diff options
author | Larry Knox <lrknox@hdfgroup.org> | 2017-04-11 14:24:47 (GMT) |
---|---|---|
committer | Larry Knox <lrknox@hdfgroup.org> | 2017-04-11 14:24:47 (GMT) |
commit | 725b443f1f247d05bbb362182e74b0e2c5058996 (patch) | |
tree | 139bf89221ea94fc8259e890a7d19839ba3138cb | |
parent | 3140697e40c77acf8c72c5dbe63fbce788362054 (diff) | |
parent | ccb4e9ed9a5e0af27db9f1504a628e35d7f4cf92 (diff) | |
download | hdf5-725b443f1f247d05bbb362182e74b0e2c5058996.zip hdf5-725b443f1f247d05bbb362182e74b0e2c5058996.tar.gz hdf5-725b443f1f247d05bbb362182e74b0e2c5058996.tar.bz2 |
Merge pull request #408 in HDFFV/hdf5 from develop to hdf5_1_10
* commit 'ccb4e9ed9a5e0af27db9f1504a628e35d7f4cf92': (27 commits)
Removed commeted out code from H5C_dump_coll_write_list()
Checkin of fix for CGNS bug (https://jira.hdfgroup.org/browse/HDFFV-10055).
HDFFV-10143 add missing javadoc param
Add missing test status
Fix CMake regex commands
Modify test/fheap.c to run with various file space strategies and/or page buffering Modify test/fheap.c to run with different combinations of file space strategies and page buffering only when ExpressMode is 0 (HDF5TestExpress is 0). Tested on ostrich, platypus, mayll, emu, osx1010test, quail, kite, kituo.
Updated the H5L.c error message after additional thought. Fix for HDFFV-10141.
Updated an error message in H5L.c to be more helpful. Fixes HDFFV-10141.
Re-enabled fixed array index testing in the test_random_rank4_vl() test in test/set_extent. This was fixed some time ago, but the test was never re-enabled for that index type.
Fix typo deletion
HDFFV-10143 Update new feature section.
HDFFV-10143 clean up format and function return
HDFFV-10143 Add plugin APIs to Java interface
Update with checks for index bounds
Update tools issues
HDFFV-10143 fix use before set
HDFFV-10143 surround will fail with try block
HDFFV-10143 typo cleanup
HDFFV-10143 typo removed
Fix code error and use H5PL_MAX_PATH_NUM in test
...
-rw-r--r-- | release_docs/RELEASE.txt | 11 | ||||
-rw-r--r-- | src/H5Cdbg.c | 107 | ||||
-rw-r--r-- | src/H5Cmpio.c | 102 | ||||
-rw-r--r-- | src/H5Cprivate.h | 5 | ||||
-rw-r--r-- | src/H5FDmpi.c | 39 | ||||
-rw-r--r-- | src/H5FDmpio.c | 37 | ||||
-rw-r--r-- | src/H5FDprivate.h | 2 | ||||
-rw-r--r-- | src/H5Fmpi.c | 26 | ||||
-rw-r--r-- | src/H5Fprivate.h | 1 | ||||
-rw-r--r-- | src/H5L.c | 6 | ||||
-rw-r--r-- | test/fheap.c | 669 | ||||
-rw-r--r-- | test/set_extent.c | 21 |
12 files changed, 687 insertions, 339 deletions
diff --git a/release_docs/RELEASE.txt b/release_docs/RELEASE.txt index 72fee6e..6d96bd8 100644 --- a/release_docs/RELEASE.txt +++ b/release_docs/RELEASE.txt @@ -77,7 +77,7 @@ New Features The page buffering layer in the HDF5 library absorbs small accesses to the file system. Each page in memory corresponds to a page allocated in the file. Access to the file system is then performed as a single page - or multiple of pages, if they are contiguous. This ensures that small + or multiple of pages, if they are contiguous. This ensures that small accesses to the file system are avoided while providing another caching layer for improved I/O performance. This feature works in conjunction with the paged aggregation feature. @@ -206,7 +206,7 @@ Bug Fixes since HDF5-1.10.0-patch1 release (HDFFV-9940 VC 2016/07/03, 2016/07/06) - (a) Throw an error instead of assertion when v1 btree level hits the 1 byte limit. - (b) Modifications to better handle error recovery when conversion by + (b) Modifications to better handle error recovery when conversion by h5format_convert fails. (HDFFV-9434 VC 2016/05/29) @@ -255,6 +255,13 @@ Bug Fixes since HDF5-1.10.0-patch1 release - h5repack now correctly parses the command line filter options. (HDFFV-10046 ADB 2017/01/24) + - h5diff correctly indicates error when it cannot read data due + to an unavailable filter plugin. + (HDFFV-9994 ADB 2017/01/18) + + - h5repack allows the --enable-error-stack option on the command line. + (HDFFV-775 ADB 2016/08/08) + High-Level APIs: ------ - diff --git a/src/H5Cdbg.c b/src/H5Cdbg.c index 0a98406..85f25b3 100644 --- a/src/H5Cdbg.c +++ b/src/H5Cdbg.c @@ -30,12 +30,16 @@ #include "H5Cmodule.h" /* This source code file is part of the H5C module */ +#define H5AC_FRIEND + + + /***********/ /* Headers */ /***********/ #include "H5private.h" /* Generic Functions */ -#include "H5ACprivate.h" /* Metadata Cache */ +#include "H5ACpkg.h" /* Metadata Cache */ #include "H5Cpkg.h" /* Cache */ #include "H5Eprivate.h" /* Error Handling */ @@ -340,6 +344,107 @@ H5C_dump_cache_skip_list(H5C_t * cache_ptr, char * calling_fcn) /*------------------------------------------------------------------------- + * Function: H5C_dump_coll_write_list + * + * Purpose: Debugging routine that prints a summary of the contents of + * the collective write skip list used by the metadata cache + * in the parallel case to maintain a list of entries to write + * collectively at a sync point. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 4/1/17 + * + *------------------------------------------------------------------------- + */ +#ifdef H5_HAVE_PARALLEL +#ifndef NDEBUG +herr_t +H5C_dump_coll_write_list(H5C_t * cache_ptr, char * calling_fcn) +{ + herr_t ret_value = SUCCEED; /* Return value */ + int i; + int list_len; + H5AC_aux_t * aux_ptr = NULL; + H5C_cache_entry_t * entry_ptr = NULL; + H5SL_node_t * node_ptr = NULL; + + FUNC_ENTER_NOAPI_NOERR + + HDassert(cache_ptr != NULL); + HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC); + HDassert(cache_ptr->aux_ptr); + + aux_ptr = (H5AC_aux_t *)cache_ptr->aux_ptr; + + HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC); + + HDassert(calling_fcn != NULL); + + list_len = (int)H5SL_count(cache_ptr->coll_write_list); + + HDfprintf(stdout, "\n\nDumping MDC coll write list from %d:%s.\n", + aux_ptr->mpi_rank, calling_fcn); + HDfprintf(stdout, " slist len = %u.\n", cache_ptr->slist_len); + + if ( list_len > 0 ) { + + /* scan the collective write list generating the desired output */ + HDfprintf(stdout, + "Num: Addr: Len: Prot/Pind: Dirty: Type:\n"); + + i = 0; + + node_ptr = H5SL_first(cache_ptr->coll_write_list); + + if ( node_ptr != NULL ) + + entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr); + + else + + entry_ptr = NULL; + + while ( entry_ptr != NULL ) { + + HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC); + + HDfprintf(stdout, + "%s%d 0x%016llx %4lld %d/%d %d %s\n", + cache_ptr->prefix, i, + (long long)(entry_ptr->addr), + (long long)(entry_ptr->size), + (int)(entry_ptr->is_protected), + (int)(entry_ptr->is_pinned), + (int)(entry_ptr->is_dirty), + entry_ptr->type->name); + + node_ptr = H5SL_next(node_ptr); + + if ( node_ptr != NULL ) + + entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr); + + else + + entry_ptr = NULL; + + i++; + + } /* end while */ + } /* end if */ + + HDfprintf(stdout, "\n\n"); + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_dump_coll_write_list() */ +#endif /* NDEBUG */ +#endif /* H5_HAVE_PARALLEL */ + + +/*------------------------------------------------------------------------- * Function: H5C_set_prefix * * Purpose: Set the values of the prefix field of H5C_t. This diff --git a/src/H5Cmpio.c b/src/H5Cmpio.c index 06ce714..0d1a3ff 100644 --- a/src/H5Cmpio.c +++ b/src/H5Cmpio.c @@ -950,12 +950,15 @@ H5C__collective_write(H5F_t *f, hid_t dxpl_id) /* Get original transfer mode */ if(NULL == (plist = (H5P_genplist_t *)H5I_object(dxpl_id))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data transfer property list") + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, \ + "not a data transfer property list") + if(H5P_get(plist, H5D_XFER_IO_XFER_MODE_NAME, &orig_xfer_mode) < 0) HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set MPI-I/O property") /* Get number of entries in collective write list */ count = (int)H5SL_count(cache_ptr->coll_write_list); + if(count > 0) { H5FD_mpio_xfer_t xfer_mode = H5FD_MPIO_COLLECTIVE; H5SL_node_t *node; @@ -964,21 +967,34 @@ H5C__collective_write(H5F_t *f, hid_t dxpl_id) int i; if(H5P_set(plist, H5D_XFER_IO_XFER_MODE_NAME, &xfer_mode) < 0) - HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set MPI-I/O property") + HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, \ + "can't set MPI-I/O property") /* Allocate arrays */ - if(NULL == (length_array = (int *)H5MM_malloc((size_t)count * sizeof(int)))) - HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "memory allocation failed for collective write table length array") - if(NULL == (buf_array = (MPI_Aint *)H5MM_malloc((size_t)count * sizeof(MPI_Aint)))) - HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "memory allocation failed for collective buf table length array") - if(NULL == (offset_array = (MPI_Aint *)H5MM_malloc((size_t)count * sizeof(MPI_Aint)))) - HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "memory allocation failed for collective offset table length array") + if ( NULL == (length_array = + (int *)H5MM_malloc((size_t)count * sizeof(int))) ) + + HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, \ + "memory allocation failed for collective write table length array") + + if ( NULL == (buf_array = + (MPI_Aint *)H5MM_malloc((size_t)count * sizeof(MPI_Aint))) ) + + HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, \ + "memory allocation failed for collective buf table length array") + + if(NULL == (offset_array = + (MPI_Aint *)H5MM_malloc((size_t)count * sizeof(MPI_Aint))) ) + + HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, \ + "memory allocation failed for collective offset table length array") /* Fill arrays */ node = H5SL_first(cache_ptr->coll_write_list); HDassert(node); if(NULL == (entry_ptr = (H5C_cache_entry_t *)H5SL_item(node))) - HGOTO_ERROR(H5E_CACHE, H5E_NOTFOUND, FAIL, "can't retrieve skip list item") + HGOTO_ERROR(H5E_CACHE, H5E_NOTFOUND, FAIL, \ + "can't retrieve skip list item") /* Set up initial array position & buffer base address */ length_array[0] = (int)entry_ptr->size; @@ -989,8 +1005,10 @@ H5C__collective_write(H5F_t *f, hid_t dxpl_id) node = H5SL_next(node); i = 1; while(node) { + if(NULL == (entry_ptr = (H5C_cache_entry_t *)H5SL_item(node))) - HGOTO_ERROR(H5E_CACHE, H5E_NOTFOUND, FAIL, "can't retrieve skip list item") + HGOTO_ERROR(H5E_CACHE, H5E_NOTFOUND, FAIL, \ + "can't retrieve skip list item") /* Set up array position */ length_array[i] = (int)entry_ptr->size; @@ -1003,48 +1021,85 @@ H5C__collective_write(H5F_t *f, hid_t dxpl_id) } /* end while */ /* Create memory MPI type */ - if(MPI_SUCCESS != (mpi_code = MPI_Type_create_hindexed(count, length_array, buf_array, MPI_BYTE, &btype))) + if(MPI_SUCCESS != (mpi_code = + MPI_Type_create_hindexed(count, length_array, + buf_array, MPI_BYTE, + &btype))) HMPI_GOTO_ERROR(FAIL, "MPI_Type_create_hindexed failed", mpi_code) + btype_created = TRUE; + if(MPI_SUCCESS != (mpi_code = MPI_Type_commit(&btype))) HMPI_GOTO_ERROR(FAIL, "MPI_Type_commit failed", mpi_code) /* Create file MPI type */ - if(MPI_SUCCESS != (mpi_code = MPI_Type_create_hindexed(count, length_array, offset_array, MPI_BYTE, &ftype))) + if(MPI_SUCCESS != (mpi_code = + MPI_Type_create_hindexed(count, length_array, + offset_array, MPI_BYTE, + &ftype))) HMPI_GOTO_ERROR(FAIL, "MPI_Type_create_hindexed failed", mpi_code) + ftype_created = TRUE; + if(MPI_SUCCESS != (mpi_code = MPI_Type_commit(&ftype))) HMPI_GOTO_ERROR(FAIL, "MPI_Type_commit failed", mpi_code) /* Pass buf type, file type to the file driver */ if(H5FD_mpi_setup_collective(dxpl_id, &btype, &ftype) < 0) - HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set MPI-I/O properties") + HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, \ + "can't set MPI-I/O properties") /* Write data */ - if(H5F_block_write(f, H5FD_MEM_DEFAULT, (haddr_t)0, (size_t)1, dxpl_id, base_buf) < 0) - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to write entries collectively") + if(H5F_block_write(f, H5FD_MEM_DEFAULT, (haddr_t)0, + (size_t)1, dxpl_id, base_buf) < 0) + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ + "unable to write entries collectively") + } /* end if */ else { MPI_Status mpi_stat; - MPI_File mpi_fh_p; + MPI_File *mpi_fh_p; MPI_File mpi_fh; + MPI_Info *info_p; + MPI_Info info; if(H5F_get_mpi_handle(f, (MPI_File **)&mpi_fh_p) < 0) - HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't get mpi file handle") + HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, \ + "can't get mpi file handle") + mpi_fh = *(MPI_File*)mpi_fh_p; - /* just to match up with the 1st MPI_File_set_view from H5FD_mpio_write() */ - if(MPI_SUCCESS != (mpi_code = MPI_File_set_view(mpi_fh, (MPI_Offset)0, MPI_BYTE, MPI_BYTE, "native", MPI_INFO_NULL))) + if (H5F_get_mpi_info(f, &info_p) < 0) + HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, \ + "can't get mpi file info") + + info = *info_p; + + /* just to match up with the 1st MPI_File_set_view from + * H5FD_mpio_write() + */ + if(MPI_SUCCESS != (mpi_code = + MPI_File_set_view(mpi_fh, (MPI_Offset)0, MPI_BYTE, + MPI_BYTE, "native", + info))) HMPI_GOTO_ERROR(FAIL, "MPI_File_set_view failed", mpi_code) /* just to match up with MPI_File_write_at_all from H5FD_mpio_write() */ HDmemset(&mpi_stat, 0, sizeof(MPI_Status)); - if(MPI_SUCCESS != (mpi_code = MPI_File_write_at_all(mpi_fh, (MPI_Offset)0, NULL, 0, MPI_BYTE, &mpi_stat))) + if(MPI_SUCCESS != (mpi_code = + MPI_File_write_at_all(mpi_fh, (MPI_Offset)0, + NULL, 0, MPI_BYTE, &mpi_stat))) HMPI_GOTO_ERROR(FAIL, "MPI_File_write_at_all failed", mpi_code) - /* just to match up with the 2nd MPI_File_set_view (reset) in H5FD_mpio_write() */ - if(MPI_SUCCESS != (mpi_code = MPI_File_set_view(mpi_fh, (MPI_Offset)0, MPI_BYTE, MPI_BYTE, "native", MPI_INFO_NULL))) + /* just to match up with the 2nd MPI_File_set_view (reset) in + * H5FD_mpio_write() + */ + if(MPI_SUCCESS != (mpi_code = + MPI_File_set_view(mpi_fh, (MPI_Offset)0, MPI_BYTE, + MPI_BYTE, "native", + info))) HMPI_GOTO_ERROR(FAIL, "MPI_File_set_view failed", mpi_code) + } /* end else */ done: @@ -1063,7 +1118,8 @@ done: if(orig_xfer_mode != H5FD_MPIO_COLLECTIVE) { HDassert(plist); if(H5P_set(plist, H5D_XFER_IO_XFER_MODE_NAME, &orig_xfer_mode) < 0) - HDONE_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set MPI-I/O property") + HDONE_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, \ + "can't set MPI-I/O property") } /* end if */ FUNC_LEAVE_NOAPI(ret_value); diff --git a/src/H5Cprivate.h b/src/H5Cprivate.h index bdfb23e..5c5a666 100644 --- a/src/H5Cprivate.h +++ b/src/H5Cprivate.h @@ -2340,9 +2340,12 @@ H5_DLL herr_t H5C_dump_cache_LRU(H5C_t *cache_ptr, const char *cache_name); H5_DLL hbool_t H5C_get_serialization_in_progress(const H5C_t *cache_ptr); H5_DLL hbool_t H5C_cache_is_clean(const H5C_t *cache_ptr, H5C_ring_t inner_ring); H5_DLL herr_t H5C_dump_cache_skip_list(H5C_t *cache_ptr, char *calling_fcn); +#ifdef H5_HAVE_PARALLEL +H5_DLL herr_t H5C_dump_coll_write_list(H5C_t * cache_ptr, char * calling_fcn); +#endif /* H5_HAVE_PARALLEL */ H5_DLL herr_t H5C_get_entry_ptr_from_addr(H5C_t *cache_ptr, haddr_t addr, void **entry_ptr_ptr); -H5_DLL herr_t H5C_flush_dependency_exists(H5C_t *cache_ptr, haddr_t parent_addr, +H5_DLL herr_t H5C_flush_dependency_exists(H5C_t *cache_ptr, haddr_t parent_addr, haddr_t child_addr, hbool_t *fd_exists_ptr); H5_DLL herr_t H5C_verify_entry_type(H5C_t *cache_ptr, haddr_t addr, const H5C_class_t *expected_type, hbool_t *in_cache_ptr, diff --git a/src/H5FDmpi.c b/src/H5FDmpi.c index fdc4eca..bf4e03a 100644 --- a/src/H5FDmpi.c +++ b/src/H5FDmpi.c @@ -148,6 +148,45 @@ done: /*------------------------------------------------------------------------- + * Function: H5FD_get_mpi_info + * + * Purpose: Retrieves the file's mpi info + * + * Return: Success: SUCCEED + * + * Failure: Negative + * + * Programmer: John Mainzer + * 4/4/17 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +herr_t +H5FD_get_mpi_info(H5FD_t *file, void** mpi_info) +{ + const H5FD_class_mpi_t *cls; + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI_NOINIT + + HDassert(file); + cls = (const H5FD_class_mpi_t *)(file->cls); + HDassert(cls); + HDassert(cls->get_mpi_info); /* All MPI drivers must implement this */ + + /* Dispatch to driver */ + if ((ret_value=(cls->get_mpi_info)(file, mpi_info)) < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTGET, MPI_COMM_NULL, \ + "driver get_mpi_info request failed") + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5FD_get_mpi_info() */ + + +/*------------------------------------------------------------------------- * Function: H5FD_mpi_MPIOff_to_haddr * * Purpose: Convert an MPI_Offset value to haddr_t. diff --git a/src/H5FDmpio.c b/src/H5FDmpio.c index a3a404f..9417d46 100644 --- a/src/H5FDmpio.c +++ b/src/H5FDmpio.c @@ -95,6 +95,7 @@ static herr_t H5FD_mpio_truncate(H5FD_t *_file, hid_t dxpl_id, hbool_t closing); static int H5FD_mpio_mpi_rank(const H5FD_t *_file); static int H5FD_mpio_mpi_size(const H5FD_t *_file); static MPI_Comm H5FD_mpio_communicator(const H5FD_t *_file); +static herr_t H5FD_mpio_get_info(H5FD_t *_file, void** mpi_info); /* The MPIO file driver information */ static const H5FD_class_mpi_t H5FD_mpio_g = { @@ -134,7 +135,8 @@ static const H5FD_class_mpi_t H5FD_mpio_g = { }, /* End of superclass information */ H5FD_mpio_mpi_rank, /*get_rank */ H5FD_mpio_mpi_size, /*get_size */ - H5FD_mpio_communicator /*get_comm */ + H5FD_mpio_communicator, /*get_comm */ + H5FD_mpio_get_info /*get_info */ }; #ifdef H5FDmpio_DEBUG @@ -1308,6 +1310,39 @@ done: /*------------------------------------------------------------------------- + * Function: H5FD_mpio_get_info + * + * Purpose: Returns the file info of MPIO file driver. + * + * Returns: Non-negative if succeed or negative if fails. + * + * Programmer: John Mainzer + * April 4, 2017 + * + * Modifications: + * + *------------------------------------------------------------------------- +*/ +static herr_t +H5FD_mpio_get_info(H5FD_t *_file, void** mpi_info) +{ + H5FD_mpio_t *file = (H5FD_mpio_t *)_file; + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI_NOINIT + + if(!mpi_info) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "mpi info not valid") + + *mpi_info = &(file->info); + +done: + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5FD_mpio_get_info() */ + + +/*------------------------------------------------------------------------- * Function: H5FD_mpio_read * * Purpose: Reads SIZE bytes of data from FILE beginning at address ADDR diff --git a/src/H5FDprivate.h b/src/H5FDprivate.h index c64ec30..fb7c43c 100644 --- a/src/H5FDprivate.h +++ b/src/H5FDprivate.h @@ -53,6 +53,7 @@ typedef struct H5FD_class_mpi_t { int (*get_rank)(const H5FD_t *file); /* Get the MPI rank of a process */ int (*get_size)(const H5FD_t *file); /* Get the MPI size of a communicator */ MPI_Comm (*get_comm)(const H5FD_t *file); /* Get the communicator for a file */ + herr_t (*get_mpi_info)(H5FD_t *file, void** mpi_info); /* get MPI_Info for a file */ } H5FD_class_mpi_t; #endif @@ -202,6 +203,7 @@ H5_DLL herr_t H5FD_get_mpio_atomicity(H5FD_t *file, hbool_t *flag); H5_DLL int H5FD_mpi_get_rank(const H5FD_t *file); H5_DLL int H5FD_mpi_get_size(const H5FD_t *file); H5_DLL MPI_Comm H5FD_mpi_get_comm(const H5FD_t *_file); +H5_DLL herr_t H5FD_get_mpi_info(H5FD_t *file, void** file_info); #endif /* H5_HAVE_PARALLEL */ #endif /* !_H5FDprivate_H */ diff --git a/src/H5Fmpi.c b/src/H5Fmpi.c index 5434aa5..60593a8 100644 --- a/src/H5Fmpi.c +++ b/src/H5Fmpi.c @@ -356,5 +356,31 @@ done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5F_mpi_retrieve_comm */ +/*------------------------------------------------------------------------- + * Function: H5F_get_mpi_info + * + * Purpose: Retrieves MPI File info. + * + * Return: Success: The size (positive) + * Failure: Negative + * + *------------------------------------------------------------------------- + */ +herr_t +H5F_get_mpi_info(const H5F_t *f, MPI_Info **f_info) +{ + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(FAIL) + + HDassert(f && f->shared); + + /* Dispatch to driver */ + if ((ret_value = H5FD_get_mpi_info(f->shared->lf, (void **)f_info)) < 0) + HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't get mpi file info") + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5F_get_mpi_info() */ #endif /* H5_HAVE_PARALLEL */ diff --git a/src/H5Fprivate.h b/src/H5Fprivate.h index 886063a..8ef353a 100644 --- a/src/H5Fprivate.h +++ b/src/H5Fprivate.h @@ -852,6 +852,7 @@ H5_DLL int H5F_mpi_get_rank(const H5F_t *f); H5_DLL MPI_Comm H5F_mpi_get_comm(const H5F_t *f); H5_DLL int H5F_mpi_get_size(const H5F_t *f); H5_DLL herr_t H5F_mpi_retrieve_comm(hid_t loc_id, hid_t acspl_id, MPI_Comm *mpi_comm); +H5_DLL herr_t H5F_get_mpi_info(const H5F_t *f, MPI_Info **f_info); #endif /* H5_HAVE_PARALLEL */ /* External file cache routines */ @@ -2351,9 +2351,11 @@ H5L_delete_cb(H5G_loc_t *grp_loc/*in*/, const char *name, const H5O_link_t *lnk, if(name == NULL) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "name doesn't exist") - /* Check for removing '.' */ + /* Check for non-existent (NULL) link. + * Note that this can also occur when attempting to remove '.' + */ if(lnk == NULL) - HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "can't delete self") + HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "callback link pointer is NULL (specified link may be '.' or not exist)") /* Remove the link from the group */ if(H5G_obj_remove(grp_loc->oloc, grp_loc->path->full_path_r, name, udata->dxpl_id) < 0) diff --git a/test/fheap.c b/test/fheap.c index f08c0f8..77de4a8 100644 --- a/test/fheap.c +++ b/test/fheap.c @@ -81,6 +81,10 @@ #define DBLOCK_SIZE(fh, r) H5HF_get_dblock_size_test(fh, r) /* Size of a direct block in a given row */ #define DBLOCK_FREE(fh, r) H5HF_get_dblock_free_test(fh, r) /* Free space in a direct block of a given row */ +/* The number of settings for testing: page buffering, file space strategy and persisting free-space */ +#define NUM_PB_FS 6 +#define PAGE_BUFFER_PAGE_SIZE 4096 + const char *FILENAME[] = { "fheap", NULL @@ -16367,21 +16371,31 @@ main(void) fheap_test_param_t tparam; /* Testing parameters */ H5HF_create_t small_cparam; /* Creation parameters for "small" heap */ H5HF_create_t large_cparam; /* Creation parameters for "large" heap */ - hid_t fapl = -1; /* File access property list for data files */ - hid_t fcpl = -1; /* File creation property list for data files */ - hid_t fcpl2 = -1; /* File creation property list for data files */ + hid_t fapl = -1, def_fapl = -1; /* File access property list for data files */ + hid_t pb_fapl = -1; /* File access property list for data files */ + hid_t fcpl = -1, def_fcpl = -1; /* File creation property list for data files */ fheap_test_type_t curr_test; /* Current test being worked on */ - unsigned u; /* Local index variable */ + unsigned u, v; /* Local index variable */ unsigned nerrors = 0; /* Cumulative error count */ - int ExpressMode; /* Express testing level */ + unsigned num_pb_fs = 1; /* The number of settings to test for page buffering and file space handling */ + int ExpressMode; /* Express testing level */ /* Reset library */ h5_reset(); - fapl = h5_fileaccess(); + def_fapl = h5_fileaccess(); ExpressMode = GetTestExpress(); + + /* + * Caution when turning on ExpressMode 0: + * It will activate testing with different combinations of + * page buffering and file space strategy and the + * running time will be long. + */ if(ExpressMode > 1) - printf("***Express test mode on. Some tests may be skipped\n"); + printf("***Express test mode on. Some tests may be skipped\n"); + else if(ExpressMode == 0) + num_pb_fs = NUM_PB_FS; /* Initialize heap creation parameters */ init_small_cparam(&small_cparam); @@ -16392,359 +16406,409 @@ main(void) shared_wobj_g = (unsigned char *)H5MM_malloc(shared_obj_size_g); shared_robj_g = (unsigned char *)H5MM_malloc(shared_obj_size_g); - /* create a file creation property list */ - if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0) + /* Create a copy def_fapl and enable page buffering */ + if((pb_fapl = H5Pcopy(def_fapl)) < 0) + TEST_ERROR + if(H5Pset_page_buffer_size(pb_fapl, PAGE_BUFFER_PAGE_SIZE, 0, 0) < 0) TEST_ERROR - if((fcpl2 = H5Pcopy(fcpl)) < 0) TEST_ERROR - /* Set file space strategy and persisting free-space */ - /* This will be modified later on to run the test with different file space strategy setting */ - if(H5Pset_file_space_strategy(fcpl2, H5F_FSPACE_STRATEGY_FSM_AGGR, FALSE, (hsize_t)1) < 0) + /* Create a file creation property list */ + if((def_fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0) TEST_ERROR /* Initialize the shared write buffer for objects */ for(u = 0; u < shared_obj_size_g; u++) shared_wobj_g[u] = (unsigned char)u; - /* Iterate over the testing parameters */ - for(curr_test = FHEAP_TEST_NORMAL; curr_test < FHEAP_TEST_NTESTS; H5_INC_ENUM(fheap_test_type_t, curr_test)) { - /* Clear the testing parameters */ - HDmemset(&tparam, 0, sizeof(fheap_test_param_t)); - tparam.actual_id_len = HEAP_ID_LEN; + for(v = 0; v < num_pb_fs; v++) { - /* This will be modified later on to run the test with different file space strategy setting */ - tparam.my_fcpl = fcpl2; + if((fcpl = H5Pcopy(def_fcpl)) < 0) + TEST_ERROR - /* Set appropriate testing parameters for each test */ - switch(curr_test) { - /* "Normal" testing parameters */ - case FHEAP_TEST_NORMAL: - puts("Testing with normal parameters"); + switch(v) { + case 0: + if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_FSM_AGGR, FALSE, (hsize_t)1) < 0) + TEST_ERROR + fapl = def_fapl; break; - - /* "Re-open heap" testing parameters */ - case FHEAP_TEST_REOPEN: - puts("Testing with reopen heap flag set"); - tparam.reopen_heap = FHEAP_TEST_REOPEN; + case 1: + if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_FSM_AGGR, TRUE, (hsize_t)1) < 0) + TEST_ERROR + fapl = def_fapl; + break; + case 2: + if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, FALSE, (hsize_t)1) < 0) + TEST_ERROR + fapl = def_fapl; + break; + case 3: + if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, TRUE, (hsize_t)1) < 0) + TEST_ERROR + fapl = def_fapl; + break; + case 4: + if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, FALSE, (hsize_t)1) < 0) + TEST_ERROR + fapl = pb_fapl; + break; + case 5: + if(H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, TRUE, (hsize_t)1) < 0) + TEST_ERROR + fapl = pb_fapl; break; - /* An unknown test? */ - case FHEAP_TEST_NTESTS: + case NUM_PB_FS: default: goto error; - } /* end switch */ - - /* Test fractal heap creation */ - nerrors += test_create(fapl, &small_cparam, &tparam); - nerrors += test_reopen(fapl, &small_cparam, &tparam); - nerrors += test_open_twice(fapl, &small_cparam, &tparam); - nerrors += test_delete_open(fapl, &small_cparam, &tparam); + } - nerrors += test_id_limits(fapl, &small_cparam, tparam.my_fcpl); - nerrors += test_filtered_create(fapl, &small_cparam, tparam.my_fcpl); - nerrors += test_size(fapl, &small_cparam, tparam.my_fcpl); - nerrors += test_reopen_hdr(fapl, &small_cparam, tparam.my_fcpl); + /* Iterate over the testing parameters */ + for(curr_test = FHEAP_TEST_NORMAL; curr_test < FHEAP_TEST_NTESTS; H5_INC_ENUM(fheap_test_type_t, curr_test)) { + /* Clear the testing parameters */ + HDmemset(&tparam, 0, sizeof(fheap_test_param_t)); + tparam.actual_id_len = HEAP_ID_LEN; - { - fheap_test_fill_t fill; /* Size of objects to fill heap blocks with */ - - /* Filling with different sized objects */ - for(fill = FHEAP_TEST_FILL_LARGE; fill < FHEAP_TEST_FILL_N; H5_INC_ENUM(fheap_test_fill_t, fill)) { - tparam.fill = fill; + /* Set to run with different file space setting */ + tparam.my_fcpl = fcpl; /* Set appropriate testing parameters for each test */ - switch(fill) { - /* "Bulk fill" heap blocks with 'large' objects */ - case FHEAP_TEST_FILL_LARGE: - puts("Bulk-filling blocks w/large objects"); + switch(curr_test) { + /* "Normal" testing parameters */ + case FHEAP_TEST_NORMAL: + puts("Testing with normal parameters"); break; - /* "Bulk fill" heap blocks with 'single' objects */ - case FHEAP_TEST_FILL_SINGLE: - puts("Bulk-filling blocks w/single object"); + /* "Re-open heap" testing parameters */ + case FHEAP_TEST_REOPEN: + puts("Testing with reopen heap flag set"); + tparam.reopen_heap = FHEAP_TEST_REOPEN; break; /* An unknown test? */ - case FHEAP_TEST_FILL_N: + case FHEAP_TEST_NTESTS: default: goto error; } /* end switch */ - /* - * Test fractal heap managed object insertion - */ + /* Test fractal heap creation */ + nerrors += test_create(fapl, &small_cparam, &tparam); + nerrors += test_reopen(fapl, &small_cparam, &tparam); + nerrors += test_open_twice(fapl, &small_cparam, &tparam); + nerrors += test_delete_open(fapl, &small_cparam, &tparam); - /* "Weird" sized objects */ - nerrors += test_man_insert_weird(fapl, &small_cparam, &tparam); + nerrors += test_id_limits(fapl, &small_cparam, tparam.my_fcpl); + nerrors += test_filtered_create(fapl, &small_cparam, tparam.my_fcpl); + nerrors += test_size(fapl, &small_cparam, tparam.my_fcpl); + nerrors += test_reopen_hdr(fapl, &small_cparam, tparam.my_fcpl); -#ifdef ALL_INSERT_TESTS - /* "Standard" sized objects, building from simple to complex heaps */ - nerrors += test_man_insert_first(fapl, &small_cparam, &tparam); - nerrors += test_man_insert_second(fapl, &small_cparam, &tparam); - nerrors += test_man_insert_root_mult(fapl, &small_cparam, &tparam); - nerrors += test_man_insert_force_indirect(fapl, &small_cparam, &tparam); - nerrors += test_man_insert_fill_second(fapl, &small_cparam, &tparam); - nerrors += test_man_insert_third_direct(fapl, &small_cparam, &tparam); - nerrors += test_man_fill_first_row(fapl, &small_cparam, &tparam); - nerrors += test_man_start_second_row(fapl, &small_cparam, &tparam); - nerrors += test_man_fill_second_row(fapl, &small_cparam, &tparam); - nerrors += test_man_start_third_row(fapl, &small_cparam, &tparam); - nerrors += test_man_fill_fourth_row(fapl, &small_cparam, &tparam); - nerrors += test_man_fill_all_root_direct(fapl, &small_cparam, &tparam); - nerrors += test_man_first_recursive_indirect(fapl, &small_cparam, &tparam); - nerrors += test_man_second_direct_recursive_indirect(fapl, &small_cparam, &tparam); - nerrors += test_man_fill_first_recursive_indirect(fapl, &small_cparam, &tparam); - nerrors += test_man_second_recursive_indirect(fapl, &small_cparam, &tparam); - nerrors += test_man_fill_second_recursive_indirect(fapl, &small_cparam, &tparam); - nerrors += test_man_fill_recursive_indirect_row(fapl, &small_cparam, &tparam); - nerrors += test_man_start_2nd_recursive_indirect(fapl, &small_cparam, &tparam); - nerrors += test_man_recursive_indirect_two_deep(fapl, &small_cparam, &tparam); - nerrors += test_man_start_3rd_recursive_indirect(fapl, &small_cparam, &tparam); - nerrors += test_man_fill_first_3rd_recursive_indirect(fapl, &small_cparam, &tparam); - nerrors += test_man_fill_3rd_recursive_indirect_row(fapl, &small_cparam, &tparam); - nerrors += test_man_fill_all_3rd_recursive_indirect(fapl, &small_cparam, &tparam); - nerrors += test_man_start_4th_recursive_indirect(fapl, &small_cparam, &tparam); - nerrors += test_man_fill_first_4th_recursive_indirect(fapl, &small_cparam, &tparam); - nerrors += test_man_fill_4th_recursive_indirect_row(fapl, &small_cparam, &tparam); - nerrors += test_man_fill_all_4th_recursive_indirect(fapl, &small_cparam, &tparam); -#endif /* ALL_INSERT_TESTS */ - /* If this test fails, uncomment the tests above, which build up to this - * level of complexity gradually. -QAK - */ - if(ExpressMode > 1) - printf("***Express test mode on. test_man_start_5th_recursive_indirect is skipped\n"); - else - nerrors += test_man_start_5th_recursive_indirect(fapl, &small_cparam, &tparam); + { + fheap_test_fill_t fill; /* Size of objects to fill heap blocks with */ - /* - * Test fractal heap object deletion - */ - /* Simple removal */ - nerrors += test_man_remove_bogus(fapl, &small_cparam, &tparam); - nerrors += test_man_remove_one(fapl, &small_cparam, &tparam); - nerrors += test_man_remove_two(fapl, &small_cparam, &tparam); - nerrors += test_man_remove_one_larger(fapl, &small_cparam, &tparam); - tparam.del_dir = FHEAP_DEL_FORWARD; - nerrors += test_man_remove_two_larger(fapl, &small_cparam, &tparam); - tparam.del_dir = FHEAP_DEL_REVERSE; - nerrors += test_man_remove_two_larger(fapl, &small_cparam, &tparam); - tparam.del_dir = FHEAP_DEL_FORWARD; - nerrors += test_man_remove_three_larger(fapl, &small_cparam, &tparam); - tparam.del_dir = FHEAP_DEL_REVERSE; - nerrors += test_man_remove_three_larger(fapl, &small_cparam, &tparam); - - /* Incremental insert & removal */ - tparam.del_dir = FHEAP_DEL_FORWARD; - nerrors += test_man_incr_insert_remove(fapl, &small_cparam, &tparam); + /* Filling with different sized objects */ + for(fill = FHEAP_TEST_FILL_LARGE; fill < FHEAP_TEST_FILL_N; H5_INC_ENUM(fheap_test_fill_t, fill)) { + tparam.fill = fill; - { - fheap_test_del_dir_t del_dir; /* Deletion direction */ - fheap_test_del_drain_t drain_half; /* Deletion draining */ + /* Set appropriate testing parameters for each test */ + switch(fill) { + /* "Bulk fill" heap blocks with 'large' objects */ + case FHEAP_TEST_FILL_LARGE: + puts("Bulk-filling blocks w/large objects"); + break; - /* More complex removal patterns */ - for(del_dir = FHEAP_DEL_FORWARD; del_dir < FHEAP_DEL_NDIRS; H5_INC_ENUM(fheap_test_del_dir_t, del_dir)) { - tparam.del_dir = del_dir; - for(drain_half = FHEAP_DEL_DRAIN_ALL; drain_half < FHEAP_DEL_DRAIN_N; H5_INC_ENUM(fheap_test_del_drain_t, drain_half)) { - tparam.drain_half = drain_half; - /* Don't need to test deletion directions when deleting entire heap */ - if(tparam.del_dir == FHEAP_DEL_HEAP && tparam.drain_half > FHEAP_DEL_DRAIN_ALL) + /* "Bulk fill" heap blocks with 'single' objects */ + case FHEAP_TEST_FILL_SINGLE: + puts("Bulk-filling blocks w/single object"); break; - /* Simple insertion patterns */ - nerrors += test_man_remove_root_direct(fapl, &small_cparam, &tparam); - nerrors += test_man_remove_two_direct(fapl, &small_cparam, &tparam); - nerrors += test_man_remove_first_row(fapl, &small_cparam, &tparam); - nerrors += test_man_remove_first_two_rows(fapl, &small_cparam, &tparam); - nerrors += test_man_remove_first_four_rows(fapl, &small_cparam, &tparam); - if(ExpressMode > 1) - printf("***Express test mode on. Some tests skipped\n"); - else { - nerrors += test_man_remove_all_root_direct(fapl, &small_cparam, &tparam); - nerrors += test_man_remove_2nd_indirect(fapl, &small_cparam, &tparam); - nerrors += test_man_remove_3rd_indirect(fapl, &small_cparam, &tparam); - } /* end else */ - - /* Skip blocks insertion */ - /* (covers insertion & deletion of skipped blocks) */ - nerrors += test_man_skip_start_block(fapl, &small_cparam, &tparam); - nerrors += test_man_skip_start_block_add_back(fapl, &small_cparam, &tparam); - nerrors += test_man_skip_start_block_add_skipped(fapl, &small_cparam, &tparam); - nerrors += test_man_skip_2nd_block(fapl, &small_cparam, &tparam); - nerrors += test_man_skip_2nd_block_add_skipped(fapl, &small_cparam, &tparam); - nerrors += test_man_fill_one_partial_skip_2nd_block_add_skipped(fapl, &small_cparam, &tparam); - nerrors += test_man_fill_row_skip_add_skipped(fapl, &small_cparam, &tparam); - nerrors += test_man_skip_direct_skip_indirect_two_rows_add_skipped(fapl, &small_cparam, &tparam); - nerrors += test_man_fill_direct_skip_indirect_start_block_add_skipped(fapl, &small_cparam, &tparam); - nerrors += test_man_fill_direct_skip_2nd_indirect_start_block_add_skipped(fapl, &small_cparam, &tparam); - nerrors += test_man_fill_2nd_direct_less_one_wrap_start_block_add_skipped(fapl, &small_cparam, &tparam); - nerrors += test_man_fill_direct_skip_2nd_indirect_skip_2nd_block_add_skipped(fapl, &small_cparam, &tparam); - nerrors += test_man_fill_direct_skip_indirect_two_rows_add_skipped(fapl, &small_cparam, &tparam); - nerrors += test_man_fill_direct_skip_indirect_two_rows_skip_indirect_row_add_skipped(fapl, &small_cparam, &tparam); - nerrors += test_man_fill_2nd_direct_skip_start_block_add_skipped(fapl, &small_cparam, &tparam); - nerrors += test_man_fill_2nd_direct_skip_2nd_indirect_start_block_add_skipped(fapl, &small_cparam, &tparam); - nerrors += test_man_fill_2nd_direct_fill_direct_skip_3rd_indirect_start_block_add_skipped(fapl, &small_cparam, &tparam); - nerrors += test_man_fill_2nd_direct_fill_direct_skip2_3rd_indirect_start_block_add_skipped(fapl, &small_cparam, &tparam); - nerrors += test_man_fill_3rd_direct_less_one_fill_direct_wrap_start_block_add_skipped(fapl, &small_cparam, &tparam); - nerrors += test_man_fill_1st_row_3rd_direct_fill_2nd_direct_less_one_wrap_start_block_add_skipped(fapl, &small_cparam, &tparam); - if(ExpressMode > 1) - printf("***Express test mode on. Some tests skipped\n"); - else { - nerrors += test_man_fill_3rd_direct_fill_direct_skip_start_block_add_skipped(fapl, &small_cparam, &tparam); - nerrors += test_man_fill_3rd_direct_fill_2nd_direct_fill_direct_skip_3rd_indirect_start_block_add_skipped(fapl, &small_cparam, &tparam); - nerrors += test_man_fill_3rd_direct_fill_2nd_direct_fill_direct_skip_3rd_indirect_two_rows_start_block_add_skipped(fapl, &small_cparam, &tparam); - nerrors += test_man_fill_3rd_direct_fill_2nd_direct_fill_direct_skip_3rd_indirect_wrap_start_block_add_skipped(fapl, &small_cparam, &tparam); - nerrors += test_man_fill_4th_direct_less_one_fill_2nd_direct_fill_direct_skip_3rd_indirect_wrap_start_block_add_skipped(fapl, &small_cparam, &tparam); - } /* end else */ - - /* Fragmented insertion patterns */ - /* (covers insertion & deletion of fragmented blocks) */ - nerrors += test_man_frag_simple(fapl, &small_cparam, &tparam); - nerrors += test_man_frag_direct(fapl, &small_cparam, &tparam); - nerrors += test_man_frag_2nd_direct(fapl, &small_cparam, &tparam); - nerrors += test_man_frag_3rd_direct(fapl, &small_cparam, &tparam); + /* An unknown test? */ + case FHEAP_TEST_FILL_N: + default: + goto error; + } /* end switch */ + + /* + * Test fractal heap managed object insertion + */ + + /* "Weird" sized objects */ + nerrors += test_man_insert_weird(fapl, &small_cparam, &tparam); + +#ifdef ALL_INSERT_TESTS + /* "Standard" sized objects, building from simple to complex heaps */ + nerrors += test_man_insert_first(fapl, &small_cparam, &tparam); + nerrors += test_man_insert_second(fapl, &small_cparam, &tparam); + nerrors += test_man_insert_root_mult(fapl, &small_cparam, &tparam); + nerrors += test_man_insert_force_indirect(fapl, &small_cparam, &tparam); + nerrors += test_man_insert_fill_second(fapl, &small_cparam, &tparam); + nerrors += test_man_insert_third_direct(fapl, &small_cparam, &tparam); + nerrors += test_man_fill_first_row(fapl, &small_cparam, &tparam); + nerrors += test_man_start_second_row(fapl, &small_cparam, &tparam); + nerrors += test_man_fill_second_row(fapl, &small_cparam, &tparam); + nerrors += test_man_start_third_row(fapl, &small_cparam, &tparam); + nerrors += test_man_fill_fourth_row(fapl, &small_cparam, &tparam); + nerrors += test_man_fill_all_root_direct(fapl, &small_cparam, &tparam); + nerrors += test_man_first_recursive_indirect(fapl, &small_cparam, &tparam); + nerrors += test_man_second_direct_recursive_indirect(fapl, &small_cparam, &tparam); + nerrors += test_man_fill_first_recursive_indirect(fapl, &small_cparam, &tparam); + nerrors += test_man_second_recursive_indirect(fapl, &small_cparam, &tparam); + nerrors += test_man_fill_second_recursive_indirect(fapl, &small_cparam, &tparam); + nerrors += test_man_fill_recursive_indirect_row(fapl, &small_cparam, &tparam); + nerrors += test_man_start_2nd_recursive_indirect(fapl, &small_cparam, &tparam); + nerrors += test_man_recursive_indirect_two_deep(fapl, &small_cparam, &tparam); + nerrors += test_man_start_3rd_recursive_indirect(fapl, &small_cparam, &tparam); + nerrors += test_man_fill_first_3rd_recursive_indirect(fapl, &small_cparam, &tparam); + nerrors += test_man_fill_3rd_recursive_indirect_row(fapl, &small_cparam, &tparam); + nerrors += test_man_fill_all_3rd_recursive_indirect(fapl, &small_cparam, &tparam); + nerrors += test_man_start_4th_recursive_indirect(fapl, &small_cparam, &tparam); + nerrors += test_man_fill_first_4th_recursive_indirect(fapl, &small_cparam, &tparam); + nerrors += test_man_fill_4th_recursive_indirect_row(fapl, &small_cparam, &tparam); + nerrors += test_man_fill_all_4th_recursive_indirect(fapl, &small_cparam, &tparam); +#endif /* ALL_INSERT_TESTS */ + /* If this test fails, uncomment the tests above, which build up to this + * level of complexity gradually. -QAK + */ + if(ExpressMode > 1) + printf("***Express test mode on. test_man_start_5th_recursive_indirect is skipped\n"); + else + nerrors += test_man_start_5th_recursive_indirect(fapl, &small_cparam, &tparam); + + /* + * Test fractal heap object deletion + */ + /* Simple removal */ + nerrors += test_man_remove_bogus(fapl, &small_cparam, &tparam); + nerrors += test_man_remove_one(fapl, &small_cparam, &tparam); + nerrors += test_man_remove_two(fapl, &small_cparam, &tparam); + nerrors += test_man_remove_one_larger(fapl, &small_cparam, &tparam); + tparam.del_dir = FHEAP_DEL_FORWARD; + nerrors += test_man_remove_two_larger(fapl, &small_cparam, &tparam); + tparam.del_dir = FHEAP_DEL_REVERSE; + nerrors += test_man_remove_two_larger(fapl, &small_cparam, &tparam); + tparam.del_dir = FHEAP_DEL_FORWARD; + nerrors += test_man_remove_three_larger(fapl, &small_cparam, &tparam); + tparam.del_dir = FHEAP_DEL_REVERSE; + nerrors += test_man_remove_three_larger(fapl, &small_cparam, &tparam); + + /* Incremental insert & removal */ + tparam.del_dir = FHEAP_DEL_FORWARD; + nerrors += test_man_incr_insert_remove(fapl, &small_cparam, &tparam); + + { + fheap_test_del_dir_t del_dir; /* Deletion direction */ + fheap_test_del_drain_t drain_half; /* Deletion draining */ + + /* More complex removal patterns */ + for(del_dir = FHEAP_DEL_FORWARD; del_dir < FHEAP_DEL_NDIRS; H5_INC_ENUM(fheap_test_del_dir_t, del_dir)) { + tparam.del_dir = del_dir; + for(drain_half = FHEAP_DEL_DRAIN_ALL; drain_half < FHEAP_DEL_DRAIN_N; H5_INC_ENUM(fheap_test_del_drain_t, drain_half)) { + tparam.drain_half = drain_half; + /* Don't need to test deletion directions when deleting entire heap */ + if(tparam.del_dir == FHEAP_DEL_HEAP && tparam.drain_half > FHEAP_DEL_DRAIN_ALL) + break; + + /* Simple insertion patterns */ + nerrors += test_man_remove_root_direct(fapl, &small_cparam, &tparam); + nerrors += test_man_remove_two_direct(fapl, &small_cparam, &tparam); + nerrors += test_man_remove_first_row(fapl, &small_cparam, &tparam); + nerrors += test_man_remove_first_two_rows(fapl, &small_cparam, &tparam); + nerrors += test_man_remove_first_four_rows(fapl, &small_cparam, &tparam); + if(ExpressMode > 1) + printf("***Express test mode on. Some tests skipped\n"); + else { + nerrors += test_man_remove_all_root_direct(fapl, &small_cparam, &tparam); + nerrors += test_man_remove_2nd_indirect(fapl, &small_cparam, &tparam); + nerrors += test_man_remove_3rd_indirect(fapl, &small_cparam, &tparam); + } /* end else */ + + /* Skip blocks insertion */ + /* (covers insertion & deletion of skipped blocks) */ + nerrors += test_man_skip_start_block(fapl, &small_cparam, &tparam); + nerrors += test_man_skip_start_block_add_back(fapl, &small_cparam, &tparam); + nerrors += test_man_skip_start_block_add_skipped(fapl, &small_cparam, &tparam); + nerrors += test_man_skip_2nd_block(fapl, &small_cparam, &tparam); + nerrors += test_man_skip_2nd_block_add_skipped(fapl, &small_cparam, &tparam); + nerrors += test_man_fill_one_partial_skip_2nd_block_add_skipped(fapl, &small_cparam, &tparam); + nerrors += test_man_fill_row_skip_add_skipped(fapl, &small_cparam, &tparam); + nerrors += test_man_skip_direct_skip_indirect_two_rows_add_skipped(fapl, &small_cparam, &tparam); + nerrors += test_man_fill_direct_skip_indirect_start_block_add_skipped(fapl, &small_cparam, &tparam); + nerrors += test_man_fill_direct_skip_2nd_indirect_start_block_add_skipped(fapl, &small_cparam, &tparam); + nerrors += test_man_fill_2nd_direct_less_one_wrap_start_block_add_skipped(fapl, &small_cparam, &tparam); + nerrors += test_man_fill_direct_skip_2nd_indirect_skip_2nd_block_add_skipped(fapl, &small_cparam, &tparam); + nerrors += test_man_fill_direct_skip_indirect_two_rows_add_skipped(fapl, &small_cparam, &tparam); + nerrors += test_man_fill_direct_skip_indirect_two_rows_skip_indirect_row_add_skipped(fapl, &small_cparam, &tparam); + nerrors += test_man_fill_2nd_direct_skip_start_block_add_skipped(fapl, &small_cparam, &tparam); + nerrors += test_man_fill_2nd_direct_skip_2nd_indirect_start_block_add_skipped(fapl, &small_cparam, &tparam); + nerrors += test_man_fill_2nd_direct_fill_direct_skip_3rd_indirect_start_block_add_skipped(fapl, &small_cparam, &tparam); + nerrors += test_man_fill_2nd_direct_fill_direct_skip2_3rd_indirect_start_block_add_skipped(fapl, &small_cparam, &tparam); + nerrors += test_man_fill_3rd_direct_less_one_fill_direct_wrap_start_block_add_skipped(fapl, &small_cparam, &tparam); + nerrors += test_man_fill_1st_row_3rd_direct_fill_2nd_direct_less_one_wrap_start_block_add_skipped(fapl, &small_cparam, &tparam); + if(ExpressMode > 1) + printf("***Express test mode on. Some tests skipped\n"); + else { + nerrors += test_man_fill_3rd_direct_fill_direct_skip_start_block_add_skipped(fapl, &small_cparam, &tparam); + nerrors += test_man_fill_3rd_direct_fill_2nd_direct_fill_direct_skip_3rd_indirect_start_block_add_skipped(fapl, &small_cparam, &tparam); + nerrors += test_man_fill_3rd_direct_fill_2nd_direct_fill_direct_skip_3rd_indirect_two_rows_start_block_add_skipped(fapl, &small_cparam, &tparam); + nerrors += test_man_fill_3rd_direct_fill_2nd_direct_fill_direct_skip_3rd_indirect_wrap_start_block_add_skipped(fapl, &small_cparam, &tparam); + nerrors += test_man_fill_4th_direct_less_one_fill_2nd_direct_fill_direct_skip_3rd_indirect_wrap_start_block_add_skipped(fapl, &small_cparam, &tparam); + } /* end else */ + + /* Fragmented insertion patterns */ + /* (covers insertion & deletion of fragmented blocks) */ + nerrors += test_man_frag_simple(fapl, &small_cparam, &tparam); + nerrors += test_man_frag_direct(fapl, &small_cparam, &tparam); + nerrors += test_man_frag_2nd_direct(fapl, &small_cparam, &tparam); + nerrors += test_man_frag_3rd_direct(fapl, &small_cparam, &tparam); + } /* end for */ } /* end for */ - } /* end for */ - /* Reset deletion drain parameter */ - tparam.drain_half = FHEAP_DEL_DRAIN_ALL; + /* Reset deletion drain parameter */ + tparam.drain_half = FHEAP_DEL_DRAIN_ALL; - } /* end block */ + } /* end block */ } /* end for */ - } /* end block */ + } /* end block */ - /* - * Test fractal heap 'huge' & 'tiny' object insertion & deletion - */ - { - fheap_test_del_dir_t del_dir; /* Deletion direction */ - unsigned id_len; /* Length of heap IDs */ - - /* Test "normal" & "direct" storage of 'huge' & 'tiny' heap IDs */ - for(id_len = 0; id_len < 3; id_len++) { - /* Set the ID length for this test */ - small_cparam.id_len = (uint16_t)id_len; - - /* Print information about each test */ - switch(id_len) { - /* Use "normal" form for 'huge' object's heap IDs */ - case 0: - puts("Using 'normal' heap ID format for 'huge' objects"); - break; + /* + * Test fractal heap 'huge' & 'tiny' object insertion & deletion + */ + { + fheap_test_del_dir_t del_dir; /* Deletion direction */ + unsigned id_len; /* Length of heap IDs */ + + /* Test "normal" & "direct" storage of 'huge' & 'tiny' heap IDs */ + for(id_len = 0; id_len < 3; id_len++) { + /* Set the ID length for this test */ + small_cparam.id_len = (uint16_t)id_len; + + /* Print information about each test */ + switch(id_len) { + /* Use "normal" form for 'huge' object's heap IDs */ + case 0: + puts("Using 'normal' heap ID format for 'huge' objects"); + break; - /* Use "direct" form for 'huge' object's heap IDs */ - case 1: - puts("Using 'direct' heap ID format for 'huge' objects"); + /* Use "direct" form for 'huge' object's heap IDs */ + case 1: + puts("Using 'direct' heap ID format for 'huge' objects"); - /* Adjust actual length of heap IDs for directly storing 'huge' object's file offset & length in heap ID */ - tparam.actual_id_len = 17; /* 1 + 8 (file address size) + 8 (file length size) */ - break; + /* Adjust actual length of heap IDs for directly storing 'huge' object's file offset & length in heap ID */ + tparam.actual_id_len = 17; /* 1 + 8 (file address size) + 8 (file length size) */ + break; - /* Use "direct" storage for 'huge' objects and larger IDs for 'tiny' objects */ - case 2: - small_cparam.id_len = 37; - puts("Using 'direct' heap ID format for 'huge' objects and larger IDs for 'tiny' objects"); - tparam.actual_id_len = 37; - break; + /* Use "direct" storage for 'huge' objects and larger IDs for 'tiny' objects */ + case 2: + small_cparam.id_len = 37; + puts("Using 'direct' heap ID format for 'huge' objects and larger IDs for 'tiny' objects"); + tparam.actual_id_len = 37; + break; - /* An unknown test? */ - default: - goto error; - } /* end switch */ + /* An unknown test? */ + default: + goto error; + } /* end switch */ + + /* Try several different methods of deleting objects */ + for(del_dir = FHEAP_DEL_FORWARD; del_dir < FHEAP_DEL_NDIRS; H5_INC_ENUM(fheap_test_del_dir_t, del_dir)) { + tparam.del_dir = del_dir; + + /* Test 'huge' object insert & delete */ + nerrors += test_huge_insert_one(fapl, &small_cparam, &tparam); + nerrors += test_huge_insert_two(fapl, &small_cparam, &tparam); + nerrors += test_huge_insert_three(fapl, &small_cparam, &tparam); + nerrors += test_huge_insert_mix(fapl, &small_cparam, &tparam); + nerrors += test_filtered_huge(fapl, &small_cparam, &tparam); + + /* Test 'tiny' object insert & delete */ + nerrors += test_tiny_insert_one(fapl, &small_cparam, &tparam); + nerrors += test_tiny_insert_two(fapl, &small_cparam, &tparam); + nerrors += test_tiny_insert_mix(fapl, &small_cparam, &tparam); + } /* end for */ + } /* end for */ + + /* Reset the "normal" heap ID lengths */ + small_cparam.id_len = 0; + tparam.actual_id_len = HEAP_ID_LEN; + } /* end block */ + + /* Test I/O filter support */ /* Try several different methods of deleting objects */ + { + fheap_test_del_dir_t del_dir; /* Deletion direction */ + for(del_dir = FHEAP_DEL_FORWARD; del_dir < FHEAP_DEL_NDIRS; H5_INC_ENUM(fheap_test_del_dir_t, del_dir)) { tparam.del_dir = del_dir; - /* Test 'huge' object insert & delete */ - nerrors += test_huge_insert_one(fapl, &small_cparam, &tparam); - nerrors += test_huge_insert_two(fapl, &small_cparam, &tparam); - nerrors += test_huge_insert_three(fapl, &small_cparam, &tparam); - nerrors += test_huge_insert_mix(fapl, &small_cparam, &tparam); - nerrors += test_filtered_huge(fapl, &small_cparam, &tparam); - - /* Test 'tiny' object insert & delete */ - nerrors += test_tiny_insert_one(fapl, &small_cparam, &tparam); - nerrors += test_tiny_insert_two(fapl, &small_cparam, &tparam); - nerrors += test_tiny_insert_mix(fapl, &small_cparam, &tparam); + /* Controlled tests */ + /* XXX: Re-enable file size checks in these tests, after the file has persistent free space tracking working */ + nerrors += test_filtered_man_root_direct(fapl, &small_cparam, &tparam); + nerrors += test_filtered_man_root_indirect(fapl, &small_cparam, &tparam); + + /* Random tests, with compressed blocks */ + tparam.comp = FHEAP_TEST_COMPRESS; + nerrors += test_random((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(50*1000*1000) : (hsize_t)(25*1000*1000)), fapl, &small_cparam, &tparam); + nerrors += test_random_pow2((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(50*1000*1000) : (hsize_t)(2*1000*1000)), fapl, &small_cparam, &tparam); + + /* Reset block compression */ + tparam.comp = FHEAP_TEST_NO_COMPRESS; } /* end for */ - } /* end for */ + } /* end block */ + + /* Random object insertion & deletion */ + if(ExpressMode > 1) + printf("***Express test mode on. Some tests skipped\n"); + else { + /* Random tests using "small" heap creation parameters */ + puts("Using 'small' heap creation parameters"); + + /* (reduce size of tests when re-opening each time) */ + /* XXX: Try to speed things up enough that these tests don't have to be reduced when re-opening */ + tparam.del_dir = FHEAP_DEL_FORWARD; + nerrors += test_random((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(50*1000*1000)), fapl, &small_cparam, &tparam); + nerrors += test_random_pow2((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(4*1000*1000)), fapl, &small_cparam, &tparam); + + tparam.del_dir = FHEAP_DEL_HEAP; + nerrors += test_random((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(50*1000*1000)), fapl, &small_cparam, &tparam); + nerrors += test_random_pow2((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(4*1000*1000)), fapl, &small_cparam, &tparam); - /* Reset the "normal" heap ID lengths */ - small_cparam.id_len = 0; - tparam.actual_id_len = HEAP_ID_LEN; - } /* end block */ + /* Random tests using "large" heap creation parameters */ + puts("Using 'large' heap creation parameters"); + tparam.actual_id_len = LARGE_HEAP_ID_LEN; - /* Test I/O filter support */ + /* (reduce size of tests when re-opening each time) */ + /* XXX: Try to speed things up enough that these tests don't have to be reduced when re-opening */ + tparam.del_dir = FHEAP_DEL_FORWARD; + nerrors += test_random((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(50*1000*1000)), fapl, &large_cparam, &tparam); + nerrors += test_random_pow2((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(4*1000*1000)), fapl, &large_cparam, &tparam); - /* Try several different methods of deleting objects */ - { - fheap_test_del_dir_t del_dir; /* Deletion direction */ + tparam.del_dir = FHEAP_DEL_HEAP; + nerrors += test_random((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(50*1000*1000)), fapl, &large_cparam, &tparam); + nerrors += test_random_pow2((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(4*1000*1000)), fapl, &large_cparam, &tparam); - for(del_dir = FHEAP_DEL_FORWARD; del_dir < FHEAP_DEL_NDIRS; H5_INC_ENUM(fheap_test_del_dir_t, del_dir)) { - tparam.del_dir = del_dir; + /* Reset the "normal" heap ID length */ + tparam.actual_id_len = SMALL_HEAP_ID_LEN; + } /* end else */ - /* Controlled tests */ -/* XXX: Re-enable file size checks in these tests, after the file has persistent free space tracking working */ - nerrors += test_filtered_man_root_direct(fapl, &small_cparam, &tparam); - nerrors += test_filtered_man_root_indirect(fapl, &small_cparam, &tparam); + /* Test object writing support */ - /* Random tests, with compressed blocks */ + /* Basic object writing */ + nerrors += test_write(fapl, &small_cparam, &tparam); + + /* Writing objects in heap with filters */ tparam.comp = FHEAP_TEST_COMPRESS; - nerrors += test_random((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(50*1000*1000) : (hsize_t)(25*1000*1000)), fapl, &small_cparam, &tparam); - nerrors += test_random_pow2((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(50*1000*1000) : (hsize_t)(2*1000*1000)), fapl, &small_cparam, &tparam); + nerrors += test_write(fapl, &small_cparam, &tparam); /* Reset block compression */ tparam.comp = FHEAP_TEST_NO_COMPRESS; } /* end for */ - } /* end block */ - - /* Random object insertion & deletion */ - if(ExpressMode > 1) - printf("***Express test mode on. Some tests skipped\n"); - else { - /* Random tests using "small" heap creation parameters */ - puts("Using 'small' heap creation parameters"); - - /* (reduce size of tests when re-opening each time) */ -/* XXX: Try to speed things up enough that these tests don't have to be reduced when re-opening */ - tparam.del_dir = FHEAP_DEL_FORWARD; - nerrors += test_random((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(50*1000*1000)), fapl, &small_cparam, &tparam); - nerrors += test_random_pow2((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(4*1000*1000)), fapl, &small_cparam, &tparam); - - tparam.del_dir = FHEAP_DEL_HEAP; - nerrors += test_random((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(50*1000*1000)), fapl, &small_cparam, &tparam); - nerrors += test_random_pow2((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(4*1000*1000)), fapl, &small_cparam, &tparam); - - /* Random tests using "large" heap creation parameters */ - puts("Using 'large' heap creation parameters"); - tparam.actual_id_len = LARGE_HEAP_ID_LEN; - - /* (reduce size of tests when re-opening each time) */ -/* XXX: Try to speed things up enough that these tests don't have to be reduced when re-opening */ - tparam.del_dir = FHEAP_DEL_FORWARD; - nerrors += test_random((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(50*1000*1000)), fapl, &large_cparam, &tparam); - nerrors += test_random_pow2((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(4*1000*1000)), fapl, &large_cparam, &tparam); - - tparam.del_dir = FHEAP_DEL_HEAP; - nerrors += test_random((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(50*1000*1000)), fapl, &large_cparam, &tparam); - nerrors += test_random_pow2((curr_test == FHEAP_TEST_NORMAL ? (hsize_t)(100*1000*1000) : (hsize_t)(4*1000*1000)), fapl, &large_cparam, &tparam); - - /* Reset the "normal" heap ID length */ - tparam.actual_id_len = SMALL_HEAP_ID_LEN; - } /* end else */ - - /* Test object writing support */ - /* Basic object writing */ - nerrors += test_write(fapl, &small_cparam, &tparam); - - /* Writing objects in heap with filters */ - tparam.comp = FHEAP_TEST_COMPRESS; - nerrors += test_write(fapl, &small_cparam, &tparam); + if(H5Pclose(fcpl) < 0) + TEST_ERROR + } /* end num_pb_fs */ - /* Reset block compression */ - tparam.comp = FHEAP_TEST_NO_COMPRESS; - } /* end for */ + /* Tests that address specific bugs */ + tparam.my_fcpl = def_fcpl; + fapl = def_fapl; /* Tests that address specific bugs */ nerrors += test_bug1(fapl, &small_cparam, &tparam); @@ -16763,12 +16827,12 @@ main(void) H5MM_xfree(shared_lens_g); H5MM_xfree(shared_offs_g); - if(H5Pclose(fcpl) < 0) TEST_ERROR - if(H5Pclose(fcpl2) < 0) TEST_ERROR + if(H5Pclose(def_fcpl) < 0) TEST_ERROR + if(H5Pclose(pb_fapl) < 0) TEST_ERROR /* Clean up file used */ #ifndef QAK - h5_cleanup(FILENAME, fapl); + h5_cleanup(FILENAME, def_fapl); #else /* QAK */ HDfprintf(stderr, "Uncomment cleanup!\n"); #endif /* QAK */ @@ -16783,7 +16847,10 @@ error: H5MM_xfree(shared_ids_g); H5MM_xfree(shared_lens_g); H5MM_xfree(shared_offs_g); - H5Pclose(fapl); + H5Pclose(def_fapl); + H5Pclose(pb_fapl); + H5Pclose(def_fcpl); + H5Pclose(fcpl); } H5E_END_TRY; return 1; } /* end main() */ diff --git a/test/set_extent.c b/test/set_extent.c index 17dc6a0..949120b 100644 --- a/test/set_extent.c +++ b/test/set_extent.c @@ -2603,10 +2603,12 @@ static int test_random_rank4( hid_t fapl, hid_t dcpl, hbool_t do_fillvalue, volatile unsigned i, j, k, l, m; /* Local indices */ char filename[NAME_BUF_SIZE]; - /*!FIXME Skip the test if a fixed array index is requested, as resizing - * fixed arrays is broken now. Extensible arrays are also broken. Remove - * these lines as appropriate when these problems are fixed. */ - /* Fixed Array index type is now fixed */ + /* *** FIXME *** + * Skip the test if an extensible array index is requested, as resizing + * them is broken. + * + * Remove these lines as appropriate when these problems are fixed. + */ if(index_type == RANK4_INDEX_EARRAY) return 0; @@ -2814,10 +2816,13 @@ static int test_random_rank4_vl( hid_t fapl, hid_t dcpl, hbool_t do_fillvalue, volatile unsigned i, j, k, l, m; /* Local indices */ char filename[NAME_BUF_SIZE]; - /*!FIXME Skip the test if a fixed array index is requested, as resizing - * fixed arrays is broken now. Extensible arrays are also broken. Remove - * these lines as appropriate when these problems are fixed. */ - if(index_type == RANK4_INDEX_FARRAY || index_type == RANK4_INDEX_EARRAY) + /* *** FIXME *** + * Skip the test if an extensible array index is requested, as resizing + * them is broken. + * + * Remove these lines as appropriate when these problems are fixed. + */ + if(index_type == RANK4_INDEX_EARRAY) return 0; /* Initialize fill value buffers so they aren't freed in case of an error */ |