diff options
89 files changed, 4665 insertions, 2253 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index dc6a94f..a9a759f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -642,45 +642,42 @@ if (H5_HAVE_PARALLEL) endif () endif () -set (DEFAULT_API_VERSION "v110") +#option (DEFAULT_API_VERSION "Enable v1.12 API (v16, v18, v110, v112)" "v112") +set (DEFAULT_API_VERSION "v112" CACHE STRING "Enable v1.12 API (v16, v18, v110, v112)") +set_property (CACHE DEFAULT_API_VERSION PROPERTY STRINGS v16 v18 v110 v112) #----------------------------------------------------------------------------- # Option to use 1.6.x API #----------------------------------------------------------------------------- -option (HDF5_USE_16_API_DEFAULT "Use the HDF5 1.6.x API by default" OFF) set (H5_USE_16_API_DEFAULT 0) -if (HDF5_USE_16_API_DEFAULT) +if (DEFAULT_API_VERSION MATCHES "v16") set (H5_USE_16_API_DEFAULT 1) - set (DEFAULT_API_VERSION "v16") endif () #----------------------------------------------------------------------------- # Option to use 1.8.x API #----------------------------------------------------------------------------- -option (HDF5_USE_18_API_DEFAULT "Use the HDF5 1.8.x API by default" OFF) set (H5_USE_18_API_DEFAULT 0) -if (HDF5_USE_18_API_DEFAULT) +if (DEFAULT_API_VERSION MATCHES "v18") set (H5_USE_18_API_DEFAULT 1) - set (DEFAULT_API_VERSION "v18") endif () #----------------------------------------------------------------------------- # Option to use 1.10.x API #----------------------------------------------------------------------------- -option (HDF5_USE_110_API_DEFAULT "Use the HDF5 1.10.x API by default" OFF) set (H5_USE_110_API_DEFAULT 0) -if (HDF5_USE_110_API_DEFAULT) +if (DEFAULT_API_VERSION MATCHES "v110") set (H5_USE_110_API_DEFAULT 1) - set (DEFAULT_API_VERSION "v110") endif () #----------------------------------------------------------------------------- # Option to use 1.12.x API #----------------------------------------------------------------------------- -option (HDF5_USE_112_API_DEFAULT "Use the HDF5 1.12.x API by default" ON) +if (NOT DEFAULT_API_VERSION) + set (DEFAULT_API_VERSION "v112") +endif () set (H5_USE_112_API_DEFAULT 0) -if (HDF5_USE_112_API_DEFAULT) +if (DEFAULT_API_VERSION MATCHES "v112") set (H5_USE_112_API_DEFAULT 1) - set (DEFAULT_API_VERSION "v112") endif () #----------------------------------------------------------------------------- @@ -709,6 +706,7 @@ if (NOT HDF5_EXTERNALLY_CONFIGURED) endif () endif () endif () + #----------------------------------------------------------------------------- # Option to use threadsafe #----------------------------------------------------------------------------- @@ -763,6 +761,14 @@ if (HDF5_ENABLE_THREADSAFE) endif () #----------------------------------------------------------------------------- +# Option to build the map API +#----------------------------------------------------------------------------- +option (HDF5_ENABLE_MAP_API "Build the map API" OFF) +if (HDF5_ENABLE_MAP_API) + set (H5_HAVE_MAP_API 1) +endif () + +#----------------------------------------------------------------------------- # Add the HDF5 Library Target to the build #----------------------------------------------------------------------------- add_subdirectory (src) @@ -481,6 +481,7 @@ ./src/H5err.txt ./src/H5detect.c ./src/H5make_libsettings.c +./src/H5mpi.c ./src/H5overflow.txt ./src/H5private.h ./src/H5public.h @@ -749,6 +750,11 @@ ./src/H5Lpkg.h ./src/H5Lprivate.h ./src/H5Lpublic.h +./src/H5M.c +./src/H5Mmodule.h +./src/H5Mpkg.h +./src/H5Mprivate.h +./src/H5Mpublic.h ./src/H5MF.c ./src/H5MFaggr.c ./src/H5MFdbg.c @@ -820,6 +826,8 @@ ./src/H5Pint.c ./src/H5Plapl.c ./src/H5Plcpl.c +./src/H5Pmapl.c +./src/H5Pmcpl.c ./src/H5Pmodule.h ./src/H5Pocpl.c ./src/H5Pocpypl.c @@ -150,6 +150,7 @@ $Source = ""; "H5L_class_t" => "x", "H5L_elink_traverse_t" => "x", "H5L_iterate_t" => "x", + "H5M_iterate_t" => 'x', "H5MM_allocate_t" => "x", "H5MM_free_t" => "x", "H5O_info_t" => "x", diff --git a/config/cmake/H5pubconf.h.in b/config/cmake/H5pubconf.h.in index cb05974..120c023 100644 --- a/config/cmake/H5pubconf.h.in +++ b/config/cmake/H5pubconf.h.in @@ -267,6 +267,9 @@ /* Define to 1 if you have the <mach/mach_time.h> header file. */ #cmakedefine H5_HAVE_MACH_MACH_TIME_H @H5_HAVE_MACH_MACH_TIME_H@ +/* Define if the map API (H5M) should be compiled */ +#cmakedefine H5_HAVE_MAP_API @H5_HAVE_MAP_API@ + /* Define to 1 if you have the <memory.h> header file. */ #cmakedefine H5_HAVE_MEMORY_H @H5_HAVE_MEMORY_H@ diff --git a/configure.ac b/configure.ac index 3d6ab10..7f1f0dd 100644 --- a/configure.ac +++ b/configure.ac @@ -2766,6 +2766,32 @@ if test -n "$PARALLEL"; then fi ## ---------------------------------------------------------------------- +## Check if the map API is enabled by --enable-map-api +## +AC_SUBST([MAP_API]) + +## Default is no map API +MAP_API=no + +AC_MSG_CHECKING([if the map API (H5M) is enabled]) + +AC_ARG_ENABLE([map-api], + [AS_HELP_STRING([--enable-map-api], + [Build the map API (H5M). + This is not yet supported in the native file format + and requires a VOL connector that supports it. + [default=no]])], + [MAP_API=$enableval], [MAP_API=no]) + +if test "X$MAP_API" = "Xyes"; then + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_MAP_API], [1], + [Define if the map API (H5M) should be compiled]) +else + AC_MSG_RESULT([no]) +fi + +## ---------------------------------------------------------------------- ## Check if Direct I/O driver is enabled by --enable-direct-vfd ## AC_SUBST([DIRECT_VFD]) diff --git a/java/examples/groups/JavaGroupExample.sh.in b/java/examples/groups/JavaGroupExample.sh.in index 9d4673f..acc606f 100644 --- a/java/examples/groups/JavaGroupExample.sh.in +++ b/java/examples/groups/JavaGroupExample.sh.in @@ -179,17 +179,9 @@ COPY_DATAFILES_TO_BLDDIR() CLEAN_DATAFILES_AND_BLDDIR() { - $RM $BLDDIR/examples.groups.H5Ex_G_*.txt - $RM $BLDDIR/H5Ex_G_*.out - $RM $BLDDIR/H5Ex_G_*.h5 - $RM $BLDDIR/h5ex_g_*.h5 - SDIR=`$DIRNAME $tstfile` - INODE_SDIR=`$LS -i -d $SDIR | $AWK -F' ' '{print $1}'` - INODE_DDIR=`$LS -i -d $BLDDIR | $AWK -F' ' '{print $1}'` - if [ "$INODE_SDIR" != "$INODE_DDIR" ]; then SDIR=`$DIRNAME $tstfile` - $RM $BLDDIR/h5ex_g_iterate.h5 - $RM $BLDDIR/h5ex_g_visit.h5 - fi + $RM $BLDDIR/examples.groups.H5Ex_G_*.txt + $RM $BLDDIR/H5Ex_G_*.out + $RM $BLDDIR/H5Ex_G_*.h5 } COPY_ITERFILES="$LIST_ITER_FILES" diff --git a/release_docs/INSTALL_CMake.txt b/release_docs/INSTALL_CMake.txt index 4bba5e8..49fef76 100644 --- a/release_docs/INSTALL_CMake.txt +++ b/release_docs/INSTALL_CMake.txt @@ -652,10 +652,7 @@ HDF5_STRICT_FORMAT_CHECKS "Whether to perform strict file format checks" HDF_TEST_EXPRESS "Control testing framework (0-3)" "0" HDF5_TEST_VFD "Execute tests with different VFDs" OFF HDF5_TEST_PASSTHROUGH_VOL "Execute tests with different passthrough VOL connectors" OFF -HDF5_USE_16_API_DEFAULT "Use the HDF5 1.6.x API by default" OFF -HDF5_USE_18_API_DEFAULT "Use the HDF5 1.8.x API by default" OFF -HDF5_USE_110_API_DEFAULT "Use the HDF5 1.10.x API by default" OFF -HDF5_USE_112_API_DEFAULT "Use the HDF5 1.12.x API by default" ON +DEFAULT_API_VERSION "Enable default API (v16, v18, v110, v112)" "v112" HDF5_USE_FOLDERS "Enable folder grouping of projects in IDEs." ON HDF5_WANT_DATA_ACCURACY "IF data accuracy is guaranteed during data conversions" ON HDF5_WANT_DCONV_EXCEPTION "exception handling functions is checked during data conversions" ON @@ -668,13 +665,13 @@ if (HDF5_TEST_VFD) HDF5_TEST_FHEAP_VFD "Execute fheap test with different VFDs" ON ---------------- External Library Options --------------------- -HDF5_ALLOW_EXTERNAL_SUPPORT "Allow External Library Building" "NO" -HDF5_ENABLE_SZIP_SUPPORT "Use SZip Filter" OFF -HDF5_ENABLE_Z_LIB_SUPPORT "Enable Zlib Filters" OFF -ZLIB_USE_EXTERNAL "Use External Library Building for ZLIB" 0 -SZIP_USE_EXTERNAL "Use External Library Building for SZIP" 0 +HDF5_ALLOW_EXTERNAL_SUPPORT "Allow External Library Building (NO GIT TGZ)" "NO" +HDF5_ENABLE_SZIP_SUPPORT "Use SZip Filter" OFF +HDF5_ENABLE_Z_LIB_SUPPORT "Enable Zlib Filters" OFF +ZLIB_USE_EXTERNAL "Use External Library Building for ZLIB" 0 +SZIP_USE_EXTERNAL "Use External Library Building for SZIP" 0 if (HDF5_ENABLE_SZIP_SUPPORT) - HDF5_ENABLE_SZIP_ENCODING "Use SZip Encoding" OFF + HDF5_ENABLE_SZIP_ENCODING "Use SZip Encoding" OFF if (WINDOWS) H5_DEFAULT_PLUGINDIR "%ALLUSERSPROFILE%/hdf5/lib/plugin" else () diff --git a/release_docs/RELEASE.txt b/release_docs/RELEASE.txt index b4fa11c..b940095 100644 --- a/release_docs/RELEASE.txt +++ b/release_docs/RELEASE.txt @@ -191,6 +191,11 @@ New Features Library: -------- + - Add new API H5M for map objects. Currently not supported by native + library, can be supported by VOL connectors. + + (NAF - 2019/03/01) + - Improved the performance of virtual dataset I/O Refactored the internal dataspace routines used by the virtual dataset @@ -321,6 +326,23 @@ Bug Fixes since HDF5-1.10.3 release Library ------- + - Fixed the test failure from test_metadata_read_retry_info() in + test/swmr.c + + The test failure is due to the incorrect number of bins returned for + retry info (info.nbins). The # of bins expected for 101 read attempts + is 3 instead of 2. The routine H5F_set_retries() in src/H5Fint.c + calculates the # of bins by first obtaining the log10 value for + (read attempts - 1). For PGI/19, the log10 value for 100 read attempts + is 1.9999999999999998 instead of 2.00000. When casting the log10 value + to unsigned later on, the decimal part is chopped off causing the test + failure. + + This was fixed by obtaining the rounded integer value (HDceil) for the + log10 value of read attempts first before casting the result to unsigned. + + (VC - 2019/8/14, HDFFV-10813) + - Fixed an issue where creating a file with non-default file space info together with library high bound setting to H5F_LIBVER_V18. @@ -492,7 +514,13 @@ Bug Fixes since HDF5-1.10.3 release Configuration ------------- - - + - Correct option for default API version + + CMake options for default API version are not mutually exclusive. + Change the multiple BOOL options to a single STRING option with the + strings; v16, v18, v110, v112. + + (ADB - 2019/08/12, HDFFV-10879) Performance ------------- diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2b693bd..313d231 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -8,6 +8,7 @@ set (H5_SOURCES ${HDF5_SRC_DIR}/H5.c ${HDF5_SRC_DIR}/H5checksum.c ${HDF5_SRC_DIR}/H5dbg.c + ${HDF5_SRC_DIR}/H5mpi.c ${HDF5_SRC_DIR}/H5system.c ${HDF5_SRC_DIR}/H5timer.c ${HDF5_SRC_DIR}/H5trace.c @@ -393,6 +394,15 @@ set (H5L_HDRS IDE_GENERATED_PROPERTIES ("H5L" "${H5L_HDRS}" "${H5L_SOURCES}" ) +set (H5M_SOURCES + ${HDF5_SRC_DIR}/H5M.c +) +set (H5M_HDRS + ${HDF5_SRC_DIR}/H5Mpublic.h +) +IDE_GENERATED_PROPERTIES ("H5M" "${H5M_HDRS}" "${H5M_SOURCES}") + + set (H5MF_SOURCES ${HDF5_SRC_DIR}/H5MF.c ${HDF5_SRC_DIR}/H5MFaggr.c @@ -483,6 +493,8 @@ set (H5P_SOURCES ${HDF5_SRC_DIR}/H5Pint.c ${HDF5_SRC_DIR}/H5Plapl.c ${HDF5_SRC_DIR}/H5Plcpl.c + ${HDF5_SRC_DIR}/H5Pmapl.c + ${HDF5_SRC_DIR}/H5Pmcpl.c ${HDF5_SRC_DIR}/H5Pocpl.c ${HDF5_SRC_DIR}/H5Pocpypl.c ${HDF5_SRC_DIR}/H5Pstrcpl.c @@ -716,6 +728,7 @@ set (common_SRCS ${H5HP_SOURCES} ${H5I_SOURCES} ${H5L_SOURCES} + ${H5M_SOURCES} ${H5MF_SOURCES} ${H5MM_SOURCES} ${H5MP_SOURCES} @@ -759,6 +772,7 @@ set (H5_PUBLIC_HEADERS ${H5HL_HDRS} ${H5I_HDRS} ${H5L_HDRS} + ${H5M_HDRS} ${H5MF_HDRS} ${H5MM_HDRS} ${H5MP_HDRS} @@ -845,6 +859,9 @@ set (H5_PRIVATE_HEADERS ${HDF5_SRC_DIR}/H5Lpkg.h ${HDF5_SRC_DIR}/H5Lprivate.h + ${HDF5_SRC_DIR}/H5Mpkg.h + ${HDF5_SRC_DIR}/H5Mprivate.h + ${HDF5_SRC_DIR}/H5MFprivate.h ${HDF5_SRC_DIR}/H5MMprivate.h @@ -166,6 +166,7 @@ H5_init_library(void) H5_debug_g.pkg[H5_PKG_HG].name = "hg"; H5_debug_g.pkg[H5_PKG_HL].name = "hl"; H5_debug_g.pkg[H5_PKG_I].name = "i"; + H5_debug_g.pkg[H5_PKG_M].name = "m"; H5_debug_g.pkg[H5_PKG_MF].name = "mf"; H5_debug_g.pkg[H5_PKG_MM].name = "mm"; H5_debug_g.pkg[H5_PKG_O].name = "o"; @@ -312,6 +313,7 @@ H5_term_library(void) pending += DOWN(A_top); pending += DOWN(D_top); pending += DOWN(G_top); + pending += DOWN(M_top); pending += DOWN(R_top); pending += DOWN(S_top); pending += DOWN(T_top); @@ -337,6 +339,7 @@ H5_term_library(void) pending += DOWN(A); pending += DOWN(D); pending += DOWN(G); + pending += DOWN(M); pending += DOWN(R); pending += DOWN(S); pending += DOWN(T); diff --git a/src/H5ACmpio.c b/src/H5ACmpio.c index b60b933..e4b81fa 100644 --- a/src/H5ACmpio.c +++ b/src/H5ACmpio.c @@ -821,9 +821,8 @@ H5AC__log_cleaned_entry(const H5AC_info_t *entry_ptr) { H5AC_t * cache_ptr; H5AC_aux_t * aux_ptr; - herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_PACKAGE + FUNC_ENTER_PACKAGE_NOERR /* Sanity check */ HDassert(entry_ptr); @@ -853,8 +852,7 @@ H5AC__log_cleaned_entry(const H5AC_info_t *entry_ptr) /* Decrement the dirty byte count */ aux_ptr->dirty_bytes -= entry_ptr->size; -done: - FUNC_LEAVE_NOAPI(ret_value) + FUNC_LEAVE_NOAPI(SUCCEED) } /* H5AC__log_cleaned_entry() */ diff --git a/src/H5FDhdfs.c b/src/H5FDhdfs.c index e3e11b2..83d0202 100644 --- a/src/H5FDhdfs.c +++ b/src/H5FDhdfs.c @@ -130,6 +130,8 @@ typedef struct { #endif /* HDFS_STATS */ +#ifdef H5_HAVE_LIBHDFS + /* "unique" identifier for `hdfs_t` structures. * Randomly generated by unweighted dice rolls. */ @@ -143,7 +145,7 @@ typedef struct { * Purpose: * * Contain/retain information associated with a file hosted on Hadoop - * Distributed File System (HDFS). Instantiated and populated via + * Distributed File System (HDFS). Instantiated and populated via * `H5FD_hdfs_handle_open()` and cleaned up via `H5FD_hdfs_handle_close()`. * * @@ -179,14 +181,11 @@ typedef struct { */ typedef struct { unsigned long magic; -#ifdef H5_HAVE_LIBHDFS hdfsFS filesystem; hdfsFileInfo *fileinfo; - hdfsFile file; -#endif + hdfsFile file; } hdfs_t; -#ifdef H5_HAVE_LIBHDFS /*-------------------------------------------------------------------------- * Function: H5FD_hdfs_handle_open @@ -274,7 +273,7 @@ H5FD_hdfs_handle_open( "hdfsGetPathInfo failed") } handle->file = hdfsOpenFile( - handle->filesystem, + handle->filesystem, path, O_RDONLY, stream_buffer_size, @@ -292,18 +291,18 @@ done: /* error; clean up */ HDassert(handle->magic == HDFS_HDFST_MAGIC); handle->magic++; - if (handle->file != NULL) { + if (handle->file != NULL) { if (FAIL == (hdfsCloseFile(handle->filesystem, handle->file))) { - HDONE_ERROR(H5E_VFL, H5E_CANTCLOSEFILE, NULL, + HDONE_ERROR(H5E_VFL, H5E_CANTCLOSEFILE, NULL, "unable to close hdfs file handle") } } - if (handle->fileinfo != NULL) { + if (handle->fileinfo != NULL) { hdfsFreeFileInfo(handle->fileinfo, 1); } - if (handle->filesystem != NULL) { + if (handle->filesystem != NULL) { if (FAIL == (hdfsDisconnect(handle->filesystem))) { - HDONE_ERROR(H5E_VFL, H5E_CANTCLOSEFILE, NULL, + HDONE_ERROR(H5E_VFL, H5E_CANTCLOSEFILE, NULL, "unable to disconnect from hdfs") } } @@ -351,18 +350,18 @@ H5FD_hdfs_handle_close(hdfs_t *handle) } handle->magic++; - if (handle->file != NULL) { + if (handle->file != NULL) { if (FAIL == (hdfsCloseFile(handle->filesystem, handle->file))) { - HDONE_ERROR(H5E_VFL, H5E_CANTCLOSEFILE, FAIL, + HDONE_ERROR(H5E_VFL, H5E_CANTCLOSEFILE, FAIL, "unable to close hdfs file handle") } } - if (handle->fileinfo != NULL) { + if (handle->fileinfo != NULL) { hdfsFreeFileInfo(handle->fileinfo, 1); } - if (handle->filesystem != NULL) { + if (handle->filesystem != NULL) { if (FAIL == (hdfsDisconnect(handle->filesystem))) { - HDONE_ERROR(H5E_VFL, H5E_CANTCLOSEFILE, FAIL, + HDONE_ERROR(H5E_VFL, H5E_CANTCLOSEFILE, FAIL, "unable to disconnect hdfs file system") } } @@ -373,6 +372,7 @@ done: FUNC_LEAVE_NOAPI(ret_value) } /* H5FD_hdfs_close() */ + #endif /* H5_HAVE_LIBHDFS */ @@ -382,9 +382,9 @@ done: * * Purpose: * - * H5FD_hdfs_t is a structure used to store all information needed to + * H5FD_hdfs_t is a structure used to store all information needed to * maintain R/O access to a single HDF5 file in an HDFS file system. - * This structure is created when such a file is "opened" and + * This structure is created when such a file is "opened" and * discarded when it is "closed". * * @@ -396,7 +396,7 @@ done: * * `fa` (H5FD_hdfs_fapl_t) * - * Instance of `H5FD_hdfs_fapl_t` containing the HDFS configuration data + * Instance of `H5FD_hdfs_fapl_t` containing the HDFS configuration data * needed to "open" the HDF5 file. * * `eoa` (haddr_t) @@ -405,9 +405,9 @@ done: * equal the file size. * * `hdfs_handle` (hdfs_t *) - * + * * Instance of HDFS Request handle associated with the target resource. - * Responsible for communicating with remote host and presenting file + * Responsible for communicating with remote host and presenting file * contents as indistinguishable from a file on the local filesystem. * * *** present only if HDFS_SATS is flagged to enable stats collection *** @@ -456,10 +456,13 @@ typedef struct H5FD_hdfs_t { * ADDR_OVERFLOW: Checks whether a file address of type `haddr_t' * is too large to be represented by the second argument * of the file seek function. + * Only included if HDFS code should compile. * */ #define MAXADDR (((haddr_t)1<<(8*sizeof(HDoff_t)-1))-1) +#ifdef H5_HAVE_LIBHDFS #define ADDR_OVERFLOW(A) (HADDR_UNDEF==(A) || ((A) & ~(haddr_t)MAXADDR)) +#endif /* H5_HAVE_LIBHDFS */ /* Prototypes */ static herr_t H5FD_hdfs_term(void); @@ -474,13 +477,13 @@ static herr_t H5FD_hdfs_query(const H5FD_t *_f1, unsigned long *flags); static haddr_t H5FD_hdfs_get_eoa(const H5FD_t *_file, H5FD_mem_t type); static herr_t H5FD_hdfs_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t addr); static haddr_t H5FD_hdfs_get_eof(const H5FD_t *_file, H5FD_mem_t type); -static herr_t H5FD_hdfs_get_handle(H5FD_t *_file, hid_t fapl, +static herr_t H5FD_hdfs_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle); -static herr_t H5FD_hdfs_read(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, +static herr_t H5FD_hdfs_read(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, haddr_t addr, size_t size, void *buf); -static herr_t H5FD_hdfs_write(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, +static herr_t H5FD_hdfs_write(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, haddr_t addr, size_t size, const void *buf); -static herr_t H5FD_hdfs_truncate(H5FD_t *_file, hid_t dxpl_id, +static herr_t H5FD_hdfs_truncate(H5FD_t *_file, hid_t dxpl_id, hbool_t closing); static herr_t H5FD_hdfs_lock(H5FD_t *_file, hbool_t rw); static herr_t H5FD_hdfs_unlock(H5FD_t *_file); @@ -521,8 +524,10 @@ static const H5FD_class_t H5FD_hdfs_g = { H5FD_FLMAP_DICHOTOMY /* fl_map */ }; +#ifdef H5_HAVE_LIBHDFS /* Declare a free list to manage the H5FD_hdfs_t struct */ H5FL_DEFINE_STATIC(H5FD_hdfs_t); +#endif /* H5_HAVE_LIBHDFS */ /*------------------------------------------------------------------------- @@ -545,7 +550,7 @@ H5FD__init_package(void) FUNC_ENTER_STATIC if (H5FD_hdfs_init() < 0) { - HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, + HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "unable to initialize hdfs VFD") } @@ -643,8 +648,8 @@ H5FD_hdfs_term(void) * Function: H5Pset_fapl_hdfs * * Purpose: Modify the file access property list to use the H5FD_HDFS - * driver defined in this source file. All driver specfic - * properties are passed in as a pointer to a suitably + * driver defined in this source file. All driver specfic + * properties are passed in as a pointer to a suitably * initialized instance of H5FD_hdfs_fapl_t * * Return: SUCCEED/FAIL @@ -658,7 +663,7 @@ H5FD_hdfs_term(void) *------------------------------------------------------------------------- */ herr_t -H5Pset_fapl_hdfs(hid_t fapl_id, +H5Pset_fapl_hdfs(hid_t fapl_id, H5FD_hdfs_fapl_t *fa) { H5P_genplist_t *plist = NULL; /* Property list pointer */ @@ -674,7 +679,7 @@ H5Pset_fapl_hdfs(hid_t fapl_id, #endif plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS); - if (plist == NULL) { + if (plist == NULL) { HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, \ "not a file access property list") } @@ -699,12 +704,12 @@ done: * contains internally consistant data. Return SUCCEED if so, * and FAIL otherwise. * - * Note the difference between internally consistant and - * correct. As we will have to try to access the target + * Note the difference between internally consistant and + * correct. As we will have to try to access the target * object to determine whether the supplied data is correct, * we will settle for internal consistancy at this point * - * Return: SUCCEED if instance of H5FD_hdfs_fapl_t contains internally + * Return: SUCCEED if instance of H5FD_hdfs_fapl_t contains internally * consistant data, FAIL otherwise. * * Programmer: Jacob Smith @@ -761,7 +766,7 @@ done: *------------------------------------------------------------------------- */ herr_t -H5Pget_fapl_hdfs(hid_t fapl_id, +H5Pget_fapl_hdfs(hid_t fapl_id, H5FD_hdfs_fapl_t *fa_out) { const H5FD_hdfs_fapl_t *fa = NULL; @@ -832,7 +837,7 @@ H5FD_hdfs_fapl_get(H5FD_t *_file) fa = (H5FD_hdfs_fapl_t *)H5MM_calloc(sizeof(H5FD_hdfs_fapl_t)); if (fa == NULL) { - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") } @@ -878,7 +883,7 @@ H5FD_hdfs_fapl_copy(const void *_old_fa) new_fa = (H5FD_hdfs_fapl_t *)H5MM_malloc(sizeof(H5FD_hdfs_fapl_t)); if (new_fa == NULL) { - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") } @@ -916,7 +921,7 @@ H5FD_hdfs_fapl_free(void *_fa) FUNC_ENTER_NOAPI_NOINIT_NOERR - HDassert(fa != NULL); /* sanity check */ + HDassert(fa != NULL); /* sanity check */ H5MM_xfree(fa); @@ -994,11 +999,11 @@ done: * Create and/or opens a file as an HDF5 file. * * Any flag except H5F_ACC_RDONLY will cause an error. - * + * * Return: * - * Success: A pointer to a new file data structure. - * The public fields will be initialized by the caller, which is + * Success: A pointer to a new file data structure. + * The public fields will be initialized by the caller, which is * always H5FD_open(). * * Failure: NULL @@ -1010,26 +1015,21 @@ done: * *------------------------------------------------------------------------- */ +#ifdef H5_HAVE_LIBHDFS static H5FD_t * H5FD_hdfs_open( - const char *path, - unsigned flags, - hid_t fapl_id, + const char *path, + unsigned flags, + hid_t fapl_id, haddr_t maxaddr) { H5FD_t *ret_value = NULL; -#ifdef H5_HAVE_LIBHDFS H5FD_hdfs_t *file = NULL; hdfs_t *handle = NULL; H5FD_hdfs_fapl_t fa; -#endif FUNC_ENTER_NOAPI_NOINIT -#ifndef H5_HAVE_LIBHDFS - HGOTO_ERROR(H5E_VFL, H5E_UNSUPPORTED, NULL, - "Illegal open of unsupported virtual file (hdfs)"); -#else #if HDFS_DEBUG HDfprintf(stdout, "H5FD_hdfs_open() called.\n"); #endif /* HDFS_DEBUG */ @@ -1078,11 +1078,11 @@ H5FD_hdfs_open( HDassert(handle->magic == HDFS_HDFST_MAGIC); - /* create new file struct + /* create new file struct */ file = H5FL_CALLOC(H5FD_hdfs_t); if (file == NULL) { - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "unable to allocate file struct") } file->hdfs_handle = handle; @@ -1090,33 +1090,53 @@ H5FD_hdfs_open( #if HDFS_STATS if (FAIL == hdfs_reset_stats(file)) { - HGOTO_ERROR(H5E_INTERNAL, H5E_UNINITIALIZED, NULL, + HGOTO_ERROR(H5E_INTERNAL, H5E_UNINITIALIZED, NULL, "unable to reset file statistics") } #endif /* HDFS_STATS */ ret_value = (H5FD_t*)file; -#endif /* H5_HAVE_LIBHDFS */ done: -#ifdef H5_HAVE_LIBHDFS if (ret_value == NULL) { - if (handle != NULL) { + if (handle != NULL) { if (FAIL == H5FD_hdfs_handle_close(handle)) { - HDONE_ERROR(H5E_VFL, H5E_CANTCLOSEFILE, NULL, + HDONE_ERROR(H5E_VFL, H5E_CANTCLOSEFILE, NULL, "unable to close HDFS file handle") } } if (file != NULL) { file = H5FL_FREE(H5FD_hdfs_t, file); } - } /* if null return value (error) */ -#endif /* H5_HAVE_LIBHDFS */ + } /* end if null return value (error) */ + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5FD_hdfs_open() */ + +#else /* H5_HAVE_LIBHDFS not defined */ + +static H5FD_t * +H5FD_hdfs_open( + const char H5_ATTR_UNUSED *path, + unsigned H5_ATTR_UNUSED flags, + hid_t H5_ATTR_UNUSED fapl_id, + haddr_t H5_ATTR_UNUSED maxaddr) +{ + H5FD_t *ret_value = NULL; + + FUNC_ENTER_NOAPI_NOINIT + + HGOTO_ERROR(H5E_VFL, H5E_UNSUPPORTED, NULL, + "Illegal open of unsupported virtual file (hdfs)"); +done: FUNC_LEAVE_NOAPI(ret_value) } /* H5FD_hdfs_open() */ +#endif /* H5_HAVE_LIBHDFS */ + #if HDFS_STATS /*---------------------------------------------------------------------------- @@ -1124,7 +1144,7 @@ done: * Function: hdfs_fprint_stats() * * Purpose: - * + * * Tabulate and pretty-print statistics for this virtual file. * * Should be called upon file close. @@ -1145,17 +1165,17 @@ done: * - max (largest size read) * 2. tabulation of "bins", sepraring reads into exponentially-larger * ranges of size. - * - columns for number of reads, total bytes, and average size, with + * - columns for number of reads, total bytes, and average size, with * separate sub-colums for raw- and metadata reads. * - each row represents one bin, identified by the top of its range - * + * * Bin ranges can be modified with pound-defines at the top of this file. * * Bins without any reads in their bounds are not printed. * * An "overflow" bin is also present, to catch "big" reads. * - * Output for all bins (and range ceiling and average size report) + * Output for all bins (and range ceiling and average size report) * is divied by powers of 1024. By corollary, four digits before the decimal * is valid. * @@ -1216,36 +1236,6 @@ hdfs_fprint_stats( "hdfs handle has invalid magic") } - /* TODO: See what libhdfs exposes to us. */ - -#if 0 - if (file->s3r_handle->purl == NULL) { - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, - "parsed url structure cannot be null") - } - purl = file->s3r_handle->purl; - - /****************** - * PRINT FILENAME * - ******************/ - - HDfprintf(stream, "stats for %s://%s", purl->scheme, purl->host); - if (purl->port != NULL && purl->port[0] != '\0') { - HDfprintf(stream, ":%s", purl->port); - } - if (purl->query != NULL && purl->query[0] != '\0') { - if (purl->path != NULL && purl->path[0] != '\0') { - HDfprintf(stream, "/%s", purl->path); - } else { - HDfprintf(stream, "/"); - } - HDfprintf(stream, "?%s", purl->query); - } else if (purl->path != NULL && purl->path[0] != '\0') { - HDfprintf(stream, "/%s", purl->path); - } - HDfprintf(stream, "\n"); -#endif - /******************* * AGGREGATE STATS * *******************/ @@ -1254,18 +1244,22 @@ hdfs_fprint_stats( const hdfs_statsbin *r = &file->raw[i]; const hdfs_statsbin *m = &file->meta[i]; - if (m->min < min_meta) min_meta = m->min; - if (r->min < min_raw) min_raw = r->min; - if (m->max > max_meta) max_meta = m->max; - if (r->max > max_raw) max_raw = r->max; + if (m->min < min_meta) { min_meta = m->min; } + if (r->min < min_raw) { min_raw = r->min; } + if (m->max > max_meta) { max_meta = m->max; } + if (r->max > max_raw) { max_raw = r->max; } count_raw += r->count; count_meta += m->count; bytes_raw += r->bytes; bytes_meta += m->bytes; } - if (count_raw > 0) average_raw = (double)bytes_raw / (double)count_raw; - if (count_meta > 0) average_meta = (double)bytes_meta / (double)count_meta; + if (count_raw > 0) { + average_raw = (double)bytes_raw / (double)count_raw; + } + if (count_meta > 0) { + average_meta = (double)bytes_meta / (double)count_meta; + } /****************** * PRINT OVERVIEW * @@ -1342,9 +1336,9 @@ hdfs_fprint_stats( * PRINT INDIVIDUAL BIN STATS * ******************************/ - HDfprintf(stream, + HDfprintf(stream, "BINS # of reads total bytes average size\n"); - HDfprintf(stream, + HDfprintf(stream, " up-to meta raw meta raw meta raw\n"); for (i = 0; i <= HDFS_STATS_BIN_COUNT; i++) { @@ -1414,7 +1408,7 @@ hdfs_fprint_stats( HDassert(suffix_i < sizeof(suffixes)); HDfprintf( - stream, + stream, " %8.3f%c %7d %7d %8.3f%c %8.3f%c %8.3f%c %8.3f%c\n", re_dub, suffixes[suffix_i], /* bin ceiling */ m->count, /* metadata reads */ @@ -1428,7 +1422,6 @@ hdfs_fprint_stats( done: FUNC_LEAVE_NOAPI(ret_value); - } /* hdfs_fprint_stats */ #endif /* HDFS_STATS */ @@ -1442,7 +1435,7 @@ done: * Close an HDF5 file. * * Return: - * + * * SUCCEED/FAIL * * Programmer: Jacob Smith @@ -1452,35 +1445,31 @@ done: * *------------------------------------------------------------------------- */ +#ifdef H5_HAVE_LIBHDFS + static herr_t H5FD_hdfs_close(H5FD_t *_file) { herr_t ret_value = SUCCEED; -#ifdef H5_HAVE_LIBHDFS H5FD_hdfs_t *file = (H5FD_hdfs_t *)_file; -#endif FUNC_ENTER_NOAPI_NOINIT -#ifndef H5_HAVE_LIBHDFS - HGOTO_ERROR(H5E_VFL, H5E_CANTCLOSEFILE, FAIL, - "Illegal close of unsupported Virtual File (hdfs)") -#else #if HDFS_DEBUG HDfprintf(stdout, "H5FD_hdfs_close() called.\n"); #endif - /* Sanity checks + /* Sanity checks */ HDassert(file != NULL); HDassert(file->hdfs_handle != NULL); HDassert(file->hdfs_handle->magic == HDFS_HDFST_MAGIC); - /* Close the underlying request handle + /* Close the underlying request handle */ - if (file->hdfs_handle != NULL) { + if (file->hdfs_handle != NULL) { if (FAIL == H5FD_hdfs_handle_close(file->hdfs_handle)) { - HGOTO_ERROR(H5E_VFL, H5E_CANTCLOSEFILE, FAIL, + HGOTO_ERROR(H5E_VFL, H5E_CANTCLOSEFILE, FAIL, "unable to close HDFS file handle") } } @@ -1488,21 +1477,37 @@ H5FD_hdfs_close(H5FD_t *_file) #if HDFS_STATS /* TODO: mechanism to re-target stats printout */ if (FAIL == hdfs_fprint_stats(stdout, file)) { - HGOTO_ERROR(H5E_INTERNAL, H5E_ERROR, FAIL, + HGOTO_ERROR(H5E_INTERNAL, H5E_ERROR, FAIL, "problem while writing file statistics") } #endif /* HDFS_STATS */ - /* Release the file info + /* Release the file info */ file = H5FL_FREE(H5FD_hdfs_t, file); -#endif /* H5_HAVE_LIBHDFS */ done: FUNC_LEAVE_NOAPI(ret_value) +} /* end H5FD_hdfs_close() */ + +#else /* H5_HAVE_LIBHDFS not defined */ + +static herr_t +H5FD_hdfs_close(H5FD_t H5_ATTR_UNUSED *_file) +{ + herr_t ret_value = SUCCEED; + FUNC_ENTER_NOAPI_NOINIT + + HGOTO_ERROR(H5E_VFL, H5E_CANTCLOSEFILE, FAIL, + "Illegal close of unsupported Virtual File (hdfs)") + +done: + FUNC_LEAVE_NOAPI(ret_value) } /* end H5FD_hdfs_close() */ +#endif /* H5_HAVE_LIBHDFS */ + /*------------------------------------------------------------------------- * @@ -1527,21 +1532,21 @@ done: * *------------------------------------------------------------------------- */ +#ifdef H5_HAVE_LIBHDFS + static int -H5FD_hdfs_cmp(const H5FD_t *_f1, - const H5FD_t *_f2) +H5FD_hdfs_cmp( + const H5FD_t *_f1, + const H5FD_t *_f2) { int ret_value = 0; -#ifdef H5_HAVE_LIBHDFS const H5FD_hdfs_t *f1 = (const H5FD_hdfs_t *)_f1; const H5FD_hdfs_t *f2 = (const H5FD_hdfs_t *)_f2; hdfsFileInfo *finfo1 = NULL; hdfsFileInfo *finfo2 = NULL; -#endif /* H5_HAVE_LIBHDFS */ FUNC_ENTER_NOAPI_NOINIT_NOERR -#ifdef H5_HAVE_LIBHDFS #if HDFS_DEBUG HDfprintf(stdout, "H5FD_hdfs_cmp() called.\n"); #endif /* HDFS_DEBUG */ @@ -1556,23 +1561,37 @@ H5FD_hdfs_cmp(const H5FD_t *_f1, HDassert(finfo1 != NULL); HDassert(finfo2 != NULL); - if (finfo1->mKind != finfo2->mKind) HGOTO_DONE(-1); - if (finfo1->mName != finfo2->mName) HGOTO_DONE(-1); - if (finfo1->mLastMod != finfo2->mLastMod) HGOTO_DONE(-1); - if (finfo1->mSize != finfo2->mSize) HGOTO_DONE(-1); - if (finfo1->mReplication != finfo2->mReplication) HGOTO_DONE(-1); - if (finfo1->mBlockSize != finfo2->mBlockSize) HGOTO_DONE(-1); - if (strcmp(finfo1->mOwner, finfo2->mOwner)) HGOTO_DONE(-1); - if (strcmp(finfo1->mGroup, finfo2->mGroup)) HGOTO_DONE(-1); - if (finfo1->mPermissions != finfo2->mPermissions) HGOTO_DONE(-1); - if (finfo1->mLastAccess != finfo2->mLastAccess) HGOTO_DONE(-1); -#endif /* H5_HAVE_LIBHDFS */ + if (finfo1->mKind != finfo2->mKind) { HGOTO_DONE(-1); } + if (finfo1->mName != finfo2->mName) { HGOTO_DONE(-1); } + if (finfo1->mLastMod != finfo2->mLastMod) { HGOTO_DONE(-1); } + if (finfo1->mSize != finfo2->mSize) { HGOTO_DONE(-1); } + if (finfo1->mReplication != finfo2->mReplication) { HGOTO_DONE(-1); } + if (finfo1->mBlockSize != finfo2->mBlockSize) { HGOTO_DONE(-1); } + if (strcmp(finfo1->mOwner, finfo2->mOwner)) { HGOTO_DONE(-1); } + if (strcmp(finfo1->mGroup, finfo2->mGroup)) { HGOTO_DONE(-1); } + if (finfo1->mPermissions != finfo2->mPermissions) { HGOTO_DONE(-1); } + if (finfo1->mLastAccess != finfo2->mLastAccess) { HGOTO_DONE(-1); } done: FUNC_LEAVE_NOAPI(ret_value) +} /* H5FD_hdfs_cmp() */ + +#else /* H5_HAVE_LIBHDFS not defined */ + +static int +H5FD_hdfs_cmp( + const H5FD_t H5_ATTR_UNUSED *_f1, + const H5FD_t H5_ATTR_UNUSED *_f2) +{ + int ret_value = 0; + FUNC_ENTER_NOAPI_NOINIT_NOERR + + FUNC_LEAVE_NOAPI(ret_value) } /* H5FD_hdfs_cmp() */ +#endif /* H5_HAVE_LIBHDFS */ + /*------------------------------------------------------------------------- * Function: H5FD_hdfs_query @@ -1580,7 +1599,7 @@ done: * Purpose: Set the flags that this VFL driver is capable of supporting. * (listed in H5FDpublic.h) * - * Note that since the HDFS VFD is read only, most flags + * Note that since the HDFS VFD is read only, most flags * are irrelevant. * * The term "set" is highly misleading... @@ -1595,7 +1614,7 @@ done: */ static herr_t H5FD_hdfs_query( - const H5FD_t H5_ATTR_UNUSED *_file, + const H5FD_t H5_ATTR_UNUSED *_file, unsigned long *flags) /* out variable */ { FUNC_ENTER_NOAPI_NOINIT_NOERR @@ -1606,11 +1625,10 @@ H5FD_hdfs_query( if (flags) { *flags = 0; - *flags |= H5FD_FEAT_DATA_SIEVE; + *flags |= H5FD_FEAT_DATA_SIEVE; } FUNC_LEAVE_NOAPI(SUCCEED) - } /* H5FD_hdfs_query() */ @@ -1635,14 +1653,14 @@ H5FD_hdfs_query( * *------------------------------------------------------------------------- */ +#ifdef H5_HAVE_LIBHDFS + static haddr_t H5FD_hdfs_get_eoa( - const H5FD_t *_file, + const H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type) { -#ifdef H5_HAVE_LIBHDFS const H5FD_hdfs_t *file = (const H5FD_hdfs_t *)_file; -#endif /* H5_HAVE_LIBHDFS */ FUNC_ENTER_NOAPI_NOINIT_NOERR @@ -1650,14 +1668,27 @@ H5FD_hdfs_get_eoa( HDfprintf(stdout, "H5FD_hdfs_get_eoa() called.\n"); #endif -#ifdef H5_HAVE_LIBHDFS FUNC_LEAVE_NOAPI(file->eoa) -#else - FUNC_LEAVE_NOAPI(0) -#endif /* H5_HAVE_LIBHDFS */ +} /* end H5FD_hdfs_get_eoa() */ + +#else /* H5_HAVE_LIBHDFS not defined */ + +static haddr_t +H5FD_hdfs_get_eoa( + const H5FD_t H5_ATTR_UNUSED *_file, + H5FD_mem_t H5_ATTR_UNUSED type) +{ + FUNC_ENTER_NOAPI_NOINIT_NOERR +#if HDFS_DEBUG + HDfprintf(stdout, "H5FD_hdfs_get_eoa() called.\n"); +#endif + + FUNC_LEAVE_NOAPI(0) } /* end H5FD_hdfs_get_eoa() */ +#endif /* H5_HAVE_LIBHDFS */ + /*------------------------------------------------------------------------- * @@ -1678,15 +1709,15 @@ H5FD_hdfs_get_eoa( * *------------------------------------------------------------------------- */ +#ifdef H5_HAVE_LIBHDFS + static herr_t H5FD_hdfs_set_eoa( - H5FD_t *_file, - H5FD_mem_t H5_ATTR_UNUSED type, + H5FD_t *_file, + H5FD_mem_t H5_ATTR_UNUSED type, haddr_t addr) { -#ifdef H5_HAVE_LIBHDFS H5FD_hdfs_t *file = (H5FD_hdfs_t *)_file; -#endif /* H5_HAVE_LIBHDFS */ FUNC_ENTER_NOAPI_NOINIT_NOERR @@ -1694,16 +1725,30 @@ H5FD_hdfs_set_eoa( HDfprintf(stdout, "H5FD_hdfs_set_eoa() called.\n"); #endif -#ifdef H5_HAVE_LIBHDFS file->eoa = addr; FUNC_LEAVE_NOAPI(SUCCEED) -#else - FUNC_LEAVE_NOAPI(FAIL) -#endif /* H5_HAVE_LIBHDFS */ +} /* H5FD_hdfs_set_eoa() */ + +#else /* H5_HAVE_LIBHDFS not defined */ + +static herr_t +H5FD_hdfs_set_eoa( + H5FD_t H5_ATTR_UNUSED *_file, + H5FD_mem_t H5_ATTR_UNUSED type, + haddr_t H5_ATTR_UNUSED addr) +{ + FUNC_ENTER_NOAPI_NOINIT_NOERR +#if HDFS_DEBUG + HDfprintf(stdout, "H5FD_hdfs_set_eoa() called.\n"); +#endif + + FUNC_LEAVE_NOAPI(FAIL) } /* H5FD_hdfs_set_eoa() */ +#endif /* H5_HAVE_LIBHDFS */ + /*------------------------------------------------------------------------- * @@ -1715,7 +1760,7 @@ H5FD_hdfs_set_eoa( * * Return: * - * EOF: the first address past the end of the "file", either the + * EOF: the first address past the end of the "file", either the * filesystem file or the HDF5 file. * * Programmer: Jacob Smith @@ -1723,14 +1768,14 @@ H5FD_hdfs_set_eoa( * *------------------------------------------------------------------------- */ +#ifdef H5_HAVE_LIBHDFS + static haddr_t H5FD_hdfs_get_eof( - const H5FD_t *_file, + const H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type) { -#ifdef H5_HAVE_LIBHDFS const H5FD_hdfs_t *file = (const H5FD_hdfs_t *)_file; -#endif /* H5_HAVE_LIBHDFS */ FUNC_ENTER_NOAPI_NOINIT_NOERR @@ -1738,17 +1783,30 @@ H5FD_hdfs_get_eof( HDfprintf(stdout, "H5FD_hdfs_get_eof() called.\n"); #endif -#ifdef H5_HAVE_LIBHDFS HDassert(file->hdfs_handle != NULL); HDassert(file->hdfs_handle->magic == HDFS_HDFST_MAGIC); FUNC_LEAVE_NOAPI((size_t) file->hdfs_handle->fileinfo->mSize) -#else - FUNC_LEAVE_NOAPI((size_t)0) -#endif /* H5_HAVE_LIBHDFS */ +} /* end H5FD_hdfs_get_eof() */ + +#else /* H5_HAVE_LIBHDFS not defined */ + +static haddr_t +H5FD_hdfs_get_eof( + const H5FD_t H5_ATTR_UNUSED *_file, + H5FD_mem_t H5_ATTR_UNUSED type) +{ + FUNC_ENTER_NOAPI_NOINIT_NOERR +#if HDFS_DEBUG + HDfprintf(stdout, "H5FD_hdfs_get_eof() called.\n"); +#endif + + FUNC_LEAVE_NOAPI((size_t)0) } /* end H5FD_hdfs_get_eof() */ +#endif /* H5_HAVE_LIBHDFS */ + /*------------------------------------------------------------------------- * @@ -1769,16 +1827,16 @@ H5FD_hdfs_get_eof( * *------------------------------------------------------------------------- */ +#ifdef H5_HAVE_LIBHDFS + static herr_t H5FD_hdfs_get_handle( - H5FD_t *_file, - hid_t H5_ATTR_UNUSED fapl, + H5FD_t *_file, + hid_t H5_ATTR_UNUSED fapl, void **file_handle) { herr_t ret_value = SUCCEED; -#ifdef H5_HAVE_LIBHDFS H5FD_hdfs_t *file = (H5FD_hdfs_t *)_file; -#endif FUNC_ENTER_NOAPI_NOINIT @@ -1786,29 +1844,48 @@ H5FD_hdfs_get_handle( HDfprintf(stdout, "H5FD_hdfs_get_handle() called.\n"); #endif /* HDFS_DEBUG */ -#ifdef H5_HAVE_LIBHDFS if (!file_handle) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "file handle not valid") } *file_handle = file->hdfs_handle; -#else + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5FD_hdfs_get_handle() */ + +#else /* H5_HAVE_LIBHDFS not defined */ + +static herr_t +H5FD_hdfs_get_handle( + H5FD_t H5_ATTR_UNUSED *_file, + hid_t H5_ATTR_UNUSED fapl, + void H5_ATTR_UNUSED **file_handle) +{ + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI_NOINIT + +#if HDFS_DEBUG + HDfprintf(stdout, "H5FD_hdfs_get_handle() called.\n"); +#endif /* HDFS_DEBUG */ + HGOTO_ERROR(H5E_VFL, H5E_UNSUPPORTED, FAIL, "Illegal get-handle of unsupported virtual file (hdfs)"); -#endif /* H5_HAVE_LIBHDFS */ done: FUNC_LEAVE_NOAPI(ret_value) - } /* end H5FD_hdfs_get_handle() */ +#endif /* H5_HAVE_LIBHDFS */ + /*------------------------------------------------------------------------- * * Function: H5FD_hdfs_read() * - * Purpose: + * Purpose: * * Reads SIZE bytes of data from FILE beginning at address ADDR * into buffer BUF according to data transfer properties in DXPL_ID. @@ -1828,20 +1905,20 @@ done: * *------------------------------------------------------------------------- */ +#ifdef H5_HAVE_LIBHDFS + static herr_t H5FD_hdfs_read( - H5FD_t *_file, - H5FD_mem_t H5_ATTR_UNUSED type, + H5FD_t *_file, + H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t addr, /* start offset */ size_t size, /* length of read */ void *buf) /* out */ { herr_t ret_value = SUCCEED; -#if H5_HAVE_LIBHDFS H5FD_hdfs_t *file = (H5FD_hdfs_t *)_file; size_t filesize = 0; -#endif /* H5_HAVE_LIBHDFS */ #if HDFS_STATS /* working variables for storing stats */ hdfs_statsbin *bin = NULL; @@ -1854,10 +1931,6 @@ H5FD_hdfs_read( HDfprintf(stdout, "H5FD_hdfs_read() called.\n"); #endif /* HDFS_DEBUG */ -#ifndef H5_HAVE_LIBHDFS - HGOTO_ERROR(H5E_VFL, H5E_UNSUPPORTED, FAIL, - "Illegal get-handle of unsupported virtual file (hdfs)"); -#else HDassert(file != NULL); HDassert(file->hdfs_handle != NULL); HDassert(file->hdfs_handle->magic == HDFS_HDFST_MAGIC); @@ -1894,37 +1967,64 @@ H5FD_hdfs_read( ? &file->raw[bin_i] : &file->meta[bin_i]; - /* Store collected stats in appropriate bin + /* Store collected stats in appropriate bin */ if (bin->count == 0) { bin->min = size; bin->max = size; - } else { - if (size < bin->min) bin->min = size; - if (size > bin->max) bin->max = size; + } + else { + if (size < bin->min) { bin->min = size; } + if (size > bin->max) { bin->max = size; } } bin->count++; bin->bytes += (unsigned long long)size; #endif /* HDFS_STATS */ -#endif /* H5_HAVE_LIBHDFS */ done: FUNC_LEAVE_NOAPI(ret_value) +} /* end H5FD_hdfs_read() */ + +#else /* H5_HAVE_LIBHDFS not defined */ + +static herr_t +H5FD_hdfs_read( + H5FD_t H5_ATTR_UNUSED *_file, + H5FD_mem_t H5_ATTR_UNUSED type, + hid_t H5_ATTR_UNUSED dxpl_id, + haddr_t H5_ATTR_UNUSED addr, + size_t H5_ATTR_UNUSED size, + void H5_ATTR_UNUSED *buf) +{ + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI_NOINIT + +#if HDFS_DEBUG + HDfprintf(stdout, "H5FD_hdfs_read() called.\n"); +#endif /* HDFS_DEBUG */ + + HGOTO_ERROR(H5E_VFL, H5E_UNSUPPORTED, FAIL, + "Illegal get-handle of unsupported virtual file (hdfs)"); +done: + FUNC_LEAVE_NOAPI(ret_value) } /* end H5FD_hdfs_read() */ +#endif /* H5_HAVE_LIBHDFS */ + /*------------------------------------------------------------------------- * * Function: H5FD_hdfs_write() * - * Purpose: + * Purpose: * * Write bytes to file. * UNSUPPORTED IN READ-ONLY HDFS VFD. * - * Return: + * Return: * * FAIL (Not possible with Read-Only S3 file.) * @@ -1937,11 +2037,11 @@ done: */ static herr_t H5FD_hdfs_write( - H5FD_t H5_ATTR_UNUSED *_file, - H5FD_mem_t H5_ATTR_UNUSED type, + H5FD_t H5_ATTR_UNUSED *_file, + H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNUSED dxpl_id, - haddr_t H5_ATTR_UNUSED addr, - size_t H5_ATTR_UNUSED size, + haddr_t H5_ATTR_UNUSED addr, + size_t H5_ATTR_UNUSED size, const void H5_ATTR_UNUSED *buf) { herr_t ret_value = FAIL; @@ -1957,7 +2057,6 @@ H5FD_hdfs_write( done: FUNC_LEAVE_NOAPI(ret_value) - } /* H5FD_hdfs_write() */ @@ -1985,8 +2084,8 @@ done: */ static herr_t H5FD_hdfs_truncate( - H5FD_t H5_ATTR_UNUSED *_file, - hid_t H5_ATTR_UNUSED dxpl_id, + H5FD_t H5_ATTR_UNUSED *_file, + hid_t H5_ATTR_UNUSED dxpl_id, hbool_t H5_ATTR_UNUSED closing) { herr_t ret_value = SUCCEED; @@ -2002,7 +2101,6 @@ H5FD_hdfs_truncate( done: FUNC_LEAVE_NOAPI(ret_value) - } /* end H5FD_hdfs_truncate() */ @@ -2031,12 +2129,11 @@ done: */ static herr_t H5FD_hdfs_lock( - H5FD_t H5_ATTR_UNUSED *_file, + H5FD_t H5_ATTR_UNUSED *_file, hbool_t H5_ATTR_UNUSED rw) { FUNC_ENTER_NOAPI_NOINIT_NOERR FUNC_LEAVE_NOAPI(SUCCEED) - } /* end H5FD_hdfs_lock() */ @@ -2065,6 +2162,5 @@ H5FD_hdfs_unlock(H5FD_t H5_ATTR_UNUSED *_file) { FUNC_ENTER_NOAPI_NOINIT_NOERR FUNC_LEAVE_NOAPI(SUCCEED) - } /* end H5FD_hdfs_unlock() */ diff --git a/src/H5FDmpi.c b/src/H5FDmpi.c index 7d58b7a..b2959a5 100644 --- a/src/H5FDmpi.c +++ b/src/H5FDmpi.c @@ -267,115 +267,6 @@ H5FD_mpi_haddr_to_MPIOff(haddr_t addr, MPI_Offset *mpi_off/*out*/) FUNC_LEAVE_NOAPI(ret_value) } - -/*------------------------------------------------------------------------- - * Function: H5FD_mpi_comm_info_dup - * - * Purpose: Make duplicates of communicator and Info object. - * If the Info object is in fact MPI_INFO_NULL, no duplicate - * is made but the same value assigned to the new Info object - * handle. - * - * Return: Success: Non-negative. The new communicator and Info - * object handles are returned via comm_new and - * info_new pointers. - * - * Failure: Negative. - * - * Programmer: Albert Cheng - * Jan 8, 2003 - * - * Modifications: - *------------------------------------------------------------------------- - */ -herr_t -H5FD_mpi_comm_info_dup(MPI_Comm comm, MPI_Info info, MPI_Comm *comm_new, MPI_Info *info_new) -{ - herr_t ret_value=SUCCEED; - MPI_Comm comm_dup=MPI_COMM_NULL; - MPI_Info info_dup=MPI_INFO_NULL; - int mpi_code; - - FUNC_ENTER_NOAPI(FAIL) - - /* Check arguments */ - if (MPI_COMM_NULL == comm) - HGOTO_ERROR(H5E_INTERNAL, H5E_BADVALUE, FAIL, "not a valid argument") - if (!comm_new || !info_new) - HGOTO_ERROR(H5E_INTERNAL, H5E_BADVALUE, FAIL, "bad pointers") - - /* Dup them. Using temporary variables for error recovery cleanup. */ - if (MPI_SUCCESS != (mpi_code=MPI_Comm_dup(comm, &comm_dup))) - HMPI_GOTO_ERROR(FAIL, "MPI_Comm_dup failed", mpi_code) - if (MPI_INFO_NULL != info){ - if (MPI_SUCCESS != (mpi_code=MPI_Info_dup(info, &info_dup))) - HMPI_GOTO_ERROR(FAIL, "MPI_Info_dup failed", mpi_code) - }else{ - /* No dup, just copy it. */ - info_dup = info; - } - - /* Set MPI_ERRORS_RETURN on comm_dup so that MPI failures are not fatal, - and return codes can be checked and handled. May 23, 2017 FTW */ - if (MPI_SUCCESS != (mpi_code = MPI_Comm_set_errhandler(comm_dup, MPI_ERRORS_RETURN))) - HMPI_GOTO_ERROR(FAIL, "MPI_Errhandler_set failed", mpi_code) - - /* copy them to the return arguments */ - *comm_new = comm_dup; - *info_new = info_dup; - -done: - if (FAIL == ret_value){ - /* need to free anything created here */ - if (MPI_COMM_NULL != comm_dup) - MPI_Comm_free(&comm_dup); - if (MPI_INFO_NULL != info_dup) - MPI_Info_free(&info_dup); - } - - FUNC_LEAVE_NOAPI(ret_value) -} - - -/*------------------------------------------------------------------------- - * Function: H5FD_mpi_comm_info_free - * - * Purpose: Free the communicator and Info object. - * If comm or info is in fact MPI_COMM_NULL or MPI_INFO_NULL - * respectively, no action occurs to it. - * - * Return: Success: Non-negative. The values the pointers refer - * to will be set to the corresponding NULL - * handles. - * - * Failure: Negative. - * - * Programmer: Albert Cheng - * Jan 8, 2003 - * - * Modifications: - *------------------------------------------------------------------------- - */ -herr_t -H5FD_mpi_comm_info_free(MPI_Comm *comm, MPI_Info *info) -{ - herr_t ret_value=SUCCEED; - - FUNC_ENTER_NOAPI(FAIL) - - /* Check arguments */ - if (!comm || !info) - HGOTO_ERROR(H5E_INTERNAL, H5E_BADVALUE, FAIL, "not a valid argument") - - if (MPI_COMM_NULL != *comm) - MPI_Comm_free(comm); - if (MPI_INFO_NULL != *info) - MPI_Info_free(info); - -done: - FUNC_LEAVE_NOAPI(ret_value) -} - #ifdef NOT_YET /*------------------------------------------------------------------------- diff --git a/src/H5FDmpio.c b/src/H5FDmpio.c index d5aa170..6ca7aa4 100644 --- a/src/H5FDmpio.c +++ b/src/H5FDmpio.c @@ -167,7 +167,7 @@ USAGE herr_t H5FD__init_package() RETURNS - Non-negative on success/Negative on failure + SUCCEED/FAIL DESCRIPTION Initializes any interface-specific data or routines. (Just calls @@ -249,9 +249,9 @@ done: /*--------------------------------------------------------------------------- - * Function: H5FD__mpio_term + * Function: H5FD__mpio_term * - * Purpose: Shut down the VFD + * Purpose: Shut down the VFD * * Returns: Non-negative on success or negative on failure * @@ -263,7 +263,7 @@ done: static herr_t H5FD__mpio_term(void) { - FUNC_ENTER_STATIC + FUNC_ENTER_STATIC_NOERR /* Reset VFL ID */ H5FD_MPIO_g = 0; @@ -273,40 +273,40 @@ H5FD__mpio_term(void) /*------------------------------------------------------------------------- - * Function: H5Pset_fapl_mpio + * Function: H5Pset_fapl_mpio * - * Purpose: Store the user supplied MPIO communicator comm and info in - * the file access property list FAPL_ID which can then be used - * to create and/or open the file. This function is available - * only in the parallel HDF5 library and is not collective. + * Purpose: Store the user supplied MPIO communicator comm and info in + * the file access property list FAPL_ID which can then be used + * to create and/or open the file. This function is available + * only in the parallel HDF5 library and is not collective. * - * comm is the MPI communicator to be used for file open as - * defined in MPI_FILE_OPEN of MPI-2. This function makes a - * duplicate of comm. Any modification to comm after this function - * call returns has no effect on the access property list. + * comm is the MPI communicator to be used for file open as + * defined in MPI_FILE_OPEN of MPI-2. This function makes a + * duplicate of comm. Any modification to comm after this function + * call returns has no effect on the access property list. * - * info is the MPI Info object to be used for file open as - * defined in MPI_FILE_OPEN of MPI-2. This function makes a - * duplicate of info. Any modification to info after this - * function call returns has no effect on the access property - * list. + * info is the MPI Info object to be used for file open as + * defined in MPI_FILE_OPEN of MPI-2. This function makes a + * duplicate of info. Any modification to info after this + * function call returns has no effect on the access property + * list. * * If fapl_id has previously set comm and info values, they * will be replaced and the old communicator and Info object * are freed. * - * Return: Success: Non-negative - * Failure: Negative + * Return: Success: Non-negative + * Failure: Negative * - * Programmer: Albert Cheng - * Feb 3, 1998 + * Programmer: Albert Cheng + * Feb 3, 1998 * *------------------------------------------------------------------------- */ herr_t H5Pset_fapl_mpio(hid_t fapl_id, MPI_Comm comm, MPI_Info info) { - H5FD_mpio_fapl_t fa; + H5FD_mpio_fapl_t fa; H5P_genplist_t *plist; /* Property list pointer */ herr_t ret_value; @@ -319,7 +319,7 @@ H5Pset_fapl_mpio(hid_t fapl_id, MPI_Comm comm, MPI_Info info) if(NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS))) HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a file access list") if(MPI_COMM_NULL == comm) - HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a valid communicator") + HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a valid communicator") /* Initialize driver specific properties */ HDmemset(&fa, 0, sizeof(H5FD_mpio_fapl_t)); @@ -335,25 +335,25 @@ done: /*------------------------------------------------------------------------- - * Function: H5Pget_fapl_mpio - * - * Purpose: If the file access property list is set to the H5FD_MPIO - * driver then this function returns duplicates of the MPI - * communicator and Info object stored through the comm and - * info pointers. It is the responsibility of the application - * to free the returned communicator and Info object. - * - * Return: Success: Non-negative with the communicator and - * Info object returned through the comm and - * info arguments if non-null. Since they are - * duplicates of the stored objects, future - * modifications to the access property list do - * not affect them and it is the responsibility - * of the application to free them. - * Failure: Negative - * - * Programmer: Robb Matzke - * Thursday, February 26, 1998 + * Function: H5Pget_fapl_mpio + * + * Purpose: If the file access property list is set to the H5FD_MPIO + * driver then this function returns duplicates of the MPI + * communicator and Info object stored through the comm and + * info pointers. It is the responsibility of the application + * to free the returned communicator and Info object. + * + * Return: Success: Non-negative with the communicator and + * Info object returned through the comm and + * info arguments if non-null. Since they are + * duplicates of the stored objects, future + * modifications to the access property list do + * not affect them and it is the responsibility + * of the application to free them. + * Failure: Negative + * + * Programmer: Robb Matzke + * Thursday, February 26, 1998 * *------------------------------------------------------------------------- */ @@ -362,9 +362,9 @@ H5Pget_fapl_mpio(hid_t fapl_id, MPI_Comm *comm/*out*/, MPI_Info *info/*out*/) { H5P_genplist_t *plist; /* Property list pointer */ const H5FD_mpio_fapl_t *fa; /* MPIO fapl info */ - MPI_Comm comm_tmp = MPI_COMM_NULL; + MPI_Comm comm_tmp = MPI_COMM_NULL; hbool_t comm_copied = FALSE; /* MPI Comm has been duplicated */ - int mpi_code; /* MPI return code */ + int mpi_code; /* MPI return code */ herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_API(FAIL) @@ -381,19 +381,19 @@ H5Pget_fapl_mpio(hid_t fapl_id, MPI_Comm *comm/*out*/, MPI_Info *info/*out*/) /* Store the duplicated communicator in a temporary variable for error */ /* recovery in case the INFO duplication fails. */ if(comm) { - if(MPI_SUCCESS != (mpi_code = MPI_Comm_dup(fa->comm, &comm_tmp))) - HMPI_GOTO_ERROR(FAIL, "MPI_Comm_dup failed", mpi_code) + if(MPI_SUCCESS != (mpi_code = MPI_Comm_dup(fa->comm, &comm_tmp))) + HMPI_GOTO_ERROR(FAIL, "MPI_Comm_dup failed", mpi_code) comm_copied = TRUE; } /* end if */ if(info) { - if(MPI_INFO_NULL != fa->info) { - if(MPI_SUCCESS != (mpi_code = MPI_Info_dup(fa->info, info))) - HMPI_GOTO_ERROR(FAIL, "MPI_Info_dup failed", mpi_code) - } /* end if */ + if(MPI_INFO_NULL != fa->info) { + if(MPI_SUCCESS != (mpi_code = MPI_Info_dup(fa->info, info))) + HMPI_GOTO_ERROR(FAIL, "MPI_Info_dup failed", mpi_code) + } /* end if */ else - /* do not dup it */ - *info = MPI_INFO_NULL; + /* do not dup it */ + *info = MPI_INFO_NULL; } /* end if */ /* Store the copied communicator, now that the Info object has been @@ -404,33 +404,33 @@ H5Pget_fapl_mpio(hid_t fapl_id, MPI_Comm *comm/*out*/, MPI_Info *info/*out*/) done: if(ret_value < 0) - /* need to free anything created here */ - if(comm_copied) - MPI_Comm_free(&comm_tmp); + /* need to free anything created here */ + if(comm_copied) + MPI_Comm_free(&comm_tmp); FUNC_LEAVE_API(ret_value) } /* end H5Pget_fapl_mpio() */ /*------------------------------------------------------------------------- - * Function: H5Pset_dxpl_mpio + * Function: H5Pset_dxpl_mpio * - * Purpose: Set the data transfer property list DXPL_ID to use transfer - * mode XFER_MODE. The property list can then be used to control - * the I/O transfer mode during data I/O operations. The valid - * transfer modes are: + * Purpose: Set the data transfer property list DXPL_ID to use transfer + * mode XFER_MODE. The property list can then be used to control + * the I/O transfer mode during data I/O operations. The valid + * transfer modes are: * - * H5FD_MPIO_INDEPENDENT: - * Use independent I/O access (the default). + * H5FD_MPIO_INDEPENDENT: + * Use independent I/O access (the default). * - * H5FD_MPIO_COLLECTIVE: - * Use collective I/O access. + * H5FD_MPIO_COLLECTIVE: + * Use collective I/O access. * - * Return: Success: Non-negative - * Failure: Negative + * Return: Success: Non-negative + * Failure: Negative * - * Programmer: Albert Cheng - * April 2, 1998 + * Programmer: Albert Cheng + * April 2, 1998 * *------------------------------------------------------------------------- */ @@ -461,18 +461,18 @@ done: /*------------------------------------------------------------------------- - * Function: H5Pget_dxpl_mpio + * Function: H5Pget_dxpl_mpio * - * Purpose: Queries the transfer mode current set in the data transfer - * property list DXPL_ID. This is not collective. + * Purpose: Queries the transfer mode current set in the data transfer + * property list DXPL_ID. This is not collective. * - * Return: Success: Non-negative, with the transfer mode returned - * through the XFER_MODE argument if it is - * non-null. - * Failure: Negative + * Return: Success: Non-negative, with the transfer mode returned + * through the XFER_MODE argument if it is + * non-null. + * Failure: Negative * - * Programmer: Albert Cheng - * April 2, 1998 + * Programmer: Albert Cheng + * April 2, 1998 * *------------------------------------------------------------------------- */ @@ -500,21 +500,20 @@ done: /*------------------------------------------------------------------------- - * Function: H5Pset_dxpl_mpio_collective_opt + * Function: H5Pset_dxpl_mpio_collective_opt * - * Purpose: To set a flag to choose linked chunk I/O or multi-chunk I/O - * without involving decision-making inside HDF5 + * Purpose: To set a flag to choose linked chunk I/O or multi-chunk I/O + * without involving decision-making inside HDF5 * - * Note: The library will do linked chunk I/O or multi-chunk I/O without - * involving communications for decision-making process. - * The library won't behave as it asks for only when we find - * that the low-level MPI-IO package doesn't support this. + * Note: The library will do linked chunk I/O or multi-chunk I/O without + * involving communications for decision-making process. + * The library won't behave as it asks for only when we find + * that the low-level MPI-IO package doesn't support this. * - * Return: Success: Non-negative - * Failure: Negative + * Return: Success: Non-negative + * Failure: Negative * - * Programmer: Kent Yang - * ? ?, ? + * Programmer: Kent Yang * *------------------------------------------------------------------------- */ @@ -543,21 +542,20 @@ done: /*------------------------------------------------------------------------- - * Function: H5Pset_dxpl_mpio_chunk_opt + * Function: H5Pset_dxpl_mpio_chunk_opt * - * Purpose: To set a flag to choose linked chunk I/O or multi-chunk I/O - * without involving decision-making inside HDF5 + * Purpose: To set a flag to choose linked chunk I/O or multi-chunk I/O + * without involving decision-making inside HDF5 * - * Note: The library will do linked chunk I/O or multi-chunk I/O without - * involving communications for decision-making process. - * The library won't behave as it asks for only when we find - * that the low-level MPI-IO package doesn't support this. + * Note: The library will do linked chunk I/O or multi-chunk I/O without + * involving communications for decision-making process. + * The library won't behave as it asks for only when we find + * that the low-level MPI-IO package doesn't support this. * - * Return: Success: Non-negative - * Failure: Negative + * Return: Success: Non-negative + * Failure: Negative * - * Programmer: Kent Yang - * ? ?, ? + * Programmer: Kent Yang * *------------------------------------------------------------------------- */ @@ -586,19 +584,18 @@ done: /*------------------------------------------------------------------------- - * Function: H5Pset_dxpl_mpio_chunk_opt_num + * Function: H5Pset_dxpl_mpio_chunk_opt_num * - * Purpose: To set a threshold for doing linked chunk IO + * Purpose: To set a threshold for doing linked chunk IO * - * Note: If the number is greater than the threshold set by the user, - * the library will do linked chunk I/O; otherwise, I/O will be - * done for every chunk. + * Note: If the number is greater than the threshold set by the user, + * the library will do linked chunk I/O; otherwise, I/O will be + * done for every chunk. * - * Return: Success: Non-negative - * Failure: Negative + * Return: Success: Non-negative + * Failure: Negative * - * Programmer: Kent Yang - * ? ?, ? + * Programmer: Kent Yang * *------------------------------------------------------------------------- */ @@ -627,22 +624,21 @@ done: /*------------------------------------------------------------------------- - * Function: H5Pset_dxpl_mpio_chunk_opt_ratio + * Function: H5Pset_dxpl_mpio_chunk_opt_ratio * - * Purpose: To set a threshold for doing collective I/O for each chunk + * Purpose: To set a threshold for doing collective I/O for each chunk * - * Note: The library will calculate the percentage of the number of - * process holding selections at each chunk. If that percentage - * of number of process in the individual chunk is greater than - * the threshold set by the user, the library will do collective - * chunk I/O for this chunk; otherwise, independent I/O will be - * done for this chunk. + * Note: The library will calculate the percentage of the number of + * process holding selections at each chunk. If that percentage + * of number of process in the individual chunk is greater than + * the threshold set by the user, the library will do collective + * chunk I/O for this chunk; otherwise, independent I/O will be + * done for this chunk. * - * Return: Success: Non-negative - * Failure: Negative + * Return: Success: Non-negative + * Failure: Negative * - * Programmer: Kent Yang - * ? ?, ? + * Programmer: Kent Yang * *------------------------------------------------------------------------- */ @@ -671,16 +667,16 @@ done: /*------------------------------------------------------------------------- - * Function: H5FD__mpio_fapl_get + * Function: H5FD__mpio_fapl_get * - * Purpose: Returns a file access property list which could be used to - * create another file the same as this one. + * Purpose: Returns a file access property list which could be used to + * create another file the same as this one. * - * Return: Success: Ptr to new file access property list with all - * fields copied from the file pointer. - * Failure: NULL + * Return: Success: Ptr to new file access property list with all + * fields copied from the file pointer. + * Failure: NULL * - * Programmer: Robb Matzke + * Programmer: Robb Matzke * Friday, August 13, 1999 * *------------------------------------------------------------------------- @@ -688,9 +684,9 @@ done: static void * H5FD__mpio_fapl_get(H5FD_t *_file) { - H5FD_mpio_t *file = (H5FD_mpio_t*)_file; - H5FD_mpio_fapl_t *fa = NULL; - void *ret_value; /* Return value */ + H5FD_mpio_t *file = (H5FD_mpio_t*)_file; + H5FD_mpio_fapl_t *fa = NULL; + void *ret_value = NULL; /* Return value */ FUNC_ENTER_STATIC @@ -701,28 +697,38 @@ H5FD__mpio_fapl_get(H5FD_t *_file) /* Check arguments */ if(NULL == (fa = (H5FD_mpio_fapl_t *)H5MM_calloc(sizeof(H5FD_mpio_fapl_t)))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") + fa->comm = MPI_COMM_NULL; + fa->info = MPI_INFO_NULL; - /* Duplicate communicator and Info object. */ - if(FAIL == H5FD_mpi_comm_info_dup(file->comm, file->info, &fa->comm, &fa->info)) - HGOTO_ERROR(H5E_INTERNAL, H5E_CANTCOPY, NULL, "Communicator/Info duplicate failed") + /* Duplicate MPI communicator and info */ + if(FAIL == H5_mpi_comm_dup(file->comm, &fa->comm)) + HGOTO_ERROR(H5E_INTERNAL, H5E_CANTCOPY, NULL, "communicator duplicate failed") + if(FAIL == H5_mpi_info_dup(file->info, &fa->info)) + HGOTO_ERROR(H5E_INTERNAL, H5E_CANTCOPY, NULL, "info duplicate failed") /* Set return value */ ret_value = fa; done: + /* Clean up badness if we're failing */ + if(NULL == ret_value && fa) { + H5_mpi_comm_free(&fa->comm); + H5_mpi_info_free(&fa->info); + H5MM_xfree(fa); + } FUNC_LEAVE_NOAPI(ret_value) } /* end H5FD__mpio_fapl_get() */ /*------------------------------------------------------------------------- - * Function: H5FD__mpio_fapl_copy + * Function: H5FD__mpio_fapl_copy * - * Purpose: Copies the mpio-specific file access properties. + * Purpose: Copies the mpio-specific file access properties. * - * Return: Success: Ptr to a new property list - * Failure: NULL + * Return: Success: Ptr to a new property list + * Failure: NULL * - * Programmer: Albert Cheng + * Programmer: Albert Cheng * Jan 8, 2003 * *------------------------------------------------------------------------- @@ -730,9 +736,9 @@ done: static void * H5FD__mpio_fapl_copy(const void *_old_fa) { - const H5FD_mpio_fapl_t *old_fa = (const H5FD_mpio_fapl_t*)_old_fa; - H5FD_mpio_fapl_t *new_fa = NULL; - void *ret_value = NULL; + const H5FD_mpio_fapl_t *old_fa = (const H5FD_mpio_fapl_t*)_old_fa; + H5FD_mpio_fapl_t *new_fa = NULL; + void *ret_value = NULL; FUNC_ENTER_STATIC @@ -747,18 +753,22 @@ if(H5FD_mpio_Debug[(int)'t']) /* Copy the general information */ H5MM_memcpy(new_fa, old_fa, sizeof(H5FD_mpio_fapl_t)); - /* Duplicate communicator and Info object. */ - if(H5FD_mpi_comm_info_dup(old_fa->comm, old_fa->info, &new_fa->comm, &new_fa->info) < 0) - HGOTO_ERROR(H5E_INTERNAL, H5E_CANTCOPY, NULL, "Communicator/Info duplicate failed") + /* Duplicate MPI communicator and info */ + if(H5_mpi_comm_dup(old_fa->comm, &new_fa->comm) < 0) + HGOTO_ERROR(H5E_INTERNAL, H5E_CANTCOPY, NULL, "communicator duplicate failed") + if(H5_mpi_info_dup(old_fa->info, &new_fa->info) < 0) + HGOTO_ERROR(H5E_INTERNAL, H5E_CANTCOPY, NULL, "info duplicate failed") /* Set return value */ ret_value = new_fa; done: - if(NULL == ret_value) - /* cleanup */ - if(new_fa) - H5MM_xfree(new_fa); + /* Clean up badness if we're failing */ + if(NULL == ret_value && new_fa) { + H5_mpi_comm_free(&new_fa->comm); + H5_mpi_info_free(&new_fa->info); + H5MM_xfree(new_fa); + } #ifdef H5FDmpio_DEBUG if(H5FD_mpio_Debug[(int)'t']) @@ -770,14 +780,13 @@ if(H5FD_mpio_Debug[(int)'t']) /*------------------------------------------------------------------------- - * Function: H5FD__mpio_fapl_free + * Function: H5FD__mpio_fapl_free * - * Purpose: Frees the mpio-specific file access properties. + * Purpose: Frees the mpio-specific file access properties. * - * Return: Success: 0 - * Failure: -1 + * Return: SUCCEED/FAIL * - * Programmer: Albert Cheng + * Programmer: Albert Cheng * Jan 8, 2003 * *------------------------------------------------------------------------- @@ -785,10 +794,9 @@ if(H5FD_mpio_Debug[(int)'t']) static herr_t H5FD__mpio_fapl_free(void *_fa) { - H5FD_mpio_fapl_t *fa = (H5FD_mpio_fapl_t*)_fa; - herr_t ret_value = SUCCEED; + H5FD_mpio_fapl_t *fa = (H5FD_mpio_fapl_t*)_fa; - FUNC_ENTER_STATIC + FUNC_ENTER_STATIC_NOERR #ifdef H5FDmpio_DEBUG if(H5FD_mpio_Debug[(int)'t']) @@ -800,7 +808,8 @@ if(H5FD_mpio_Debug[(int)'t']) /* Free the internal communicator and INFO object */ HDassert(MPI_COMM_NULL != fa->comm); - H5FD_mpi_comm_info_free(&fa->comm, &fa->info); + H5_mpi_comm_free(&fa->comm); + H5_mpi_info_free(&fa->info); H5MM_xfree(fa); #ifdef H5FDmpio_DEBUG @@ -808,21 +817,19 @@ if(H5FD_mpio_Debug[(int)'t']) HDfprintf(stderr, "%s: leaving\n", FUNC); #endif - FUNC_LEAVE_NOAPI(ret_value) + FUNC_LEAVE_NOAPI(SUCCEED) } /* end H5FD__mpio_fapl_free() */ /*------------------------------------------------------------------------- - * Function: H5FD_set_mpio_atomicity - * - * Purpose: Sets the atomicity mode + * Function: H5FD_set_mpio_atomicity * - * Return: Success: Non-negative + * Purpose: Sets the atomicity mode * - * Failure: Negative + * Return: SUCCEED/FAIL * - * Programmer: Mohamad Chaarawi - * Feb 14, 2012 + * Programmer: Mohamad Chaarawi + * Feb 14, 2012 * *------------------------------------------------------------------------- */ @@ -838,7 +845,7 @@ H5FD_set_mpio_atomicity(H5FD_t *_file, hbool_t flag) #ifdef H5FDmpio_DEBUG if(H5FD_mpio_Debug[(int)'t']) - HDfprintf(stdout, "%s: Entering\n", FUNC); + HDfprintf(stdout, "%s: Entering\n", FUNC); #endif if(FALSE == flag) @@ -853,7 +860,7 @@ H5FD_set_mpio_atomicity(H5FD_t *_file, hbool_t flag) done: #ifdef H5FDmpio_DEBUG if(H5FD_mpio_Debug[(int)'t']) - HDfprintf(stdout, "%s: Leaving\n", FUNC); + HDfprintf(stdout, "%s: Leaving\n", FUNC); #endif FUNC_LEAVE_NOAPI(ret_value) @@ -861,16 +868,14 @@ done: /*------------------------------------------------------------------------- - * Function: H5FD_get_mpio_atomicity - * - * Purpose: Returns the atomicity mode + * Function: H5FD_get_mpio_atomicity * - * Return: Success: Non-negative + * Purpose: Returns the atomicity mode * - * Failure: Negative + * Return: SUCCEED/FAIL * - * Programmer: Mohamad Chaarawi - * Feb 14, 2012 + * Programmer: Mohamad Chaarawi + * Feb 14, 2012 * *------------------------------------------------------------------------- */ @@ -886,7 +891,7 @@ H5FD_get_mpio_atomicity(H5FD_t *_file, hbool_t *flag) #ifdef H5FDmpio_DEBUG if(H5FD_mpio_Debug[(int)'t']) - HDfprintf(stdout, "%s: Entering\n", FUNC); + HDfprintf(stdout, "%s: Entering\n", FUNC); #endif /* Get atomicity value */ @@ -901,7 +906,7 @@ H5FD_get_mpio_atomicity(H5FD_t *_file, hbool_t *flag) done: #ifdef H5FDmpio_DEBUG if(H5FD_mpio_Debug[(int)'t']) - HDfprintf(stdout, "%s: Leaving\n", FUNC); + HDfprintf(stdout, "%s: Leaving\n", FUNC); #endif FUNC_LEAVE_NOAPI(ret_value) @@ -912,14 +917,14 @@ done: * Function: H5FD__mpio_open * * Purpose: Opens a file with name NAME. The FLAGS are a bit field with - * purpose similar to the second argument of open(2) and which - * are defined in H5Fpublic.h. The file access property list - * FAPL_ID contains the properties driver properties and MAXADDR - * is the largest address which this file will be expected to - * access. This is collective. + * purpose similar to the second argument of open(2) and which + * are defined in H5Fpublic.h. The file access property list + * FAPL_ID contains the properties driver properties and MAXADDR + * is the largest address which this file will be expected to + * access. This is collective. * - * Return: Success: A new file pointer. - * Failure: NULL + * Return: Success: A new file pointer + * Failure: NULL * * Programmer: Robert Kim Yates * January 30, 1998 @@ -943,30 +948,32 @@ H5FD__mpio_open(const char *name, unsigned flags, hid_t fapl_id, H5P_genplist_t *plist; /* Property list pointer */ MPI_Comm comm_dup = MPI_COMM_NULL; MPI_Info info_dup = MPI_INFO_NULL; - H5FD_t *ret_value; /* Return value */ + H5FD_t *ret_value = NULL; /* Return value */ FUNC_ENTER_STATIC #ifdef H5FDmpio_DEBUG if(H5FD_mpio_Debug[(int)'t']) - HDfprintf(stdout, "%s: Entering - name = \"%s\", flags = 0x%x, fapl_id = %d, maxaddr = %lu\n", FUNC, name, flags, (int)fapl_id, (unsigned long)maxaddr); + HDfprintf(stdout, "%s: Entering - name = \"%s\", flags = 0x%x, fapl_id = %d, maxaddr = %lu\n", FUNC, name, flags, (int)fapl_id, (unsigned long)maxaddr); #endif /* Obtain a pointer to mpio-specific file access properties */ if(NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list") if(H5P_FILE_ACCESS_DEFAULT == fapl_id || H5FD_MPIO != H5P_peek_driver(plist)) { - _fa.comm = MPI_COMM_SELF; /*default*/ - _fa.info = MPI_INFO_NULL; /*default*/ - fa = &_fa; + _fa.comm = MPI_COMM_SELF; /*default*/ + _fa.info = MPI_INFO_NULL; /*default*/ + fa = &_fa; } /* end if */ else if(NULL == (fa = (const H5FD_mpio_fapl_t *)H5P_peek_driver_info(plist))) - HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, NULL, "bad VFL driver info") + HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, NULL, "bad VFL driver info") - /* Duplicate communicator and Info object for use by this file. */ - if(FAIL == H5FD_mpi_comm_info_dup(fa->comm, fa->info, &comm_dup, &info_dup)) - HGOTO_ERROR(H5E_INTERNAL, H5E_CANTCOPY, NULL, "Communicator/Info duplicate failed") + /* Duplicate MPI communicator and info */ + if(FAIL == H5_mpi_comm_dup(fa->comm, &comm_dup)) + HGOTO_ERROR(H5E_INTERNAL, H5E_CANTCOPY, NULL, "communicator duplicate failed") + if(FAIL == H5_mpi_info_dup(fa->info, &info_dup)) + HGOTO_ERROR(H5E_INTERNAL, H5E_CANTCOPY, NULL, "info duplicate failed") /* convert HDF5 flags to MPI-IO flags */ /* some combinations are illegal; let MPI-IO figure it out */ @@ -1046,12 +1053,10 @@ done: if(ret_value == NULL) { if(file_opened) MPI_File_close(&fh); - if(MPI_COMM_NULL != comm_dup) - MPI_Comm_free(&comm_dup); - if(MPI_INFO_NULL != info_dup) - MPI_Info_free(&info_dup); - if(file) - H5MM_xfree(file); + MPI_Comm_free(&comm_dup); + MPI_Info_free(&info_dup); + if(file) + H5MM_xfree(file); } /* end if */ #ifdef H5FDmpio_DEBUG @@ -1068,8 +1073,7 @@ done: * * Purpose: Closes a file. This is collective. * - * Return: Success: Non-negative - * Failure: Negative + * Return: SUCCEED/FAIL * * Programmer: Unknown * January 30, 1998 @@ -1079,15 +1083,15 @@ done: static herr_t H5FD__mpio_close(H5FD_t *_file) { - H5FD_mpio_t *file = (H5FD_mpio_t*)_file; - int mpi_code; /* MPI return code */ + H5FD_mpio_t *file = (H5FD_mpio_t*)_file; + int mpi_code; /* MPI return code */ herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_STATIC #ifdef H5FDmpio_DEBUG if(H5FD_mpio_Debug[(int)'t']) - HDfprintf(stdout, "%s: Entering\n", FUNC); + HDfprintf(stdout, "%s: Entering\n", FUNC); #endif /* Sanity checks */ @@ -1099,13 +1103,14 @@ H5FD__mpio_close(H5FD_t *_file) HMPI_GOTO_ERROR(FAIL, "MPI_File_close failed", mpi_code) /* Clean up other stuff */ - H5FD_mpi_comm_info_free(&file->comm, &file->info); + H5_mpi_comm_free(&file->comm); + H5_mpi_info_free(&file->info); H5MM_xfree(file); done: #ifdef H5FDmpio_DEBUG if(H5FD_mpio_Debug[(int)'t']) - HDfprintf(stdout, "%s: Leaving\n", FUNC); + HDfprintf(stdout, "%s: Leaving\n", FUNC); #endif FUNC_LEAVE_NOAPI(ret_value) @@ -1113,15 +1118,14 @@ done: /*------------------------------------------------------------------------- - * Function: H5FD__mpio_query + * Function: H5FD__mpio_query * - * Purpose: Set the flags that this VFL driver is capable of supporting. + * Purpose: Set the flags that this VFL driver is capable of supporting. * (listed in H5FDpublic.h) * - * Return: Success: non-negative - * Failure: negative + * Return: SUCCEED/FAIL * - * Programmer: Quincey Koziol + * Programmer: Quincey Koziol * Friday, August 25, 2000 * *------------------------------------------------------------------------- @@ -1129,7 +1133,7 @@ done: static herr_t H5FD__mpio_query(const H5FD_t H5_ATTR_UNUSED *_file, unsigned long *flags /* out */) { - FUNC_ENTER_STATIC + FUNC_ENTER_STATIC_NOERR /* Set the VFL feature flags that this driver supports */ if(flags) { @@ -1146,16 +1150,16 @@ H5FD__mpio_query(const H5FD_t H5_ATTR_UNUSED *_file, unsigned long *flags /* out /*------------------------------------------------------------------------- - * Function: H5FD__mpio_get_eoa + * Function: H5FD__mpio_get_eoa * - * Purpose: Gets the end-of-address marker for the file. The EOA marker - * is the first address past the last byte allocated in the - * format address space. + * Purpose: Gets the end-of-address marker for the file. The EOA marker + * is the first address past the last byte allocated in the + * format address space. * - * Return: Success: The end-of-address marker. - * Failure: HADDR_UNDEF + * Return: Success: The end-of-address marker + * Failure: HADDR_UNDEF * - * Programmer: Robb Matzke + * Programmer: Robb Matzke * Friday, August 6, 1999 * *------------------------------------------------------------------------- @@ -1163,9 +1167,9 @@ H5FD__mpio_query(const H5FD_t H5_ATTR_UNUSED *_file, unsigned long *flags /* out static haddr_t H5FD__mpio_get_eoa(const H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type) { - const H5FD_mpio_t *file = (const H5FD_mpio_t*)_file; + const H5FD_mpio_t *file = (const H5FD_mpio_t*)_file; - FUNC_ENTER_STATIC + FUNC_ENTER_STATIC_NOERR /* Sanity checks */ HDassert(file); @@ -1176,16 +1180,15 @@ H5FD__mpio_get_eoa(const H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type) /*------------------------------------------------------------------------- - * Function: H5FD__mpio_set_eoa + * Function: H5FD__mpio_set_eoa * - * Purpose: Set the end-of-address marker for the file. This function is - * called shortly after an existing HDF5 file is opened in order - * to tell the driver where the end of the HDF5 data is located. + * Purpose: Set the end-of-address marker for the file. This function is + * called shortly after an existing HDF5 file is opened in order + * to tell the driver where the end of the HDF5 data is located. * - * Return: Success: 0 - * Failure: -1 + * Return: SUCCEED/FAIL * - * Programmer: Robb Matzke + * Programmer: Robb Matzke * Friday, August 6, 1999 * *------------------------------------------------------------------------- @@ -1193,9 +1196,9 @@ H5FD__mpio_get_eoa(const H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type) static herr_t H5FD__mpio_set_eoa(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, haddr_t addr) { - H5FD_mpio_t *file = (H5FD_mpio_t*)_file; + H5FD_mpio_t *file = (H5FD_mpio_t*)_file; - FUNC_ENTER_STATIC + FUNC_ENTER_STATIC_NOERR /* Sanity checks */ HDassert(file); @@ -1208,27 +1211,27 @@ H5FD__mpio_set_eoa(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, haddr_t addr) /*------------------------------------------------------------------------- - * Function: H5FD__mpio_get_eof + * Function: H5FD__mpio_get_eof * - * Purpose: Gets the end-of-file marker for the file. The EOF marker - * is the real size of the file. + * Purpose: Gets the end-of-file marker for the file. The EOF marker + * is the real size of the file. * - * The MPIO driver doesn't bother keeping this field updated - * since that's a relatively expensive operation. Fortunately - * the library only needs the EOF just after the file is opened - * in order to determine whether the file is empty, truncated, - * or okay. Therefore, any MPIO I/O function will set its value - * to HADDR_UNDEF which is the error return value of this - * function. + * The MPIO driver doesn't bother keeping this field updated + * since that's a relatively expensive operation. Fortunately + * the library only needs the EOF just after the file is opened + * in order to determine whether the file is empty, truncated, + * or okay. Therefore, any MPIO I/O function will set its value + * to HADDR_UNDEF which is the error return value of this + * function. * * Keeping the EOF updated (during write calls) is expensive * because any process may extend the physical end of the * file. -QAK * - * Return: Success: The end-of-address marker. - * Failure: HADDR_UNDEF + * Return: Success: The end-of-file marker + * Failure: HADDR_UNDEF * - * Programmer: Robb Matzke + * Programmer: Robb Matzke * Friday, August 6, 1999 * *------------------------------------------------------------------------- @@ -1236,9 +1239,9 @@ H5FD__mpio_set_eoa(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, haddr_t addr) static haddr_t H5FD__mpio_get_eof(const H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type) { - const H5FD_mpio_t *file = (const H5FD_mpio_t*)_file; + const H5FD_mpio_t *file = (const H5FD_mpio_t*)_file; - FUNC_ENTER_STATIC + FUNC_ENTER_STATIC_NOERR /* Sanity checks */ HDassert(file); @@ -1253,7 +1256,7 @@ H5FD__mpio_get_eof(const H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type) * * Purpose: Returns the file handle of MPIO file driver. * - * Returns: Non-negative if succeed or negative if fails. + * Returns: SUCCEED/FAIL * * Programmer: Raymond Lu * Sept. 16, 2002 @@ -1283,13 +1286,11 @@ done: * * Purpose: Returns the file info of MPIO file driver. * - * Returns: Non-negative if succeed or negative if fails. + * Returns: SUCCEED/FAIL * * Programmer: John Mainzer * April 4, 2017 * - * Modifications: - * *------------------------------------------------------------------------- */ static herr_t @@ -1312,23 +1313,23 @@ done: /*------------------------------------------------------------------------- - * Function: H5FD__mpio_read + * Function: H5FD__mpio_read * - * Purpose: Reads SIZE bytes of data from FILE beginning at address ADDR - * into buffer BUF according to data transfer properties in - * DXPL_ID using potentially complex file and buffer types to - * effect the transfer. + * Purpose: Reads SIZE bytes of data from FILE beginning at address ADDR + * into buffer BUF according to data transfer properties in + * DXPL_ID using potentially complex file and buffer types to + * effect the transfer. * - * Reading past the end of the MPI file returns zeros instead of - * failing. MPI is able to coalesce requests from different - * processes (collective or independent). + * Reading past the end of the MPI file returns zeros instead of + * failing. MPI is able to coalesce requests from different + * processes (collective or independent). * - * Return: Success: Zero. Result is stored in caller-supplied - * buffer BUF. + * Return: Success: SUCCEED. Result is stored in caller-supplied + * buffer BUF. * - * Failure: -1, Contents of buffer BUF are undefined. + * Failure: FAIL. Contents of buffer BUF are undefined. * - * Programmer: rky, 1998-01-30 + * Programmer: rky, 1998-01-30 * *------------------------------------------------------------------------- */ @@ -1531,22 +1532,22 @@ done: /*------------------------------------------------------------------------- - * Function: H5FD__mpio_write + * Function: H5FD__mpio_write * - * Purpose: Writes SIZE bytes of data to FILE beginning at address ADDR - * from buffer BUF according to data transfer properties in - * DXPL_ID using potentially complex file and buffer types to - * effect the transfer. + * Purpose: Writes SIZE bytes of data to FILE beginning at address ADDR + * from buffer BUF according to data transfer properties in + * DXPL_ID using potentially complex file and buffer types to + * effect the transfer. * - * MPI is able to coalesce requests from different processes - * (collective and independent). + * MPI is able to coalesce requests from different processes + * (collective and independent). * - * Return: Success: Zero. USE_TYPES and OLD_USE_TYPES in the - * access params are altered. - * Failure: -1, USE_TYPES and OLD_USE_TYPES in the - * access params may be altered. + * Return: Success: SUCCEED. USE_TYPES and OLD_USE_TYPES in the + * access params are altered. + * Failure: FAIL. USE_TYPES and OLD_USE_TYPES in the + * access params may be altered. * - * Programmer: Robert Kim Yates + * Programmer: Robert Kim Yates * January 30, 1998 * *------------------------------------------------------------------------- @@ -1555,13 +1556,13 @@ static herr_t H5FD__mpio_write(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t addr, size_t size, const void *buf) { - H5FD_mpio_t *file = (H5FD_mpio_t*)_file; - MPI_Offset mpi_off; - MPI_Status mpi_stat; /* Status from I/O operation */ - MPI_Datatype buf_type = MPI_BYTE; /* MPI description of the selection in memory */ - int mpi_code; /* MPI return code */ + H5FD_mpio_t *file = (H5FD_mpio_t*)_file; + MPI_Offset mpi_off; + MPI_Status mpi_stat; /* Status from I/O operation */ + MPI_Datatype buf_type = MPI_BYTE; /* MPI description of the selection in memory */ + int mpi_code; /* MPI return code */ #if MPI_VERSION >= 3 - MPI_Count bytes_written; + MPI_Count bytes_written; MPI_Count type_size; /* MPI datatype used for I/O's size */ MPI_Count io_size; /* Actual number of bytes requested */ #else @@ -1570,15 +1571,15 @@ H5FD__mpio_write(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, int io_size; /* Actual number of bytes requested */ #endif int size_i; - hbool_t use_view_this_time = FALSE; + hbool_t use_view_this_time = FALSE; H5FD_mpio_xfer_t xfer_mode; /* I/O transfer mode */ - herr_t ret_value = SUCCEED; + herr_t ret_value = SUCCEED; FUNC_ENTER_STATIC #ifdef H5FDmpio_DEBUG if(H5FD_mpio_Debug[(int)'t']) - HDfprintf(stdout, "%s: Entering\n", FUNC); + HDfprintf(stdout, "%s: Entering\n", FUNC); #endif /* Sanity checks */ @@ -1615,7 +1616,7 @@ H5FD__mpio_write(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, * could mean "use MPI_BYTE" by convention). */ if(xfer_mode == H5FD_MPIO_COLLECTIVE) { - MPI_Datatype file_type; + MPI_Datatype file_type; /* Remember that views are used */ use_view_this_time = TRUE; @@ -1713,7 +1714,7 @@ H5FD__mpio_write(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, done: #ifdef H5FDmpio_DEBUG if(H5FD_mpio_Debug[(int)'t']) - HDfprintf(stdout, "%s: Leaving, proc %d: ret_value = %d\n", FUNC, file->mpi_rank, ret_value ); + HDfprintf(stdout, "%s: Leaving, proc %d: ret_value = %d\n", FUNC, file->mpi_rank, ret_value ); #endif FUNC_LEAVE_NOAPI(ret_value) @@ -1725,9 +1726,7 @@ done: * * Purpose: Makes sure that all data is on disk. This is collective. * - * Return: Success: Non-negative - * - * Failure: Negative + * Return: SUCCEED/FAIL * * Programmer: Robb Matzke * January 30, 1998 @@ -1737,15 +1736,15 @@ done: static herr_t H5FD__mpio_flush(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, hbool_t closing) { - H5FD_mpio_t *file = (H5FD_mpio_t*)_file; - int mpi_code; /* mpi return code */ - herr_t ret_value = SUCCEED; + H5FD_mpio_t *file = (H5FD_mpio_t*)_file; + int mpi_code; /* mpi return code */ + herr_t ret_value = SUCCEED; FUNC_ENTER_STATIC #ifdef H5FDmpio_DEBUG if(H5FD_mpio_Debug[(int)'t']) - HDfprintf(stdout, "%s: Entering\n", FUNC); + HDfprintf(stdout, "%s: Entering\n", FUNC); #endif /* Sanity checks */ @@ -1760,7 +1759,7 @@ H5FD__mpio_flush(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, hbool_t closing) done: #ifdef H5FDmpio_DEBUG if(H5FD_mpio_Debug[(int)'t']) - HDfprintf(stdout, "%s: Leaving\n", FUNC); + HDfprintf(stdout, "%s: Leaving\n", FUNC); #endif FUNC_LEAVE_NOAPI(ret_value) @@ -1782,8 +1781,7 @@ done: * only call MPI_File_set_size() if this value disagrees * with the current eoa. * - * Return: Success: Non-negative - * Failure: Negative + * Return: SUCCEED/FAIL * * Programmer: Quincey Koziol * January 31, 2008 @@ -1793,14 +1791,14 @@ done: static herr_t H5FD__mpio_truncate(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, hbool_t H5_ATTR_UNUSED closing) { - H5FD_mpio_t *file = (H5FD_mpio_t*)_file; + H5FD_mpio_t *file = (H5FD_mpio_t*)_file; herr_t ret_value = SUCCEED; FUNC_ENTER_STATIC #ifdef H5FDmpio_DEBUG if(H5FD_mpio_Debug[(int)'t']) - HDfprintf(stdout, "%s: Entering\n", FUNC); + HDfprintf(stdout, "%s: Entering\n", FUNC); #endif /* Sanity checks */ @@ -1869,7 +1867,7 @@ H5FD__mpio_truncate(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, hbool_t H5_ATTR done: #ifdef H5FDmpio_DEBUG if(H5FD_mpio_Debug[(int)'t']) - HDfprintf(stdout, "%s: Leaving\n", FUNC); + HDfprintf(stdout, "%s: Leaving\n", FUNC); #endif FUNC_LEAVE_NOAPI(ret_value) @@ -1877,14 +1875,14 @@ done: /*------------------------------------------------------------------------- - * Function: H5FD__mpio_mpi_rank + * Function: H5FD__mpio_mpi_rank * - * Purpose: Returns the MPI rank for a process + * Purpose: Returns the MPI rank for a process * - * Return: Success: non-negative - * Failure: negative + * Return: Success: non-negative + * Failure: negative * - * Programmer: Quincey Koziol + * Programmer: Quincey Koziol * Thursday, May 16, 2002 * *------------------------------------------------------------------------- @@ -1892,9 +1890,9 @@ done: static int H5FD__mpio_mpi_rank(const H5FD_t *_file) { - const H5FD_mpio_t *file = (const H5FD_mpio_t*)_file; + const H5FD_mpio_t *file = (const H5FD_mpio_t*)_file; - FUNC_ENTER_STATIC + FUNC_ENTER_STATIC_NOERR /* Sanity checks */ HDassert(file); @@ -1905,14 +1903,14 @@ H5FD__mpio_mpi_rank(const H5FD_t *_file) /*------------------------------------------------------------------------- - * Function: H5FD__mpio_mpi_size + * Function: H5FD__mpio_mpi_size * - * Purpose: Returns the number of MPI processes + * Purpose: Returns the number of MPI processes * - * Return: Success: non-negative - * Failure: negative + * Return: Success: non-negative + * Failure: negative * - * Programmer: Quincey Koziol + * Programmer: Quincey Koziol * Thursday, May 16, 2002 * *------------------------------------------------------------------------- @@ -1920,9 +1918,9 @@ H5FD__mpio_mpi_rank(const H5FD_t *_file) static int H5FD__mpio_mpi_size(const H5FD_t *_file) { - const H5FD_mpio_t *file = (const H5FD_mpio_t*)_file; + const H5FD_mpio_t *file = (const H5FD_mpio_t*)_file; - FUNC_ENTER_STATIC + FUNC_ENTER_STATIC_NOERR /* Sanity checks */ HDassert(file); @@ -1933,15 +1931,14 @@ H5FD__mpio_mpi_size(const H5FD_t *_file) /*------------------------------------------------------------------------- - * Function: H5FD__mpio_communicator - * - * Purpose: Returns the MPI communicator for the file. + * Function: H5FD__mpio_communicator * - * Return: Success: The communicator + * Purpose: Returns the MPI communicator for the file. * - * Failure: NULL + * Return: Success: The communicator + * Failure: Can't fail * - * Programmer: Robb Matzke + * Programmer: Robb Matzke * Monday, August 9, 1999 * *------------------------------------------------------------------------- @@ -1949,9 +1946,9 @@ H5FD__mpio_mpi_size(const H5FD_t *_file) static MPI_Comm H5FD__mpio_communicator(const H5FD_t *_file) { - const H5FD_mpio_t *file = (const H5FD_mpio_t*)_file; + const H5FD_mpio_t *file = (const H5FD_mpio_t*)_file; - FUNC_ENTER_STATIC + FUNC_ENTER_STATIC_NOERR /* Sanity checks */ HDassert(file); @@ -1971,8 +1968,6 @@ H5FD__mpio_communicator(const H5FD_t *_file) * Programmer: John Mainzer * April 4, 2017 * - * Modifications: - * *------------------------------------------------------------------------- */ static herr_t diff --git a/src/H5FDprivate.h b/src/H5FDprivate.h index c79d676..0db66af 100644 --- a/src/H5FDprivate.h +++ b/src/H5FDprivate.h @@ -160,9 +160,6 @@ H5_DLL herr_t H5FD_set_paged_aggr(H5FD_t *file, hbool_t paged); /* General routines */ H5_DLL haddr_t H5FD_mpi_MPIOff_to_haddr(MPI_Offset mpi_off); H5_DLL herr_t H5FD_mpi_haddr_to_MPIOff(haddr_t addr, MPI_Offset *mpi_off/*out*/); -H5_DLL herr_t H5FD_mpi_comm_info_dup(MPI_Comm comm, MPI_Info info, - MPI_Comm *comm_new, MPI_Info *info_new); -H5_DLL herr_t H5FD_mpi_comm_info_free(MPI_Comm *comm, MPI_Info *info); #ifdef NOT_YET H5_DLL herr_t H5FD_mpio_wait_for_left_neighbor(H5FD_t *file); H5_DLL herr_t H5FD_mpio_signal_right_neighbor(H5FD_t *file); diff --git a/src/H5FDros3.c b/src/H5FDros3.c index 86642aa..18f1f91 100644 --- a/src/H5FDros3.c +++ b/src/H5FDros3.c @@ -11,12 +11,12 @@ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* - * Read-Only S3 Virtual File Driver (VFD) + * Read-Only S3 Virtual File Driver (VFD) * * Programmer: Jacob Smith <jake.smith@hdfgroup.org> * 2017-10-13 * - * Purpose: + * Purpose: * * Provide read-only access to files hosted on Amazon's S3 service. * Relies on "s3comms" utility layer to implement the AWS REST API. @@ -137,9 +137,9 @@ typedef struct { * * Purpose: * - * H5FD_ros3_t is a structure used to store all information needed to + * H5FD_ros3_t is a structure used to store all information needed to * maintain R/O access to a single HDF5 file that has been stored as a - * S3 object. This structure is created when such a file is "opened" and + * S3 object. This structure is created when such a file is "opened" and * discarded when it is "closed". * * Presents an S3 object as a file to the HDF5 library. @@ -154,7 +154,7 @@ typedef struct { * * `fa` (H5FD_ros3_fapl_t) * - * Instance of `H5FD_ros3_fapl_t` containing the S3 configuration data + * Instance of `H5FD_ros3_fapl_t` containing the S3 configuration data * needed to "open" the HDF5 file. * * `eoa` (haddr_t) @@ -163,9 +163,9 @@ typedef struct { * equal the file size. * * `s3r_handle` (s3r_t *) - * + * * Instance of S3 Request handle associated with the target resource. - * Responsible for communicating with remote host and presenting file + * Responsible for communicating with remote host and presenting file * contents as indistinguishable from a file on the local filesystem. * * *** present only if ROS3_SATS is flagged to enable stats collection *** @@ -211,10 +211,13 @@ typedef struct H5FD_ros3_t { * ADDR_OVERFLOW: Checks whether a file address of type `haddr_t' * is too large to be represented by the second argument * of the file seek function. + * Only included if it may be used -- ROS3 VFD is enabled. * */ #define MAXADDR (((haddr_t)1<<(8*sizeof(HDoff_t)-1))-1) +#ifdef H5_HAVE_ROS3_VFD #define ADDR_OVERFLOW(A) (HADDR_UNDEF==(A) || ((A) & ~(haddr_t)MAXADDR)) +#endif /* H5_HAVE_ROS3_VFD */ /* Prototypes */ static herr_t H5FD_ros3_term(void); @@ -229,13 +232,13 @@ static herr_t H5FD_ros3_query(const H5FD_t *_f1, unsigned long *flags); static haddr_t H5FD_ros3_get_eoa(const H5FD_t *_file, H5FD_mem_t type); static herr_t H5FD_ros3_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t addr); static haddr_t H5FD_ros3_get_eof(const H5FD_t *_file, H5FD_mem_t type); -static herr_t H5FD_ros3_get_handle(H5FD_t *_file, hid_t fapl, +static herr_t H5FD_ros3_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle); -static herr_t H5FD_ros3_read(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, +static herr_t H5FD_ros3_read(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, haddr_t addr, size_t size, void *buf); -static herr_t H5FD_ros3_write(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, +static herr_t H5FD_ros3_write(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, haddr_t addr, size_t size, const void *buf); -static herr_t H5FD_ros3_truncate(H5FD_t *_file, hid_t dxpl_id, +static herr_t H5FD_ros3_truncate(H5FD_t *_file, hid_t dxpl_id, hbool_t closing); static herr_t H5FD_ros3_lock(H5FD_t *_file, hbool_t rw); static herr_t H5FD_ros3_unlock(H5FD_t *_file); @@ -276,8 +279,10 @@ static const H5FD_class_t H5FD_ros3_g = { H5FD_FLMAP_DICHOTOMY /* fl_map */ }; +#ifdef H5_HAVE_ROS3_VFD /* Declare a free list to manage the H5FD_ros3_t struct */ H5FL_DEFINE_STATIC(H5FD_ros3_t); +#endif /* H5_HAVE_ROS3_VFD */ /*------------------------------------------------------------------------- @@ -300,14 +305,14 @@ H5FD__init_package(void) FUNC_ENTER_STATIC if (H5FD_ros3_init() < 0) { - HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, + HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "unable to initialize ros3 VFD") } done: FUNC_LEAVE_NOAPI(ret_value) -} /* H5FD__init_package() */ +} /* end H5FD__init_package() */ /*------------------------------------------------------------------------- @@ -330,7 +335,7 @@ done: hid_t H5FD_ros3_init(void) { - hid_t ret_value = H5I_INVALID_HID; /* Return value */ + hid_t ret_value = H5I_INVALID_HID; FUNC_ENTER_NOAPI(FAIL) @@ -388,6 +393,7 @@ H5FD_ros3_term(void) H5FD_ROS3_g = 0; FUNC_LEAVE_NOAPI(SUCCEED) + } /* end H5FD_ros3_term() */ @@ -395,8 +401,8 @@ H5FD_ros3_term(void) * Function: H5Pset_fapl_ros3 * * Purpose: Modify the file access property list to use the H5FD_ROS3 - * driver defined in this source file. All driver specfic - * properties are passed in as a pointer to a suitably + * driver defined in this source file. All driver specfic + * properties are passed in as a pointer to a suitably * initialized instance of H5FD_ros3_fapl_t * * Return: SUCCEED/FAIL @@ -407,14 +413,12 @@ H5FD_ros3_term(void) *------------------------------------------------------------------------- */ herr_t -H5Pset_fapl_ros3(hid_t fapl_id, +H5Pset_fapl_ros3(hid_t fapl_id, H5FD_ros3_fapl_t *fa) { H5P_genplist_t *plist = NULL; /* Property list pointer */ herr_t ret_value = FAIL; - - FUNC_ENTER_API(FAIL) H5TRACE2("e", "i*x", fapl_id, fa); @@ -425,21 +429,21 @@ H5Pset_fapl_ros3(hid_t fapl_id, #endif plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS); - if (plist == NULL) { + if (plist == NULL) { HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, \ "not a file access property list") } - if (FAIL == H5FD_ros3_validate_config(fa)) + if (FAIL == H5FD_ros3_validate_config(fa)) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid ros3 config") + } ret_value = H5P_set_driver(plist, H5FD_ROS3, (void *)fa); done: - FUNC_LEAVE_API(ret_value) -} /* H5Pset_fapl_ros3() */ +} /* end H5Pset_fapl_ros3() */ /*------------------------------------------------------------------------- @@ -449,12 +453,12 @@ done: * contains internally consistant data. Return SUCCEED if so, * and FAIL otherwise. * - * Note the difference between internally consistant and - * correct. As we will have to try to access the target + * Note the difference between internally consistant and + * correct. As we will have to try to access the target * object to determine whether the supplied data is correct, * we will settle for internal consistancy at this point * - * Return: SUCCEED if instance of H5FD_ros3_fapl_t contains internally + * Return: SUCCEED if instance of H5FD_ros3_fapl_t contains internally * consistant data, FAIL otherwise. * * Programmer: Jacob Smith @@ -494,7 +498,7 @@ H5FD_ros3_validate_config(const H5FD_ros3_fapl_t * fa) done: FUNC_LEAVE_NOAPI(ret_value) -} /* H5FD_ros3_validate_config() */ +} /* end H5FD_ros3_validate_config() */ /*------------------------------------------------------------------------- @@ -515,12 +519,12 @@ done: *------------------------------------------------------------------------- */ herr_t -H5Pget_fapl_ros3(hid_t fapl_id, +H5Pget_fapl_ros3(hid_t fapl_id, H5FD_ros3_fapl_t *fa_out) { - const H5FD_ros3_fapl_t *fa; - H5P_genplist_t *plist = NULL; /* Property list pointer */ - herr_t ret_value = SUCCEED; /* Return value */ + const H5FD_ros3_fapl_t *fa = NULL; + H5P_genplist_t *plist = NULL; + herr_t ret_value = SUCCEED; FUNC_ENTER_API(FAIL) H5TRACE2("e", "i*x", fapl_id, fa_out); @@ -529,8 +533,9 @@ H5Pget_fapl_ros3(hid_t fapl_id, HDfprintf(stdout, "H5Pget_fapl_ros3() called.\n"); #endif - if (fa_out == NULL) + if (fa_out == NULL) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "fa_out is NULL") + } plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS); if (plist == NULL) { @@ -552,7 +557,7 @@ H5Pget_fapl_ros3(hid_t fapl_id, done: FUNC_LEAVE_API(ret_value) -} /* H5Pget_fapl_ros3() */ +} /* end H5Pget_fapl_ros3() */ /*------------------------------------------------------------------------- @@ -583,7 +588,7 @@ H5FD_ros3_fapl_get(H5FD_t *_file) fa = (H5FD_ros3_fapl_t *)H5MM_calloc(sizeof(H5FD_ros3_fapl_t)); if (fa == NULL) { - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") } @@ -595,12 +600,13 @@ H5FD_ros3_fapl_get(H5FD_t *_file) done: if (ret_value == NULL) { - if (fa != NULL) - H5MM_xfree(fa); + if (fa != NULL) { + H5MM_xfree(fa); + } } FUNC_LEAVE_NOAPI(ret_value) -} /* H5FD_ros3_fapl_get() */ +} /* end H5FD_ros3_fapl_get() */ /*------------------------------------------------------------------------- @@ -624,13 +630,13 @@ H5FD_ros3_fapl_copy(const void *_old_fa) { const H5FD_ros3_fapl_t *old_fa = (const H5FD_ros3_fapl_t*)_old_fa; H5FD_ros3_fapl_t *new_fa = NULL; - void *ret_value = NULL; /* Return value */ + void *ret_value = NULL; FUNC_ENTER_NOAPI_NOINIT new_fa = (H5FD_ros3_fapl_t *)H5MM_malloc(sizeof(H5FD_ros3_fapl_t)); if (new_fa == NULL) { - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed"); } @@ -639,12 +645,13 @@ H5FD_ros3_fapl_copy(const void *_old_fa) done: if (ret_value == NULL) { - if (new_fa != NULL) + if (new_fa != NULL) { H5MM_xfree(new_fa); + } } FUNC_LEAVE_NOAPI(ret_value) -} /* H5FD_ros3_fapl_copy() */ +} /* end H5FD_ros3_fapl_copy() */ /*------------------------------------------------------------------------- @@ -668,13 +675,13 @@ H5FD_ros3_fapl_free(void *_fa) FUNC_ENTER_NOAPI_NOINIT_NOERR - HDassert(fa != NULL); /* sanity check */ + HDassert(fa != NULL); /* sanity check */ H5MM_xfree(fa); FUNC_LEAVE_NOAPI(SUCCEED) -} /* H5FD_ros3_fapl_free() */ +} /* end H5FD_ros3_fapl_free() */ #if ROS3_STATS @@ -707,7 +714,6 @@ ros3_reset_stats(H5FD_ros3_t *file) unsigned i = 0; herr_t ret_value = SUCCEED; - FUNC_ENTER_NOAPI_NOINIT #if ROS3_DEBUG @@ -734,7 +740,8 @@ ros3_reset_stats(H5FD_ros3_t *file) done: FUNC_LEAVE_NOAPI(ret_value); -} /* ros3_reset_stats */ +} /* end ros3_reset_stats() */ + #endif /* ROS3_STATS */ @@ -747,10 +754,10 @@ done: * Create and/or opens a file as an HDF5 file. * * Any flag except H5F_ACC_RDONLY will cause an error. - * + * * Name (as received from `H5FD_open()`) must conform to web url: * NAME :: HTTP "://" DOMAIN [PORT] ["/" [URI] [QUERY] ] - * HTTP :: "http" [ "s" ] + * HTTP :: "http" [ "s" ] * DOMAIN :: e.g., "mybucket.host.org" * PORT :: ":" <number> (e.g., ":9000" ) * URI :: <string> (e.g., "path/to/resource.hd5" ) @@ -758,8 +765,8 @@ done: * * Return: * - * Success: A pointer to a new file data structure. - * The public fields will be initialized by the caller, which is + * Success: A pointer to a new file data structure. + * The public fields will be initialized by the caller, which is * always H5FD_open(). * * Failure: NULL @@ -771,32 +778,31 @@ done: * *------------------------------------------------------------------------- */ +#ifdef H5_HAVE_ROS3_VFD + static H5FD_t * -H5FD_ros3_open(const char *url, - unsigned flags, - hid_t fapl_id, - haddr_t maxaddr) +H5FD_ros3_open( + const char *url, + unsigned flags, + hid_t fapl_id, + haddr_t maxaddr) { -#ifdef H5_HAVE_ROS3_VFD H5FD_ros3_t *file = NULL; struct tm *now = NULL; char iso8601now[ISO8601_SIZE]; unsigned char signing_key[SHA256_DIGEST_LENGTH]; s3r_t *handle = NULL; H5FD_ros3_fapl_t fa; -#endif H5FD_t *ret_value = NULL; FUNC_ENTER_NOAPI_NOINIT -#ifdef H5_HAVE_ROS3_VFD #if ROS3_DEBUG HDfprintf(stdout, "H5FD_ros3_open() called.\n"); #endif - /* Sanity check on file offsets */ HDcompile_assert(sizeof(HDoff_t) >= sizeof(size_t)); @@ -837,7 +843,7 @@ H5FD_ros3_open(const char *url, if (FAIL == H5FD_s3comms_signing_key(signing_key, (const char *)fa.secret_key, (const char *)fa.aws_region, - (const char *)iso8601now) ) + (const char *)iso8601now) ) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "problem while computing signing key") @@ -854,17 +860,17 @@ H5FD_ros3_open(const char *url, if (handle == NULL) { /* If we want to check CURL's say on the matter in a controlled - * fashion, this is the place to do it, but would need to make a + * fashion, this is the place to do it, but would need to make a * few minor changes to s3comms `s3r_t` and `s3r_read()`. - */ + */ HGOTO_ERROR(H5E_VFL, H5E_CANTOPENFILE, NULL, "could not open"); } - /* create new file struct + /* create new file struct */ file = H5FL_CALLOC(H5FD_ros3_t); if (file == NULL) { - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "unable to allocate file struct") } @@ -873,7 +879,7 @@ H5FD_ros3_open(const char *url, #if ROS3_STATS if (FAIL == ros3_reset_stats(file)) { - HGOTO_ERROR(H5E_INTERNAL, H5E_UNINITIALIZED, NULL, + HGOTO_ERROR(H5E_INTERNAL, H5E_UNINITIALIZED, NULL, "unable to reset file statistics") } #endif /* ROS3_STATS */ @@ -882,9 +888,9 @@ H5FD_ros3_open(const char *url, done: if (ret_value == NULL) { - if (handle != NULL) { + if (handle != NULL) { if (FAIL == H5FD_s3comms_s3r_close(handle)) { - HDONE_ERROR(H5E_VFL, H5E_CANTCLOSEFILE, NULL, + HDONE_ERROR(H5E_VFL, H5E_CANTCLOSEFILE, NULL, "unable to close s3 file handle") } } @@ -892,13 +898,28 @@ done: file = H5FL_FREE(H5FD_ros3_t, file); } curl_global_cleanup(); /* early cleanup because open failed */ - } /* if null return value (error) */ -#endif /* H5_HAVE_ROS3_VFD */ + } /* end if null return value (error) */ FUNC_LEAVE_NOAPI(ret_value) +} /* end H5FD_ros3_open() */ + +#else /* H5_HAVE_ROS3_VFD not defined */ + +static H5FD_t * +H5FD_ros3_open( + const char H5_ATTR_UNUSED *url, + unsigned H5_ATTR_UNUSED flags, + hid_t H5_ATTR_UNUSED fapl_id, + haddr_t H5_ATTR_UNUSED maxaddr) +{ + H5FD_t *ret_value = NULL; + FUNC_ENTER_NOAPI_NOINIT_NOERR + FUNC_LEAVE_NOAPI(ret_value) } /* H5FD_ros3_open() */ +#endif /* H5_HAVE_ROS3_VFD */ + #if ROS3_STATS /*---------------------------------------------------------------------------- @@ -906,7 +927,7 @@ done: * Function: ros3_fprint_stats() * * Purpose: - * + * * Tabulate and pretty-print statistics for this virtual file. * * Should be called upon file close. @@ -927,17 +948,17 @@ done: * - max (largest size read) * 2. tabulation of "bins", sepraring reads into exponentially-larger * ranges of size. - * - columns for number of reads, total bytes, and average size, with + * - columns for number of reads, total bytes, and average size, with * separate sub-colums for raw- and metadata reads. * - each row represents one bin, identified by the top of its range - * + * * Bin ranges can be modified with pound-defines at the top of this file. * * Bins without any reads in their bounds are not printed. * * An "overflow" bin is also present, to catch "big" reads. * - * Output for all bins (and range ceiling and average size report) + * Output for all bins (and range ceiling and average size report) * is divied by powers of 1024. By corollary, four digits before the decimal * is valid. * @@ -1050,7 +1071,7 @@ ros3_fprint_stats(FILE *stream, HDfprintf(stream, "TOTAL BYTES: %llu (%llu meta, %llu raw)\n", bytes_raw + bytes_meta, bytes_meta, bytes_raw); - if (count_raw + count_meta == 0) + if (count_raw + count_meta == 0) goto done; /************************* @@ -1109,9 +1130,9 @@ ros3_fprint_stats(FILE *stream, * PRINT INDIVIDUAL BIN STATS * ******************************/ - HDfprintf(stream, + HDfprintf(stream, "BINS # of reads total bytes average size\n"); - HDfprintf(stream, + HDfprintf(stream, " up-to meta raw meta raw meta raw\n"); for (i = 0; i <= ROS3_STATS_BIN_COUNT; i++) { @@ -1129,7 +1150,7 @@ ros3_fprint_stats(FILE *stream, m = &file->meta[i]; r = &file->raw[i]; - if (r->count == 0 && m->count == 0) + if (r->count == 0 && m->count == 0) continue; range_end = ros3_stats_boundaries[i]; @@ -1172,7 +1193,7 @@ ros3_fprint_stats(FILE *stream, re_dub /= 1024.0; HDassert(suffix_i < sizeof(suffixes)); - HDfprintf(stream, + HDfprintf(stream, " %8.3f%c %7d %7d %8.3f%c %8.3f%c %8.3f%c %8.3f%c\n", re_dub, suffixes[suffix_i], /* bin ceiling */ m->count, /* metadata reads */ @@ -1187,7 +1208,7 @@ ros3_fprint_stats(FILE *stream, done: FUNC_LEAVE_NOAPI(ret_value); - + } /* ros3_fprint_stats */ #endif /* ROS3_STATS */ @@ -1201,7 +1222,7 @@ done: * Close an HDF5 file. * * Return: - * + * * SUCCEED/FAIL * * Programmer: Jacob Smith @@ -1211,57 +1232,63 @@ done: * *------------------------------------------------------------------------- */ +#ifdef H5_HAVE_ROS3_VFD + static herr_t -H5FD_ros3_close(H5FD_t *_file) +H5FD_ros3_close(H5FD_t H5_ATTR_UNUSED *_file) { -#ifdef H5_HAVE_ROS3_VFD H5FD_ros3_t *file = (H5FD_ros3_t *)_file; herr_t ret_value = SUCCEED; -#else - herr_t ret_value = FAIL; -#endif - - FUNC_ENTER_NOAPI_NOINIT -#ifdef H5_HAVE_ROS3_VFD #if ROS3_DEBUG HDfprintf(stdout, "H5FD_ros3_close() called.\n"); #endif - /* Sanity checks + /* Sanity checks */ HDassert(file != NULL); HDassert(file->s3r_handle != NULL); - /* Close the underlying request handle + /* Close the underlying request handle */ if (FAIL == H5FD_s3comms_s3r_close(file->s3r_handle)) { - HGOTO_ERROR(H5E_VFL, H5E_CANTCLOSEFILE, FAIL, + HGOTO_ERROR(H5E_VFL, H5E_CANTCLOSEFILE, FAIL, "unable to close S3 request handle") } #if ROS3_STATS /* TODO: mechanism to re-target stats printout */ - if (FAIL == ros3_fprint_stats(stdout, file)) { - HGOTO_ERROR(H5E_INTERNAL, H5E_ERROR, FAIL, + if (ros3_fprint_stats(stdout, file) == FAIL) { + HGOTO_ERROR(H5E_INTERNAL, H5E_ERROR, FAIL, "problem while writing file statistics") } #endif /* ROS3_STATS */ - /* Release the file info + /* Release the file info */ file = H5FL_FREE(H5FD_ros3_t, file); done: curl_global_cleanup(); /* cleanup to answer init on open */ -#endif /* H5_HAVE_ROS3_VFD */ FUNC_LEAVE_NOAPI(ret_value) } /* end H5FD_ros3_close() */ +#else /* H5_HAVE_ROS3_VFD not defined */ + +static herr_t +H5FD_ros3_close(H5FD_t H5_ATTR_UNUSED *_file) +{ + herr_t ret_value = FAIL; + FUNC_ENTER_NOAPI_NOINIT_NOERR + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5FD_ros3_close() */ + +#endif /* H5_HAVE_ROS3_VFD */ + /*------------------------------------------------------------------------- * @@ -1269,7 +1296,7 @@ done: * * Purpose: * - * Compares two files belonging to this driver using an arbitrary + * Compares two files belonging to this driver using an arbitrary * (but consistent) ordering: * * + url scheme @@ -1284,7 +1311,7 @@ done: * tl;dr -> check URL, check crentials * * Return: - * + * * - Equivalent: 0 * - Not Equivalent: -1 * @@ -1300,22 +1327,20 @@ done: * *------------------------------------------------------------------------- */ +#ifdef H5_HAVE_ROS3_VFD + static int -H5FD_ros3_cmp(const H5FD_t *_f1, - const H5FD_t *_f2) +H5FD_ros3_cmp( + const H5FD_t *_f1, + const H5FD_t *_f2) { -#ifdef H5_HAVE_ROS3_VFD const H5FD_ros3_t *f1 = (const H5FD_ros3_t *)_f1; const H5FD_ros3_t *f2 = (const H5FD_ros3_t *)_f2; const parsed_url_t *purl1 = NULL; const parsed_url_t *purl2 = NULL; -#endif int ret_value = 0; - - FUNC_ENTER_NOAPI_NOINIT_NOERR -#ifdef H5_HAVE_ROS3_VFD #if ROS3_DEBUG HDfprintf(stdout, "H5FD_ros3_cmp() called.\n"); @@ -1334,71 +1359,124 @@ H5FD_ros3_cmp(const H5FD_t *_f1, HDassert(purl2->host != NULL); /* URL: SCHEME */ - if (HDstrcmp(purl1->scheme, purl2->scheme)) HGOTO_DONE(-1); + if (HDstrcmp(purl1->scheme, purl2->scheme)) { + HGOTO_DONE(-1); + } /* URL: HOST */ - if (HDstrcmp(purl1->host, purl2->host)) HGOTO_DONE(-1); + if (HDstrcmp(purl1->host, purl2->host)) { + HGOTO_DONE(-1); + } /* URL: PORT */ if (purl1->port && purl2->port) { - if (HDstrcmp(purl1->port, purl2->port)) HGOTO_DONE(-1); - } else if (purl1->port) { + if (HDstrcmp(purl1->port, purl2->port)) { + HGOTO_DONE(-1); + } + } + else + if (purl1->port) { HGOTO_DONE(-1); - } else if (purl2->port) { + } + else + if (purl2->port) { HGOTO_DONE(-1); } /* URL: PATH */ if (purl1->path && purl2->path) { - if (HDstrcmp(purl1->path, purl2->path)) HGOTO_DONE(-1); - } else if (purl1->path && !purl2->path) { + if (HDstrcmp(purl1->path, purl2->path)) { + HGOTO_DONE(-1); + } + } + else + if (purl1->path && !purl2->path) { HGOTO_DONE(-1); - } else if (purl2->path && !purl1->path) { + } + else + if (purl2->path && !purl1->path) { HGOTO_DONE(-1); } /* URL: QUERY */ if (purl1->query && purl2->query) { - if (HDstrcmp(purl1->query, purl2->query)) HGOTO_DONE(-1); - } else if (purl1->query && !purl2->query) { + if (HDstrcmp(purl1->query, purl2->query)) { + HGOTO_DONE(-1); + } + } + else + if (purl1->query && !purl2->query) { HGOTO_DONE(-1); - } else if (purl2->query && !purl1->query) { + } + else + if (purl2->query && !purl1->query) { HGOTO_DONE(-1); } /* FAPL: AWS_REGION */ if (f1->fa.aws_region[0] != '\0' && f1->fa.aws_region[0] != '\0') { - if (HDstrcmp(f1->fa.aws_region, f2->fa.aws_region)) HGOTO_DONE(-1); - } else if (f1->fa.aws_region[0] != '\0') { + if (HDstrcmp(f1->fa.aws_region, f2->fa.aws_region)) { + HGOTO_DONE(-1); + } + } + else + if (f1->fa.aws_region[0] != '\0') { HGOTO_DONE(-1); - } else if (f2->fa.aws_region[0] != '\0') { + } + else + if (f2->fa.aws_region[0] != '\0') { HGOTO_DONE(-1); } /* FAPL: SECRET_ID */ if (f1->fa.secret_id[0] != '\0' && f1->fa.secret_id[0] != '\0') { - if (HDstrcmp(f1->fa.secret_id, f2->fa.secret_id)) HGOTO_DONE(-1); - } else if (f1->fa.secret_id[0] != '\0') { + if (HDstrcmp(f1->fa.secret_id, f2->fa.secret_id)) { + HGOTO_DONE(-1); + } + } + else + if (f1->fa.secret_id[0] != '\0') { HGOTO_DONE(-1); - } else if (f2->fa.secret_id[0] != '\0') { + } + else + if (f2->fa.secret_id[0] != '\0') { HGOTO_DONE(-1); } /* FAPL: SECRET_KEY */ if (f1->fa.secret_key[0] != '\0' && f1->fa.secret_key[0] != '\0') { - if (HDstrcmp(f1->fa.secret_key, f2->fa.secret_key)) HGOTO_DONE(-1); - } else if (f1->fa.secret_key[0] != '\0') { + if (HDstrcmp(f1->fa.secret_key, f2->fa.secret_key)) { + HGOTO_DONE(-1); + } + } + else + if (f1->fa.secret_key[0] != '\0') { HGOTO_DONE(-1); - } else if (f2->fa.secret_key[0] != '\0') { + } + else + if (f2->fa.secret_key[0] != '\0') { HGOTO_DONE(-1); } -#endif /* H5_HAVE_ROS3_VFD */ done: FUNC_LEAVE_NOAPI(ret_value) } /* H5FD_ros3_cmp() */ +#else /* H5_HAVE_ROS3_VFD not defined */ + +static int +H5FD_ros3_cmp( + const H5FD_t H5_ATTR_UNUSED *_f1, + const H5FD_t H5_ATTR_UNUSED *_f2) +{ + int ret_value = 0; + FUNC_ENTER_NOAPI_NOINIT_NOERR + FUNC_LEAVE_NOAPI(ret_value) +} /* H5FD_ros3_cmp() */ + +#endif /* H5_HAVE_ROS3_VFD */ + /*------------------------------------------------------------------------- * Function: H5FD_ros3_query @@ -1406,7 +1484,7 @@ done: * Purpose: Set the flags that this VFL driver is capable of supporting. * (listed in H5FDpublic.h) * - * Note that since the ROS3 VFD is read only, most flags + * Note that since the ROS3 VFD is read only, most flags * are irrelevant. * * The term "set" is highly misleading... @@ -1420,7 +1498,7 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5FD_ros3_query(const H5FD_t H5_ATTR_UNUSED *_file, +H5FD_ros3_query(const H5FD_t H5_ATTR_UNUSED *_file, unsigned long *flags /* out */) { FUNC_ENTER_NOAPI_NOINIT_NOERR @@ -1433,7 +1511,7 @@ H5FD_ros3_query(const H5FD_t H5_ATTR_UNUSED *_file, if (flags) { *flags = 0; /* OK to perform data sieving for faster raw data reads & writes */ - *flags |= H5FD_FEAT_DATA_SIEVE; + *flags |= H5FD_FEAT_DATA_SIEVE; } /* end if */ FUNC_LEAVE_NOAPI(SUCCEED) @@ -1463,7 +1541,7 @@ H5FD_ros3_query(const H5FD_t H5_ATTR_UNUSED *_file, *------------------------------------------------------------------------- */ static haddr_t -H5FD_ros3_get_eoa(const H5FD_t *_file, +H5FD_ros3_get_eoa(const H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type) { const H5FD_ros3_t *file = (const H5FD_ros3_t *)_file; @@ -1499,8 +1577,8 @@ H5FD_ros3_get_eoa(const H5FD_t *_file, *------------------------------------------------------------------------- */ static herr_t -H5FD_ros3_set_eoa(H5FD_t *_file, - H5FD_mem_t H5_ATTR_UNUSED type, +H5FD_ros3_set_eoa(H5FD_t *_file, + H5FD_mem_t H5_ATTR_UNUSED type, haddr_t addr) { H5FD_ros3_t *file = (H5FD_ros3_t *)_file; @@ -1528,7 +1606,7 @@ H5FD_ros3_set_eoa(H5FD_t *_file, * * Return: * - * EOF: the first address past the end of the "file", either the + * EOF: the first address past the end of the "file", either the * filesystem file or the HDF5 file. * * Programmer: Jacob Smith @@ -1537,7 +1615,7 @@ H5FD_ros3_set_eoa(H5FD_t *_file, *------------------------------------------------------------------------- */ static haddr_t -H5FD_ros3_get_eof(const H5FD_t *_file, +H5FD_ros3_get_eof(const H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type) { const H5FD_ros3_t *file = (const H5FD_ros3_t *)_file; @@ -1573,8 +1651,8 @@ H5FD_ros3_get_eof(const H5FD_t *_file, *------------------------------------------------------------------------- */ static herr_t -H5FD_ros3_get_handle(H5FD_t *_file, - hid_t H5_ATTR_UNUSED fapl, +H5FD_ros3_get_handle(H5FD_t *_file, + hid_t H5_ATTR_UNUSED fapl, void **file_handle) { H5FD_ros3_t *file = (H5FD_ros3_t *)_file; @@ -1586,8 +1664,9 @@ H5FD_ros3_get_handle(H5FD_t *_file, HDfprintf(stdout, "H5FD_ros3_get_handle() called.\n"); #endif - if(!file_handle) + if (!file_handle) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "file handle not valid") + } *file_handle = file->s3r_handle; @@ -1601,7 +1680,7 @@ done: * * Function: H5FD_ros3_read() * - * Purpose: + * Purpose * * Reads SIZE bytes of data from FILE beginning at address ADDR * into buffer BUF according to data transfer properties in DXPL_ID. @@ -1622,8 +1701,8 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5FD_ros3_read(H5FD_t *_file, - H5FD_mem_t H5_ATTR_UNUSED type, +H5FD_ros3_read(H5FD_t *_file, + H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t addr, /* start offset */ size_t size, /* length of read */ @@ -1631,13 +1710,13 @@ H5FD_ros3_read(H5FD_t *_file, { H5FD_ros3_t *file = (H5FD_ros3_t *)_file; size_t filesize = 0; - herr_t ret_value = SUCCEED; /* Return value */ + herr_t ret_value = SUCCEED; #if ROS3_STATS /* working variables for storing stats */ ros3_statsbin *bin = NULL; unsigned bin_i = 0; #endif /* ROS3_STATS */ - + FUNC_ENTER_NOAPI_NOINIT @@ -1655,7 +1734,7 @@ H5FD_ros3_read(H5FD_t *_file, HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "range exceeds file address") } - if (FAIL == H5FD_s3comms_s3r_read(file->s3r_handle, addr, size, buf) ) { + if (H5FD_s3comms_s3r_read(file->s3r_handle, addr, size, buf) == FAIL) { HGOTO_ERROR(H5E_VFL, H5E_READERROR, FAIL, "unable to execute read") } @@ -1664,30 +1743,33 @@ H5FD_ros3_read(H5FD_t *_file, /* Find which "bin" this read fits in. Can be "overflow" bin. */ for (bin_i = 0; bin_i < ROS3_STATS_BIN_COUNT; bin_i++) { - if ((unsigned long long)size < ros3_stats_boundaries[bin_i]) + if ((unsigned long long)size < ros3_stats_boundaries[bin_i]) { break; + } } bin = (type == H5FD_MEM_DRAW) ? &file->raw[bin_i] : &file->meta[bin_i]; - /* Store collected stats in appropriate bin + /* Store collected stats in appropriate bin */ if (bin->count == 0) { bin->min = size; bin->max = size; - } else { - if (size < bin->min) + } + else { + if (size < bin->min) { bin->min = size; - if (size > bin->max) + } + if (size > bin->max) { bin->max = size; + } } bin->count++; bin->bytes += (unsigned long long)size; #endif /* ROS3_STATS */ - done: FUNC_LEAVE_NOAPI(ret_value) @@ -1698,12 +1780,12 @@ done: * * Function: H5FD_ros3_write() * - * Purpose: + * Purpose: * * Write bytes to file. * UNSUPPORTED IN READ-ONLY ROS3 VFD. * - * Return: + * Return: * * FAIL (Not possible with Read-Only S3 file.) * @@ -1715,11 +1797,11 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5FD_ros3_write(H5FD_t H5_ATTR_UNUSED *_file, - H5FD_mem_t H5_ATTR_UNUSED type, +H5FD_ros3_write(H5FD_t H5_ATTR_UNUSED *_file, + H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNUSED dxpl_id, - haddr_t H5_ATTR_UNUSED addr, - size_t H5_ATTR_UNUSED size, + haddr_t H5_ATTR_UNUSED addr, + size_t H5_ATTR_UNUSED size, const void H5_ATTR_UNUSED *buf) { herr_t ret_value = FAIL; @@ -1762,8 +1844,8 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5FD_ros3_truncate(H5FD_t H5_ATTR_UNUSED *_file, - hid_t H5_ATTR_UNUSED dxpl_id, +H5FD_ros3_truncate(H5FD_t H5_ATTR_UNUSED *_file, + hid_t H5_ATTR_UNUSED dxpl_id, hbool_t H5_ATTR_UNUSED closing) { herr_t ret_value = SUCCEED; @@ -1807,7 +1889,7 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5FD_ros3_lock(H5FD_t H5_ATTR_UNUSED *_file, +H5FD_ros3_lock(H5FD_t H5_ATTR_UNUSED *_file, hbool_t H5_ATTR_UNUSED rw) { FUNC_ENTER_NOAPI_NOINIT_NOERR diff --git a/src/H5FDs3comms.c b/src/H5FDs3comms.c index 8c0515d..42b281f 100644 --- a/src/H5FDs3comms.c +++ b/src/H5FDs3comms.c @@ -11,7 +11,7 @@ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /***************************************************************************** - * Read-Only S3 Virtual File Driver (VFD) + * Read-Only S3 Virtual File Driver (VFD) * * Source for S3 Communications module * @@ -51,6 +51,8 @@ */ #define S3COMMS_DEBUG 0 +#ifdef H5_HAVE_ROS3_VFD + /* manipulate verbosity of CURL output * operates separately from S3COMMS_DEBUG * @@ -65,6 +67,8 @@ */ #define S3COMMS_MAX_RANGE_STRING_SIZE 128 +#endif /* H5_HAVE_ROS3_VFD */ + /******************/ /* Local Typedefs */ /******************/ @@ -111,7 +115,7 @@ herr_t H5FD_s3comms_s3r_getsize(s3r_t *handle); /* Functions */ /*************/ - + /*---------------------------------------------------------------------------- * * Function: curlwritecallback() @@ -147,8 +151,9 @@ curlwritecallback(char *ptr, size_t product = (size * nmemb); size_t written = 0; - if (sds->magic != S3COMMS_CALLBACK_DATASTRUCT_MAGIC) + if (sds->magic != S3COMMS_CALLBACK_DATASTRUCT_MAGIC) { return written; + } if (size > 0) { HDmemcpy(&(sds->data[sds->size]), ptr, product); @@ -158,9 +163,9 @@ curlwritecallback(char *ptr, return written; -} /* curlwritecallback */ - +} /* end curlwritecallback() */ + /*---------------------------------------------------------------------------- * * Function: H5FD_s3comms_hrb_node_set() @@ -223,9 +228,10 @@ curlwritecallback(char *ptr, *---------------------------------------------------------------------------- */ herr_t -H5FD_s3comms_hrb_node_set(hrb_node_t **L, - const char *name, - const char *value) +H5FD_s3comms_hrb_node_set( + hrb_node_t **L, + const char *name, + const char *value) { size_t i = 0; char *valuecpy = NULL; @@ -238,8 +244,6 @@ H5FD_s3comms_hrb_node_set(hrb_node_t **L, hbool_t is_looking = TRUE; herr_t ret_value = SUCCEED; - - FUNC_ENTER_NOAPI_NOINIT #if S3COMMS_DEBUG @@ -247,8 +251,9 @@ H5FD_s3comms_hrb_node_set(hrb_node_t **L, HDprintf("NAME: %s\n", name); HDprintf("VALUE: %s\n", value); HDprintf("LIST:\n->"); - for (node_ptr = (*L); node_ptr != NULL; node_ptr = node_ptr->next) + for (node_ptr = (*L); node_ptr != NULL; node_ptr = node_ptr->next) { HDfprintf(stdout, "{%s}\n->", node_ptr->cat); + } HDprintf("(null)\n"); fflush(stdout); node_ptr = NULL; @@ -281,34 +286,37 @@ H5FD_s3comms_hrb_node_set(hrb_node_t **L, * copies */ if (value != NULL) { - size_t valuelen = HDstrlen(value); - size_t catlen = namelen + valuelen + 2; /* HDstrlen(": ") -> +2 */ - int sprint_ret = 0; + int ret = 0; + size_t valuelen = HDstrlen(value); + size_t catlen = namelen + valuelen + 2; /* +2 from ": " */ + size_t catwrite = catlen + 3; /* 3 not 1 to quiet compiler warning */ + namecpy = (char *)H5MM_malloc(sizeof(char) * (namelen + 1)); if (namecpy == NULL) { HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "cannot make space for name copy.\n"); } - HDmemcpy(namecpy, name, namelen + 1); + HDmemcpy(namecpy, name, (namelen + 1)); valuecpy = (char *)H5MM_malloc(sizeof(char) * (valuelen + 1)); if (valuecpy == NULL) { HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "cannot make space for value copy.\n"); } - HDmemcpy(valuecpy, value, valuelen + 1); + HDmemcpy(valuecpy, value, (valuelen + 1)); - nvcat = (char *)H5MM_malloc(sizeof(char) * (catlen + 1)); + nvcat = (char *)H5MM_malloc(sizeof(char) * catwrite); if (nvcat == NULL) { HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "cannot make space for concatenated string.\n"); } - sprint_ret = HDsnprintf(nvcat, (catlen + 1), "%s: %s", name, value); - if (sprint_ret <= 0) + ret = HDsnprintf(nvcat, catwrite, "%s: %s", name, value); + if (ret < 0 || (size_t)ret > catlen) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, - "error while concatenating `%s: %s", name, value); - HDassert( catlen == (size_t)sprint_ret ); + "cannot concatenate `%s: %s", name, value); + } + HDassert( catlen == HDstrlen(nvcat) ); /* create new_node, should we need it */ @@ -334,7 +342,8 @@ H5FD_s3comms_hrb_node_set(hrb_node_t **L, if (value == NULL) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "trying to remove node from empty list"); - } else { + } + else { #if S3COMMS_DEBUG HDprintf("CREATE NEW\n"); fflush(stdout); #endif @@ -406,7 +415,8 @@ HDprintf("FREEING POINTER\n"); fflush(stdout); HDprintf("FREEING WORKING LOWERNAME\n"); fflush(stdout); #endif H5MM_xfree(lowername); lowername = NULL; - } else { + } + else { #if S3COMMS_DEBUG HDprintf("MODIFY HEAD\n"); fflush(stdout); #endif @@ -428,14 +438,17 @@ HDprintf("MODIFY HEAD\n"); fflush(stdout); H5MM_xfree(new_node); new_node = NULL; } - } else if (strcmp(lowername, node_ptr->lowername) < 0) { + } + else + if (strcmp(lowername, node_ptr->lowername) < 0) { is_looking = FALSE; if (value == NULL) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "trying to remove a node 'before' head"); - } else { + } + else { #if S3COMMS_DEBUG HDprintf("PREPEND NEW HEAD\n"); fflush(stdout); #endif @@ -464,7 +477,8 @@ HDprintf("PREPEND NEW HEAD\n"); fflush(stdout); if (value == NULL) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "trying to remove absent node"); - } else { + } + else { #if S3COMMS_DEBUG HDprintf("APPEND A NODE\n"); fflush(stdout); #endif @@ -479,14 +493,17 @@ HDprintf("APPEND A NODE\n"); fflush(stdout); new_node->cat = nvcat; node_ptr->next = new_node; } - } else if (strcmp(lowername, node_ptr->next->lowername) < 0) { + } + else + if (strcmp(lowername, node_ptr->next->lowername) < 0) { is_looking = FALSE; if (value == NULL) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "trying to remove absent node"); - } else { + } + else { #if S3COMMS_DEBUG HDprintf("INSERT A NODE\n"); fflush(stdout); #endif @@ -502,7 +519,9 @@ HDprintf("INSERT A NODE\n"); fflush(stdout); new_node->next = node_ptr->next; node_ptr->next = new_node; } - } else if (strcmp(lowername, node_ptr->next->lowername) == 0) { + } + else + if (strcmp(lowername, node_ptr->next->lowername) == 0) { is_looking = FALSE; @@ -528,7 +547,8 @@ HDprintf("REMOVE A NODE\n"); fflush(stdout); H5MM_xfree(lowername); lowername = NULL; - } else { + } + else { #if S3COMMS_DEBUG HDprintf("MODIFY A NODE\n"); fflush(stdout); #endif @@ -552,23 +572,24 @@ HDprintf("MODIFY A NODE\n"); fflush(stdout); node_ptr->value = valuecpy; node_ptr->cat = nvcat; } - } else { + } + else { /**************** * KEEP LOOKING * ****************/ node_ptr = node_ptr->next; } - } + } /* end while is_looking */ done: if (ret_value == FAIL) { /* clean up */ - if (nvcat != NULL) H5MM_xfree(nvcat); - if (namecpy != NULL) H5MM_xfree(namecpy); - if (lowername != NULL) H5MM_xfree(lowername); - if (valuecpy != NULL) H5MM_xfree(valuecpy); + if (nvcat != NULL) { H5MM_xfree(nvcat); } + if (namecpy != NULL) { H5MM_xfree(namecpy); } + if (lowername != NULL) { H5MM_xfree(lowername); } + if (valuecpy != NULL) { H5MM_xfree(valuecpy); } if (new_node != NULL) { HDassert( new_node->magic == S3COMMS_HRB_NODE_MAGIC ); new_node->magic += 1ul; @@ -577,11 +598,9 @@ done: } FUNC_LEAVE_NOAPI(ret_value); +} /* end H5FD_s3comms_hrb_node_set() */ -} /* H5FD_s3comms_hrb_node_set */ - - - + /*---------------------------------------------------------------------------- * * Function: H5FD_s3comms_hrb_destroy() @@ -637,8 +656,6 @@ H5FD_s3comms_hrb_destroy(hrb_t **_buf) hrb_t *buf = NULL; herr_t ret_value = SUCCEED; - - FUNC_ENTER_NOAPI_NOINIT #if S3COMMS_DEBUG @@ -658,12 +675,11 @@ H5FD_s3comms_hrb_destroy(hrb_t **_buf) buf->magic += 1ul; H5MM_xfree(buf); *_buf = NULL; - } + } /* end if `_buf` has some value */ done: FUNC_LEAVE_NOAPI(ret_value) - -} /* H5FD_s3comms_hrb_destroy */ +} /* end H5FD_s3comms_hrb_destroy() */ /*---------------------------------------------------------------------------- @@ -728,8 +744,6 @@ H5FD_s3comms_hrb_init_request(const char *_verb, char *vrsn = NULL; size_t vrsnlen = 0; - - FUNC_ENTER_NOAPI_NOINIT #if S3COMMS_DEBUG @@ -743,11 +757,13 @@ H5FD_s3comms_hrb_init_request(const char *_verb, /* populate valid NULLs with defaults */ - if (_verb == NULL) + if (_verb == NULL) { _verb = "GET"; + } - if (_http_version == NULL) + if (_http_version == NULL) { _http_version = "HTTP/1.1"; + } /* malloc space for and prepare structure */ @@ -765,28 +781,26 @@ H5FD_s3comms_hrb_init_request(const char *_verb, /* malloc and copy strings for the structure */ + reslen = HDstrlen(_resource); + if (_resource[0] == '/') { - reslen = HDstrlen(_resource) + 1; - res = (char *)H5MM_malloc(sizeof(char) * reslen); + res = (char *)H5MM_malloc(sizeof(char) * (reslen+1)); if (res == NULL) { HGOTO_ERROR(H5E_ARGS, H5E_CANTALLOC, NULL, "no space for resource string"); } - HDstrncpy(res, _resource, reslen); - } else { - int sprint_ret = 0; - reslen = HDstrlen(_resource) + 2; - res = (char *)H5MM_malloc(sizeof(char) * reslen); + HDmemcpy(res, _resource, (reslen+1)); + } + else { + res = (char *)H5MM_malloc(sizeof(char) * (reslen+2)); if (res == NULL) { HGOTO_ERROR(H5E_ARGS, H5E_CANTALLOC, NULL, - "no space for resource string"); + "no space for resource string"); } - sprint_ret = HDsnprintf(res, reslen, "/%s", _resource); - if (sprint_ret <= 0) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, - "errro while appending resource string %s", _resource); - HDassert( (reslen - 1) == (size_t)sprint_ret ); - } /* start resource string with '/' */ + *res = '/'; + HDmemcpy((&res[1]), _resource, (reslen+1)); + HDassert( (reslen+1) == HDstrlen(res) ); + } /* end if (else resource string not starting with '/') */ verblen = HDstrlen(_verb) + 1; verb = (char *)H5MM_malloc(sizeof(char) * verblen); @@ -815,7 +829,6 @@ H5FD_s3comms_hrb_init_request(const char *_verb, ret_value = request; done: - /* if there is an error, clean up after ourselves */ if (ret_value == NULL) { @@ -826,8 +839,7 @@ done: } FUNC_LEAVE_NOAPI(ret_value) - -} /* H5FD_s3comms_hrb_init_request */ +} /* end H5FD_s3comms_hrb_init_request() */ @@ -835,7 +847,60 @@ done: * S3R FUNCTIONS ****************************************************************************/ +#ifndef H5_HAVE_ROS3_VFD +/* No-op, auto-fail, unused-variable implementations if ROS3 is not enabled */ + +herr_t +H5FD_s3comms_s3r_close(s3r_t H5_ATTR_UNUSED *handle) +{ + herr_t ret_value = SUCCEED; + FUNC_ENTER_NOAPI_NOINIT_NOERR + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5FD_s3comms_s3r_close() */ + +size_t +H5FD_s3comms_s3r_get_filesize(s3r_t H5_ATTR_UNUSED *handle) +{ + size_t ret_value = 0; + FUNC_ENTER_NOAPI_NOINIT_NOERR + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5FD_s3comms_s3r_get_filesize() */ + +herr_t +H5FD_s3comms_s3r_getsize(s3r_t H5_ATTR_UNUSED *handle) +{ + herr_t ret_value = FAIL; + FUNC_ENTER_NOAPI_NOINIT_NOERR + FUNC_LEAVE_NOAPI(ret_value); +} /* end H5FD_s3comms_s3r_getsize() */ + +s3r_t * +H5FD_s3comms_s3r_open( + const char H5_ATTR_UNUSED *url, + const char H5_ATTR_UNUSED *region, + const char H5_ATTR_UNUSED *id, + const unsigned char H5_ATTR_UNUSED *signing_key) +{ + s3r_t *ret_value = NULL; + FUNC_ENTER_NOAPI_NOINIT_NOERR + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5FD_s3comms_s3r_open() */ +herr_t +H5FD_s3comms_s3r_read( + s3r_t H5_ATTR_UNUSED *handle, + haddr_t H5_ATTR_UNUSED offset, + size_t H5_ATTR_UNUSED len, + void H5_ATTR_UNUSED *dest) +{ + herr_t ret_value = FAIL; + FUNC_ENTER_NOAPI_NOINIT_NOERR + FUNC_LEAVE_NOAPI(ret_value); +} /* end H5FD_s3comms_s3r_read() */ + +#else + + /*---------------------------------------------------------------------------- * * Function: H5FD_s3comms_s3r_close() @@ -876,11 +941,8 @@ H5FD_s3comms_s3r_close(s3r_t *handle) { herr_t ret_value = SUCCEED; - - FUNC_ENTER_NOAPI_NOINIT -#ifdef H5_HAVE_ROS3_VFD #if S3COMMS_DEBUG HDfprintf(stdout, "called H5FD_s3comms_s3r_close.\n"); #endif @@ -910,14 +972,11 @@ H5FD_s3comms_s3r_close(s3r_t *handle) H5MM_xfree(handle); -#endif /* H5_HAVE_ROS3_VFD */ - done: FUNC_LEAVE_NOAPI(ret_value) - } /* H5FD_s3comms_s3r_close */ - + /*---------------------------------------------------------------------------- * * Function: H5FD_s3comms_s3r_get_filesize() @@ -941,22 +1000,20 @@ done: *---------------------------------------------------------------------------- */ size_t -H5FD_s3comms_s3r_get_filesize(s3r_t *handle) { - +H5FD_s3comms_s3r_get_filesize(s3r_t *handle) +{ size_t ret_value = 0; FUNC_ENTER_NOAPI_NOINIT_NOERR -#ifdef H5_HAVE_ROS3_VFD - if (handle != NULL) + if (handle != NULL) { ret_value = handle->filesize; -#endif /* H5_HAVE_ROS3_VFD */ + } FUNC_LEAVE_NOAPI(ret_value) - } /* H5FD_s3comms_s3r_get_filesize */ - + /*---------------------------------------------------------------------------- * * Function: H5FD_s3comms_s3r_getsize() @@ -1143,7 +1200,7 @@ H5FD_s3comms_s3r_getsize(s3r_t *handle) HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "content_length overflows size_t\n"); } - if (content_length == 0 || + if (content_length == 0 || errno == ERANGE) /* errno set by strtoumax*/ { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, @@ -1187,7 +1244,7 @@ done: } /* H5FD_s3comms_s3r_getsize */ - + /*---------------------------------------------------------------------------- * * Function: H5FD_s3comms_s3r_open() @@ -1463,7 +1520,7 @@ done: } /* H5FD_s3comms_s3r_open */ - + /*---------------------------------------------------------------------------- * * Function: H5FD_s3comms_s3r_read() @@ -1621,7 +1678,7 @@ H5FD_s3comms_s3r_read(s3r_t *handle, if (len > 0) { rangebytesstr = (char *)H5MM_malloc(sizeof(char) * \ - S3COMMS_MAX_RANGE_STRING_SIZE ); + (S3COMMS_MAX_RANGE_STRING_SIZE+1) ); if (rangebytesstr == NULL) { HGOTO_ERROR(H5E_ARGS, H5E_CANTALLOC, FAIL, "could not malloc range format string.\n"); @@ -1631,12 +1688,12 @@ H5FD_s3comms_s3r_read(s3r_t *handle, "bytes="H5_PRINTF_HADDR_FMT"-"H5_PRINTF_HADDR_FMT, offset, offset + len - 1); - if (ret == 0 || ret >= S3COMMS_MAX_RANGE_STRING_SIZE) + if (ret <= 0 || ret >= S3COMMS_MAX_RANGE_STRING_SIZE) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to format HTTP Range value"); } else if (offset > 0) { rangebytesstr = (char *)H5MM_malloc(sizeof(char) * \ - S3COMMS_MAX_RANGE_STRING_SIZE); + (S3COMMS_MAX_RANGE_STRING_SIZE+1)); if (rangebytesstr == NULL) { HGOTO_ERROR(H5E_ARGS, H5E_CANTALLOC, FAIL, "could not malloc range format string.\n"); @@ -1645,7 +1702,7 @@ H5FD_s3comms_s3r_read(s3r_t *handle, (S3COMMS_MAX_RANGE_STRING_SIZE), "bytes="H5_PRINTF_HADDR_FMT"-", offset); - if (ret == 0 || ret >= S3COMMS_MAX_RANGE_STRING_SIZE) + if (ret <= 0 || ret >= S3COMMS_MAX_RANGE_STRING_SIZE) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to format HTTP Range value"); } @@ -1679,7 +1736,7 @@ H5FD_s3comms_s3r_read(s3r_t *handle, } else { /* authenticate request */ - char authorization[512]; + char authorization[512+1]; /* 512 := approximate max length... * 67 <len("AWS4-HMAC-SHA256 Credential=///s3/aws4_request," * "SignedHeaders=,Signature=")> @@ -1689,10 +1746,10 @@ H5FD_s3comms_s3r_read(s3r_t *handle, * + 20 <max? len(region)> * + 128 <max? len(signed_headers)> */ - char buffer1[512]; /* -> Canonical Request -> Signature */ - char buffer2[256]; /* -> String To Sign -> Credential */ + char buffer1[512+1]; /* -> Canonical Request -> Signature */ + char buffer2[256+1]; /* -> String To Sign -> Credential */ char iso8601now[ISO8601_SIZE]; - char signed_headers[48]; + char signed_headers[48+1]; /* should be large enough for nominal listing: * "host;range;x-amz-content-sha256;x-amz-date" * + '\0', with "range;" possibly absent @@ -1821,8 +1878,11 @@ H5FD_s3comms_s3r_read(s3r_t *handle, /**** COMPUTE AUTHORIZATION ****/ if (FAIL == /* buffer1 -> canonical request */ - H5FD_s3comms_aws_canonical_request(buffer1, + H5FD_s3comms_aws_canonical_request( + buffer1, + 512, signed_headers, + 48, request) ) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, @@ -1858,23 +1918,25 @@ H5FD_s3comms_s3r_read(s3r_t *handle, HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to format aws4 credential string"); - ret = HDsnprintf(authorization, + ret = HDsnprintf( + authorization, 512, "AWS4-HMAC-SHA256 Credential=%s,SignedHeaders=%s,Signature=%s", buffer2, signed_headers, buffer1); - if (ret == 0 || ret >= 512) + if (ret <= 0 || ret >= 512) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to format aws4 authorization string"); + } /* append authorization header to http request buffer */ - if (FAIL == - H5FD_s3comms_hrb_node_set( - &headers, - "Authorization", - (const char *)authorization) ) + if (H5FD_s3comms_hrb_node_set( + &headers, + "Authorization", + (const char *)authorization) + == FAIL) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to set Authorization header") @@ -1914,17 +1976,18 @@ H5FD_s3comms_s3r_read(s3r_t *handle, /* finally, set http headers in curl handle */ - if (CURLE_OK != - curl_easy_setopt(curlh, - CURLOPT_HTTPHEADER, - curlheaders) ) + if (curl_easy_setopt( + curlh, + CURLOPT_HTTPHEADER, + curlheaders) + != CURLE_OK) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "error while setting CURL option " "(CURLOPT_HTTPHEADER). (placeholder flags)"); } - } /* if should authenticate (info provided) */ + } /* end if should authenticate (info provided) */ /******************* * PERFORM REQUEST * @@ -1983,14 +2046,16 @@ H5FD_s3comms_s3r_read(s3r_t *handle, HDfprintf(stderr, "CHECKING FOR BUFFER OVERFLOW\n"); if (sds == NULL) { HDfprintf(stderr, "sds is NULL!\n"); - } else { + } + else { HDfprintf(stderr, "sds: 0x%lx\n", (long long)sds); HDfprintf(stderr, "sds->size: %d\n", (int)sds->size); if (len > sds->size) { HDfprintf(stderr, "buffer overwrite\n"); } } - } else { + } + else { HDfprintf(stderr, "performed on entire file\n"); } #endif @@ -2028,29 +2093,30 @@ done: if (curlh != NULL) { /* clear any Range */ - if (CURLE_OK != curl_easy_setopt(curlh, CURLOPT_RANGE, NULL) ) + if (CURLE_OK != curl_easy_setopt(curlh, CURLOPT_RANGE, NULL) ) { HDONE_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cannot unset CURLOPT_RANGE") + } /* clear headers */ - if (CURLE_OK != curl_easy_setopt(curlh, CURLOPT_HTTPHEADER, NULL) ) + if (CURLE_OK != curl_easy_setopt(curlh, CURLOPT_HTTPHEADER, NULL) ) { HDONE_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cannot unset CURLOPT_HTTPHEADER") + } } #endif /* H5_HAVE_ROS3_VFD */ FUNC_LEAVE_NOAPI(ret_value); - } /* H5FD_s3comms_s3r_read */ - +#endif /* H5_HAVE_ROS3_VFD */ /**************************************************************************** * MISCELLANEOUS FUNCTIONS ****************************************************************************/ - + /*---------------------------------------------------------------------------- * * Function: gmnow() @@ -2079,14 +2145,14 @@ gmnow(void) struct tm *ret_value = NULL; /* Doctor assert, checks against error in time() */ - if ( (time_t)(-1) != time(now_ptr) ) + if ( (time_t)(-1) != time(now_ptr) ) { ret_value = gmtime(now_ptr); + } HDassert( ret_value != NULL ); return ret_value; - -} /* gmnow */ +} /* end gmnow() */ /*---------------------------------------------------------------------------- @@ -2131,16 +2197,23 @@ gmnow(void) *---------------------------------------------------------------------------- */ herr_t -H5FD_s3comms_aws_canonical_request(char *canonical_request_dest, - char *signed_headers_dest, - hrb_t *http_request) +H5FD_s3comms_aws_canonical_request( + char *canonical_request_dest, + int _cr_size, + char *signed_headers_dest, + int _sh_size, + hrb_t *http_request) { hrb_node_t *node = NULL; const char *query_params = ""; /* unused at present */ herr_t ret_value = SUCCEED; - int ret = 0; /* return value of HDsnprintf */ - size_t len = 0; /* working string length variable */ - char tmpstr[256]; + int ret = 0; + size_t cr_size = (size_t)_cr_size; + size_t sh_size = (size_t)_sh_size; + size_t cr_len = 0; /* working length of canonical request str */ + size_t sh_len = 0; /* working length of signed headers str */ + char tmpstr[256+1]; + tmpstr[256] = 0; /* terminating NULL */ /* "query params" refers to the optional element in the URL, e.g. * http://bucket.aws.com/myfile.txt?max-keys=2&prefix=J @@ -2152,8 +2225,6 @@ H5FD_s3comms_aws_canonical_request(char *canonical_request_dest, * VFD use-cases. */ - - FUNC_ENTER_NOAPI_NOINIT #if S3COMMS_DEBUG @@ -2178,55 +2249,71 @@ H5FD_s3comms_aws_canonical_request(char *canonical_request_dest, /* HTTP verb, resource path, and query string lines */ - len = (HDstrlen(http_request->verb) + + cr_len = (HDstrlen(http_request->verb) + HDstrlen(http_request->resource) + HDstrlen(query_params) + - 3 ); - ret = HDsnprintf(canonical_request_dest, - len + 1, - "%s\n%s\n%s\n", - http_request->verb, - http_request->resource, - query_params); - if (ret == 0 || (size_t)ret > len) + (size_t)3); /* three newline chars */ + if (cr_len >= cr_size) { + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, + "not enough space in canonical request"); + } + ret = HDsnprintf( /* TODO: compiler warning */ + canonical_request_dest, + (cr_size-1), + "%s\n%s\n%s\n", + http_request->verb, + http_request->resource, + query_params); + if (ret < 0 || (size_t)ret >= cr_size) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to compose canonical request first line"); + } /* write in canonical headers, building signed headers concurrently */ - node = http_request->first_header; /* assumed at first sorted */ + node = http_request->first_header; /* assumed sorted */ while (node != NULL) { - size_t join_len = 0; /* string len of joined header-value */ - - HDassert( node->magic == S3COMMS_HRB_NODE_MAGIC ); - - len = HDstrlen(node->lowername); - join_len = HDstrlen(node->value) + len + 2; /* +2 <- ":\n" */ - ret = HDsnprintf(tmpstr, - join_len + 1, /* +1 for null terminator */ - "%s:%s\n", - node->lowername, - node->value); - if (ret == 0 || (size_t)ret > join_len) + + HDassert(node->magic == S3COMMS_HRB_NODE_MAGIC); + + ret = HDsnprintf( + tmpstr, + 256, + "%s:%s\n", + node->lowername, + node->value); + if (ret < 0 || ret >= 256) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to concatenate HTTP header %s:%s", node->lowername, node->value); + } + cr_len += HDstrlen(tmpstr); + if (cr_len + 1 > cr_size) { + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, + "not enough space in canonical request"); + } strcat(canonical_request_dest, tmpstr); - len += 1; /* semicolon */ - ret = HDsnprintf(tmpstr, - len + 1, - "%s;", - node->lowername); - if (ret == 0 || (size_t)ret > len) + ret = HDsnprintf( + tmpstr, + 256, + "%s;", + node->lowername); + if (ret < 0 || ret >= 256) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, - "unable to append signed header %s", + "unable to append semicolon to lowername %s", node->lowername); + } + sh_len += HDstrlen(tmpstr); + if (sh_len + 1 > sh_size) { + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, + "not enough space in signed headers"); + } strcat(signed_headers_dest, tmpstr); node = node->next; - } + } /* end while node is not NULL */ /* remove tailing ';' from signed headers sequence */ @@ -2243,10 +2330,9 @@ H5FD_s3comms_aws_canonical_request(char *canonical_request_dest, done: FUNC_LEAVE_NOAPI(ret_value); +} /* end H5FD_s3comms_aws_canonical_request() */ -} /* H5FD_s3comms_aws_canonical_request */ - - + /*---------------------------------------------------------------------------- * * Function: H5FD_s3comms_bytes_to_hex() @@ -2293,16 +2379,15 @@ done: *---------------------------------------------------------------------------- */ herr_t -H5FD_s3comms_bytes_to_hex(char *dest, - const unsigned char *msg, - size_t msg_len, - hbool_t lowercase) +H5FD_s3comms_bytes_to_hex( + char *dest, + const unsigned char *msg, + size_t msg_len, + hbool_t lowercase) { size_t i = 0; herr_t ret_value = SUCCEED; - - FUNC_ENTER_NOAPI_NOINIT #if S3COMMS_DEBUG @@ -2319,24 +2404,23 @@ H5FD_s3comms_bytes_to_hex(char *dest, } for (i = 0; i < msg_len; i++) { - int chars_written = - HDsnprintf(&(dest[i * 2]), - 3, /* 'X', 'X', '\n' */ - (lowercase == TRUE) ? "%02x" - : "%02X", - msg[i]); - if (chars_written != 2) + int chars_written = HDsnprintf(&(dest[i * 2]), + 3, /* 'X', 'X', '\n' */ + (lowercase == TRUE) ? "%02x" : "%02X", + msg[i]); + if (chars_written != 2) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "problem while writing hex chars for %c", msg[i]); + } } done: FUNC_LEAVE_NOAPI(ret_value); -} /* H5FD_s3comms_bytes_to_hex */ - +} /* end H5FD_s3comms_bytes_to_hex() */ + /*---------------------------------------------------------------------------- * * Function: H5FD_s3comms_free_purl() @@ -2369,19 +2453,19 @@ H5FD_s3comms_free_purl(parsed_url_t *purl) if (purl != NULL) { HDassert( purl->magic == S3COMMS_PARSED_URL_MAGIC ); - if (purl->scheme != NULL) H5MM_xfree(purl->scheme); - if (purl->host != NULL) H5MM_xfree(purl->host); - if (purl->port != NULL) H5MM_xfree(purl->port); - if (purl->path != NULL) H5MM_xfree(purl->path); - if (purl->query != NULL) H5MM_xfree(purl->query); + if (purl->scheme != NULL) { H5MM_xfree(purl->scheme); } + if (purl->host != NULL) { H5MM_xfree(purl->host); } + if (purl->port != NULL) { H5MM_xfree(purl->port); } + if (purl->path != NULL) { H5MM_xfree(purl->path); } + if (purl->query != NULL) { H5MM_xfree(purl->query); } purl->magic += 1ul; H5MM_xfree(purl); } FUNC_LEAVE_NOAPI(SUCCEED) -} /* H5FD_s3comms_free_purl */ - +} /* end H5FD_s3comms_free_purl() */ + /*---------------------------------------------------------------------------- * * Function: H5FD_s3comms_HMAC_SHA256() @@ -2424,27 +2508,22 @@ H5FD_s3comms_free_purl(parsed_url_t *purl) * *---------------------------------------------------------------------------- */ +#ifdef H5_HAVE_ROS3_VFD + herr_t -H5FD_s3comms_HMAC_SHA256(const unsigned char *key, - size_t key_len, - const char *msg, - size_t msg_len, - char *dest) +H5FD_s3comms_HMAC_SHA256( + const unsigned char *key, + size_t key_len, + const char *msg, + size_t msg_len, + char *dest) { -#ifdef H5_HAVE_ROS3_VFD unsigned char md[SHA256_DIGEST_LENGTH]; unsigned int md_len = SHA256_DIGEST_LENGTH; herr_t ret_value = SUCCEED; -#else - herr_t ret_value = FAIL; -#endif /* H5_HAVE_ROS3_VFD */ - - FUNC_ENTER_NOAPI_NOINIT -#ifdef H5_HAVE_ROS3_VFD - #if S3COMMS_DEBUG HDfprintf(stdout, "called H5FD_s3comms_HMAC_SHA256.\n"); #endif @@ -2462,24 +2541,39 @@ H5FD_s3comms_HMAC_SHA256(const unsigned char *key, md, &md_len); - if (FAIL == - H5FD_s3comms_bytes_to_hex(dest, - (const unsigned char *)md, - (size_t)md_len, - true)) + if (H5FD_s3comms_bytes_to_hex( + dest, + (const unsigned char *)md, + (size_t)md_len, + true) + == FAIL) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "could not convert to hex string."); } -#endif /* H5_HAVE_ROS3_VFD */ - done: FUNC_LEAVE_NOAPI(ret_value); - } /* H5FD_s3comms_HMAC_SHA256 */ +#else /* H5_HAVE_ROS3_VFD not defined */ + +herr_t +H5FD_s3comms_HMAC_SHA256( + const unsigned char H5_ATTR_UNUSED *key, + size_t H5_ATTR_UNUSED key_len, + const char H5_ATTR_UNUSED *msg, + size_t H5_ATTR_UNUSED msg_len, + char H5_ATTR_UNUSED *dest) +{ + herr_t ret_value = FAIL; + FUNC_ENTER_NOAPI_NOINIT_NOERR + FUNC_LEAVE_NOAPI(ret_value); +} /* end H5FD_s3comms_HMAC_SHA256() */ + +#endif /* H5_HAVE_ROS3_VFD */ + /*----------------------------------------------------------------------------- * * Function: H5FD__s3comms_load_aws_creds_from_file() @@ -2565,85 +2659,98 @@ H5FD__s3comms_load_aws_creds_from_file( #endif /* format target line for start of profile */ - if (32 < HDsnprintf(profile_line, 32, "[%s]", profile_name)) + if (32 < HDsnprintf(profile_line, 32, "[%s]", profile_name)) { HGOTO_ERROR(H5E_ARGS, H5E_CANTCOPY, FAIL, "unable to format profile label") + } /* look for start of profile */ do { /* clear buffer */ - for (buffer_i=0; buffer_i < 128; buffer_i++) buffer[buffer_i] = 0; + for (buffer_i=0; buffer_i < 128; buffer_i++) { + buffer[buffer_i] = 0; + } line_buffer = fgets(line_buffer, 128, file); - if (line_buffer == NULL) /* reached end of file */ + if (line_buffer == NULL) { /* reached end of file */ goto done; + } } while (strncmp(line_buffer, profile_line, HDstrlen(profile_line))); /* extract credentials from lines */ do { - size_t setting_name_len = 0; - const char *setting_name = NULL; - char line_prefix[128]; - /* clear buffer */ - for (buffer_i=0; buffer_i < 128; buffer_i++) buffer[buffer_i] = 0; + for (buffer_i=0; buffer_i < 128; buffer_i++) { + buffer[buffer_i] = 0; + } /* collect a line from file */ line_buffer = fgets(line_buffer, 128, file); - if (line_buffer == NULL) + if (line_buffer == NULL) { goto done; /* end of file */ + } /* loop over names to see if line looks like assignment */ for (setting_i = 0; setting_i < setting_count; setting_i++) { + size_t setting_name_len = 0; + const char *setting_name = NULL; + char line_prefix[128]; + setting_name = setting_names[setting_i]; setting_name_len = HDstrlen(setting_name); - if (128 < HDsnprintf( - line_prefix, - setting_name_len+2, - "%s=", - setting_name)) + if (HDsnprintf(line_prefix, 128, "%s=", setting_name) < 0) { HGOTO_ERROR(H5E_ARGS, H5E_CANTCOPY, FAIL, "unable to format line prefix") + } /* found a matching name? */ if (!HDstrncmp(line_buffer, line_prefix, setting_name_len + 1)) { found_setting = 1; /* skip NULL destination buffer */ - if (setting_pointers[setting_i] == NULL) + if (setting_pointers[setting_i] == NULL) { break; + } /* advance to end of name in string */ do { line_buffer++; } while (*line_buffer != 0 && *line_buffer != '='); - if (*line_buffer == 0 || *(line_buffer+1) == 0) + if (*line_buffer == 0 || *(line_buffer+1) == 0) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "incomplete assignment in file") + } line_buffer++; /* was pointing at '='; advance */ /* copy line buffer into out pointer */ - HDstrncpy(setting_pointers[setting_i], (const char *)line_buffer, - HDstrlen(line_buffer)); + if (HDstrncpy( + setting_pointers[setting_i], + (const char *)line_buffer, + HDstrlen(line_buffer)) + == NULL) + { + HGOTO_ERROR(H5E_ARGS, H5E_CANTCOPY, FAIL, + "unable to copy line into pointer") + } /* "trim" tailing whitespace by replacing with null terminator*/ buffer_i = 0; - while (!isspace(setting_pointers[setting_i][buffer_i])) + while (!isspace(setting_pointers[setting_i][buffer_i])) { buffer_i++; + } setting_pointers[setting_i][buffer_i] = '\0'; break; /* have read setting; don't compare with others */ - } - } + } /* end if possible name match */ + } /* end for each setting name */ } while (found_setting); done: FUNC_LEAVE_NOAPI(ret_value); +} /* end H5FD__s3comms_load_aws_creds_from_file() */ -} /* H5FD__s3comms_load_aws_creds_from_file */ - - + /*---------------------------------------------------------------------------- * * Function: H5FD_s3comms_load_aws_profile() @@ -2688,6 +2795,7 @@ H5FD_s3comms_load_aws_profile(const char *profile_name, FILE *credfile = NULL; char awspath[117]; char filepath[128]; + int ret = 0; FUNC_ENTER_NOAPI_NOINIT @@ -2696,47 +2804,61 @@ H5FD_s3comms_load_aws_profile(const char *profile_name, #endif /* TODO: Windows and other path gotchas */ - if (117 < HDsnprintf(awspath, 117, "%s/.aws/", getenv("HOME"))) + ret = HDsnprintf(awspath, 117, "%s/.aws/", getenv("HOME")) ; + if (ret < 0 || (size_t)ret >= 117) { HGOTO_ERROR(H5E_ARGS, H5E_CANTCOPY, FAIL, "unable to format home-aws path") - if (128 < HDsnprintf(filepath, 128, "%s%s", awspath, "credentials")) + } + ret = HDsnprintf(filepath, 128, "%s%s", awspath, "credentials"); + if (ret < 0 || (size_t)ret >= 128) { HGOTO_ERROR(H5E_ARGS, H5E_CANTCOPY, FAIL, "unable to format credentials path") + } credfile = fopen(filepath, "r"); if (credfile != NULL) { - if (FAIL == H5FD__s3comms_load_aws_creds_from_file( + if (H5FD__s3comms_load_aws_creds_from_file( credfile, profile_name, key_id_out, secret_access_key_out, - aws_region_out)) + aws_region_out) + == FAIL) + { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to load from aws credentials") - if (EOF == fclose(credfile)) + } + if (fclose(credfile) == EOF) { HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "unable to close credentials file") + } credfile = NULL; - } + } /* end if credential file opened */ - if (128 < HDsnprintf(filepath, 128, "%s%s", awspath, "config")) + ret = HDsnprintf(filepath, 128, "%s%s", awspath, "config"); + if (ret < 0 || (size_t)ret >= 128) { HGOTO_ERROR(H5E_ARGS, H5E_CANTCOPY, FAIL, "unable to format config path") + } credfile = fopen(filepath, "r"); if (credfile != NULL) { - if (FAIL == H5FD__s3comms_load_aws_creds_from_file( + if (H5FD__s3comms_load_aws_creds_from_file( credfile, profile_name, (*key_id_out == 0) ? key_id_out : NULL, (*secret_access_key_out == 0) ? secret_access_key_out : NULL, - (*aws_region_out == 0) ? aws_region_out : NULL)) + (*aws_region_out == 0) ? aws_region_out : NULL) + == FAIL) + { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to load from aws config") - if (EOF == fclose(credfile)) + } + if (fclose(credfile) == EOF) { HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "unable to close config file") + } credfile = NULL; - } + } /* end if credential file opened */ /* fail if not all three settings were loaded */ if (*key_id_out == 0 || @@ -2748,16 +2870,15 @@ H5FD_s3comms_load_aws_profile(const char *profile_name, done: if (credfile != NULL) { - if (EOF == fclose(credfile)) + if (fclose(credfile) == EOF) { HDONE_ERROR(H5E_ARGS, H5E_ARGS, FAIL, "problem error-closing aws configuration file") + } } - FUNC_LEAVE_NOAPI(ret_value); +} /* end H5FD_s3comms_load_aws_profile() */ -} /* H5FD_s3comms_load_aws_profile */ - - + /*---------------------------------------------------------------------------- * * Function: H5FD_s3comms_nlowercase() @@ -2787,9 +2908,10 @@ done: *---------------------------------------------------------------------------- */ herr_t -H5FD_s3comms_nlowercase(char *dest, - const char *s, - size_t len) +H5FD_s3comms_nlowercase( + char *dest, + const char *s, + size_t len) { herr_t ret_value = SUCCEED; @@ -2814,10 +2936,9 @@ H5FD_s3comms_nlowercase(char *dest, done: FUNC_LEAVE_NOAPI(ret_value); +} /* end H5FD_s3comms_nlowercase() */ -} /* H5FD_s3comms_nlowercase */ - - + /*---------------------------------------------------------------------------- * * Function: H5FD_s3comms_parse_url() @@ -2852,8 +2973,9 @@ done: *---------------------------------------------------------------------------- */ herr_t -H5FD_s3comms_parse_url(const char *str, - parsed_url_t **_purl) +H5FD_s3comms_parse_url( + const char *str, + parsed_url_t **_purl) { parsed_url_t *purl = NULL; /* pointer to new structure */ const char *tmpstr = NULL; /* working pointer in string */ @@ -2863,8 +2985,6 @@ H5FD_s3comms_parse_url(const char *str, unsigned int i = 0; herr_t ret_value = FAIL; - - FUNC_ENTER_NOAPI_NOINIT; #if S3COMMS_DEBUG @@ -2946,7 +3066,8 @@ H5FD_s3comms_parse_url(const char *str, tmpstr++; } tmpstr++; - } else { + } /* end if (IPv6) */ + else { while (0 != *tmpstr) { if (':' == *tmpstr || '/' == *tmpstr || @@ -2956,12 +3077,14 @@ H5FD_s3comms_parse_url(const char *str, } tmpstr++; } - } /* if IPv4 or IPv6 */ + } /* end else (IPv4) */ len = tmpstr - curstr; if (len == 0) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "HOST substring cannot be empty"); - } else if (len > urllen) { + } + else + if (len > urllen) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "problem with length of HOST substring"); } @@ -2990,7 +3113,9 @@ H5FD_s3comms_parse_url(const char *str, if (len == 0) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "PORT element cannot be empty"); - } else if (len > urllen) { + } + else + if (len > urllen) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "problem with length of PORT substring"); } @@ -3005,12 +3130,12 @@ H5FD_s3comms_parse_url(const char *str, */ purl->port = (char *)H5MM_malloc(sizeof(char) * (size_t)(len + 1)); if (purl->port == NULL) { /* cannot malloc */ - HGOTO_ERROR(H5E_ARGS, H5E_CANTALLOC, FAIL, - "can't allocate space for PORT"); + HGOTO_ERROR(H5E_ARGS, H5E_CANTALLOC, FAIL, + "can't allocate space for PORT"); } (void)HDstrncpy(purl->port, curstr, (size_t)len); purl->port[len] = 0; - } /* if PORT element */ + } /* end if PORT element */ /************* * READ PATH * @@ -3040,7 +3165,7 @@ H5FD_s3comms_parse_url(const char *str, (void)HDstrncpy(purl->path, curstr, (size_t)len); purl->path[len] = 0; } - } /* if PATH element */ + } /* end if PATH element */ /************** * READ QUERY * @@ -3067,9 +3192,7 @@ H5FD_s3comms_parse_url(const char *str, } /* cannot malloc path pointer */ (void)HDstrncpy(purl->query, curstr, (size_t)len); purl->query[len] = 0; - } /* if QUERY exists */ - - + } /* end if QUERY exists */ *_purl = purl; ret_value = SUCCEED; @@ -3079,10 +3202,9 @@ done: H5FD_s3comms_free_purl(purl); } FUNC_LEAVE_NOAPI(ret_value); +} /* end H5FD_s3comms_parse_url() */ -} /* H5FD_s3comms_parse_url */ - - + /*---------------------------------------------------------------------------- * * Function: H5FD_s3comms_percent_encode_char() @@ -3129,15 +3251,12 @@ done: *---------------------------------------------------------------------------- */ herr_t -H5FD_s3comms_percent_encode_char(char *repr, - const unsigned char c, - size_t *repr_len) +H5FD_s3comms_percent_encode_char( + char *repr, + const unsigned char c, + size_t *repr_len) { - unsigned int acc = 0; unsigned int i = 0; - unsigned int k = 0; - unsigned int stack[4] = {0, 0, 0, 0}; - unsigned int stack_size = 0; int chars_written = 0; herr_t ret_value = SUCCEED; #if S3COMMS_DEBUG @@ -3145,8 +3264,6 @@ H5FD_s3comms_percent_encode_char(char *repr, unsigned char hex[3] = {0, 0, 0}; #endif - - FUNC_ENTER_NOAPI_NOINIT #if S3COMMS_DEBUG @@ -3172,13 +3289,19 @@ H5FD_s3comms_percent_encode_char(char *repr, #endif *repr_len = 3; chars_written = HDsnprintf(repr, 4, "%%%02X", c); - if (chars_written != 3) + if (chars_written < 0) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cannot write char %c", c); - } else { + } + } /* end if single-byte unicode char */ + else { /* multi-byte, multi-percent representation */ + unsigned int acc = 0; /* byte accumulator */ + unsigned int k = 0; /* uint character representation */ + unsigned int stack_size = 0; + unsigned char stack[4] = {0, 0, 0, 0}; #if S3COMMS_DEBUG HDfprintf(stdout, " MULTI-BYTE\n"); #endif @@ -3191,21 +3314,22 @@ H5FD_s3comms_percent_encode_char(char *repr, acc = k; acc >>= 6; /* cull least */ acc <<= 6; /* six bits */ - stack[stack_size++] = k - acc; /* max six-bit number */ + stack[stack_size++] = (unsigned char)(k - acc); k = acc >> 6; } while (k > 0); - /* now have "stack" of two to four six-bit numbers - * to be put into UTF-8 byte fields + /* `stack` now has two to four six-bit 'numbers' to be put into + * UTF-8 byte fields. */ #if S3COMMS_DEBUG HDfprintf(stdout, " STACK:\n {\n"); for (i = 0; i < stack_size; i++) { - H5FD_s3comms_bytes_to_hex((char *)hex, - (unsigned char *)(&stack[i]), - 1, - FALSE); + H5FD_s3comms_bytes_to_hex( + (char *)hex, + (&stack[i]), + 1, + FALSE); hex[2] = 0; HDfprintf(stdout, " %s,\n", hex); } @@ -3218,15 +3342,20 @@ H5FD_s3comms_percent_encode_char(char *repr, /* prepend 11[1[1]]0 to first byte */ /* 110xxxxx, 1110xxxx, or 11110xxx */ - acc = 0xC0; /* 2^7 + 2^6 -> 11000000 */ - acc += (stack_size > 2) ? 0x20 : 0; - acc += (stack_size > 3) ? 0x10 : 0; - stack_size -= 1; - chars_written = HDsnprintf(repr, 4, "%%%02X", acc + stack[stack_size]); - if (chars_written != 3) + acc = 0xC0; /* 0x11000000 */ + acc += (stack_size > 2) ? 0x20 : 0; /* 0x00100000 */ + acc += (stack_size > 3) ? 0x10 : 0; /* 0x00010000 */ + stack_size--; + chars_written = HDsnprintf( + repr, + 4, + "%%%02X", + (unsigned char)(acc + stack[stack_size])); + if (chars_written < 0) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cannot write char %c", c); + } *repr_len += 3; /************************ @@ -3235,25 +3364,27 @@ H5FD_s3comms_percent_encode_char(char *repr, /* 10xxxxxx */ for (i = 0; i < stack_size; i++) { - chars_written = HDsnprintf(&repr[i*3 + 3], - 4, - "%%%02X", - 128 + stack[stack_size - 1 - i]); - if (chars_written != 3) + chars_written = HDsnprintf( + &repr[i*3 + 3], + 4, + "%%%02X", + (unsigned char)(0x80 + stack[stack_size - 1 - i])); + if (chars_written < 0) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cannot write char %c", c); + } *repr_len += 3; - } - } + } /* end for each continuation byte */ + } /* end else (multi-byte) */ + *(repr + *repr_len) = '\0'; done: FUNC_LEAVE_NOAPI(ret_value); - } /* H5FD_s3comms_percent_encode_char */ - + /*---------------------------------------------------------------------------- * * Function: H5FD_s3comms_signing_key() @@ -3301,13 +3432,15 @@ done: * *---------------------------------------------------------------------------- */ +#ifdef H5_HAVE_ROS3_VFD + herr_t -H5FD_s3comms_signing_key(unsigned char *md, - const char *secret, - const char *region, - const char *iso8601now) +H5FD_s3comms_signing_key( + unsigned char *md, + const char *secret, + const char *region, + const char *iso8601now) { -#ifdef H5_HAVE_ROS3_VFD char *AWS4_secret = NULL; size_t AWS4_secret_len = 0; unsigned char datekey[SHA256_DIGEST_LENGTH]; @@ -3315,16 +3448,9 @@ H5FD_s3comms_signing_key(unsigned char *md, unsigned char dateregionservicekey[SHA256_DIGEST_LENGTH]; int ret = 0; /* return value of HDsnprintf */ herr_t ret_value = SUCCEED; -#else - herr_t ret_value = SUCCEED; -#endif /* H5_HAVE_ROS3_VFD */ - - FUNC_ENTER_NOAPI_NOINIT -#ifdef H5_HAVE_ROS3_VFD - #if S3COMMS_DEBUG HDfprintf(stdout, "called H5FD_s3comms_signing_key.\n"); #endif @@ -3356,10 +3482,11 @@ H5FD_s3comms_signing_key(unsigned char *md, /* prepend "AWS4" to start of the secret key */ ret = HDsnprintf(AWS4_secret, AWS4_secret_len,"%s%s", "AWS4", secret); - if ((size_t)ret != (AWS4_secret_len - 1)) + if ((size_t)ret != (AWS4_secret_len - 1)) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "problem writing AWS4+secret `%s`", secret); + } /* hash_func, key, len(key), msg, len(msg), digest_dest, digest_len_dest * we know digest length, so ignore via NULL @@ -3396,13 +3523,26 @@ H5FD_s3comms_signing_key(unsigned char *md, done: H5MM_xfree(AWS4_secret); -#endif /* H5_HAVE_ROS3_VFD */ - FUNC_LEAVE_NOAPI(ret_value); +} /* end H5FD_s3comms_signing_key() */ + +#else /* H5_HAVE_ROS3_VFD not defined */ -} /* H5FD_s3comms_signing_key */ +herr_t +H5FD_s3comms_signing_key( + unsigned char H5_ATTR_UNUSED *md, + const char H5_ATTR_UNUSED *secret, + const char H5_ATTR_UNUSED *region, + const char H5_ATTR_UNUSED *iso8601now) +{ + herr_t ret_value = SUCCEED; + FUNC_ENTER_NOAPI_NOINIT_NOERR; + FUNC_LEAVE_NOAPI(ret_value); +} /* end H5FD_s3comms_signing_key() */ +#endif /* H5_HAVE_ROS3_VFD */ + /*---------------------------------------------------------------------------- * * Function: H5FD_s3comms_tostringtosign() @@ -3450,13 +3590,14 @@ done: * *---------------------------------------------------------------------------- */ +#ifdef H5_HAVE_ROS3_VFD herr_t -H5FD_s3comms_tostringtosign(char *dest, - const char *req, - const char *now, - const char *region) +H5FD_s3comms_tostringtosign( + char *dest, + const char *req, + const char *now, + const char *region) { -#ifdef H5_HAVE_ROS3_VFD unsigned char checksum[SHA256_DIGEST_LENGTH * 2 + 1]; size_t d = 0; char day[9]; @@ -3465,15 +3606,9 @@ H5FD_s3comms_tostringtosign(char *dest, int ret = 0; /* HDsnprintf return value */ herr_t ret_value = SUCCEED; char tmp[128]; -#else - herr_t ret_value = FAIL; -#endif /* H5_HAVE_ROS3_VFD */ - FUNC_ENTER_NOAPI_NOINIT -#ifdef H5_HAVE_ROS3_VFD - #if S3COMMS_DEBUG HDfprintf(stdout, "called H5FD_s3comms_tostringtosign.\n"); #endif @@ -3495,8 +3630,6 @@ H5FD_s3comms_tostringtosign(char *dest, "Region cannot be NULL.\n") } - - for (i = 0; i < 128; i++) { tmp[i] = '\0'; } @@ -3507,11 +3640,10 @@ H5FD_s3comms_tostringtosign(char *dest, HDstrncpy(day, now, 8); day[8] = '\0'; ret = HDsnprintf(tmp, 127, "%s/%s/s3/aws4_request", day, region); - if (ret <= 0 || ret >= 127) + if (ret <= 0 || ret >= 127) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "problem adding day and region to string") - - + } HDmemcpy((dest + d), "AWS4-HMAC-SHA256\n", 17); d = 17; @@ -3528,11 +3660,12 @@ H5FD_s3comms_tostringtosign(char *dest, HDstrlen(req), checksum); - if (FAIL == - H5FD_s3comms_bytes_to_hex(hexsum, - (const unsigned char *)checksum, - SHA256_DIGEST_LENGTH, - true)) + if (H5FD_s3comms_bytes_to_hex( + hexsum, + (const unsigned char *)checksum, + SHA256_DIGEST_LENGTH, + true) + == FAIL) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "could not create hex string"); @@ -3544,14 +3677,27 @@ H5FD_s3comms_tostringtosign(char *dest, dest[d] = '\0'; -#endif /* H5_HAVE_ROS3_VFD */ - done: FUNC_LEAVE_NOAPI(ret_value) +} /* end H5ros3_tostringtosign() */ + +#else /* H5_HAVE_ROS3_VFD not defined */ -} /* H5ros3_tostringtosign */ +herr_t +H5FD_s3comms_tostringtosign( + char H5_ATTR_UNUSED *dest, + const char H5_ATTR_UNUSED *req, + const char H5_ATTR_UNUSED *now, + const char H5_ATTR_UNUSED *region) +{ + herr_t ret_value = FAIL; + FUNC_ENTER_NOAPI_NOINIT_NOERR + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5ros3_tostringtosign() */ +#endif /* H5_HAVE_ROS3_VFD */ + /*---------------------------------------------------------------------------- * * Function: H5FD_s3comms_trim() @@ -3594,9 +3740,7 @@ H5FD_s3comms_trim(char *dest, size_t s_len, size_t *n_written) { - herr_t ret_value = SUCCEED; - - + herr_t ret_value = SUCCEED; FUNC_ENTER_NOAPI_NOINIT @@ -3612,8 +3756,6 @@ H5FD_s3comms_trim(char *dest, s_len = 0; } - - if (s_len > 0) { /* Find first non-whitespace character from start; * reduce total length per character. @@ -3645,10 +3787,9 @@ H5FD_s3comms_trim(char *dest, done: FUNC_LEAVE_NOAPI(ret_value) +} /* end H5FD_s3comms_trim() */ -} /* H5FD_s3comms_trim */ - - + /*---------------------------------------------------------------------------- * * Function: H5FD_s3comms_uriencode() @@ -3698,11 +3839,12 @@ done: *---------------------------------------------------------------------------- */ herr_t -H5FD_s3comms_uriencode(char *dest, - const char *s, - size_t s_len, - hbool_t encode_slash, - size_t *n_written) +H5FD_s3comms_uriencode( + char *dest, + const char *s, + size_t s_len, + hbool_t encode_slash, + size_t *n_written) { char c = 0; size_t dest_off = 0; @@ -3712,20 +3854,20 @@ H5FD_s3comms_uriencode(char *dest, herr_t ret_value = SUCCEED; size_t s_off = 0; - - FUNC_ENTER_NOAPI_NOINIT #if S3COMMS_DEBUG HDfprintf(stdout, "H5FD_s3comms_uriencode called.\n"); #endif - if (s == NULL) + if (s == NULL) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "source string cannot be NULL"); - if (dest == NULL) + } + if (dest == NULL) { HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "destination cannot be NULL"); + } /* Write characters to destination, converting to percent-encoded * "hex-utf-8" strings if necessary. @@ -3741,12 +3883,14 @@ H5FD_s3comms_uriencode(char *dest, (c == '/' && encode_slash == FALSE)) { dest[dest_off++] = c; - } else { + } + else { hex_off = 0; - if (FAIL == - H5FD_s3comms_percent_encode_char(hex_buffer, - (const unsigned char)c, - &hex_len)) + if (H5FD_s3comms_percent_encode_char( + hex_buffer, + (const unsigned char)c, + &hex_len) + == FAIL) { hex_buffer[0] = c; hex_buffer[1] = 0; @@ -3758,8 +3902,8 @@ H5FD_s3comms_uriencode(char *dest, for (hex_off = 0; hex_off < hex_len; hex_off++) { dest[dest_off++] = hex_buffer[hex_off]; } - } - } + } /* end else (not a regular character) */ + } /* end for each character */ if (dest_off < s_len) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, @@ -3769,7 +3913,6 @@ H5FD_s3comms_uriencode(char *dest, done: FUNC_LEAVE_NOAPI(ret_value) - } /* H5FD_s3comms_uriencode */ diff --git a/src/H5FDs3comms.h b/src/H5FDs3comms.h index 93a5a81..16f6a8b 100644 --- a/src/H5FDs3comms.h +++ b/src/H5FDs3comms.h @@ -577,7 +577,9 @@ H5_DLL herr_t H5FD_s3comms_s3r_read(s3r_t *handle, H5_DLL struct tm * gmnow(void); herr_t H5FD_s3comms_aws_canonical_request(char *canonical_request_dest, + int cr_size, char *signed_headers_dest, + int sh_size, hrb_t *http_request); H5_DLL herr_t H5FD_s3comms_bytes_to_hex(char *dest, diff --git a/src/H5Fint.c b/src/H5Fint.c index 7ed3ca8..29f017e 100644 --- a/src/H5Fint.c +++ b/src/H5Fint.c @@ -498,6 +498,9 @@ H5F__get_objects_cb(void *obj_ptr, hid_t obj_id, void *key) oloc = NULL; break; + case H5I_MAP: + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5_ITER_ERROR, "maps not supported in native VOL connector") + case H5I_UNINIT: case H5I_BADID: case H5I_FILE: @@ -2989,8 +2992,10 @@ H5F_set_retries(H5F_t *f) /* Initialize the # of bins for retries */ f->shared->retries_nbins = 0; if(f->shared->read_attempts > 1) { - tmp = HDlog10((double)(f->shared->read_attempts - 1)); - f->shared->retries_nbins = (unsigned)tmp + 1; + /* Use HDceil to ensure that the log10 value is rounded up to the + nearest integer before casting to unsigned */ + tmp = HDceil(HDlog10((double)f->shared->read_attempts)); + f->shared->retries_nbins = (unsigned)tmp; } FUNC_LEAVE_NOAPI(SUCCEED) @@ -3600,6 +3605,9 @@ H5F__get_file(void *obj, H5I_type_t type) oloc = H5A_oloc((H5A_t *)obj); break; + case H5I_MAP: + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "maps not supported in native VOL connector") + case H5I_UNINIT: case H5I_BADID: case H5I_DATASPACE: @@ -3641,7 +3649,7 @@ done: *------------------------------------------------------------------------- */ hid_t -H5F__get_file_id(H5F_t *file) +H5F__get_file_id(H5F_t *file, hbool_t app_ref) { hid_t file_id = H5I_INVALID_HID; /* File ID */ hid_t ret_value = H5I_INVALID_HID; /* Return value */ @@ -3654,13 +3662,13 @@ H5F__get_file_id(H5F_t *file) /* If the ID does not exist, register it with the VOL connector */ if(H5I_INVALID_HID == file_id) { - if((file_id = H5VL_wrap_register(H5I_FILE, file, TRUE)) < 0) + if((file_id = H5VL_wrap_register(H5I_FILE, file, app_ref)) < 0) HGOTO_ERROR(H5E_FILE, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to atomize file handle") file->id_exists = TRUE; } /* end if */ else { /* Increment ref count on existing ID */ - if(H5I_inc_ref(file_id, TRUE) < 0) + if(H5I_inc_ref(file_id, app_ref) < 0) HGOTO_ERROR(H5E_FILE, H5E_CANTSET, H5I_INVALID_HID, "incrementing file ID failed") } /* end else */ @@ -3684,7 +3692,7 @@ done: *------------------------------------------------------------------------- */ hid_t -H5F_get_file_id(hid_t obj_id, H5I_type_t type) +H5F_get_file_id(hid_t obj_id, H5I_type_t type, hbool_t app_ref) { H5VL_object_t *vol_obj; /* File info */ hid_t file_id = H5I_INVALID_HID; /* File ID for object */ @@ -3697,7 +3705,7 @@ H5F_get_file_id(hid_t obj_id, H5I_type_t type) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid identifier") /* Get the file through the VOL */ - if(H5VL_file_optional(vol_obj, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, H5VL_NATIVE_FILE_GET_FILE_ID, (int)type, &file_id) < 0) + if(H5VL_file_optional(vol_obj, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, H5VL_NATIVE_FILE_GET_FILE_ID, (int)type, (int)app_ref, &file_id) < 0) HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, H5I_INVALID_HID, "unable to get file ID") if(H5I_INVALID_HID == file_id) HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, H5I_INVALID_HID, "unable to get the file ID through the VOL") diff --git a/src/H5Fmpi.c b/src/H5Fmpi.c index 5bbd717..12bcbc0 100644 --- a/src/H5Fmpi.c +++ b/src/H5Fmpi.c @@ -90,14 +90,14 @@ herr_t H5F_get_mpi_handle(const H5F_t *f, MPI_File **f_handle) { herr_t ret_value = SUCCEED; - hid_t fapl = -1; + hid_t fapl_id = H5I_INVALID_HID; FUNC_ENTER_NOAPI(FAIL) HDassert(f && f->shared); /* Dispatch to driver */ - if ((ret_value = H5FD_get_vfd_handle(f->shared->lf, fapl, (void **)f_handle)) < 0) + if ((ret_value = H5FD_get_vfd_handle(f->shared->lf, fapl_id, (void **)f_handle)) < 0) HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't get mpi file handle") done: @@ -106,33 +106,31 @@ done: /*------------------------------------------------------------------------- - * Function: H5F_mpi_get_rank + * Function: H5F_mpi_get_rank * - * Purpose: Retrieves the rank of an MPI process. + * Purpose: Retrieves the rank of an MPI process. * - * Return: Success: The rank (non-negative) + * Return: Success: The rank (non-negative) * - * Failure: Negative + * Failure: Negative * - * Programmer: Quincey Koziol + * Programmer: Quincey Koziol * Friday, January 30, 2004 * - * Modifications: - * *------------------------------------------------------------------------- */ int H5F_mpi_get_rank(const H5F_t *f) { - int ret_value; + int ret_value = -1; - FUNC_ENTER_NOAPI(FAIL) + FUNC_ENTER_NOAPI((-1)) HDassert(f && f->shared); /* Dispatch to driver */ - if ((ret_value=H5FD_mpi_get_rank(f->shared->lf)) < 0) - HGOTO_ERROR(H5E_VFL, H5E_CANTGET, FAIL, "driver get_rank request failed") + if ((ret_value = H5FD_mpi_get_rank(f->shared->lf)) < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTGET, (-1), "driver get_rank request failed") done: FUNC_LEAVE_NOAPI(ret_value) @@ -140,32 +138,30 @@ done: /*------------------------------------------------------------------------- - * Function: H5F_mpi_get_comm + * Function: H5F_mpi_get_comm * - * Purpose: Retrieves the file's communicator + * Purpose: Retrieves the file's communicator * - * Return: Success: The communicator (non-negative) + * Return: Success: The communicator (non-negative) * - * Failure: Negative + * Failure: Negative * - * Programmer: Quincey Koziol + * Programmer: Quincey Koziol * Friday, January 30, 2004 * - * Modifications: - * *------------------------------------------------------------------------- */ MPI_Comm H5F_mpi_get_comm(const H5F_t *f) { - MPI_Comm ret_value; + MPI_Comm ret_value = MPI_COMM_NULL; FUNC_ENTER_NOAPI(MPI_COMM_NULL) HDassert(f && f->shared); /* Dispatch to driver */ - if ((ret_value=H5FD_mpi_get_comm(f->shared->lf))==MPI_COMM_NULL) + if ((ret_value = H5FD_mpi_get_comm(f->shared->lf)) == MPI_COMM_NULL) HGOTO_ERROR(H5E_VFL, H5E_CANTGET, MPI_COMM_NULL, "driver get_comm request failed") done: @@ -185,22 +181,20 @@ done: * Programmer: John Mainzer * Friday, May 6, 2005 * - * Modifications: - * *------------------------------------------------------------------------- */ int H5F_mpi_get_size(const H5F_t *f) { - int ret_value; + int ret_value = -1; - FUNC_ENTER_NOAPI(FAIL) + FUNC_ENTER_NOAPI((-1)) HDassert(f && f->shared); /* Dispatch to driver */ - if ((ret_value=H5FD_mpi_get_size(f->shared->lf)) < 0) - HGOTO_ERROR(H5E_VFL, H5E_CANTGET, FAIL, "driver get_size request failed") + if ((ret_value = H5FD_mpi_get_size(f->shared->lf)) < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTGET, (-1), "driver get_size request failed") done: FUNC_LEAVE_NOAPI(ret_value) @@ -208,16 +202,16 @@ done: /*------------------------------------------------------------------------- - * Function: H5Fset_mpi_atomicity + * Function: H5Fset_mpi_atomicity * - * Purpose: Sets the atomicity mode + * Purpose: Sets the atomicity mode * - * Return: Success: Non-negative + * Return: Success: Non-negative * - * Failure: Negative + * Failure: Negative * - * Programmer: Mohamad Chaarawi - * Feb 14, 2012 + * Programmer: Mohamad Chaarawi + * Feb 14, 2012 * *------------------------------------------------------------------------- */ @@ -248,16 +242,16 @@ done: /*------------------------------------------------------------------------- - * Function: H5Fget_mpi_atomicity + * Function: H5Fget_mpi_atomicity * - * Purpose: Returns the atomicity mode + * Purpose: Returns the atomicity mode * - * Return: Success: Non-negative + * Return: Success: Non-negative * - * Failure: Negative + * Failure: Negative * - * Programmer: Mohamad Chaarawi - * Feb 14, 2012 + * Programmer: Mohamad Chaarawi + * Feb 14, 2012 * *------------------------------------------------------------------------- */ @@ -288,18 +282,18 @@ done: /*------------------------------------------------------------------------- - * Function: H5F_mpi_retrieve_comm + * Function: H5F_mpi_retrieve_comm * - * Purpose: Retrieves an MPI communicator from the file the location ID + * Purpose: Retrieves an MPI communicator from the file the location ID * is in. If the loc_id is invalid, the fapl_id is used to * retrieve the communicator. * - * Return: Success: Non-negative + * Return: Success: Non-negative * - * Failure: Negative + * Failure: Negative * - * Programmer: Mohamad Chaarawi - * Feb 14, 2012 + * Programmer: Mohamad Chaarawi + * Feb 14, 2012 * *------------------------------------------------------------------------- */ diff --git a/src/H5Fpkg.h b/src/H5Fpkg.h index 1dd07c1..dbf68c3 100644 --- a/src/H5Fpkg.h +++ b/src/H5Fpkg.h @@ -408,7 +408,7 @@ H5_DLL herr_t H5F__start_swmr_write(H5F_t *f); H5_DLL herr_t H5F__close(H5F_t *f); H5_DLL herr_t H5F__set_libver_bounds(H5F_t *f, H5F_libver_t low, H5F_libver_t high); H5_DLL H5F_t *H5F__get_file(void *obj, H5I_type_t type); -H5_DLL hid_t H5F__get_file_id(H5F_t *file); +H5_DLL hid_t H5F__get_file_id(H5F_t *file, hbool_t app_ref); /* File mount related routines */ H5_DLL herr_t H5F__mount(H5G_loc_t *loc, const char *name, H5F_t *child, hid_t plist_id); diff --git a/src/H5Fprivate.h b/src/H5Fprivate.h index a8ac158..838fa28 100644 --- a/src/H5Fprivate.h +++ b/src/H5Fprivate.h @@ -718,7 +718,7 @@ typedef enum H5F_prefix_open_t { /* Private functions */ H5_DLL H5F_t *H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id); H5_DLL herr_t H5F_try_close(H5F_t *f, hbool_t *was_closed/*out*/); -H5_DLL hid_t H5F_get_file_id(hid_t obj_id, H5I_type_t id_type); +H5_DLL hid_t H5F_get_file_id(hid_t obj_id, H5I_type_t id_type, hbool_t app_ref); /* Functions that retrieve values from the file struct */ H5_DLL H5F_libver_t H5F_get_low_bound(const H5F_t *f); diff --git a/src/H5Gdeprec.c b/src/H5Gdeprec.c index 95627d2..5acb378 100644 --- a/src/H5Gdeprec.c +++ b/src/H5Gdeprec.c @@ -131,6 +131,9 @@ H5G_map_obj_type(H5O_type_t obj_type) ret_value = H5G_TYPE; break; + case H5O_TYPE_MAP: + /* Maps not supported in native VOL connector */ + case H5O_TYPE_UNKNOWN: case H5O_TYPE_NTYPES: default: diff --git a/src/H5Gloc.c b/src/H5Gloc.c index e47d3be..40d56c6 100644 --- a/src/H5Gloc.c +++ b/src/H5Gloc.c @@ -213,6 +213,9 @@ H5G_loc_real(void *obj, H5I_type_t type, H5G_loc_t *loc) case H5I_DATASPACE: HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get group location of dataspace") + case H5I_MAP: + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "maps not supported in native VOL connector") + case H5I_GENPROP_CLS: case H5I_GENPROP_LST: HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get group location of property list") diff --git a/src/H5Gname.c b/src/H5Gname.c index 16c1ca7..86a0c2f 100644 --- a/src/H5Gname.c +++ b/src/H5Gname.c @@ -816,6 +816,9 @@ H5G_name_replace_cb(void *obj_ptr, hid_t obj_id, void *key) obj_path = H5T_nameof((H5T_t *)obj_ptr); break; + case H5I_MAP: + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "maps not supported in native VOL connector") + case H5I_UNINIT: case H5I_BADID: case H5I_FILE: @@ -1112,6 +1115,9 @@ H5G_name_replace(const H5O_link_t *lnk, H5G_names_op_t op, H5F_t *src_file, search_datatype = TRUE; break; + case H5O_TYPE_MAP: + HGOTO_ERROR(H5E_SYM, H5E_BADTYPE, FAIL, "maps not supported in native VOL connector") + case H5O_TYPE_UNKNOWN: case H5O_TYPE_NTYPES: /* Search and replace names through datatype IDs */ diff --git a/src/H5Gtest.c b/src/H5Gtest.c index 0b431b1..f9ab6f2 100644 --- a/src/H5Gtest.c +++ b/src/H5Gtest.c @@ -604,6 +604,9 @@ H5G__user_path_test(hid_t obj_id, char *user_path, size_t *user_path_len, unsign obj_path = H5T_nameof((H5T_t *)obj_ptr); break; + case H5I_MAP: + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "maps not supported in native VOL connector") + case H5I_UNINIT: case H5I_BADID: case H5I_FILE: @@ -2219,7 +2219,7 @@ H5Iget_file_id(hid_t obj_id) /* Call internal function */ if (H5I_FILE == type || H5I_DATATYPE == type || H5I_GROUP == type || H5I_DATASET == type || H5I_ATTR == type) { - if ((ret_value = H5F_get_file_id(obj_id, type)) < 0) + if ((ret_value = H5F_get_file_id(obj_id, type, TRUE)) < 0) HGOTO_ERROR(H5E_ATOM, H5E_CANTGET, H5I_INVALID_HID, "can't retrieve file ID") } /* end if */ else @@ -2371,6 +2371,11 @@ H5I__id_dump_cb(void *_item, void H5_ATTR_UNUSED *_key, void *_udata) break; } + /* TODO: Maps will have to be added when they are supported in the + * native VOL connector. + */ + case H5I_MAP: + case H5I_UNINIT: case H5I_BADID: case H5I_FILE: diff --git a/src/H5Ipublic.h b/src/H5Ipublic.h index def785f..34a408f 100644 --- a/src/H5Ipublic.h +++ b/src/H5Ipublic.h @@ -38,6 +38,7 @@ typedef enum H5I_type_t { H5I_DATATYPE, /* type ID for Datatype objects */ H5I_DATASPACE, /* type ID for Dataspace objects */ H5I_DATASET, /* type ID for Dataset objects */ + H5I_MAP, /* type ID for Map objects */ H5I_ATTR, /* type ID for Attribute objects */ H5I_VFL, /* type ID for virtual file layer */ H5I_VOL, /* type ID for virtual object layer */ diff --git a/src/H5M.c b/src/H5M.c new file mode 100644 index 0000000..adb4df0 --- /dev/null +++ b/src/H5M.c @@ -0,0 +1,1032 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the COPYING file, which can be found at the root of the source code * + * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases. * + * If you do not have access to either file, you may request a copy from * + * help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/****************/ +/* Module Setup */ +/****************/ + +#include "H5Mmodule.h" /* This source code file is part of the H5M module */ + + +/***********/ +/* Headers */ +/***********/ +#include "H5private.h" /* Generic Functions */ +#include "H5CXprivate.h" /* API Contexts */ +#include "H5Mpkg.h" /* Maps */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5Iprivate.h" /* IDs */ +#include "H5VLprivate.h" /* Virtual Object Layer */ + + + +/****************/ +/* Local Macros */ +/****************/ + + +/******************/ +/* Local Typedefs */ +/******************/ + + +/********************/ +/* Local Prototypes */ +/********************/ + +static herr_t H5M__close_cb(H5VL_object_t *map_vol_obj); + + +/*********************/ +/* Package Variables */ +/*********************/ + +/* Package initialization variable */ +hbool_t H5_PKG_INIT_VAR = FALSE; + + +/*****************************/ +/* Library Private Variables */ +/*****************************/ + + +/*******************/ +/* Local Variables */ +/*******************/ + +/* Map ID class */ +static const H5I_class_t H5I_MAP_CLS[1] = {{ + H5I_MAP, /* ID class value */ + 0, /* Class flags */ + 0, /* # of reserved IDs for class */ + (H5I_free_t)H5M__close_cb /* Callback routine for closing objects of this class */ +}}; + +/* Flag indicating "top" of interface has been initialized */ +static hbool_t H5M_top_package_initialize_s = FALSE; + + + +/*------------------------------------------------------------------------- +NAME + H5M__init_package -- Initialize interface-specific information +USAGE + herr_t H5M__init_package() + +RETURNS + Non-negative on success/Negative on failure +DESCRIPTION + Initializes any interface-specific data or routines. +--------------------------------------------------------------------------- +*/ +herr_t +H5M__init_package(void) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_PACKAGE + + /* Initialize the atom group for the map IDs */ + if(H5I_register_type(H5I_MAP_CLS) < 0) + HGOTO_ERROR(H5E_MAP, H5E_CANTINIT, FAIL, "unable to initialize interface") + + /* Mark "top" of interface as initialized, too */ + H5M_top_package_initialize_s = TRUE; + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5M__init_package() */ + + +/*------------------------------------------------------------------------- + * Function: H5M_top_term_package + * + * Purpose: Close the "top" of the interface, releasing IDs, etc. + * + * Return: Success: Positive if anything was done that might + * affect other interfaces; zero otherwise. + * Failure: Negative. + *------------------------------------------------------------------------- + */ +int +H5M_top_term_package(void) +{ + int n = 0; + + FUNC_ENTER_NOAPI_NOINIT_NOERR + + if(H5M_top_package_initialize_s) { + if(H5I_nmembers(H5I_MAP) > 0) { + (void)H5I_clear_type(H5I_MAP, FALSE, FALSE); + n++; /*H5I*/ + } /* end if */ + + /* Mark closed */ + if(0 == n) + H5M_top_package_initialize_s = FALSE; + } /* end if */ + + FUNC_LEAVE_NOAPI(n) +} /* end H5M_top_term_package() */ + + +/*------------------------------------------------------------------------- + * Function: H5M_term_package + * + * Purpose: Terminate this interface. + * + * Note: Finishes shutting down the interface, after + * H5M_top_term_package() is called + * + * Return: Success: Positive if anything was done that might + * affect other interfaces; zero otherwise. + * Failure: Negative. + *------------------------------------------------------------------------- + */ +int +H5M_term_package(void) +{ + int n = 0; + + FUNC_ENTER_NOAPI_NOINIT_NOERR + + if(H5_PKG_INIT_VAR) { + /* Sanity checks */ + HDassert(0 == H5I_nmembers(H5I_MAP)); + HDassert(FALSE == H5M_top_package_initialize_s); + + /* Destroy the dataset object id group */ + n += (H5I_dec_type_ref(H5I_MAP) > 0); + + /* Mark closed */ + if(0 == n) + H5_PKG_INIT_VAR = FALSE; + } /* end if */ + + FUNC_LEAVE_NOAPI(n) +} /* end H5M_term_package() */ + + +/*------------------------------------------------------------------------- + * Function: H5M__close_cb + * + * Purpose: Called when the ref count reaches zero on the map's ID + * + * Return: SUCCEED/FAIL + * + *------------------------------------------------------------------------- + */ +static herr_t +H5M__close_cb(H5VL_object_t *map_vol_obj) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_STATIC + + /* Sanity check */ + HDassert(map_vol_obj); + + /* Close the map */ + if(H5VL_optional(map_vol_obj, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, H5VL_MAP_CLOSE) < 0) + HGOTO_ERROR(H5E_MAP, H5E_CLOSEERROR, FAIL, "unable to close map"); + + /* Free the VOL object */ + if(H5VL_free_object(map_vol_obj) < 0) + HGOTO_ERROR(H5E_MAP, H5E_CANTDEC, FAIL, "unable to free VOL object"); + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5M__close_cb() */ + +#ifdef H5_HAVE_MAP_API + + +/*------------------------------------------------------------------------- + * Function: H5Mcreate + * + * Purpose: Creates a new map object for storing key-value pairs. The + * in-file datatype for keys is defined by KEY_TYPE_ID and + * the in-file datatype for values is defined by VAL_TYPE_ID. + * LOC_ID specifies the location to create the map object and + * NAME specifies the name of the link to the object + * (relative to LOC_ID). Other options can be specified + * through the property lists LCPL_ID, MCPL_ID, and MAPL_ID. + * + * Return: Success: The object ID of the new map. + * + * Failure: H5I_INVALID_HID + * + *------------------------------------------------------------------------- + */ +hid_t +H5Mcreate(hid_t loc_id, const char *name, hid_t key_type_id, hid_t val_type_id, + hid_t lcpl_id, hid_t mcpl_id, hid_t mapl_id) +{ + void *map = NULL; /* New map's info */ + H5VL_object_t *vol_obj = NULL; /* object token of loc_id */ + H5VL_loc_params_t loc_params; + hid_t ret_value = H5I_INVALID_HID; /* Return value */ + + FUNC_ENTER_API(H5I_INVALID_HID) + H5TRACE7("i", "i*siiiii", loc_id, name, key_type_id, val_type_id, lcpl_id, + mcpl_id, mapl_id); + + /* Check arguments */ + if(!name) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "name parameter cannot be NULL") + if(!*name) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "name parameter cannot be an empty string") + + /* Get link creation property list */ + if(H5P_DEFAULT == lcpl_id) + lcpl_id = H5P_LINK_CREATE_DEFAULT; + else + if(TRUE != H5P_isa_class(lcpl_id, H5P_LINK_CREATE)) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "lcpl_id is not a link creation property list") + + /* Get map creation property list */ + if(H5P_DEFAULT == mcpl_id) + mcpl_id = H5P_MAP_CREATE_DEFAULT; + else + if(TRUE != H5P_isa_class(mcpl_id, H5P_MAP_CREATE)) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "mcpl_id is not a map create property list ID") + + /* Verify access property list and set up collective metadata if appropriate */ + if(H5CX_set_apl(&mapl_id, H5P_CLS_MACC, loc_id, TRUE) < 0) + HGOTO_ERROR(H5E_MAP, H5E_CANTSET, H5I_INVALID_HID, "can't set access property list info") + + /* Get the location object */ + if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid location identifier") + + /* Set location parameters */ + loc_params.type = H5VL_OBJECT_BY_SELF; + loc_params.obj_type = H5I_get_type(loc_id); + + /* Create the map */ + if(H5VL_optional(vol_obj, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, H5VL_MAP_CREATE, &loc_params, name, lcpl_id, + key_type_id, val_type_id, mcpl_id, mapl_id, &map) < 0) + HGOTO_ERROR(H5E_MAP, H5E_CANTINIT, H5I_INVALID_HID, "unable to create map") + + /* Get an atom for the map */ + if((ret_value = H5VL_register(H5I_MAP, map, vol_obj->connector, TRUE)) < 0) + HGOTO_ERROR(H5E_MAP, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to atomize map handle") + +done: + /* Cleanup on failure */ + if(H5I_INVALID_HID == ret_value) + if(map && H5VL_optional(vol_obj, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, H5VL_MAP_CLOSE) < 0) + HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, H5I_INVALID_HID, "unable to release map") + + FUNC_LEAVE_API(ret_value) +} /* end H5Mcreate() */ + + +/*------------------------------------------------------------------------- + * Function: H5Mcreate_anon + * + * Purpose: Creates a new map object for storing key-value pairs. The + * in-file datatype for keys is defined by KEY_TYPE_ID and + * the in-file datatype for values is defined by VAL_TYPE_ID. + * LOC_ID specifies the file to create the map object, but no + * link to the object is created. Other options can be + * specified through the property lists LCPL_ID, MCPL_ID, and + * MAPL_ID. + * + * The resulting ID should be linked into the file with + * H5Olink or it will be deleted when closed. + * + * Return: Success: The object ID of the new map. The map should + * be linked into the group hierarchy before being closed or + * it will be deleted. The dataset should be + * closed when the caller is no longer interested + * in it. + * + * Failure: H5I_INVALID_HID + * + *------------------------------------------------------------------------- + */ +hid_t +H5Mcreate_anon(hid_t loc_id, hid_t key_type_id, hid_t val_type_id, + hid_t mcpl_id, hid_t mapl_id) +{ + void *map = NULL; /* map token from VOL connector */ + H5VL_object_t *vol_obj = NULL; /* object token of loc_id */ + H5VL_loc_params_t loc_params; + hid_t ret_value = H5I_INVALID_HID; /* Return value */ + + FUNC_ENTER_API(H5I_INVALID_HID) + H5TRACE5("i", "iiiii", loc_id, key_type_id, val_type_id, mcpl_id, mapl_id); + + /* Check arguments */ + if(H5P_DEFAULT == mcpl_id) + mcpl_id = H5P_MAP_CREATE_DEFAULT; + else + if(TRUE != H5P_isa_class(mcpl_id, H5P_MAP_CREATE)) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not map create property list ID") + + /* Verify access property list and set up collective metadata if appropriate */ + if(H5CX_set_apl(&mapl_id, H5P_CLS_MACC, loc_id, TRUE) < 0) + HGOTO_ERROR(H5E_MAP, H5E_CANTSET, H5I_INVALID_HID, "can't set access property list info") + + /* get the location object */ + if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid location identifier") + + /* Set location parameters */ + loc_params.type = H5VL_OBJECT_BY_SELF; + loc_params.obj_type = H5I_get_type(loc_id); + + /* Create the map */ + if(H5VL_optional(vol_obj, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, H5VL_MAP_CREATE, &loc_params, NULL, H5P_LINK_CREATE_DEFAULT, + key_type_id, val_type_id, mcpl_id, mapl_id, &map) < 0) + HGOTO_ERROR(H5E_MAP, H5E_CANTINIT, H5I_INVALID_HID, "unable to create map") + + /* Get an atom for the map */ + if((ret_value = H5VL_register(H5I_MAP, map, vol_obj->connector, TRUE)) < 0) + HGOTO_ERROR(H5E_MAP, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register map") + +done: + /* Cleanup on failure */ + if(H5I_INVALID_HID == ret_value) + if(map && H5VL_optional(vol_obj, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, H5VL_MAP_CLOSE) < 0) + HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, H5I_INVALID_HID, "unable to release map") + + FUNC_LEAVE_API(ret_value) +} /* end H5Mcreate_anon() */ + + +/*------------------------------------------------------------------------ + * Function: H5Mopen + * + * Purpose: Finds a map named NAME at LOC_ID, opens it, and returns + * its ID. The map should be close when the caller is no + * longer interested in it. + * + * Takes a map access property list + * + * Return: Success: Object ID of the map + * + * Failure: H5I_INVALID_HID + * + *------------------------------------------------------------------------- + */ +hid_t +H5Mopen(hid_t loc_id, const char *name, hid_t mapl_id) +{ + void *map = NULL; /* map token from VOL connector */ + H5VL_object_t *vol_obj = NULL; /* object token of loc_id */ + H5VL_loc_params_t loc_params; + hid_t ret_value = H5I_INVALID_HID; /* Return value */ + + FUNC_ENTER_API(H5I_INVALID_HID) + H5TRACE3("i", "i*si", loc_id, name, mapl_id); + + /* Check args */ + if(!name) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "name parameter cannot be NULL") + if(!*name) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "name parameter cannot be an empty string") + + /* Verify access property list and set up collective metadata if appropriate */ + if(H5CX_set_apl(&mapl_id, H5P_CLS_MACC, loc_id, FALSE) < 0) + HGOTO_ERROR(H5E_MAP, H5E_CANTSET, H5I_INVALID_HID, "can't set access property list info") + + /* get the location object */ + if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid location identifier") + + /* Set the location parameters */ + loc_params.type = H5VL_OBJECT_BY_SELF; + loc_params.obj_type = H5I_get_type(loc_id); + + /* Open the map */ + if(H5VL_optional(vol_obj, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, H5VL_MAP_OPEN, &loc_params, name, mapl_id, &map) < 0) + HGOTO_ERROR(H5E_MAP, H5E_CANTOPENOBJ, H5I_INVALID_HID, "unable to open map") + + /* Register an atom for the map */ + if((ret_value = H5VL_register(H5I_MAP, map, vol_obj->connector, TRUE)) < 0) + HGOTO_ERROR(H5E_MAP, H5E_CANTREGISTER, H5I_INVALID_HID, "can't register map atom") + +done: + /* Cleanup on failure */ + if(H5I_INVALID_HID == ret_value) + if(map && H5VL_optional(vol_obj, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, H5VL_MAP_CLOSE) < 0) + HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, H5I_INVALID_HID, "unable to release map") + + FUNC_LEAVE_API(ret_value) +} /* end H5Mopen() */ + + +/*------------------------------------------------------------------------- + * Function: H5Mclose + * + * Purpose: Closes access to a map and releases resources used by it. + * It is illegal to subsequently use that same map ID in + * calls to other map functions. + * + * Return: SUCCEED/FAIL + * + *------------------------------------------------------------------------- + */ +herr_t +H5Mclose(hid_t map_id) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_API(FAIL) + H5TRACE1("e", "i", map_id); + + /* Check args */ + if(H5I_MAP != H5I_get_type(map_id)) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a map ID") + + /* Decrement the counter on the map. It will be freed if the count + * reaches zero. + */ + if(H5I_dec_app_ref_always_close(map_id) < 0) + HGOTO_ERROR(H5E_MAP, H5E_CANTDEC, FAIL, "can't decrement count on map ID") + +done: + FUNC_LEAVE_API(ret_value) +} /* end H5Mclose() */ + + +/*------------------------------------------------------------------------- + * Function: H5Mget_key_type + * + * Purpose: Returns a copy of the key datatype for a map. + * + * Return: Success: ID for a copy of the datatype. The data + * type should be released by calling + * H5Tclose(). + * + * Failure: H5I_INVALID_HID + * + *------------------------------------------------------------------------- + */ +hid_t +H5Mget_key_type(hid_t map_id) +{ + H5VL_object_t *vol_obj; /* Map structure */ + hid_t ret_value = H5I_INVALID_HID; /* Return value */ + + FUNC_ENTER_API(H5I_INVALID_HID) + H5TRACE1("i", "i", map_id); + + /* Check args */ + if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(map_id, H5I_MAP))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid map identifier") + + /* get the datatype */ + if(H5VL_optional(vol_obj, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, H5VL_MAP_GET, H5VL_MAP_GET_KEY_TYPE, &ret_value) < 0) + HGOTO_ERROR(H5E_MAP, H5E_CANTGET, H5I_INVALID_HID, "unable to get datatype") + +done: + FUNC_LEAVE_API(ret_value) +} /* end H5Mget_key_type() */ + + +/*------------------------------------------------------------------------- + * Function: H5Mget_val_type + * + * Purpose: Returns a copy of the value datatype for a map. + * + * Return: Success: ID for a copy of the datatype. The data + * type should be released by calling + * H5Tclose(). + * + * Failure: H5I_INVALID_HID + * + *------------------------------------------------------------------------- + */ +hid_t +H5Mget_val_type(hid_t map_id) +{ + H5VL_object_t *vol_obj; /* Map structure */ + hid_t ret_value = H5I_INVALID_HID; /* Return value */ + + FUNC_ENTER_API(H5I_INVALID_HID) + H5TRACE1("i", "i", map_id); + + /* Check args */ + if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(map_id, H5I_MAP))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid map identifier") + + /* get the datatype */ + if(H5VL_optional(vol_obj, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, H5VL_MAP_GET, H5VL_MAP_GET_VAL_TYPE, &ret_value) < 0) + HGOTO_ERROR(H5E_MAP, H5E_CANTGET, H5I_INVALID_HID, "unable to get datatype") + +done: + FUNC_LEAVE_API(ret_value) +} /* end H5Mget_val_type() */ + + +/*------------------------------------------------------------------------- + * Function: H5Mget_create_plist + * + * Purpose: Returns a copy of the map creation property list. + * + * Return: Success: ID for a copy of the map creation + * property list. The template should be + * released by calling H5P_close(). + * + * Failure: H5I_INVALID_HID + * + *------------------------------------------------------------------------- + */ +hid_t +H5Mget_create_plist(hid_t map_id) +{ + H5VL_object_t *vol_obj; /* Map structure */ + hid_t ret_value = H5I_INVALID_HID; /* Return value */ + + FUNC_ENTER_API(H5I_INVALID_HID) + H5TRACE1("i", "i", map_id); + + /* Check args */ + if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(map_id, H5I_MAP))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid map identifier") + + /* Get the map creation property list */ + if(H5VL_optional(vol_obj, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, H5VL_MAP_GET, H5VL_MAP_GET_MCPL, &ret_value) < 0) + HGOTO_ERROR(H5E_MAP, H5E_CANTGET, H5I_INVALID_HID, "unable to get map creation properties") + +done: + FUNC_LEAVE_API(ret_value) +} /* end H5Mget_create_plist() */ + + +/*------------------------------------------------------------------------- + * Function: H5Mget_access_plist + * + * Purpose: Returns a copy of the map access property list. + * + * Description: H5Mget_access_plist returns the map access property + * list identifier of the specified map. + * + * Return: Success: ID for a copy of the map access + * property list. The template should be + * released by calling H5Pclose(). + * + * Failure: H5I_INVALID_HID + * + *------------------------------------------------------------------------- + */ +hid_t +H5Mget_access_plist(hid_t map_id) +{ + H5VL_object_t *vol_obj; /* Map structure */ + hid_t ret_value = H5I_INVALID_HID; /* Return value */ + + FUNC_ENTER_API(H5I_INVALID_HID) + H5TRACE1("i", "i", map_id); + + /* Check args */ + if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(map_id, H5I_MAP))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid map identifier") + + /* Get the map access property list */ + if(H5VL_optional(vol_obj, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, H5VL_MAP_GET, H5VL_MAP_GET_MAPL, &ret_value) < 0) + HGOTO_ERROR(H5E_MAP, H5E_CANTGET, H5I_INVALID_HID, "unable to get map access properties") + +done: + FUNC_LEAVE_API(ret_value) +} /* end H5Mget_access_plist() */ + + +/*------------------------------------------------------------------------- + * Function: H5Mget_count + * + * Purpose: Returns the number of key-value pairs stored in the map. + * + * Description: H5Mget_count returns the number of key-value pairs stored + * in the specified map. + * + * Return: SUCCEED/FAIL + * + *------------------------------------------------------------------------- + */ +herr_t +H5Mget_count(hid_t map_id, hsize_t *count, hid_t dxpl_id) +{ + H5VL_object_t *vol_obj; /* Map structure */ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_API(H5I_INVALID_HID) + H5TRACE3("e", "i*hi", map_id, count, dxpl_id); + + /* Check args */ + if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(map_id, H5I_MAP))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid map identifier") + + /* Get the default dataset transfer property list if the user didn't provide one */ + if (H5P_DEFAULT == dxpl_id) + dxpl_id = H5P_DATASET_XFER_DEFAULT; + else + if (TRUE != H5P_isa_class(dxpl_id, H5P_DATASET_XFER)) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not xfer parms") + + /* Set DXPL for operation */ + H5CX_set_dxpl(dxpl_id); + + /* Get the number of key-value pairs stored in the map */ + if(H5VL_optional(vol_obj, dxpl_id, H5_REQUEST_NULL, H5VL_MAP_GET, H5VL_MAP_GET_COUNT, count) < 0) + HGOTO_ERROR(H5E_MAP, H5E_CANTGET, H5I_INVALID_HID, "unable to get map access properties") + +done: + FUNC_LEAVE_API(ret_value) +} /* end H5Mget_count() */ + + +/*------------------------------------------------------------------------- + * Function: H5Mput + * + * Purpose: H5Mput adds a key-value pair to the Map specified by + * MAP_ID, or updates the value for the specified key if one + * was set previously. KEY_MEM_TYPE_ID and VAL_MEM_TYPE_ID + * specify the datatypes for the provided KEY and VALUE + * buffers, and if different from those used to create the + * map object, the key and value will be internally converted + * to the datatypes for the map object. Any further options + * can be specified through the property list DXPL_ID. + * + * Return: SUCCEED/FAIL + * + *------------------------------------------------------------------------- + */ +herr_t +H5Mput(hid_t map_id, hid_t key_mem_type_id, const void *key, + hid_t val_mem_type_id, const void *value, hid_t dxpl_id) +{ + H5VL_object_t *vol_obj = NULL; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_API(FAIL) + H5TRACE6("e", "ii*xi*xi", map_id, key_mem_type_id, key, val_mem_type_id, value, + dxpl_id); + + /* Check arguments */ + if (key_mem_type_id < 0) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid key memory datatype ID") + if (val_mem_type_id < 0) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid value memory datatype ID") + + /* Get map pointer */ + if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(map_id, H5I_MAP))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "map_id is not a map ID") + + /* Get the default dataset transfer property list if the user didn't provide one */ + if (H5P_DEFAULT == dxpl_id) + dxpl_id = H5P_DATASET_XFER_DEFAULT; + else + if (TRUE != H5P_isa_class(dxpl_id, H5P_DATASET_XFER)) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not xfer parms") + + /* Set DXPL for operation */ + H5CX_set_dxpl(dxpl_id); + + /* Set the key/value pair */ + if(H5VL_optional(vol_obj, dxpl_id, H5_REQUEST_NULL, H5VL_MAP_PUT, key_mem_type_id, key, val_mem_type_id, value) < 0) + HGOTO_ERROR(H5E_MAP, H5E_CANTSET, FAIL, "unable to put key/value pair") + +done: + FUNC_LEAVE_API(ret_value) +} /* end H5Mput() */ + + +/*------------------------------------------------------------------------- + * Function: H5Mget + * + * Purpose: H5Mget retrieves, from the Map specified by MAP_ID, the + * value associated with the provided key. KEY_MEM_TYPE_ID + * and VAL_MEM_TYPE_ID specify the datatypes for the provided + * KEY and VALUE buffers. If KEY_MEM_TYPE_ID is different + * from that used to create the map object, the key will be + * internally converted to the datatype for the map object + * for the query, and if VAL_MEM_TYPE_ID is different from + * that used to create the map object, the returned value + * will be converted to VAL_MEM_TYPE_ID before the function + * returns. Any further options can be specified through the + * property list DXPL_ID. + * + * Return: SUCCEED/FAIL + * + *------------------------------------------------------------------------- + */ +herr_t +H5Mget(hid_t map_id, hid_t key_mem_type_id, const void *key, + hid_t val_mem_type_id, void *value, hid_t dxpl_id) +{ + H5VL_object_t *vol_obj = NULL; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_API(FAIL) + H5TRACE6("e", "ii*xi*xi", map_id, key_mem_type_id, key, val_mem_type_id, value, + dxpl_id); + + /* Check arguments */ + if (key_mem_type_id < 0) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid key memory datatype ID") + if (val_mem_type_id < 0) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid value memory datatype ID") + + /* Get map pointer */ + if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(map_id, H5I_MAP))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "map_id is not a map ID") + + /* Get the default dataset transfer property list if the user didn't provide one */ + if (H5P_DEFAULT == dxpl_id) + dxpl_id = H5P_DATASET_XFER_DEFAULT; + else + if (TRUE != H5P_isa_class(dxpl_id, H5P_DATASET_XFER)) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not xfer parms") + + /* Set DXPL for operation */ + H5CX_set_dxpl(dxpl_id); + + /* Get the value for the key */ + if(H5VL_optional(vol_obj, dxpl_id, H5_REQUEST_NULL, H5VL_MAP_GET_VAL, key_mem_type_id, key, val_mem_type_id, value) < 0) + HGOTO_ERROR(H5E_MAP, H5E_CANTGET, FAIL, "unable to get value from map") + +done: + FUNC_LEAVE_API(ret_value) +} /* end H5Mget() */ + + +/*------------------------------------------------------------------------- + * Function: H5Mexists + * + * Purpose: H5Mexists checks if the provided key is stored in the map + * specified by MAP_ID. If KEY_MEM_TYPE_ID is different from + * that used to create the map object the key will be + * internally converted to the datatype for the map object + * for the query. + * + * Return: SUCCEED/FAIL + * + *------------------------------------------------------------------------- + */ +herr_t +H5Mexists(hid_t map_id, hid_t key_mem_type_id, const void *key, hbool_t *exists, + hid_t dxpl_id) +{ + H5VL_object_t *vol_obj = NULL; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_API(FAIL) + H5TRACE5("e", "ii*x*bi", map_id, key_mem_type_id, key, exists, dxpl_id); + + /* Check arguments */ + if (key_mem_type_id < 0) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid key memory datatype ID") + + /* Get map pointer */ + if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(map_id, H5I_MAP))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "map_id is not a map ID") + + /* Get the default dataset transfer property list if the user didn't provide one */ + if (H5P_DEFAULT == dxpl_id) + dxpl_id = H5P_DATASET_XFER_DEFAULT; + else + if (TRUE != H5P_isa_class(dxpl_id, H5P_DATASET_XFER)) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not xfer parms") + + /* Set DXPL for operation */ + H5CX_set_dxpl(dxpl_id); + + /* Check if key exists */ + if((ret_value = H5VL_optional(vol_obj, dxpl_id, H5_REQUEST_NULL, H5VL_MAP_EXISTS, key_mem_type_id, key, exists)) < 0) + HGOTO_ERROR(H5E_MAP, H5E_CANTGET, ret_value, "unable to check if key exists") + +done: + FUNC_LEAVE_API(ret_value) +} /* end H5Mexists() */ + + +/*------------------------------------------------------------------------- + * Function: H5Miterate + * + * Purpose: H5Miterate iterates over all key-value pairs stored in the + * map specified by MAP_ID, making the callback specified by + * OP for each. The IDX parameter is an in/out parameter that + * may be used to restart a previously interrupted iteration. + * At the start of iteration IDX should be set to 0, and to + * restart iteration at the same location on a subsequent + * call to H5Miterate, IDX should be the same value as + * returned by the previous call. + * + * H5M_iterate_t is defined as: + * herr_t (*H5M_iterate_t)(hid_t map_id, const void *key, + * void *ctx) + * + * The KEY parameter is the buffer for the key for this + * iteration, converted to the datatype specified by + * KEY_MEM_TYPE_ID. The OP_DATA parameter is a simple pass + * through of the value passed to H5Miterate, which can be + * used to store application-defined data for iteration. A + * negative return value from this function will cause + * H5Miterate to issue an error, while a positive return + * value will cause H5Miterate to stop iterating and return + * this value without issuing an error. A return value of + * zero allows iteration to continue. + * + * Return: Last value returned by op + * + *------------------------------------------------------------------------- + */ +herr_t +H5Miterate(hid_t map_id, hsize_t *idx, hid_t key_mem_type_id, H5M_iterate_t op, + void *op_data, hid_t dxpl_id) +{ + H5VL_object_t *vol_obj = NULL; + H5VL_loc_params_t loc_params; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_API(FAIL) + H5TRACE6("e", "i*hix*xi", map_id, idx, key_mem_type_id, op, op_data, dxpl_id); + + /* Check arguments */ + if (key_mem_type_id < 0) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid key memory datatype ID") + if (!op) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no operator specified") + + /* Get map pointer */ + if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(map_id, H5I_MAP))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "map_id is not a map ID") + + /* Get the default dataset transfer property list if the user didn't provide one */ + if (H5P_DEFAULT == dxpl_id) + dxpl_id = H5P_DATASET_XFER_DEFAULT; + else + if (TRUE != H5P_isa_class(dxpl_id, H5P_DATASET_XFER)) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not xfer parms") + + /* Set DXPL for operation */ + H5CX_set_dxpl(dxpl_id); + + /* Set location struct fields */ + loc_params.type = H5VL_OBJECT_BY_SELF; + loc_params.obj_type = H5I_get_type(map_id); + + /* Iterate over keys */ + if((ret_value = H5VL_optional(vol_obj, dxpl_id, H5_REQUEST_NULL, H5VL_MAP_SPECIFIC, &loc_params, H5VL_MAP_ITER, idx, key_mem_type_id, op, op_data)) < 0) + HGOTO_ERROR(H5E_MAP, H5E_BADITER, ret_value, "unable to ierate over keys") + +done: + FUNC_LEAVE_API(ret_value) +} /* end H5Miterate() */ + + +/*------------------------------------------------------------------------- + * Function: H5Miterate_by_name + * + * Purpose: H5Miterate_by_name iterates over all key-value pairs + * stored in the map specified by MAP_ID, making the callback + * specified by OP for each. The IDX parameter is an in/out + * parameter that may be used to restart a previously + * interrupted iteration. At the start of iteration IDX + * should be set to 0, and to restart iteration at the same + * location on a subsequent call to H5Miterate, IDX should be + * the same value as returned by the previous call. + * + * H5M_iterate_t is defined as: + * herr_t (*H5M_iterate_t)(hid_t map_id, const void *key, + * void *ctx) + * + * The KEY parameter is the buffer for the key for this + * iteration, converted to the datatype specified by + * KEY_MEM_TYPE_ID. The OP_DATA parameter is a simple pass + * through of the value passed to H5Miterate, which can be + * used to store application-defined data for iteration. A + * negative return value from this function will cause + * H5Miterate to issue an error, while a positive return + * value will cause H5Miterate to stop iterating and return + * this value without issuing an error. A return value of + * zero allows iteration to continue. + * + * Return: Last value returned by op + * + *------------------------------------------------------------------------- + */ +herr_t +H5Miterate_by_name(hid_t loc_id, const char *map_name, hsize_t *idx, + hid_t key_mem_type_id, H5M_iterate_t op, void *op_data, hid_t dxpl_id, + hid_t lapl_id) +{ + H5VL_object_t *vol_obj = NULL; + H5VL_loc_params_t loc_params; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_API(FAIL) + H5TRACE8("e", "i*s*hix*xii", loc_id, map_name, idx, key_mem_type_id, op, + op_data, dxpl_id, lapl_id); + + /* Check arguments */ + if(!map_name) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "map_name parameter cannot be NULL") + if(!*map_name) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "map_name parameter cannot be an empty string") + if (key_mem_type_id < 0) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid key memory datatype ID") + if (!op) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no operator specified") + + /* Get the location object */ + if (NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier") + + /* Get the default dataset transfer property list if the user didn't provide one */ + if (H5P_DEFAULT == dxpl_id) + dxpl_id = H5P_DATASET_XFER_DEFAULT; + else + if (TRUE != H5P_isa_class(dxpl_id, H5P_DATASET_XFER)) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not xfer parms") + + /* Set DXPL for operation */ + H5CX_set_dxpl(dxpl_id); + + /* Set location struct fields */ + loc_params.type = H5VL_OBJECT_BY_NAME; + loc_params.obj_type = H5I_get_type(loc_id); + loc_params.loc_data.loc_by_name.name = map_name; + loc_params.loc_data.loc_by_name.lapl_id = lapl_id; + + /* Iterate over keys */ + if((ret_value = H5VL_optional(vol_obj, dxpl_id, H5_REQUEST_NULL, H5VL_MAP_SPECIFIC, &loc_params, H5VL_MAP_ITER, idx, key_mem_type_id, op, op_data)) < 0) + HGOTO_ERROR(H5E_MAP, H5E_BADITER, ret_value, "unable to ierate over keys") + +done: + FUNC_LEAVE_API(ret_value) +} /* end H5Miterate_by_name() */ + + +/*------------------------------------------------------------------------- + * Function: H5Mdelete + * + * Purpose: H5Mdelete deletes a key-value pair from the Map + * specified by MAP_ID. KEY_MEM_TYPE_ID specifies the + * datatype for the provided key buffers, and if different + * from that used to create the Map object, the key will be + * internally converted to the datatype for the map object. + * Any further options can be specified through the property + * list DXPL_ID. + * + * Return: SUCCEED/FAIL + * + *------------------------------------------------------------------------- + */ +herr_t +H5Mdelete(hid_t map_id, hid_t key_mem_type_id, const void *key, + hid_t dxpl_id) +{ + H5VL_object_t *vol_obj = NULL; + H5VL_loc_params_t loc_params; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_API(FAIL) + H5TRACE4("e", "ii*xi", map_id, key_mem_type_id, key, dxpl_id); + + /* Check arguments */ + if (key_mem_type_id < 0) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid key memory datatype ID") + + /* Get map pointer */ + if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(map_id, H5I_MAP))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "map_id is not a map ID") + + /* Get the default dataset transfer property list if the user didn't provide one */ + if (H5P_DEFAULT == dxpl_id) + dxpl_id = H5P_DATASET_XFER_DEFAULT; + else + if (TRUE != H5P_isa_class(dxpl_id, H5P_DATASET_XFER)) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not xfer parms") + + /* Set DXPL for operation */ + H5CX_set_dxpl(dxpl_id); + + /* Set location struct fields */ + loc_params.type = H5VL_OBJECT_BY_SELF; + loc_params.obj_type = H5I_get_type(map_id); + + /* Delete the key/value pair */ + if(H5VL_optional(vol_obj, dxpl_id, H5_REQUEST_NULL, H5VL_MAP_SPECIFIC, &loc_params, H5VL_MAP_DELETE, key_mem_type_id, key) < 0) + HGOTO_ERROR(H5E_MAP, H5E_CANTSET, FAIL, "unable to delete key/value pair") + +done: + FUNC_LEAVE_API(ret_value) +} /* end H5Mdelete() */ + +#endif /* H5_HAVE_MAP_API */ + diff --git a/src/H5Mmodule.h b/src/H5Mmodule.h new file mode 100644 index 0000000..00a586f --- /dev/null +++ b/src/H5Mmodule.h @@ -0,0 +1,31 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the COPYING file, which can be found at the root of the source code * + * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases. * + * If you do not have access to either file, you may request a copy from * + * help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Purpose: This file contains declarations which define macros for the + * H5M package. Including this header means that the source file + * is part of the H5M package. + */ +#ifndef _H5Mmodule_H +#define _H5Mmodule_H + +/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error + * reporting macros. + */ +#define H5M_MODULE +#define H5_MY_PKG H5M +#define H5_MY_PKG_ERR H5E_MAP +#define H5_MY_PKG_INIT YES + +#endif /* _H5Dmodule_H */ + + diff --git a/src/H5Mpkg.h b/src/H5Mpkg.h new file mode 100644 index 0000000..86ff45c --- /dev/null +++ b/src/H5Mpkg.h @@ -0,0 +1,51 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the COPYING file, which can be found at the root of the source code * + * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases. * + * If you do not have access to either file, you may request a copy from * + * help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Purpose: This file contains declarations which are visible only within + * the H5M package. Source files outside the H5M package should + * include H5Mprivate.h instead. + */ +#if !(defined H5M_FRIEND || defined H5M_MODULE) +#error "Do not include this file outside the H5M package!" +#endif + +#ifndef _H5Mpkg_H +#define _H5Mpkg_H + +/* Get package's private header */ +#include "H5Mprivate.h" + +/* Other private headers needed by this file */ + +/**************************/ +/* Package Private Macros */ +/**************************/ + + +/****************************/ +/* Package Private Typedefs */ +/****************************/ + + +/*****************************/ +/* Package Private Variables */ +/*****************************/ + + +/******************************/ +/* Package Private Prototypes */ +/******************************/ + +#endif /*_H5Dpkg_H*/ + diff --git a/src/H5Mprivate.h b/src/H5Mprivate.h new file mode 100644 index 0000000..c841e75 --- /dev/null +++ b/src/H5Mprivate.h @@ -0,0 +1,80 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the COPYING file, which can be found at the root of the source code * + * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases. * + * If you do not have access to either file, you may request a copy from * + * help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This file contains private information about the H5M module + */ +#ifndef _H5Mprivate_H +#define _H5Mprivate_H + +/* Include package's public header */ +#include "H5Mpublic.h" + +/* Private headers needed by this file */ +#include "H5FDprivate.h" /* File drivers */ +#include "H5Oprivate.h" /* Object headers */ +#include "H5Sprivate.h" /* Dataspaces */ +#include "H5Zprivate.h" /* Data filters */ + + +/**************************/ +/* Library Private Macros */ +/**************************/ + +/* + * Feature: Define H5M_DEBUG on the compiler command line if you want to + * debug maps. NDEBUG must not be defined in order for this + * to have any effect. + */ +#ifdef NDEBUG +# undef H5M_DEBUG +#endif + +/* ======== Map creation property names ======== */ + +/* ======== Map access property names ======== */ +#define H5M_ACS_KEY_PREFETCH_SIZE_NAME "key_prefetch_size" /* Number of keys to prefetch during map iteration */ +#define H5M_ACS_KEY_ALLOC_SIZE_NAME "key_alloc_size" /* Initial allocation size for keys prefetched during map iteration */ + +/* Default temporary buffer size */ +#define H5D_TEMP_BUF_SIZE (1024 * 1024) + +/* Default I/O vector size */ +#define H5D_IO_VECTOR_SIZE 1024 + +/* Default VL allocation & free info */ +#define H5D_VLEN_ALLOC NULL +#define H5D_VLEN_ALLOC_INFO NULL +#define H5D_VLEN_FREE NULL +#define H5D_VLEN_FREE_INFO NULL + +/* Default virtual dataset list size */ +#define H5D_VIRTUAL_DEF_LIST_SIZE 8 + + +/****************************/ +/* Library Private Typedefs */ +/****************************/ + + +/*****************************/ +/* Library Private Variables */ +/*****************************/ + + +/******************************/ +/* Library Private Prototypes */ +/******************************/ + +#endif /* _H5Mprivate_H */ + diff --git a/src/H5Mpublic.h b/src/H5Mpublic.h new file mode 100644 index 0000000..9cbdb32 --- /dev/null +++ b/src/H5Mpublic.h @@ -0,0 +1,126 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the COPYING file, which can be found at the root of the source code * + * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases. * + * If you do not have access to either file, you may request a copy from * + * help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This file contains public declarations for the H5M module. + * + * NOTE: This is an experimental API. Everything in the H5M package + * is subject to revision in a future release. + */ +#ifndef _H5Mpublic_H +#define _H5Mpublic_H + +/* System headers needed by this file */ + +/* Public headers needed by this file */ +#include "H5public.h" +#include "H5Ipublic.h" + + +/*****************/ +/* Public Macros */ +/*****************/ + +/* Macros defining operation IDs for map VOL callbacks (implemented using the + * "optional" VOL callback) */ +#define H5VL_MAP_CREATE 1 +#define H5VL_MAP_OPEN 2 +#define H5VL_MAP_GET_VAL 3 +#define H5VL_MAP_EXISTS 4 +#define H5VL_MAP_PUT 5 +#define H5VL_MAP_GET 6 +#define H5VL_MAP_SPECIFIC 7 +#define H5VL_MAP_CLOSE 8 + + +/*******************/ +/* Public Typedefs */ +/*******************/ + +/* types for map GET callback */ +typedef enum H5VL_map_get_t { + H5VL_MAP_GET_MAPL, /* map access property list */ + H5VL_MAP_GET_MCPL, /* map creation property list */ + H5VL_MAP_GET_KEY_TYPE, /* key type */ + H5VL_MAP_GET_VAL_TYPE, /* value type */ + H5VL_MAP_GET_COUNT /* key count */ +} H5VL_map_get_t; + +/* types for map SPECIFIC callback */ +typedef enum H5VL_map_specific_t { + H5VL_MAP_ITER, /* H5Miterate */ + H5VL_MAP_DELETE /* H5Mdelete */ +} H5VL_map_specific_t; + +/* Callback for H5Miterate() */ +typedef herr_t (*H5M_iterate_t)(hid_t map_id, const void *key, void *op_data); + + +/********************/ +/* Public Variables */ +/********************/ + + +/*********************/ +/* Public Prototypes */ +/*********************/ +#ifdef __cplusplus +extern "C" { +#endif + +/* The map API is only built when requested since there's no support in + * the native file format at this time. It's only supported in a few VOL + * connectors. + */ +#ifdef H5_HAVE_MAP_API + +H5_DLL hid_t H5Mcreate(hid_t loc_id, const char *name, hid_t key_type_id, + hid_t val_type_id, hid_t lcpl_id, hid_t mcpl_id, hid_t mapl_id); +H5_DLL hid_t H5Mcreate_anon(hid_t loc_id, hid_t key_type_id, hid_t val_type_id, + hid_t mcpl_id, hid_t mapl_id); +H5_DLL hid_t H5Mopen(hid_t loc_id, const char *name, hid_t mapl_id); +H5_DLL herr_t H5Mclose(hid_t map_id); +H5_DLL hid_t H5Mget_key_type(hid_t map_id); +H5_DLL hid_t H5Mget_val_type(hid_t map_id); +H5_DLL hid_t H5Mget_create_plist(hid_t map_id); +H5_DLL hid_t H5Mget_access_plist(hid_t map_id); +H5_DLL herr_t H5Mget_count(hid_t map_id, hsize_t *count, hid_t dxpl_id); +H5_DLL herr_t H5Mput(hid_t map_id, hid_t key_mem_type_id, const void *key, + hid_t val_mem_type_id, const void *value, hid_t dxpl_id); +H5_DLL herr_t H5Mget(hid_t map_id, hid_t key_mem_type_id, const void *key, + hid_t val_mem_type_id, void *value, hid_t dxpl_id); +H5_DLL herr_t H5Mexists(hid_t map_id, hid_t key_mem_type_id, const void *key, + hbool_t *exists, hid_t dxpl_id); +H5_DLL herr_t H5Miterate(hid_t map_id, hsize_t *idx, hid_t key_mem_type_id, + H5M_iterate_t op, void *op_data, hid_t dxpl_id); +H5_DLL herr_t H5Miterate_by_name(hid_t loc_id, const char *map_name, + hsize_t *idx, hid_t key_mem_type_id, H5M_iterate_t op, void *op_data, + hid_t dxpl_id, hid_t lapl_id); +H5_DLL herr_t H5Mdelete(hid_t map_id, hid_t key_mem_type_id, + const void *key, hid_t dxpl_id); + +/* Symbols defined for compatibility with previous versions of the HDF5 API. + * + * Use of these symbols is deprecated. + */ +#ifndef H5_NO_DEPRECATED_SYMBOLS +#endif /* H5_NO_DEPRECATED_SYMBOLS */ + +#endif /* H5_HAVE_MAP_API */ + +#ifdef __cplusplus +} +#endif + +#endif /* _H5Mpublic_H */ + @@ -1084,6 +1084,7 @@ H5Oclose(hid_t object_id) case H5I_GROUP: case H5I_DATATYPE: case H5I_DATASET: + case H5I_MAP: if(H5I_object(object_id) == NULL) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a valid object") if(H5I_dec_app_ref(object_id) < 0) diff --git a/src/H5Oflush.c b/src/H5Oflush.c index f5ede4a..a03cfa1 100644 --- a/src/H5Oflush.c +++ b/src/H5Oflush.c @@ -479,6 +479,9 @@ H5O_refresh_metadata_reopen(hid_t oid, H5G_loc_t *obj_loc, H5VL_t *vol_connector HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, FAIL, "unable to finish refresh for dataset") break; + case H5I_MAP: + HGOTO_ERROR(H5E_OHDR, H5E_BADTYPE, FAIL, "maps not supported in native VOL connector") + case H5I_UNINIT: case H5I_BADID: case H5I_FILE: diff --git a/src/H5Oint.c b/src/H5Oint.c index 45a8046..e37eea5 100644 --- a/src/H5Oint.c +++ b/src/H5Oint.c @@ -1836,6 +1836,9 @@ H5O_get_loc(hid_t object_id) HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, NULL, "unable to get object location from datatype ID") break; + case H5I_MAP: + HGOTO_ERROR(H5E_OHDR, H5E_BADTYPE, NULL, "maps not supported in native VOL connector") + case H5I_UNINIT: case H5I_BADID: case H5I_FILE: diff --git a/src/H5Opublic.h b/src/H5Opublic.h index c868e72..234f4f0 100644 --- a/src/H5Opublic.h +++ b/src/H5Opublic.h @@ -94,6 +94,7 @@ typedef enum H5O_type_t { H5O_TYPE_GROUP, /* Object is a group */ H5O_TYPE_DATASET, /* Object is a dataset */ H5O_TYPE_NAMED_DATATYPE, /* Object is a named data type */ + H5O_TYPE_MAP, /* Object is a map */ H5O_TYPE_NTYPES /* Number of different object types (must be last!) */ } H5O_type_t; diff --git a/src/H5Pencdec.c b/src/H5Pencdec.c index 8b9962f..2a07a67 100644 --- a/src/H5Pencdec.c +++ b/src/H5Pencdec.c @@ -722,7 +722,7 @@ H5P__decode(const void *buf) /* Get the type of the property list */ type = (H5P_plist_type_t)*p++; - if(type <= H5P_TYPE_USER || type > H5P_TYPE_LINK_ACCESS) + if(type <= H5P_TYPE_USER || type >= H5P_TYPE_MAX_TYPE) HGOTO_ERROR(H5E_PLIST, H5E_BADRANGE, FAIL, "bad type of encoded information: %u", (unsigned)type) /* Create new property list of the specified type */ diff --git a/src/H5Pint.c b/src/H5Pint.c index 5683403..36367d7 100644 --- a/src/H5Pint.c +++ b/src/H5Pint.c @@ -151,6 +151,10 @@ hid_t H5P_CLS_DATATYPE_CREATE_ID_g = H5I_INVALID_HID; H5P_genclass_t *H5P_CLS_DATATYPE_CREATE_g = NULL; hid_t H5P_CLS_DATATYPE_ACCESS_ID_g = H5I_INVALID_HID; H5P_genclass_t *H5P_CLS_DATATYPE_ACCESS_g = NULL; +hid_t H5P_CLS_MAP_CREATE_ID_g = H5I_INVALID_HID; +H5P_genclass_t *H5P_CLS_MAP_CREATE_g = NULL; +hid_t H5P_CLS_MAP_ACCESS_ID_g = H5I_INVALID_HID; +H5P_genclass_t *H5P_CLS_MAP_ACCESS_g = NULL; hid_t H5P_CLS_ATTRIBUTE_CREATE_ID_g = H5I_INVALID_HID; H5P_genclass_t *H5P_CLS_ATTRIBUTE_CREATE_g = NULL; hid_t H5P_CLS_ATTRIBUTE_ACCESS_ID_g = H5I_INVALID_HID; @@ -180,6 +184,8 @@ hid_t H5P_LST_GROUP_CREATE_ID_g = H5I_INVALID_HID; hid_t H5P_LST_GROUP_ACCESS_ID_g = H5I_INVALID_HID; hid_t H5P_LST_DATATYPE_CREATE_ID_g = H5I_INVALID_HID; hid_t H5P_LST_DATATYPE_ACCESS_ID_g = H5I_INVALID_HID; +hid_t H5P_LST_MAP_CREATE_ID_g = H5I_INVALID_HID; +hid_t H5P_LST_MAP_ACCESS_ID_g = H5I_INVALID_HID; hid_t H5P_LST_ATTRIBUTE_CREATE_ID_g = H5I_INVALID_HID; hid_t H5P_LST_ATTRIBUTE_ACCESS_ID_g = H5I_INVALID_HID; hid_t H5P_LST_OBJECT_COPY_ID_g = H5I_INVALID_HID; @@ -314,6 +320,7 @@ H5_DLLVAR const H5P_libclass_t H5P_CLS_STRCRT[1]; /* String create */ H5_DLLVAR const H5P_libclass_t H5P_CLS_GCRT[1]; /* Group create */ H5_DLLVAR const H5P_libclass_t H5P_CLS_FCRT[1]; /* File creation */ H5_DLLVAR const H5P_libclass_t H5P_CLS_DCRT[1]; /* Dataset creation */ +H5_DLLVAR const H5P_libclass_t H5P_CLS_MCRT[1]; /* Map creation */ H5_DLLVAR const H5P_libclass_t H5P_CLS_DXFR[1]; /* Data transfer */ H5_DLLVAR const H5P_libclass_t H5P_CLS_FMNT[1]; /* File mount */ H5_DLLVAR const H5P_libclass_t H5P_CLS_ACRT[1]; /* Attribute creation */ @@ -352,6 +359,8 @@ static H5P_libclass_t const * const init_class[] = { H5P_CLS_FMNT, /* File mount */ H5P_CLS_TCRT, /* Datatype creation */ H5P_CLS_TACC, /* Datatype access */ + H5P_CLS_MCRT, /* Map creation */ + H5P_CLS_MACC, /* Map access */ H5P_CLS_ACRT, /* Attribute creation */ H5P_CLS_AACC, /* Attribute access */ H5P_CLS_LCRT, /* Link creation */ @@ -431,7 +440,7 @@ H5P__init_package(void) FUNC_ENTER_PACKAGE /* Sanity check */ - HDcompile_assert(H5P_TYPE_VOL_INITIALIZE == (H5P_TYPE_MAX_TYPE - 1)); + HDcompile_assert(H5P_TYPE_MAP_ACCESS == (H5P_TYPE_MAX_TYPE - 1)); /* * Initialize the Generic Property class & object groups. @@ -442,8 +451,8 @@ H5P__init_package(void) HGOTO_ERROR(H5E_ATOM, H5E_CANTINIT, FAIL, "unable to initialize ID group") /* Repeatedly pass over the list of property list classes for the library, - * initializing each class if it's parent class is initialized, until no - * more progress is made. + * initializing each class if its parent class is initialized, until no + * more progress is made. */ tot_init = 0; do { @@ -547,6 +556,8 @@ H5P_term_package(void) H5P_LST_GROUP_ACCESS_ID_g = H5P_LST_DATATYPE_CREATE_ID_g = H5P_LST_DATATYPE_ACCESS_ID_g = + H5P_LST_MAP_CREATE_ID_g = + H5P_LST_MAP_ACCESS_ID_g = H5P_LST_ATTRIBUTE_CREATE_ID_g = H5P_LST_ATTRIBUTE_ACCESS_ID_g = H5P_LST_OBJECT_COPY_ID_g = @@ -574,6 +585,8 @@ H5P_term_package(void) H5P_CLS_GROUP_ACCESS_g = H5P_CLS_DATATYPE_CREATE_g = H5P_CLS_DATATYPE_ACCESS_g = + H5P_CLS_MAP_CREATE_g = + H5P_CLS_MAP_ACCESS_g = H5P_CLS_STRING_CREATE_g = H5P_CLS_ATTRIBUTE_CREATE_g = H5P_CLS_ATTRIBUTE_ACCESS_g = @@ -594,6 +607,8 @@ H5P_term_package(void) H5P_CLS_GROUP_ACCESS_ID_g = H5P_CLS_DATATYPE_CREATE_ID_g = H5P_CLS_DATATYPE_ACCESS_ID_g = + H5P_CLS_MAP_CREATE_ID_g = + H5P_CLS_MAP_ACCESS_ID_g = H5P_CLS_STRING_CREATE_ID_g = H5P_CLS_ATTRIBUTE_CREATE_ID_g = H5P_CLS_ATTRIBUTE_ACCESS_ID_g = @@ -5437,8 +5452,9 @@ H5P__new_plist_of_type(H5P_plist_type_t type) FUNC_ENTER_PACKAGE - /* Sanity check */ - HDassert(type >= H5P_TYPE_USER && type < H5P_TYPE_MAX_TYPE); + /* Sanity checks */ + HDcompile_assert(H5P_TYPE_MAP_ACCESS == (H5P_TYPE_MAX_TYPE - 1)); + HDassert(type >= H5P_TYPE_USER && type <= H5P_TYPE_MAP_ACCESS); /* Check arguments */ if(type == H5P_TYPE_USER) @@ -5492,6 +5508,14 @@ H5P__new_plist_of_type(H5P_plist_type_t type) class_id = H5P_CLS_DATATYPE_ACCESS_ID_g; break; + case H5P_TYPE_MAP_CREATE: + class_id = H5P_CLS_MAP_CREATE_ID_g; + break; + + case H5P_TYPE_MAP_ACCESS: + class_id = H5P_CLS_MAP_ACCESS_ID_g; + break; + case H5P_TYPE_STRING_CREATE: class_id = H5P_CLS_STRING_CREATE_ID_g; break; diff --git a/src/H5Pmapl.c b/src/H5Pmapl.c new file mode 100644 index 0000000..fe5be0f --- /dev/null +++ b/src/H5Pmapl.c @@ -0,0 +1,217 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the COPYING file, which can be found at the root of the source code * + * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases. * + * If you do not have access to either file, you may request a copy from * + * help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*------------------------------------------------------------------------- + * + * Purpose: Map access property list class routines + * + *------------------------------------------------------------------------- + */ + +/****************/ +/* Module Setup */ +/****************/ + +#include "H5Pmodule.h" /* This source code file is part of the H5P module */ + + +/***********/ +/* Headers */ +/***********/ +#include "H5private.h" /* Generic Functions */ +#include "H5Mprivate.h" /* Maps */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5Iprivate.h" /* IDs */ +#include "H5Ppkg.h" /* Property lists */ + + +/****************/ +/* Local Macros */ +/****************/ + +/* ========= Map Access properties ============ */ +/* Definitions for key prefetch size */ +#define H5M_ACS_KEY_PREFETCH_SIZE_SIZE sizeof(size_t) +#define H5M_ACS_KEY_PREFETCH_SIZE_DEF (size_t)(16 * 1024) +#define H5M_ACS_KEY_PREFETCH_SIZE_ENC H5P__encode_size_t +#define H5M_ACS_KEY_PREFETCH_SIZE_DEC H5P__decode_size_t +/* Definition for key prefetch buffer size */ +#define H5M_ACS_KEY_ALLOC_SIZE_SIZE sizeof(size_t) +#define H5M_ACS_KEY_ALLOC_SIZE_DEF (size_t)(1024 * 1024) +#define H5M_ACS_KEY_ALLOC_SIZE_ENC H5P__encode_size_t +#define H5M_ACS_KEY_ALLOC_SIZE_DEC H5P__decode_size_t + + +/******************/ +/* Local Typedefs */ +/******************/ + + +/********************/ +/* Package Typedefs */ +/********************/ + + +/********************/ +/* Local Prototypes */ +/********************/ + +/* Property class callbacks */ +static herr_t H5P__macc_reg_prop(H5P_genclass_t *pclass); + + +/*********************/ +/* Package Variables */ +/*********************/ + +/* Map access property list class library initialization object */ +const H5P_libclass_t H5P_CLS_MACC[1] = {{ + "map access", /* Class name for debugging */ + H5P_TYPE_MAP_ACCESS, /* Class type */ + + &H5P_CLS_LINK_ACCESS_g, /* Parent class */ + &H5P_CLS_MAP_ACCESS_g, /* Pointer to class */ + &H5P_CLS_MAP_ACCESS_ID_g, /* Pointer to class ID */ + &H5P_LST_MAP_ACCESS_ID_g, /* Pointer to default property list ID */ + H5P__macc_reg_prop, /* Default property registration routine */ + + NULL, /* Class creation callback */ + NULL, /* Class creation callback info */ + NULL, /* Class copy callback */ + NULL, /* Class copy callback info */ + NULL, /* Class close callback */ + NULL /* Class close callback info */ +}}; + + +/*****************************/ +/* Library Private Variables */ +/*****************************/ + + +/*******************/ +/* Local Variables */ +/*******************/ + + + +/*------------------------------------------------------------------------- + * Function: H5P__macc_reg_prop + * + * Purpose: Register the map access property list class's + * properties + * + * Return: Non-negative on success/Negative on failure + *------------------------------------------------------------------------- + */ +static herr_t +H5P__macc_reg_prop(H5P_genclass_t *pclass) +{ + size_t key_prefetch_size = H5M_ACS_KEY_PREFETCH_SIZE_DEF; /* Default key prefetch size for iteration */ + size_t key_alloc_size = H5M_ACS_KEY_ALLOC_SIZE_DEF; /* Default key prefetch allocation size for iteration */ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_STATIC + + /* Register the key prefetch size for iteration */ + if(H5P__register_real(pclass, H5M_ACS_KEY_PREFETCH_SIZE_NAME, H5M_ACS_KEY_PREFETCH_SIZE_SIZE, &key_prefetch_size, + NULL, NULL, NULL, H5M_ACS_KEY_PREFETCH_SIZE_ENC, H5M_ACS_KEY_PREFETCH_SIZE_DEC, NULL, NULL, NULL, NULL) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class") + + /* Register the key prefetch allocation size for iteration */ + if(H5P__register_real(pclass, H5M_ACS_KEY_ALLOC_SIZE_NAME, H5M_ACS_KEY_ALLOC_SIZE_SIZE, &key_alloc_size, + NULL, NULL, NULL, H5M_ACS_KEY_ALLOC_SIZE_ENC, H5M_ACS_KEY_ALLOC_SIZE_DEC, NULL, NULL, NULL, NULL) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class") + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5P__macc_reg_prop() */ + + +/*------------------------------------------------------------------------- + * Function: H5Pset_map_iterate_hints + * + * Purpose: H5Pset_map_iterate_hints adjusts the behavior of + * H5Miterate when prefetching keys for iteration. The + * KEY_PREFETCH_SIZE parameter specifies the number of keys + * to prefetch at a time during iteration. The KEY_ALLOC_SIZE + * parameter specifies the initial size of the buffer + * allocated to hold these prefetched keys. If this buffer is + * too small it will be reallocated to a larger size, though + * this may result in an additional I/O. + * + * Move to DAOS VOL code? DSINC + * + * Return: Non-negative on success/Negative on failure + *------------------------------------------------------------------------- + */ +herr_t +H5Pset_map_iterate_hints(hid_t mapl_id, size_t key_prefetch_size, size_t key_alloc_size) +{ + H5P_genplist_t *plist; /* Property list pointer */ + herr_t ret_value = SUCCEED; /* return value */ + + FUNC_ENTER_API(FAIL) + H5TRACE3("e", "izz", mapl_id, key_prefetch_size, key_alloc_size); + + /* Get the plist structure */ + if(NULL == (plist = H5P_object_verify(mapl_id, H5P_MAP_ACCESS))) + HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID"); + + /* Set sizes */ + if(H5P_set(plist, H5M_ACS_KEY_PREFETCH_SIZE_NAME, &key_prefetch_size) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTSET,FAIL, "can't set key prefetch size"); + if(H5P_set(plist, H5M_ACS_KEY_ALLOC_SIZE_NAME, &key_alloc_size) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTSET,FAIL, "can't set key allocation size"); + +done: + FUNC_LEAVE_API(ret_value) +} /* end H5Pset_map_iterate_hints() */ + + +/*------------------------------------------------------------------------- + * Function: H5Pget_map_iterate_hints + * + * Purpose: Returns the map iterate hints, KEY_PREFETCH_SIZE and + * KEY_ALLOC_SIZE, as set by H5Pset_map_iterate_hints. + * + * Return: Non-negative on success/Negative on failure + *------------------------------------------------------------------------- + */ +herr_t +H5Pget_map_iterate_hints(hid_t mapl_id, size_t *key_prefetch_size, size_t *key_alloc_size) +{ + H5P_genplist_t *plist; /* Property list pointer */ + herr_t ret_value = SUCCEED; /* return value */ + + FUNC_ENTER_API(FAIL) + H5TRACE3("e", "i*z*z", mapl_id, key_prefetch_size, key_alloc_size); + + /* Get the plist structure */ + if(NULL == (plist = H5P_object_verify(mapl_id, H5P_MAP_ACCESS))) + HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID"); + + /* Get the properties */ + if(key_prefetch_size) { + if(H5P_get(plist, H5M_ACS_KEY_PREFETCH_SIZE_NAME, key_prefetch_size) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get key prefetch size"); + } /* end if */ + if(key_alloc_size) { + if(H5P_get(plist, H5M_ACS_KEY_ALLOC_SIZE_NAME, key_alloc_size) < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get key allocation size"); + } /* end if */ + +done: + FUNC_LEAVE_API(ret_value) +} /* end H5Pget_map_iterate_hints() */ + diff --git a/src/H5Pmcpl.c b/src/H5Pmcpl.c new file mode 100644 index 0000000..41a6659 --- /dev/null +++ b/src/H5Pmcpl.c @@ -0,0 +1,115 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the COPYING file, which can be found at the root of the source code * + * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases. * + * If you do not have access to either file, you may request a copy from * + * help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*------------------------------------------------------------------------- + * + * Created: H5Pmcpl.c + * + * Purpose: Map creation property list class routines + * + *------------------------------------------------------------------------- + */ + +/****************/ +/* Module Setup */ +/****************/ + +#include "H5Pmodule.h" /* This source code file is part of the H5P module */ + + +/***********/ +/* Headers */ +/***********/ +#include "H5private.h" /* Generic Functions */ +#include "H5Mprivate.h" /* Maps */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5Iprivate.h" /* IDs */ +#include "H5Ppkg.h" /* Property lists */ + + +/****************/ +/* Local Macros */ +/****************/ + + +/******************/ +/* Local Typedefs */ +/******************/ + + +/********************/ +/* Package Typedefs */ +/********************/ + + +/********************/ +/* Local Prototypes */ +/********************/ + +/* Property class callbacks */ +static herr_t H5P__mcrt_reg_prop(H5P_genclass_t *pclass); + + +/*********************/ +/* Package Variables */ +/*********************/ + +/* Map create property list class library initialization object */ +const H5P_libclass_t H5P_CLS_MCRT[1] = {{ + "map create", /* Class name for debugging */ + H5P_TYPE_MAP_CREATE, /* Class type */ + + &H5P_CLS_OBJECT_CREATE_g, /* Parent class */ + &H5P_CLS_MAP_CREATE_g, /* Pointer to class */ + &H5P_CLS_MAP_CREATE_ID_g, /* Pointer to class ID */ + &H5P_LST_MAP_CREATE_ID_g, /* Pointer to default property list ID */ + H5P__mcrt_reg_prop, /* Default property registration routine */ + + NULL, /* Class creation callback */ + NULL, /* Class creation callback info */ + NULL, /* Class copy callback */ + NULL, /* Class copy callback info */ + NULL, /* Class close callback */ + NULL /* Class close callback info */ +}}; + + +/*****************************/ +/* Library Private Variables */ +/*****************************/ + + +/***************************/ +/* Local Private Variables */ +/***************************/ + + + +/*------------------------------------------------------------------------- + * Function: H5P__mcrt_reg_prop + * + * Purpose: Register the map creation property list class's properties + * + * Return: Non-negative on success/Negative on failure + *------------------------------------------------------------------------- + */ +static herr_t +H5P__mcrt_reg_prop(H5P_genclass_t H5_ATTR_UNUSED *pclass) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_STATIC_NOERR + + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5P__mcrt_reg_prop() */ + diff --git a/src/H5Pprivate.h b/src/H5Pprivate.h index 07910c3..9fc1acc 100644 --- a/src/H5Pprivate.h +++ b/src/H5Pprivate.h @@ -79,6 +79,8 @@ typedef enum H5P_plist_type_t { H5P_TYPE_LINK_ACCESS = 17, H5P_TYPE_ATTRIBUTE_ACCESS = 18, H5P_TYPE_VOL_INITIALIZE = 19, + H5P_TYPE_MAP_CREATE = 20, + H5P_TYPE_MAP_ACCESS = 21, H5P_TYPE_MAX_TYPE } H5P_plist_type_t; @@ -125,6 +127,8 @@ H5_DLLVAR H5P_genclass_t *H5P_CLS_GROUP_CREATE_g; H5_DLLVAR H5P_genclass_t *H5P_CLS_GROUP_ACCESS_g; H5_DLLVAR H5P_genclass_t *H5P_CLS_DATATYPE_CREATE_g; H5_DLLVAR H5P_genclass_t *H5P_CLS_DATATYPE_ACCESS_g; +H5_DLLVAR H5P_genclass_t *H5P_CLS_MAP_CREATE_g; +H5_DLLVAR H5P_genclass_t *H5P_CLS_MAP_ACCESS_g; H5_DLLVAR H5P_genclass_t *H5P_CLS_ATTRIBUTE_CREATE_g; H5_DLLVAR H5P_genclass_t *H5P_CLS_ATTRIBUTE_ACCESS_g; H5_DLLVAR H5P_genclass_t *H5P_CLS_OBJECT_COPY_g; @@ -139,6 +143,7 @@ H5_DLLVAR const struct H5P_libclass_t H5P_CLS_AACC[1]; /* Attribute access */ H5_DLLVAR const struct H5P_libclass_t H5P_CLS_DACC[1]; /* Dataset access */ H5_DLLVAR const struct H5P_libclass_t H5P_CLS_GACC[1]; /* Group access */ H5_DLLVAR const struct H5P_libclass_t H5P_CLS_TACC[1]; /* Named datatype access */ +H5_DLLVAR const struct H5P_libclass_t H5P_CLS_MACC[1]; /* Map access */ H5_DLLVAR const struct H5P_libclass_t H5P_CLS_FACC[1]; /* File access */ H5_DLLVAR const struct H5P_libclass_t H5P_CLS_OCPY[1]; /* Object copy */ diff --git a/src/H5Ppublic.h b/src/H5Ppublic.h index cad2071..43e477a 100644 --- a/src/H5Ppublic.h +++ b/src/H5Ppublic.h @@ -62,6 +62,8 @@ #define H5P_GROUP_ACCESS (H5OPEN H5P_CLS_GROUP_ACCESS_ID_g) #define H5P_DATATYPE_CREATE (H5OPEN H5P_CLS_DATATYPE_CREATE_ID_g) #define H5P_DATATYPE_ACCESS (H5OPEN H5P_CLS_DATATYPE_ACCESS_ID_g) +#define H5P_MAP_CREATE (H5OPEN H5P_CLS_MAP_CREATE_ID_g) +#define H5P_MAP_ACCESS (H5OPEN H5P_CLS_MAP_ACCESS_ID_g) #define H5P_STRING_CREATE (H5OPEN H5P_CLS_STRING_CREATE_ID_g) #define H5P_ATTRIBUTE_CREATE (H5OPEN H5P_CLS_ATTRIBUTE_CREATE_ID_g) #define H5P_ATTRIBUTE_ACCESS (H5OPEN H5P_CLS_ATTRIBUTE_ACCESS_ID_g) @@ -83,6 +85,8 @@ #define H5P_GROUP_ACCESS_DEFAULT (H5OPEN H5P_LST_GROUP_ACCESS_ID_g) #define H5P_DATATYPE_CREATE_DEFAULT (H5OPEN H5P_LST_DATATYPE_CREATE_ID_g) #define H5P_DATATYPE_ACCESS_DEFAULT (H5OPEN H5P_LST_DATATYPE_ACCESS_ID_g) +#define H5P_MAP_CREATE_DEFAULT (H5OPEN H5P_LST_MAP_CREATE_ID_g) +#define H5P_MAP_ACCESS_DEFAULT (H5OPEN H5P_LST_MAP_ACCESS_ID_g) #define H5P_ATTRIBUTE_CREATE_DEFAULT (H5OPEN H5P_LST_ATTRIBUTE_CREATE_ID_g) #define H5P_ATTRIBUTE_ACCESS_DEFAULT (H5OPEN H5P_LST_ATTRIBUTE_ACCESS_ID_g) #define H5P_OBJECT_COPY_DEFAULT (H5OPEN H5P_LST_OBJECT_COPY_ID_g) @@ -191,6 +195,8 @@ H5_DLLVAR hid_t H5P_CLS_GROUP_CREATE_ID_g; H5_DLLVAR hid_t H5P_CLS_GROUP_ACCESS_ID_g; H5_DLLVAR hid_t H5P_CLS_DATATYPE_CREATE_ID_g; H5_DLLVAR hid_t H5P_CLS_DATATYPE_ACCESS_ID_g; +H5_DLLVAR hid_t H5P_CLS_MAP_CREATE_ID_g; +H5_DLLVAR hid_t H5P_CLS_MAP_ACCESS_ID_g; H5_DLLVAR hid_t H5P_CLS_STRING_CREATE_ID_g; H5_DLLVAR hid_t H5P_CLS_ATTRIBUTE_CREATE_ID_g; H5_DLLVAR hid_t H5P_CLS_ATTRIBUTE_ACCESS_ID_g; @@ -211,6 +217,8 @@ H5_DLLVAR hid_t H5P_LST_GROUP_CREATE_ID_g; H5_DLLVAR hid_t H5P_LST_GROUP_ACCESS_ID_g; H5_DLLVAR hid_t H5P_LST_DATATYPE_CREATE_ID_g; H5_DLLVAR hid_t H5P_LST_DATATYPE_ACCESS_ID_g; +H5_DLLVAR hid_t H5P_LST_MAP_CREATE_ID_g; +H5_DLLVAR hid_t H5P_LST_MAP_ACCESS_ID_g; H5_DLLVAR hid_t H5P_LST_ATTRIBUTE_CREATE_ID_g; H5_DLLVAR hid_t H5P_LST_ATTRIBUTE_ACCESS_ID_g; H5_DLLVAR hid_t H5P_LST_OBJECT_COPY_ID_g; @@ -491,6 +499,12 @@ H5_DLL herr_t H5Pget_est_link_info(hid_t plist_id, unsigned *est_num_entries /* H5_DLL herr_t H5Pset_link_creation_order(hid_t plist_id, unsigned crt_order_flags); H5_DLL herr_t H5Pget_link_creation_order(hid_t plist_id, unsigned *crt_order_flags /* out */); +/* Map access property list (MAPL) routines */ +#ifdef H5_HAVE_MAP_API +H5_DLL herr_t H5Pset_map_iterate_hints(hid_t mapl_id, size_t key_prefetch_size, size_t key_alloc_size); +H5_DLL herr_t H5Pget_map_iterate_hints(hid_t mapl_id, size_t *key_prefetch_size /*out*/, size_t *key_alloc_size /*out*/); +#endif /* H5_HAVE_MAP_API */ + /* String creation property list (STRCPL) routines */ H5_DLL herr_t H5Pset_char_encoding(hid_t plist_id, H5T_cset_t encoding); H5_DLL herr_t H5Pget_char_encoding(hid_t plist_id, H5T_cset_t *encoding /*out*/); diff --git a/src/H5Rint.c b/src/H5Rint.c index 2355ec1..07efae2 100644 --- a/src/H5Rint.c +++ b/src/H5Rint.c @@ -472,6 +472,9 @@ H5R__dereference(H5F_t *file, hid_t oapl_id, H5R_type_t ref_type, const void *_r break; } + case H5O_TYPE_MAP: + HGOTO_ERROR(H5E_REFERENCE, H5E_BADTYPE, H5I_INVALID_HID, "maps not supported in native VOL connector") + case H5O_TYPE_UNKNOWN: case H5O_TYPE_NTYPES: default: diff --git a/src/H5Shyper.c b/src/H5Shyper.c index 492cd9e..153f4be 100644 --- a/src/H5Shyper.c +++ b/src/H5Shyper.c @@ -7025,6 +7025,47 @@ done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5S_hyper_adjust_s() */ +/*-------------------------------------------------------------------------- + NAME + H5Shyper_adjust_s + PURPOSE + Adjust a hyperslab selection by subtracting an offset + USAGE + herr_t H5Shyper_adjust_s(space_id,offset) + hid_t space_id; IN: ID of the dataspace to adjust + const hssize_t *offset; IN: Offset to subtract + RETURNS + Non-negative on success, negative on failure + DESCRIPTION + Moves a hyperslab selection by subtracting an offset from it. + GLOBAL VARIABLES + COMMENTS, BUGS, ASSUMPTIONS + EXAMPLES + REVISION LOG +--------------------------------------------------------------------------*/ +herr_t +H5Shyper_adjust_s(hid_t space_id, const hssize_t *offset) +{ + H5S_t *space; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_API(FAIL) + H5TRACE2("e", "i*Hs", space_id, offset); + + if(NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE))) + HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "not a dataspace") + if(H5S_GET_SELECT_TYPE(space) != H5S_SEL_HYPERSLABS) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a hyperslab selection") + if(NULL == offset) + HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "NULL offset pointer") + + if(H5S_hyper_adjust_s(space, offset) < 0) + HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSET, FAIL, "can't adjust selection") + +done: + FUNC_LEAVE_API(ret_value) +} /* end H5Shyper_adjust_s() */ + /*-------------------------------------------------------------------------- NAME diff --git a/src/H5Spublic.h b/src/H5Spublic.h index 9e76b4b..a04f3c1 100644 --- a/src/H5Spublic.h +++ b/src/H5Spublic.h @@ -143,6 +143,7 @@ H5_DLL H5S_sel_type H5Sget_select_type(hid_t spaceid); H5_DLL hssize_t H5Sget_select_npoints(hid_t spaceid); H5_DLL herr_t H5Sselect_copy(hid_t dst_id, hid_t src_id); H5_DLL htri_t H5Sselect_valid(hid_t spaceid); +H5_DLL herr_t H5Sselect_adjust_u(hid_t spaceid, const hsize_t *offset); H5_DLL herr_t H5Sget_select_bounds(hid_t spaceid, hsize_t start[], hsize_t end[]); H5_DLL htri_t H5Sselect_shape_same(hid_t space1_id, hid_t space2_id); @@ -170,6 +171,7 @@ H5_DLL htri_t H5Sget_regular_hyperslab(hid_t spaceid, hsize_t start[], H5_DLL hssize_t H5Sget_select_hyper_nblocks(hid_t spaceid); H5_DLL herr_t H5Sget_select_hyper_blocklist(hid_t spaceid, hsize_t startblock, hsize_t numblocks, hsize_t buf[/*numblocks*/]); +H5_DLL herr_t H5Shyper_adjust_s(hid_t space_id, const hssize_t *offset); /* Operations on dataspace selection iterators */ H5_DLL hid_t H5Ssel_iter_create(hid_t spaceid, size_t elmt_size, unsigned flags); diff --git a/src/H5Sselect.c b/src/H5Sselect.c index e632b11..1a13f2c 100644 --- a/src/H5Sselect.c +++ b/src/H5Sselect.c @@ -971,6 +971,45 @@ H5S_select_adjust_u(H5S_t *space, const hsize_t *offset) FUNC_LEAVE_NOAPI(ret_value) } /* end H5S_select_adjust_u() */ +/*-------------------------------------------------------------------------- + NAME + H5Sselect_adjust_u + PURPOSE + Adjust a selection by subtracting an offset + USAGE + herr_t H5Sselect_adjust_u(space_id, offset) + hid_t space_id; IN: ID of dataspace to adjust + const hsize_t *offset; IN: Offset to subtract + RETURNS + Non-negative on success, negative on failure + DESCRIPTION + Moves a selection by subtracting an offset from it. + GLOBAL VARIABLES + COMMENTS, BUGS, ASSUMPTIONS + EXAMPLES + REVISION LOG +--------------------------------------------------------------------------*/ +herr_t +H5Sselect_adjust_u(hid_t space_id, const hsize_t *offset) +{ + H5S_t *space; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_API(FAIL) + H5TRACE2("e", "i*h", space_id, offset); + + if(NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE))) + HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "not a dataspace") + if(NULL == offset) + HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "NULL offset pointer") + + if(H5S_select_adjust_u(space, offset) < 0) + HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSET, FAIL, "can't adjust selection"); + +done: + FUNC_LEAVE_API(ret_value) +} /* end H5Sselect_adjust_u() */ + /*-------------------------------------------------------------------------- NAME @@ -1740,6 +1740,7 @@ H5Tcopy(hid_t obj_id) case H5I_GROUP: case H5I_DATASPACE: case H5I_ATTR: + case H5I_MAP: case H5I_VFL: case H5I_VOL: case H5I_GENPROP_CLS: diff --git a/src/H5VLcallback.c b/src/H5VLcallback.c index 696ccab..0131f0e 100644 --- a/src/H5VLcallback.c +++ b/src/H5VLcallback.c @@ -6562,3 +6562,114 @@ done: FUNC_LEAVE_API_NOINIT(ret_value) } /* end H5VLrequest_free() */ + +/*------------------------------------------------------------------------- + * Function: H5VL__optional + * + * Purpose: Optional operation specific to connectors. + * + * Return: Success: Non-negative + * Failure: Negative + * + *------------------------------------------------------------------------- + */ +static herr_t +H5VL__optional(void *obj, const H5VL_class_t *cls, hid_t dxpl_id, + void **req, va_list arguments) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_STATIC + + /* Check if the corresponding VOL callback exists */ + if(NULL == cls->optional) + HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL connector has no 'optional' method") + + /* Call the corresponding VOL callback */ + if((ret_value = (cls->optional)(obj, dxpl_id, req, arguments)) < 0) + HGOTO_ERROR(H5E_VOL, H5E_CANTOPERATE, ret_value, "unable to execute optional callback") + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5VL__optional() */ + + +/*------------------------------------------------------------------------- + * Function: H5VL_optional + * + * Purpose: Optional operation specific to connectors. + * + * Return: Success: Non-negative + * Failure: Negative + * + *------------------------------------------------------------------------- + */ +herr_t +H5VL_optional(const H5VL_object_t *vol_obj, hid_t dxpl_id, + void **req, ...) +{ + va_list arguments; /* Argument list passed from the API call */ + hbool_t arg_started = FALSE; /* Whether the va_list has been started */ + hbool_t vol_wrapper_set = FALSE; /* Whether the VOL object wrapping context was set up */ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(FAIL) + + /* Set wrapper info in API context */ + if(H5VL_set_vol_wrapper(vol_obj->data, vol_obj->connector) < 0) + HGOTO_ERROR(H5E_VOL, H5E_CANTSET, FAIL, "can't set VOL wrapper info") + vol_wrapper_set = TRUE; + + /* Call the corresponding internal VOL routine */ + HDva_start(arguments, req); + arg_started = TRUE; + if((ret_value = H5VL__optional(vol_obj->data, vol_obj->connector->cls, dxpl_id, req, arguments)) < 0) + HGOTO_ERROR(H5E_VOL, H5E_CANTOPERATE, FAIL, "unable to execute optional callback") + +done: + /* End access to the va_list, if we started it */ + if(arg_started) + HDva_end(arguments); + + /* Reset object wrapping info in API context */ + if(vol_wrapper_set && H5VL_reset_vol_wrapper() < 0) + HDONE_ERROR(H5E_VOL, H5E_CANTRESET, ret_value, "can't reset VOL wrapper info") + + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5VL_optional() */ + + +/*------------------------------------------------------------------------- + * Function: H5VLoptional + * + * Purpose: Performs an optional connector-specific operation + * + * Return: Success: Non-negative + * Failure: Negative + * + *------------------------------------------------------------------------- + */ +herr_t +H5VLoptional(void *obj, hid_t connector_id, hid_t dxpl_id, void **req, + va_list arguments) +{ + H5VL_class_t *cls; /* VOL connector's class struct */ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_API_NOINIT + H5TRACE5("e", "*xii**xx", obj, connector_id, dxpl_id, req, arguments); + + /* Check args and get class pointer */ + if(NULL == obj) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object") + if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(connector_id, H5I_VOL))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL connector ID") + + /* Call the corresponding internal VOL routine */ + if((ret_value = H5VL__optional(obj, cls, dxpl_id, req, arguments)) < 0) + HGOTO_ERROR(H5E_VOL, H5E_CANTOPERATE, ret_value, "unable to execute optional callback") + +done: + FUNC_LEAVE_API_NOINIT(ret_value) +} /* end H5VLoptional() */ + diff --git a/src/H5VLconnector.h b/src/H5VLconnector.h index 9de518f..98bc521 100644 --- a/src/H5VLconnector.h +++ b/src/H5VLconnector.h @@ -314,7 +314,7 @@ typedef struct H5VL_group_class_t { /* H5L routines */ typedef struct H5VL_link_class_t { herr_t (*create)(H5VL_link_create_type_t create_type, void *obj, const H5VL_loc_params_t *loc_params, - hid_t lcpl_id, hid_t lapl_id, hid_t dxpl_id, void **req, va_list argumenmts); + hid_t lcpl_id, hid_t lapl_id, hid_t dxpl_id, void **req, va_list arguments); herr_t (*copy)(void *src_obj, const H5VL_loc_params_t *loc_params1, void *dst_obj, const H5VL_loc_params_t *loc_params2, hid_t lcpl, hid_t lapl, hid_t dxpl_id, void **req); diff --git a/src/H5VLint.c b/src/H5VLint.c index 884b2f6..f9262f4 100644 --- a/src/H5VLint.c +++ b/src/H5VLint.c @@ -552,7 +552,8 @@ H5VL__new_vol_obj(H5I_type_t type, void *object, H5VL_t *vol_connector, hbool_t HDassert(vol_connector); /* Make sure type number is valid */ - if(type != H5I_ATTR && type != H5I_DATASET && type != H5I_DATATYPE && type != H5I_FILE && type != H5I_GROUP) + if(type != H5I_ATTR && type != H5I_DATASET && type != H5I_DATATYPE + && type != H5I_FILE && type != H5I_GROUP && type != H5I_MAP) HGOTO_ERROR(H5E_VOL, H5E_BADVALUE, NULL, "invalid type number") /* Create the new VOL object */ @@ -1408,6 +1409,7 @@ H5VL__object(hid_t id, H5I_type_t obj_type) case H5I_DATASET: case H5I_FILE: case H5I_ATTR: + case H5I_MAP: /* get the object */ if (NULL == (vol_obj = (H5VL_object_t *)H5I_object(id))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "invalid identifier") diff --git a/src/H5VLnative_file.c b/src/H5VLnative_file.c index eeaade6..0ac70e3 100644 --- a/src/H5VLnative_file.c +++ b/src/H5VLnative_file.c @@ -562,11 +562,12 @@ H5VL__native_file_optional(void *obj, hid_t H5_ATTR_UNUSED dxpl_id, void H5_ATTR case H5VL_NATIVE_FILE_GET_FILE_ID: { H5I_type_t type = (H5I_type_t)HDva_arg(arguments, int); /* enum work-around */ + hbool_t app_ref = (hbool_t)HDva_arg(arguments, int); hid_t *file_id = HDva_arg(arguments, hid_t *); if(NULL == (f = H5F__get_file(obj, type))) HGOTO_ERROR(H5E_FILE, H5E_BADTYPE, FAIL, "not a file or file object") - if((*file_id = H5F__get_file_id(f)) < 0) + if((*file_id = H5F__get_file_id(f, app_ref)) < 0) HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't get file ID") break; } diff --git a/src/H5VLprivate.h b/src/H5VLprivate.h index 91fa762..1752b0c 100644 --- a/src/H5VLprivate.h +++ b/src/H5VLprivate.h @@ -193,5 +193,8 @@ H5_DLL herr_t H5VL_request_specific(const H5VL_object_t *vol_obj, H5VL_request_s H5_DLL herr_t H5VL_request_optional(const H5VL_object_t *vol_obj, ...); H5_DLL herr_t H5VL_request_free(const H5VL_object_t *vol_obj); +/* Generic functions */ +H5_DLL herr_t H5VL_optional(const H5VL_object_t *vol_obj, hid_t dxpl_id,void **req, ...); + #endif /* _H5VLprivate_H */ diff --git a/src/H5err.txt b/src/H5err.txt index d4edfba..9fec521 100644 --- a/src/H5err.txt +++ b/src/H5err.txt @@ -78,6 +78,7 @@ MAJOR, H5E_FARRAY, Fixed Array MAJOR, H5E_PLUGIN, Plugin for dynamically loaded library MAJOR, H5E_PAGEBUF, Page Buffering MAJOR, H5E_CONTEXT, API Context +MAJOR, H5E_MAP, Map MAJOR, H5E_NONE_MAJOR, No error # Sections (for grouping minor errors) diff --git a/src/H5mpi.c b/src/H5mpi.c new file mode 100644 index 0000000..ea6b33f --- /dev/null +++ b/src/H5mpi.c @@ -0,0 +1,198 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the COPYING file, which can be found at the root of the source code * + * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases. * + * If you do not have access to either file, you may request a copy from * + * help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Purpose: Common MPI routines + * + */ + + +#include "H5private.h" /* Generic Functions */ +#include "H5CXprivate.h" /* API Contexts */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5Fprivate.h" /* File access */ +#include "H5FDprivate.h" /* File drivers */ +#include "H5FDmpi.h" /* Common MPI file driver */ +#include "H5Pprivate.h" /* Property lists */ + +#ifdef H5_HAVE_PARALLEL + +/*------------------------------------------------------------------------- + * Function: H5_mpi_comm_dup + * + * Purpose: Duplicate an MPI communicator. + * + * The new communicator is returned via the comm_new pointer. + * + * Return: SUCCEED/FAIL + * + *------------------------------------------------------------------------- + */ +herr_t +H5_mpi_comm_dup(MPI_Comm comm, MPI_Comm *comm_new) +{ + herr_t ret_value = SUCCEED; + MPI_Comm comm_dup = MPI_COMM_NULL; + int mpi_code; + + FUNC_ENTER_NOAPI(FAIL) + + /* Check arguments */ + if (!comm_new) + HGOTO_ERROR(H5E_INTERNAL, H5E_BADVALUE, FAIL, "comm_new cannot be NULL") + if (MPI_COMM_NULL == comm) + HGOTO_ERROR(H5E_INTERNAL, H5E_BADVALUE, FAIL, "can't duplicate MPI_COMM_NULL") + + /* Duplicate the MPI communicator */ + if (MPI_SUCCESS != (mpi_code = MPI_Comm_dup(comm, &comm_dup))) + HMPI_GOTO_ERROR(FAIL, "MPI_Comm_dup failed", mpi_code) + + /* Set MPI_ERRORS_RETURN on comm_dup so that MPI failures are not fatal, + * and return codes can be checked and handled. + */ + if (MPI_SUCCESS != (mpi_code = MPI_Comm_set_errhandler(comm_dup, MPI_ERRORS_RETURN))) + HMPI_GOTO_ERROR(FAIL, "MPI_Errhandler_set failed", mpi_code) + + /* Copy the new communicator to the return argument */ + *comm_new = comm_dup; + +done: + if (FAIL == ret_value) { + /* need to free anything created here */ + if (MPI_COMM_NULL != comm_dup) + MPI_Comm_free(&comm_dup); + } + + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5_mpi_comm_dup() */ + + +/*------------------------------------------------------------------------- + * Function: H5_mpi_info_dup + * + * Purpose: Duplicate an MPI info. + * + * If the info object is MPI_INFO_NULL, no duplicate + * is made but the same value assigned to the new info object + * handle. + * + * The new info is returned via the info_new pointer. + * + * Return: SUCCEED/FAIL + * + *------------------------------------------------------------------------- + */ +herr_t +H5_mpi_info_dup(MPI_Info info, MPI_Info *info_new) +{ + herr_t ret_value = SUCCEED; + MPI_Info info_dup = MPI_INFO_NULL; + int mpi_code; + + FUNC_ENTER_NOAPI(FAIL) + + /* Check arguments */ + if (!info_new) + HGOTO_ERROR(H5E_INTERNAL, H5E_BADVALUE, FAIL, "info_new cannot be NULL") + + /* Duplicate the MPI info */ + if (info == MPI_INFO_NULL) { + /* Don't duplicate MPI_INFO_NULL. Just copy it. */ + info_dup = info; + } + else { + /* Duplicate the info */ + if (MPI_SUCCESS != (mpi_code = MPI_Info_dup(info, &info_dup))) + HMPI_GOTO_ERROR(FAIL, "MPI_Info_dup failed", mpi_code) + } + + /* Copy the new info to the return argument */ + *info_new = info_dup; + +done: + if (FAIL == ret_value) { + /* need to free anything created here */ + if (MPI_INFO_NULL != info_dup) + MPI_Info_free(&info_dup); + } + + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5_mpi_info_dup() */ + + +/*------------------------------------------------------------------------- + * Function: H5_mpi_comm_free + * + * Purpose: Free an MPI communicator. + * + * If comm is MPI_COMM_NULL this call does nothing. + * + * Return: SUCCEED/FAIL + * + *------------------------------------------------------------------------- + */ +herr_t +H5_mpi_comm_free(MPI_Comm *comm) +{ + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(FAIL) + + /* Check arguments */ + if (!comm) + HGOTO_ERROR(H5E_INTERNAL, H5E_BADVALUE, FAIL, "comm pointer cannot be NULL") + + /* Free the communicator */ + if (MPI_COMM_NULL != *comm) + MPI_Comm_free(comm); + + *comm = MPI_COMM_NULL; + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* End H5_mpi_comm_free() */ + +/*------------------------------------------------------------------------- + * Function: H5_mpi_info_free + * + * Purpose: Free the MPI info. + * + * If info is MPI_INFO_NULL this call does nothing. + * + * Return: SUCCEED/FAIL + * + *------------------------------------------------------------------------- + */ +herr_t +H5_mpi_info_free(MPI_Info *info) +{ + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(FAIL) + + /* Check arguments */ + if (!info) + HGOTO_ERROR(H5E_INTERNAL, H5E_BADVALUE, FAIL, "info pointer cannot be NULL") + + /* Free the info */ + if (MPI_INFO_NULL != *info) + MPI_Info_free(info); + + *info = MPI_INFO_NULL; + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* End H5_mpi_info_free() */ + +#endif /* H5_HAVE_PARALLEL */ + diff --git a/src/H5private.h b/src/H5private.h index 00b7a07..18b52a0 100644 --- a/src/H5private.h +++ b/src/H5private.h @@ -317,7 +317,7 @@ # define H5_ATTR_NORETURN __attribute__((noreturn)) # define H5_ATTR_CONST __attribute__((const)) # define H5_ATTR_PURE __attribute__((pure)) -#if defined(__GNUC__) && __GNUC__ >= 7 +#if defined(__GNUC__) && __GNUC__ >= 7 && !defined(__INTEL_COMPILER) # define H5_ATTR_FALLTHROUGH __attribute__((fallthrough)); #else # define H5_ATTR_FALLTHROUGH /*void*/ @@ -1721,6 +1721,7 @@ typedef enum { H5_PKG_HG, /* Global heaps */ H5_PKG_HL, /* Local heaps */ H5_PKG_I, /* IDs */ + H5_PKG_M, /* Maps */ H5_PKG_MF, /* File memory management */ H5_PKG_MM, /* Core memory management */ H5_PKG_O, /* Object headers */ @@ -2637,6 +2638,8 @@ H5_DLL int H5G_term_package(void); H5_DLL int H5G_top_term_package(void); H5_DLL int H5I_term_package(void); H5_DLL int H5L_term_package(void); +H5_DLL int H5M_term_package(void); +H5_DLL int H5M_top_term_package(void); H5_DLL int H5P_term_package(void); H5_DLL int H5PL_term_package(void); H5_DLL int H5R_term_package(void); @@ -2665,6 +2668,14 @@ H5_DLL double H5_get_time(void); H5_DLL herr_t H5_build_extpath(const char *name, char **extpath /*out*/); H5_DLL herr_t H5_combine_path(const char *path1, const char *path2, char **full_name /*out*/); +#ifdef H5_HAVE_PARALLEL +/* Generic MPI functions */ +H5_DLL herr_t H5_mpi_comm_dup(MPI_Comm comm, MPI_Comm *comm_new); +H5_DLL herr_t H5_mpi_info_dup(MPI_Info info, MPI_Info *info_new); +H5_DLL herr_t H5_mpi_comm_free(MPI_Comm *comm); +H5_DLL herr_t H5_mpi_info_free(MPI_Info *info); +#endif /* H5_HAVE_PARALLEL */ + /* Functions for debugging */ H5_DLL herr_t H5_buffer_dump(FILE *stream, int indent, const uint8_t *buf, const uint8_t *marker, size_t buf_offset, size_t buf_size); diff --git a/src/H5trace.c b/src/H5trace.c index c5d14f5..de761f8 100644 --- a/src/H5trace.c +++ b/src/H5trace.c @@ -1359,6 +1359,10 @@ H5_trace(const double *returning, const char *func, const char *type, ...) HDfprintf(out, "%ld (attr)", (long)obj); break; + case H5I_MAP: + HDfprintf(out, "%ld (map)", (long)obj); + break; + case H5I_VFL: HDfprintf(out, "%ld (file driver)", (long)obj); break; @@ -1544,6 +1548,10 @@ H5_trace(const double *returning, const char *func, const char *type, ...) HDfprintf(out, "H5I_ATTR"); break; + case H5I_MAP: + HDfprintf(out, "H5I_MAP"); + break; + case H5I_VFL: HDfprintf(out, "H5I_VFL"); break; @@ -1799,8 +1807,12 @@ H5_trace(const double *returning, const char *func, const char *type, ...) HDfprintf(out, "H5O_TYPE_NAMED_DATATYPE"); break; + case H5O_TYPE_MAP: + HDfprintf(out, "H5O_TYPE_MAP"); + break; + case H5O_TYPE_NTYPES: - HDfprintf(out, "H5O_TYPE_TYPES"); + HDfprintf(out, "H5O_TYPE_NTYPES"); break; default: diff --git a/src/Makefile.am b/src/Makefile.am index f737d5d..1e1273c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -78,6 +78,7 @@ libhdf5_la_SOURCES= H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \ H5HG.c H5HGcache.c H5HGdbg.c H5HGquery.c \ H5HL.c H5HLcache.c H5HLdbg.c H5HLint.c H5HLprfx.c H5HLdblk.c\ H5HP.c H5I.c H5Itest.c H5L.c H5Lexternal.c H5lib_settings.c \ + H5M.c \ H5MF.c H5MFaggr.c H5MFdbg.c H5MFsection.c \ H5MM.c H5MP.c H5MPtest.c \ H5O.c H5Odeprec.c H5Oainfo.c H5Oalloc.c H5Oattr.c \ @@ -95,8 +96,9 @@ libhdf5_la_SOURCES= H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \ H5P.c H5Pacpl.c H5Pdapl.c H5Pdcpl.c \ H5Pdeprec.c H5Pdxpl.c H5Pencdec.c \ H5Pfapl.c H5Pfcpl.c H5Pfmpl.c \ - H5Pgcpl.c H5Pint.c \ - H5Plapl.c H5Plcpl.c H5Pocpl.c H5Pocpypl.c H5Pstrcpl.c H5Ptest.c \ + H5Pgcpl.c H5Pint.c H5Plapl.c H5Plcpl.c \ + H5Pmapl.c H5Pmcpl.c H5Pocpl.c H5Pocpypl.c H5Pstrcpl.c \ + H5Ptest.c \ H5PB.c \ H5PL.c H5PLint.c H5PLpath.c H5PLplugin_cache.c \ H5R.c H5Rint.c H5Rdeprec.c \ @@ -124,7 +126,7 @@ libhdf5_la_SOURCES= H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \ # Only compile parallel sources if necessary if BUILD_PARALLEL_CONDITIONAL - libhdf5_la_SOURCES += H5ACmpio.c H5Cmpio.c H5Dmpio.c H5Fmpi.c H5FDmpi.c H5FDmpio.c H5Smpio.c + libhdf5_la_SOURCES += H5mpi.c H5ACmpio.c H5Cmpio.c H5Dmpio.c H5Fmpi.c H5FDmpi.c H5FDmpio.c H5Smpio.c endif # Only compile the direct VFD if necessary @@ -141,7 +143,7 @@ include_HEADERS = hdf5.h H5api_adpt.h H5overflow.h H5pubconf.h H5public.h H5vers H5FDfamily.h H5FDhdfs.h H5FDlog.h H5FDmpi.h H5FDmpio.h \ H5FDmulti.h H5FDros3.h H5FDsec2.h H5FDstdio.h H5FDwindows.h \ H5Gpublic.h H5Ipublic.h H5Lpublic.h \ - H5MMpublic.h H5Opublic.h H5Ppublic.h \ + H5Mpublic.h H5MMpublic.h H5Opublic.h H5Ppublic.h \ H5PLextern.h H5PLpublic.h \ H5Rpublic.h H5Spublic.h H5Tpublic.h \ H5VLconnector.h H5VLconnector_passthru.h \ @@ -29,6 +29,7 @@ #include "H5Gpublic.h" /* Groups */ #include "H5Ipublic.h" /* ID management */ #include "H5Lpublic.h" /* Links */ +#include "H5Mpublic.h" /* Maps */ #include "H5MMpublic.h" /* Memory management */ #include "H5Opublic.h" /* Object headers */ #include "H5Ppublic.h" /* Property lists */ diff --git a/src/libhdf5.settings.in b/src/libhdf5.settings.in index baa99ea..1591bed 100644 --- a/src/libhdf5.settings.in +++ b/src/libhdf5.settings.in @@ -78,6 +78,7 @@ Parallel Filtered Dataset Writes: @PARALLEL_FILTERED_WRITES@ With deprecated public symbols: @DEPRECATED_SYMBOLS@ I/O filters (external): @EXTERNAL_FILTERS@ MPE: @MPE@ + Map (H5M) API: @MAP_API@ Direct VFD: @DIRECT_VFD@ (Read-Only) S3 VFD: @ROS3_VFD@ (Read-Only) HDFS VFD: @HAVE_LIBHDFS@ diff --git a/test/CMakeTests.cmake b/test/CMakeTests.cmake index cc166ec..b7eaa56 100644 --- a/test/CMakeTests.cmake +++ b/test/CMakeTests.cmake @@ -444,7 +444,7 @@ set (test_CLEANFILES cache_logging.out vds_swmr.h5 vds_swmr_src_*.h5 - tmp/vds_src_2.h5 + tmp_vds_env/vds_src_2.h5 direct_chunk.h5 native_vol_test.h5 ) @@ -613,7 +613,7 @@ else () -D "TEST_PROGRAM=$<TARGET_FILE:vds_env>" -D "TEST_ARGS:STRING=" -D "TEST_ENV_VAR:STRING=HDF5_VDS_PREFIX" - -D "TEST_ENV_VALUE:STRING=\${ORIGIN}/tmp" + -D "TEST_ENV_VALUE:STRING=\${ORIGIN}/tmp_vds_env" -D "TEST_EXPECT=0" -D "TEST_SKIP_COMPARE=TRUE" -D "TEST_OUTPUT=vds_env.txt" @@ -776,15 +776,43 @@ if (HDF5_ENABLE_DEPRECATED_SYMBOLS AND NOT MINGW) ENVIRONMENT "srcdir=${HDF5_TEST_BINARY_DIR}/H5TEST" WORKING_DIRECTORY ${HDF5_TEST_BINARY_DIR}/H5TEST ) +else () + add_test (NAME H5TEST-err_compat COMMAND "${CMAKE_COMMAND}" + -D "TEST_EMULATOR=${CMAKE_CROSSCOMPILING_EMULATOR}" + -D "TEST_PROGRAM=$<TARGET_FILE:err_compat>" + -D "TEST_ARGS:STRING=" + -D "TEST_EXPECT=0" + -D "TEST_MASK_ERROR=true" + -D "ERROR_APPEND=1" + -D "TEST_OUTPUT=err_compat.txt" + -D "TEST_REFERENCE=err_compat_2" + -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/H5TEST" + -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake" + ) + set_tests_properties (H5TEST-err_compat PROPERTIES + ENVIRONMENT "srcdir=${HDF5_TEST_BINARY_DIR}/H5TEST" + WORKING_DIRECTORY ${HDF5_TEST_BINARY_DIR}/H5TEST + ) endif () #-- Adding test for error_test -if (HDF5_USE_16_API_DEFAULT OR MINGW) - add_test ( - NAME H5TEST-error_test - COMMAND ${CMAKE_COMMAND} -E echo "SKIP $<TARGET_FILE:error_test>" +if (DEFAULT_API_VERSION MATCHES "v16" OR MINGW) + add_test (NAME H5TEST-error_test COMMAND "${CMAKE_COMMAND}" + -D "TEST_EMULATOR=${CMAKE_CROSSCOMPILING_EMULATOR}" + -D "TEST_PROGRAM=$<TARGET_FILE:error_test>" + -D "TEST_ARGS:STRING=" + -D "TEST_EXPECT=0" + -D "TEST_MASK_ERROR=true" + -D "ERROR_APPEND=1" + -D "TEST_OUTPUT=error_test.txt" + -D "TEST_REFERENCE=error_test_2" + -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/H5TEST" + -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake" + ) + set_tests_properties (H5TEST-error_test PROPERTIES + ENVIRONMENT "srcdir=${HDF5_TEST_BINARY_DIR}/H5TEST;HDF5_PLUGIN_PRELOAD=::" + WORKING_DIRECTORY ${HDF5_TEST_BINARY_DIR}/H5TEST ) - set_property(TEST H5TEST-error_test PROPERTY DISABLED) else () add_test (NAME H5TEST-error_test COMMAND "${CMAKE_COMMAND}" -D "TEST_EMULATOR=${CMAKE_CROSSCOMPILING_EMULATOR}" @@ -809,7 +837,7 @@ add_test (NAME H5TEST-links_env-clear-objects COMMAND ${CMAKE_COMMAND} -E remove extlinks_env0.h5 extlinks_env1.h5 - tmp/extlinks_env1.h5 + tmp_links_env/extlinks_env1.h5 WORKING_DIRECTORY ${HDF5_TEST_BINARY_DIR}/H5TEST ) @@ -822,7 +850,7 @@ else () -D "TEST_PROGRAM=$<TARGET_FILE:links_env>" -D "TEST_ARGS:STRING=" #-D "TEST_ENV_VAR:STRING=HDF5_EXT_PREFIX" - #-D "TEST_ENV_VALUE:STRING=.:tmp" + #-D "TEST_ENV_VALUE:STRING=.:tmp_links_env" -D "TEST_EXPECT=0" -D "TEST_OUTPUT=links_env.txt" -D "TEST_REFERENCE=links_env.out" @@ -832,7 +860,7 @@ else () endif () set_tests_properties (H5TEST-links_env PROPERTIES FIXTURES_REQUIRED clear_links_env - ENVIRONMENT "srcdir=${HDF5_TEST_BINARY_DIR}/H5TEST;HDF5_EXT_PREFIX=.:tmp" + ENVIRONMENT "srcdir=${HDF5_TEST_BINARY_DIR}/H5TEST;HDF5_EXT_PREFIX=.:tmp_links_env" WORKING_DIRECTORY ${HDF5_TEST_BINARY_DIR}/H5TEST ) diff --git a/test/Makefile.am b/test/Makefile.am index aa6afee..ff6d1c6 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -184,7 +184,8 @@ CHECK_CLEANFILES+=accum.h5 cmpd_dset.h5 compact_dataset.h5 dataset.h5 dset_offse sys_file1 tfile[1-7].h5 th5s[1-4].h5 lheap.h5 fheap.h5 ohdr.h5 \ stab.h5 extern_[1-5].h5 extern_[1-4][rw].raw gheap[0-4].h5 \ ohdr_min_a.h5 ohdr_min_b.h5 min_dset_ohdr_testfile.h5\ - dt_arith[1-2] links.h5 links[0-6]*.h5 extlinks[0-15].h5 tmp \ + dt_arith[1-2] links.h5 links[0-6]*.h5 extlinks[0-15].h5 \ + tmp tmp_links tmp2_links tmp_links_env tmp_vds_env \ big.data big[0-9][0-9][0-9][0-9][0-9].h5 \ stdio.h5 sec2.h5 dtypes[0-9].h5 dtypes1[0].h5 dt_arith[1-2].h5 tattr.h5 \ tselect.h5 mtime.h5 unlink.h5 unicode.h5 coord.h5 \ diff --git a/test/err_compat.c b/test/err_compat.c index 4860a3c..ed85524 100644 --- a/test/err_compat.c +++ b/test/err_compat.c @@ -12,17 +12,17 @@ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* - * Programmer: Raymond Lu + * Programmer: Raymond Lu * October 14, 2001 * - * Purpose: Tests Error API + * Purpose: Tests Error API */ #include "h5test.h" #ifdef H5_NO_DEPRECATED_SYMBOLS int main(void) { - printf("Test skipped because backward compatability with v1.6 is NOT configured in\n"); + printf("Test skipped because backward compatibility with v1.6 is NOT configured in\n"); return 0; } #else /* H5_NO_DEPRECATED_SYMBOLS */ @@ -35,7 +35,7 @@ const char *FILENAME[] = { #define DIM0 100 #define DIM1 200 -int ipoints2[DIM0][DIM1], icheck2[DIM0][DIM1]; +int ipoints2[DIM0][DIM1], icheck2[DIM0][DIM1]; #define DSET_NAME "a_dataset" #define FAKE_ID (hid_t)-1 @@ -43,17 +43,17 @@ int ipoints2[DIM0][DIM1], icheck2[DIM0][DIM1]; herr_t custom_print_cb1(int n, H5E_error1_t *err_desc, void* client_data); herr_t custom_print_cb2(int n, H5E_error2_t *err_desc, void* client_data); - + /*------------------------------------------------------------------------- - * Function: user_print1 + * Function: user_print1 * - * Purpose: This function is a user-defined old-style printing function. - * This is just a convenience function for H5Ewalk1() with a + * Purpose: This function is a user-defined old-style printing function. + * This is just a convenience function for H5Ewalk1() with a * function that prints error messages. * - * Return: Non-negative on success/Negative on failure + * Return: Non-negative on success/Negative on failure * - * Programmer: Raymond Lu + * Programmer: Raymond Lu * 4 October 2010 * *------------------------------------------------------------------------- @@ -73,17 +73,17 @@ user_print1(FILE *stream) } - + /*------------------------------------------------------------------------- - * Function: user_print2 + * Function: user_print2 * - * Purpose: This function is a user-defined new-style printing function. - * This is just a convenience function for H5Ewalk2() with a + * Purpose: This function is a user-defined new-style printing function. + * This is just a convenience function for H5Ewalk2() with a * function that prints error messages. * - * Return: Non-negative on success/Negative on failure + * Return: Non-negative on success/Negative on failure * - * Programmer: Raymond Lu + * Programmer: Raymond Lu * 4 October 2010 * *------------------------------------------------------------------------- @@ -103,18 +103,18 @@ user_print2(hid_t err_stack, FILE *stream) } - + /*------------------------------------------------------------------------- * Function: custom_print_cb1 * - * Purpose: Callback function to print error stack in customized way + * Purpose: Callback function to print error stack in customized way * for H5Ewalk1. * - * Return: Success: 0 + * Return: Success: 0 * - * Failure: -1 + * Failure: -1 * - * Programmer: Raymond Lu + * Programmer: Raymond Lu * 4 October 2010 * * Modifications: @@ -124,10 +124,10 @@ user_print2(hid_t err_stack, FILE *stream) herr_t custom_print_cb1(int n, H5E_error1_t *err_desc, void* client_data) { - FILE *stream = (FILE *)client_data; + FILE *stream = (FILE *)client_data; char *maj = NULL; char *min = NULL; - const int indent = 4; + const int indent = 4; if(NULL == (min = H5Eget_minor(err_desc->min_num))) TEST_ERROR; @@ -136,9 +136,9 @@ custom_print_cb1(int n, H5E_error1_t *err_desc, void* client_data) TEST_ERROR; fprintf(stream, "%*serror #%03d: %s in %s(): line %u\n", - indent, "", n, err_desc->file_name, - err_desc->func_name, err_desc->line); - + indent, "", n, err_desc->file_name, + err_desc->func_name, err_desc->line); + fprintf(stream, "%*smajor: %s\n", indent * 2, "", maj); fprintf(stream, "%*sminor: %s\n", indent * 2, "", min); @@ -152,22 +152,22 @@ error: H5free_memory(maj); if(min) H5free_memory(min); - + return -1; } - + /*------------------------------------------------------------------------- * Function: custom_print_cb2 * - * Purpose: Callback function to print error stack in customized way + * Purpose: Callback function to print error stack in customized way * for H5Ewalk1. * - * Return: Success: 0 + * Return: Success: 0 * - * Failure: -1 + * Failure: -1 * - * Programmer: Raymond Lu + * Programmer: Raymond Lu * 4 October 2010 * * Modifications: @@ -177,10 +177,10 @@ error: herr_t custom_print_cb2(int n, H5E_error2_t *err_desc, void* client_data) { - FILE *stream = (FILE *)client_data; + FILE *stream = (FILE *)client_data; char *maj = NULL; char *min = NULL; - const int indent = 4; + const int indent = 4; if(NULL == (min = H5Eget_minor(err_desc->min_num))) TEST_ERROR; @@ -189,9 +189,9 @@ custom_print_cb2(int n, H5E_error2_t *err_desc, void* client_data) TEST_ERROR; fprintf(stream, "%*serror #%03d: %s in %s(): line %u\n", - indent, "", n, err_desc->file_name, - err_desc->func_name, err_desc->line); - + indent, "", n, err_desc->file_name, + err_desc->func_name, err_desc->line); + fprintf(stream, "%*smajor: %s\n", indent * 2, "", maj); fprintf(stream, "%*sminor: %s\n", indent * 2, "", min); @@ -205,22 +205,22 @@ error: H5free_memory(maj); if(min) H5free_memory(min); - + return -1; } - + /*------------------------------------------------------------------------- - * Function: test_error1 + * Function: test_error1 * - * Purpose: Test the backward compatibility of H5Eset/get_auto. + * Purpose: Test the backward compatibility of H5Eset/get_auto. * - * Return: Success: 0 + * Return: Success: 0 * - * Failure: -1 + * Failure: -1 * - * Programmer: Raymond Lu - * 17 September 2010 + * Programmer: Raymond Lu + * 17 September 2010 * * * Modifications: @@ -230,8 +230,8 @@ error: static herr_t test_error1(void) { - hid_t dataset, space; - hsize_t dims[2]; + hid_t dataset, space; + hsize_t dims[2]; H5E_auto1_t old_func1; H5E_auto2_t old_func2; void *old_data; @@ -245,48 +245,48 @@ test_error1(void) dims[1] = DIM1; if ((space = H5Screate_simple(2, dims, NULL))<0) TEST_ERROR; - /* Use H5Eget_auto2 to query the default printing function. The library + /* Use H5Eget_auto2 to query the default printing function. The library *should indicate H5Eprint2 as the default. */ if (H5Eget_auto2(H5E_DEFAULT, &old_func2, &old_data)<0) - TEST_ERROR; + TEST_ERROR; if (old_data != NULL) - TEST_ERROR; + TEST_ERROR; if (!old_func2 || (H5E_auto2_t)H5Eprint2 != old_func2) - TEST_ERROR; + TEST_ERROR; /* This function sets the default printing function to be H5Eprint2. */ if(H5Eset_auto2(H5E_DEFAULT, old_func2, old_data)<0) TEST_ERROR; - /* Try the printing function. Dataset creation should fail because the file + /* Try the printing function. Dataset creation should fail because the file * doesn't exist. */ - dataset = H5Dcreate2(FAKE_ID, DSET_NAME, H5T_STD_I32BE, space, H5P_DEFAULT, + dataset = H5Dcreate2(FAKE_ID, DSET_NAME, H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - if(dataset >= 0) + if(dataset >= 0) TEST_ERROR; /* This call should work. It simply returns H5Eprint1. */ if((ret = H5Eget_auto1(&old_func1, &old_data))<0) TEST_ERROR; if (old_data != NULL) - TEST_ERROR; + TEST_ERROR; if (!old_func1 || (H5E_auto1_t)H5Eprint1 != old_func1) - TEST_ERROR; + TEST_ERROR; /* This function changes the old-style printing function to be user_print1. */ if(H5Eset_auto1((H5E_auto1_t)user_print1, stderr)<0) TEST_ERROR; - /* Try the printing function. Dataset creation should fail because the file + /* Try the printing function. Dataset creation should fail because the file * doesn't exist. */ - dataset = H5Dcreate2(FAKE_ID, DSET_NAME, H5T_STD_I32BE, space, H5P_DEFAULT, + dataset = H5Dcreate2(FAKE_ID, DSET_NAME, H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - if(dataset >= 0) + if(dataset >= 0) TEST_ERROR; - /* This call should fail because the test mixes H5Eget_auto2 with H5Eset_auto1. - * Once the H5Eset_auto1 is called with a user-defined printing function, - * a call to H5Eget_auto2 will fail. But keep in mind the printing function is + /* This call should fail because the test mixes H5Eget_auto2 with H5Eset_auto1. + * Once the H5Eset_auto1 is called with a user-defined printing function, + * a call to H5Eget_auto2 will fail. But keep in mind the printing function is * user_print1. */ if((ret = H5Eget_auto2(H5E_DEFAULT, &old_func2, &old_data))>=0) TEST_ERROR; @@ -295,44 +295,44 @@ test_error1(void) if(H5Eset_auto2(H5E_DEFAULT, (H5E_auto2_t)user_print2, stderr)<0) TEST_ERROR; - /* Try the printing function. Dataset creation should fail because the file + /* Try the printing function. Dataset creation should fail because the file * doesn't exist. */ - dataset = H5Dcreate2(FAKE_ID, DSET_NAME, H5T_STD_I32BE, space, H5P_DEFAULT, + dataset = H5Dcreate2(FAKE_ID, DSET_NAME, H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - if(dataset >= 0) + if(dataset >= 0) TEST_ERROR; /* This function changes the new-style printing function back to the default H5Eprint2. */ if(H5Eset_auto2(H5E_DEFAULT, (H5E_auto2_t)H5Eprint2, NULL)<0) TEST_ERROR; - /* This call should work because the H5Eset_auto2 above restored the default printing + /* This call should work because the H5Eset_auto2 above restored the default printing * function H5Eprint2. It simply returns user_print1. */ if((ret = H5Eget_auto1(&old_func1, &old_data))<0) TEST_ERROR; if (old_data != NULL) - TEST_ERROR; + TEST_ERROR; if (!old_func1 || (H5E_auto1_t)user_print1 != old_func1) - TEST_ERROR; + TEST_ERROR; /* This function changes the new-style printing function back to the default H5Eprint1. */ if(H5Eset_auto1((H5E_auto1_t)H5Eprint1, NULL)<0) TEST_ERROR; - /* This call should work because the H5Eset_auto1 above restored the default printing + /* This call should work because the H5Eset_auto1 above restored the default printing * function H5Eprint1. It simply returns H5Eprint2. */ if((ret = H5Eget_auto2(H5E_DEFAULT, &old_func2, &old_data))<0) TEST_ERROR; if (old_data != NULL) - TEST_ERROR; + TEST_ERROR; if (!old_func2 || (H5E_auto2_t)H5Eprint2 != old_func2) - TEST_ERROR; + TEST_ERROR; - /* Try the printing function. Dataset creation should fail because the file + /* Try the printing function. Dataset creation should fail because the file * doesn't exist. */ - dataset = H5Dcreate2(FAKE_ID, DSET_NAME, H5T_STD_I32BE, space, H5P_DEFAULT, + dataset = H5Dcreate2(FAKE_ID, DSET_NAME, H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - if(dataset >= 0) + if(dataset >= 0) TEST_ERROR; return 0; @@ -341,18 +341,18 @@ test_error1(void) return -1; } - + /*------------------------------------------------------------------------- - * Function: test_error2 + * Function: test_error2 * - * Purpose: Test error API functions, mainly on H5Epush1. + * Purpose: Test error API functions, mainly on H5Epush1. * - * Return: Success: 0 + * Return: Success: 0 * - * Failure: -1 + * Failure: -1 * - * Programmer: Raymond Lu - * July 10, 2003 + * Programmer: Raymond Lu + * July 10, 2003 * * * Modifications: @@ -362,8 +362,8 @@ test_error1(void) static herr_t test_error2(hid_t file) { - hid_t dataset, space; - hsize_t dims[2]; + hid_t dataset, space; + hsize_t dims[2]; const char *FUNC_test_error="test_error2"; TESTING("error API based on data I/O"); @@ -381,7 +381,7 @@ test_error2(hid_t file) /* Create the dataset */ if ((dataset = H5Dcreate2(file, DSET_NAME, H5T_STD_I32BE, space, - H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) { + H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) { H5Epush1(__FILE__, FUNC_test_error, __LINE__, H5E_ERROR, H5E_CANTCREATE, "H5Dcreate2 failed"); goto error; @@ -411,18 +411,18 @@ test_error2(hid_t file) return -1; } - + /*------------------------------------------------------------------------- * Function: dump_error * - * Purpose: Prints error stack in default and customized ways. + * Purpose: Prints error stack in default and customized ways. * - * Return: Success: 0 + * Return: Success: 0 * - * Failure: -1 + * Failure: -1 * - * Programmer: Raymond Lu - * July 17, 2003 + * Programmer: Raymond Lu + * July 17, 2003 * * * Modifications: @@ -449,14 +449,14 @@ dump_error(void) } - + /*------------------------------------------------------------------------- - * Function: main + * Function: main * - * Purpose: Test error API. + * Purpose: Test error API. * - * Programmer: Raymond Lu - * July 10, 2003 + * Programmer: Raymond Lu + * July 10, 2003 * * Modifications: * @@ -465,8 +465,8 @@ dump_error(void) int main(void) { - hid_t file, fapl; - char filename[1024]; + hid_t file, fapl; + char filename[1024]; const char *FUNC_main="main"; fprintf(stderr, " This program tests the Error API compatible with HDF5 v1.6. There are supposed to be some error messages\n"); @@ -474,7 +474,7 @@ main(void) h5_fixname(FILENAME[0], fapl, filename, sizeof filename); if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) - TEST_ERROR ; + TEST_ERROR ; /* Test error stack */ diff --git a/test/hdfs.c b/test/hdfs.c index 57dbac9..ab39da6 100644 --- a/test/hdfs.c +++ b/test/hdfs.c @@ -11,9 +11,9 @@ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* - * Read-Only HDFS Virtual File Driver (VFD) + * Read-Only HDFS Virtual File Driver (VFD) * - * Purpose: + * Purpose: * * Verify behavior for Read-Only HDFS VFD. * @@ -27,11 +27,10 @@ #include "H5FDhdfs.h" /* this file driver's utilities */ +#ifdef H5_HAVE_LIBHDFS #define HDFS_TEST_DEBUG 0 #define HDFS_TEST_MAX_BUF_SIZE 256 -#if 0 -#define S3_TEST_MAX_URL_SIZE 256 -#endif /* s3comms relic */ +#endif /* H5_HAVE_LIBHDFS */ /***************************************************************************** * @@ -39,7 +38,7 @@ * * Purpose: * - * 1) Upon test failure, goto-jump to single-location teardown in test + * 1) Upon test failure, goto-jump to single-location teardown in test * function. E.g., `error:` (consistency with HDF corpus) or * `failed:` (reflects purpose). * >>> using "error", in part because `H5E_BEGIN_TRY` expects it. @@ -48,22 +47,22 @@ * requires reading of entire line to know whether this if/call is * part of the test setup, test operation, or a test unto itself. * 3) Provide testing macros with optional user-supplied failure message; - * if not supplied (NULL), generate comparison output in the spirit of + * if not supplied (NULL), generate comparison output in the spirit of * test-driven development. E.g., "expected 5 but was -3" * User messages clarify test's purpose in code, encouraging description * without relying on comments. * 4) Configurable expected-actual order in generated comparison strings. - * Some prefer `VERIFY(expected, actual)`, others + * Some prefer `VERIFY(expected, actual)`, others * `VERIFY(actual, expected)`. Provide preprocessor ifdef switch * to satifsy both parties, assuming one paradigm per test file. * (One could #undef and redefine the flag through the file as desired, * but _why_.) * - * Provided as courtesy, per consideration for inclusion in the library + * Provided as courtesy, per consideration for inclusion in the library * proper. * * Macros: - * + * * JSVERIFY_EXP_ACT - ifdef flag, configures comparison order * FAIL_IF() - check condition * FAIL_UNLESS() - check _not_ condition @@ -80,8 +79,8 @@ /*---------------------------------------------------------------------------- * * ifdef flag: JSVERIFY_EXP_ACT - * - * JSVERIFY macros accept arguments as (EXPECTED, ACTUAL[, reason]) + * + * JSVERIFY macros accept arguments as (EXPECTED, ACTUAL[, reason]) * default, if this is undefined, is (ACTUAL, EXPECTED[, reason]) * *---------------------------------------------------------------------------- @@ -114,10 +113,10 @@ * * Macro: FAIL_IF() * - * Purpose: + * Purpose: * * Make tests more accessible and less cluttered than - * `if (thing == otherthing()) TEST_ERROR` + * `if (thing == otherthing()) TEST_ERROR` * paradigm. * * The following lines are roughly equivalent: @@ -148,7 +147,7 @@ if (condition) { \ * * TEST_ERROR wrapper to reduce cognitive overhead from "negative tests", * e.g., "a != b". - * + * * Opposite of FAIL_IF; fails if the given condition is _not_ true. * * `FAIL_IF( 5 != my_op() )` @@ -254,10 +253,10 @@ if (!(condition)) { \ * * Macro: JSVERIFY() * - * Purpose: + * Purpose: * * Verify that two long integers are equal. - * If unequal, print failure message + * If unequal, print failure message * (with `reason`, if not NULL; expected/actual if NULL) * and jump to `error` at end of function * @@ -277,10 +276,10 @@ if ((long)(actual) != (long)(expected)) { \ * * Macro: JSVERIFY_NOT() * - * Purpose: + * Purpose: * * Verify that two long integers are _not_ equal. - * If equal, print failure message + * If equal, print failure message * (with `reason`, if not NULL; expected/actual if NULL) * and jump to `error` at end of function * @@ -300,10 +299,10 @@ if ((long)(actual) == (long)(expected)) { \ * * Macro: JSVERIFY_STR() * - * Purpose: + * Purpose: * * Verify that two strings are equal. - * If unequal, print failure message + * If unequal, print failure message * (with `reason`, if not NULL; expected/actual if NULL) * and jump to `error` at end of function * @@ -319,8 +318,8 @@ if (strcmp((actual), (expected)) != 0) { \ } /* JSVERIFY_STR */ -#else -/* JSVERIFY_EXP_ACT not defined +#else +/* JSVERIFY_EXP_ACT not defined * * Repeats macros above, but with actual/expected parameters reversed. */ @@ -373,23 +372,30 @@ if (strcmp((actual), (expected)) != 0) { \ * OTHER MACROS AND DEFINITIONS * ********************************/ -/* copied from src/hdfs.c +/* copied from src/hdfs.c */ +#ifdef H5_HAVE_LIBHDFS #define MAXADDR (((haddr_t)1<<(8*sizeof(HDoff_t)-1))-1) -#define MAX_HDFS_NAMENODE_NAME 128 +#endif /* H5_HAVE_LIBHDFS */ + +#define HDFS_NAMENODE_NAME_MAX_SIZE 128 /******************************* * FILE-LOCAL GLOBAL VARIABLES * *******************************/ + +#ifdef H5_HAVE_LIBHDFS static const char filename_missing[] = "/tmp/missing.txt"; static const char filename_bard[] = "/tmp/t8.shakespeare.txt"; static const char filename_raven[] = "/tmp/Poe_Raven.txt"; static const char filename_example_h5[] = "/tmp/t.h5"; +#endif /* H5_HAVE_LIBHDFS */ + static H5FD_hdfs_fapl_t default_fa = { 1, /* fa version */ "localhost", /* namenode name */ 0, /* namenode port */ - "", /* user name */ + "", /* user name */ "", /* kerberos path */ 1024, /* buffer size */ }; @@ -403,7 +409,7 @@ static H5FD_hdfs_fapl_t default_fa = { * * Function: test_fapl_config_validation() * - * Purpose: + * Purpose: * * Test data consistency of fapl configuration. * Tests `H5FD_hdfs_validate_config` indirectly through `H5Pset_fapl_hdfs`. @@ -522,7 +528,7 @@ test_fapl_config_validation(void) for (i = 0; i < ncases; i++) { /*--------------- - * per-test setup + * per-test setup *--------------- */ case_ptr = &cases_arr[i]; @@ -535,7 +541,7 @@ test_fapl_config_validation(void) *----------------------------------- */ H5E_BEGIN_TRY { - /* `H5FD_hdfs_validate_config(...)` is static/private + /* `H5FD_hdfs_validate_config(...)` is static/private * to src/hdfs.c and cannot (and should not?) be tested directly? * Instead, validate config through public api. */ @@ -543,7 +549,7 @@ test_fapl_config_validation(void) } H5E_END_TRY; JSVERIFY( case_ptr->expected, success, case_ptr->msg ) - + /* Make sure we can get back what we put in. * Only valid if the fapl configuration does not result in error. */ @@ -566,7 +572,7 @@ test_fapl_config_validation(void) "streambuffer size mismatch" ) JSVERIFY_STR( config.namenode_name, fa_fetch.namenode_name, - NULL ) + NULL ) JSVERIFY_STR( config.user_name, fa_fetch.user_name, NULL ) @@ -599,7 +605,7 @@ error: } return 1; -} /* test_fapl_config_validation */ +} /* end test_fapl_config_validation() */ /*------------------------------------------------------------------------- @@ -608,7 +614,7 @@ error: * * Purpose: Tests the file handle interface for the HDFS driver. * - * For now, test only fapl & flags. Extend as the + * For now, test only fapl & flags. Extend as the * work on the VFD continues. * * Return: Success: 0 @@ -642,7 +648,7 @@ test_hdfs_fapl(void) TESTING("HDFS fapl "); - /* Set property list and file name for HDFS driver. + /* Set property list and file name for HDFS driver. */ fapl_id = H5Pcreate(H5P_FILE_ACCESS); FAIL_IF( fapl_id < 0 ) @@ -654,12 +660,12 @@ test_hdfs_fapl(void) /**************** * Check that the VFD feature flags are correct - * SPEC MAY CHANGE + * SPEC MAY CHANGE ******************/ FAIL_IF( H5FDdriver_query(driver_id, &driver_flags) < 0 ) - JSVERIFY_NOT( 0, (driver_flags & H5FD_FEAT_DATA_SIEVE), + JSVERIFY_NOT( 0, (driver_flags & H5FD_FEAT_DATA_SIEVE), "bit(s) in `driver_flags` must align with " "H5FD_FEAT_DATA_SIEVE" ) @@ -676,14 +682,14 @@ error: return 1; -} /* test_hdfs_fapl() */ +} /* end test_hdfs_fapl() */ /*--------------------------------------------------------------------------- * * Function: test_vfd_open() * - * Purpose: + * Purpose: * * Demonstrate/specify VFD-level "Open" failure cases * @@ -700,6 +706,16 @@ error: static int test_vfd_open(void) { + +#ifndef H5_HAVE_LIBHDFS + TESTING("HDFS VFD-level open"); + SKIPPED(); + puts(" HDFS VFD is not enabled"); + fflush(stdout); + return 0; + +#else + /********************* * test-local macros * *********************/ @@ -709,7 +725,6 @@ test_vfd_open(void) #define FAPL_UNCONFIGURED -3 /* H5P_FILE_ACCESS */ #define FAPL_HDFS -4 -#ifdef H5_HAVE_LIBHDFS /************************* * test-local structures * *************************/ @@ -799,21 +814,14 @@ test_vfd_open(void) FALSE, }, }; -#endif /* H5_HAVE_LIBHDFS */ + unsigned i = 0; + unsigned failing_conditions_count = 10; H5FD_t *fd = NULL; hid_t fapl_hdfs = -1; hid_t fapl_unconfigured = -1; - unsigned i = 0; - unsigned failing_conditions_count = 10; TESTING("HDFS VFD-level open"); -#ifndef H5_HAVE_LIBHDFS - SKIPPED(); - puts(" HDFS VFD is not enabled"); - fflush(stdout); - return 0; -#else fapl_unconfigured = H5Pcreate(H5P_FILE_ACCESS); FAIL_IF( fapl_unconfigured < 0 ) @@ -833,10 +841,13 @@ test_vfd_open(void) fd = NULL; - if (T.which_fapl == FAPL_UNCONFIGURED) + if (T.which_fapl == FAPL_UNCONFIGURED) { fapl_id = fapl_unconfigured; - else if (T.which_fapl == FAPL_HDFS) + } + else + if (T.which_fapl == FAPL_HDFS) { fapl_id = fapl_hdfs; + } #if HDFS_TEST_DEBUG HDfprintf(stderr, "testing: %s\n", T.message); @@ -852,10 +863,11 @@ test_vfd_open(void) HDfprintf(stderr, "\n!!!!! WARNING !!!!!\n" \ " Successful open of file on local system " \ "with non-HDFS VFD.\n"); - JSVERIFY(SUCCEED, H5FDclose(fd), + JSVERIFY(SUCCEED, H5FDclose(fd), "unable to close errant open"); fd = NULL; - } else { + } + else { JSVERIFY(1, 0, T.message); /* print message and fail */ } } @@ -867,14 +879,14 @@ test_vfd_open(void) HDfprintf(stderr, "nominal open\n"); #endif /* HDFS_TEST_DEBUG */ - /* finally, show that a file can be opened + /* finally, show that a file can be opened */ fd = H5FDopen( - filename_bard, - H5F_ACC_RDONLY, - fapl_hdfs, + filename_bard, + H5F_ACC_RDONLY, + fapl_hdfs, MAXADDR); - FAIL_IF( NULL == fd ) + FAIL_IF( NULL == fd ) /************ * TEARDOWN * @@ -895,20 +907,23 @@ test_vfd_open(void) PASSED(); return 0; -#endif /* H5_HAVE_LIBHDFS */ error: + /*********** * CLEANUP * ***********/ - if (fd) - (void)H5FDclose(fd); + if (fd) { + (void)H5FDclose(fd); + } H5E_BEGIN_TRY { - if (fapl_hdfs >= 0) + if (fapl_hdfs >= 0) { (void)H5Pclose(fapl_hdfs); - if (fapl_unconfigured >= 0) + } + if (fapl_unconfigured >= 0) { (void)H5Pclose(fapl_unconfigured); + } } H5E_END_TRY; return 1; @@ -917,14 +932,16 @@ error: #undef FAPL_UNCONFIGURED #undef FAPL_HDFS -} /* test_vfd_open */ +#endif /* H5_HAVE_LIBHDFS */ + +} /* end test_vfd_open() */ /*--------------------------------------------------------------------------- * * Function: test_eof_eoa() * - * Purpose: + * Purpose: * * Demonstrate behavior of get_eof, get_eoa, and set_eoa. * @@ -941,6 +958,15 @@ error: static int test_eof_eoa(void) { +#ifndef H5_HAVE_LIBHDFS + TESTING("HDFS eof/eoa gets and sets"); + SKIPPED(); + puts(" HDFS VFD is not enabled"); + fflush(stdout); + return 0; + +#else + /********************* * test-local macros * *********************/ @@ -958,16 +984,10 @@ test_eof_eoa(void) TESTING("HDFS eof/eoa gets and sets"); -#ifndef H5_HAVE_LIBHDFS - SKIPPED(); - puts(" HDFS VFD is not enabled"); - fflush(stdout); - return 0; -#else /********* * SETUP * *********/ - + fapl_id = H5Pcreate(H5P_FILE_ACCESS); FAIL_IF( 0 > fapl_id ) FAIL_IF( FAIL == H5Pset_fapl_hdfs(fapl_id, &default_fa) ) @@ -990,31 +1010,31 @@ test_eof_eoa(void) H5FDget_eof(fd_shakespeare, H5FD_MEM_DRAW), "mismatch between DEFAULT and RAW memory types" ) JSVERIFY( 0, - H5FDget_eoa(fd_shakespeare, H5FD_MEM_DEFAULT), + H5FDget_eoa(fd_shakespeare, H5FD_MEM_DEFAULT), "EoA should be unset by H5FDopen" ) /* set EoA below EoF */ - JSVERIFY( SUCCEED, - H5FDset_eoa(fd_shakespeare, H5FD_MEM_DEFAULT, 44442202), + JSVERIFY( SUCCEED, + H5FDset_eoa(fd_shakespeare, H5FD_MEM_DEFAULT, 44442202), "unable to set EoA (lower)" ) - JSVERIFY( 5458199, - H5FDget_eof(fd_shakespeare, H5FD_MEM_DEFAULT), + JSVERIFY( 5458199, + H5FDget_eof(fd_shakespeare, H5FD_MEM_DEFAULT), "EoF changed" ) - JSVERIFY( 44442202, - H5FDget_eoa(fd_shakespeare, H5FD_MEM_DEFAULT), + JSVERIFY( 44442202, + H5FDget_eoa(fd_shakespeare, H5FD_MEM_DEFAULT), "EoA unchanged" ) /* set EoA above EoF */ - JSVERIFY( SUCCEED, - H5FDset_eoa(fd_shakespeare, H5FD_MEM_DEFAULT, 6789012), + JSVERIFY( SUCCEED, + H5FDset_eoa(fd_shakespeare, H5FD_MEM_DEFAULT, 6789012), "unable to set EoA (higher)" ) - JSVERIFY( 5458199, - H5FDget_eof(fd_shakespeare, H5FD_MEM_DEFAULT), + JSVERIFY( 5458199, + H5FDget_eof(fd_shakespeare, H5FD_MEM_DEFAULT), "EoF changed" ) - JSVERIFY( 6789012, - H5FDget_eoa(fd_shakespeare, H5FD_MEM_DEFAULT), + JSVERIFY( 6789012, + H5FDget_eoa(fd_shakespeare, H5FD_MEM_DEFAULT), "EoA unchanged" ) /************ @@ -1029,9 +1049,9 @@ test_eof_eoa(void) PASSED(); return 0; -#endif /* H5_HAVE_LIBHDFS */ error: + /*********** * CLEANUP * ***********/ @@ -1039,7 +1059,7 @@ error: if (fd_shakespeare != NULL) { (void)H5FDclose(fd_shakespeare); } - if (fapl_id >= 0) { + if (fapl_id >= 0) { H5E_BEGIN_TRY { (void)H5Pclose(fapl_id); } H5E_END_TRY; @@ -1047,15 +1067,17 @@ error: return 1; -} /* test_eof_eoa */ +#endif /* H5_HAVE_LIBHDFS */ + +} /* end test_eof_eoa() */ /*----------------------------------------------------------------------------- * * Function: test_H5FDread_without_eoa_set_fails() - * + * * Purpose: - * + * * Demonstrate a not-obvious constraint by the library, preventing * file read before EoA is set * @@ -1067,26 +1089,27 @@ error: static int test_H5FDread_without_eoa_set_fails(void) { -#ifdef H5_HAVE_LIBHDFS +#ifndef H5_HAVE_LIBHDFS + TESTING("HDFS VFD read-eoa temporal coupling library limitation"); + SKIPPED(); + puts(" HDFS VFD is not enabled"); + fflush(stdout); + return 0; + +#else + char buffer[HDFS_TEST_MAX_BUF_SIZE]; unsigned int i = 0; -#endif /* H5_HAVE_LIBHDFS */ H5FD_t *file_shakespeare = NULL; hid_t fapl_id = -1; TESTING("HDFS VFD read-eoa temporal coupling library limitation"); -#ifndef H5_HAVE_LIBHDFS - SKIPPED(); - puts(" HDFS VFD is not enabled"); - fflush(stdout); - return 0; -#else /********* * SETUP * *********/ - /* create HDFS fapl + /* create HDFS fapl */ fapl_id = H5Pcreate(H5P_FILE_ACCESS); FAIL_IF( fapl_id < 0 ) @@ -1137,9 +1160,9 @@ test_H5FDread_without_eoa_set_fails(void) PASSED(); return 0; -#endif /* H5_HAVE_LIBHDFS */ error: + /*********** * CLEANUP * ***********/ @@ -1155,7 +1178,9 @@ error: return 1; -} /* test_H5FDread_without_eoa_set_fails */ +#endif /* H5_HAVE_LIBHDFS */ + +} /* end test_H5FDread_without_eoa_set_fails() */ @@ -1163,7 +1188,7 @@ error: * * Function: test_read() * - * Purpose: + * Purpose: * * Return: * @@ -1178,11 +1203,19 @@ error: static int test_read(void) { +#ifndef H5_HAVE_LIBHDFS + TESTING("HDFS VFD read/range-gets"); + SKIPPED(); + puts(" HDFS VFD is not enabled"); + fflush(stdout); + return 0; + +#else + /********************* * test-local macros * *********************/ -#ifdef H5_HAVE_LIBHDFS /************************* * test-local structures * *************************/ @@ -1248,23 +1281,16 @@ test_read(void) herr_t open_return = FAIL; char buffer[HDFS_TEST_MAX_BUF_SIZE]; unsigned int i = 0; -#endif /* H5_HAVE_LIBHDFS */ H5FD_t *file_raven = NULL; hid_t fapl_id = -1; TESTING("HDFS VFD read/range-gets"); -#ifndef H5_HAVE_LIBHDFS - SKIPPED(); - puts(" HDFS VFD is not enabled"); - fflush(stdout); - return 0; -#else /********* * SETUP * *********/ - /* create HDFS fapl + /* create HDFS fapl */ fapl_id = H5Pcreate(H5P_FILE_ACCESS); FAIL_IF( fapl_id < 0 ) @@ -1275,7 +1301,7 @@ test_read(void) buffer[i] = 0; } - /* open file + /* open file */ file_raven = H5FDopen( filename_raven, @@ -1301,7 +1327,7 @@ test_read(void) FAIL_IF( HDFS_TEST_MAX_BUF_SIZE < test.len ) /* buffer too small! */ - FAIL_IF( FAIL == + FAIL_IF( FAIL == H5FDset_eoa( file_raven, H5FD_MEM_DEFAULT, test.eoa_set) ) /* zero buffer contents */ @@ -1345,15 +1371,16 @@ test_read(void) PASSED(); return 0; -#endif /* H5_HAVE_LIBHDFS */ error: + /*********** * CLEANUP * ***********/ - if (file_raven != 0) + if (file_raven != 0) { (void)H5FDclose(file_raven); + } if (fapl_id >= 0) { H5E_BEGIN_TRY { (void)H5Pclose(fapl_id); @@ -1362,14 +1389,16 @@ error: return 1; -} /* test_read */ +#endif /* H5_HAVE_LIBHDFS */ + +} /* end test_read() */ /*--------------------------------------------------------------------------- * * Function: test_noops_and_autofails() * - * Purpose: + * Purpose: * * Demonstrate the unavailable and do-nothing routines unique to * Read-Only VFD. @@ -1391,6 +1420,15 @@ error: static int test_noops_and_autofails(void) { +#ifndef H5_HAVE_LIBHDFS + TESTING("HDFS VFD always-fail and no-op routines"); + SKIPPED(); + puts(" HDFS VFD is not enabled"); + fflush(stdout); + return 0; + +#else + /********************* * test-local macros * *********************/ @@ -1413,13 +1451,7 @@ test_noops_and_autofails(void) * SETUP * *********/ -#ifndef H5_HAVE_LIBHDFS - SKIPPED(); - puts(" HDFS VFD is not enabled"); - fflush(stdout); - return 0; -#else - /* create HDFS fapl + /* create HDFS fapl */ fapl_id = H5Pcreate(H5P_FILE_ACCESS); FAIL_IF( fapl_id < 0 ) @@ -1441,7 +1473,7 @@ test_noops_and_autofails(void) /* auto-fail calls to write and truncate */ H5E_BEGIN_TRY { - JSVERIFY( FAIL, + JSVERIFY( FAIL, H5FDwrite(file, H5FD_MEM_DRAW, H5P_DEFAULT, 1000, 35, data), "write must fail" ) } H5E_END_TRY; @@ -1485,9 +1517,9 @@ test_noops_and_autofails(void) PASSED(); return 0; -#endif /* H5_HAVE_LIBHDFS */ error: + /*********** * CLEANUP * ***********/ @@ -1503,14 +1535,16 @@ error: return 1; -} /* test_noops_and_autofails*/ +#endif /* H5_HAVE_LIBHDFS */ + +} /* end test_noops_and_autofails() */ /*--------------------------------------------------------------------------- * * Function: test_cmp() * - * Purpose: + * Purpose: * * Verify "file comparison" behavior. * @@ -1527,117 +1561,6 @@ error: static int test_cmp(void) { -#if 0 - /********************* - * test-local macros * - *********************/ - - /************************* - * test-local structures * - *************************/ - - /************************ - * test-local variables * - ************************/ - - H5FD_t *fd_raven = NULL; - H5FD_t *fd_shakes = NULL; - H5FD_t *fd_raven_2 = NULL; - hbool_t curl_ready = FALSE; - hid_t fapl_id = -1; - - - - TESTING("HDFS cmp (comparison)"); - - if (s3_test_credentials_loaded == 0) { - SKIPPED(); - puts(" s3 credentials are not loaded"); - fflush(stdout); - return 0; - } - - /********* - * SETUP * - *********/ - - FAIL_IF( CURLE_OK != curl_global_init(CURL_GLOBAL_DEFAULT) ) - curl_ready = TRUE; - - fapl_id = H5Pcreate(H5P_FILE_ACCESS); - FAIL_IF( 0 > fapl_id ) - JSVERIFY( SUCCEED, H5Pset_fapl_hdfs(fapl_id, &restricted_access_fa), NULL ) - - fd_raven = H5FDopen( - url_text_public, - H5F_ACC_RDONLY, - fapl_id, - HADDR_UNDEF); - FAIL_IF( NULL == fd_raven ) - - fd_shakes = H5FDopen( - url_text_restricted, - H5F_ACC_RDONLY, - fapl_id, - HADDR_UNDEF); - FAIL_IF( NULL == fd_shakes ) - - fd_raven_2 = H5FDopen( - url_text_public, - H5F_ACC_RDONLY, - fapl_id, - HADDR_UNDEF); - FAIL_IF( NULL == fd_raven_2 ) - - /********* - * TESTS * - *********/ - - JSVERIFY( 0, H5FDcmp(fd_raven, fd_raven_2), NULL ) - JSVERIFY( -1, H5FDcmp(fd_raven, fd_shakes), NULL ) - JSVERIFY( 1, H5FDcmp(fd_shakes, fd_raven_2), NULL ) - - /************ - * TEARDOWN * - ************/ - - FAIL_IF( FAIL == H5FDclose(fd_raven) ) - fd_raven = NULL; - FAIL_IF( FAIL == H5FDclose(fd_shakes) ) - fd_shakes = NULL; - FAIL_IF( FAIL == H5FDclose(fd_raven_2) ) - fd_raven_2 = NULL; - FAIL_IF( FAIL == H5Pclose(fapl_id) ) - fapl_id = -1; - - curl_global_cleanup(); - curl_ready = FALSE; - - PASSED(); - return 0; - -error: - /*********** - * CLEANUP * - ***********/ - - if (fd_raven != NULL) (void)H5FDclose(fd_raven); - if (fd_raven_2 != NULL) (void)H5FDclose(fd_raven_2); - if (fd_shakes != NULL) (void)H5FDclose(fd_shakes); - if (TRUE == curl_ready) curl_global_cleanup(); - if (fapl_id >= 0) { - H5E_BEGIN_TRY { - (void)H5Pclose(fapl_id); - } H5E_END_TRY; - } - -#else - /* - JSFAILED_AT() - HDprintf("TODO\n"); - return 1; - */ - TESTING("HDFS cmp (comparison)"); SKIPPED(); HDfprintf( @@ -1645,16 +1568,15 @@ error: " TODO: Distinct valid fapls to open the same file.\n"); return 0; -#endif /* s3comms relic */ -} /* test_cmp */ +} /* end test_cmp() */ /*--------------------------------------------------------------------------- * * Function: test_H5F_integration() * - * Purpose: + * Purpose: * * Demonstrate H5F (File interface) behavior with files on HDFS. * @@ -1675,6 +1597,15 @@ error: static int test_H5F_integration(void) { +#ifndef H5_HAVE_LIBHDFS + TESTING("HDFS file access through HD5F library (H5F API)"); + SKIPPED(); + puts(" HDFS VFD is not enabled"); + fflush(stdout); + return 0; + +#else + /********************* * test-local macros * *********************/ @@ -1696,12 +1627,6 @@ test_H5F_integration(void) * SETUP * *********/ -#ifndef H5_HAVE_LIBHDFS - SKIPPED(); - puts(" HDFS VFD is not enabled"); - fflush(stdout); - return 0; -#else fapl_id = H5Pcreate(H5P_FILE_ACCESS); FAIL_IF( 0 > fapl_id ) FAIL_IF( FAIL == H5Pset_fapl_hdfs(fapl_id, &default_fa) ) @@ -1749,7 +1674,6 @@ test_H5F_integration(void) PASSED(); return 0; -#endif /* H5_HAVE_LIBHDFS */ error: /*********** @@ -1771,6 +1695,8 @@ error: return 1; +#endif /* H5_HAVE_LIBHDFS */ + } /* test_H5F_integration */ @@ -1796,15 +1722,19 @@ main(void) /****************** * commence tests * ******************/ - - static char hdfs_namenode_name[MAX_HDFS_NAMENODE_NAME] = ""; + + static char hdfs_namenode_name[HDFS_NAMENODE_NAME_MAX_SIZE] = ""; const char *hdfs_namenode_name_env = NULL; hdfs_namenode_name_env = HDgetenv("HDFS_TEST_NAMENODE_NAME"); if (hdfs_namenode_name_env == NULL || hdfs_namenode_name_env[0] == '\0') { - HDstrncpy(hdfs_namenode_name, "localhost", 9); - } else { - HDstrncpy(default_fa.namenode_name, hdfs_namenode_name_env, MAX_HDFS_NAMENODE_NAME); + HDstrncpy(hdfs_namenode_name, "localhost", HDFS_NAMENODE_NAME_MAX_SIZE); + } + else { + HDstrncpy( /* TODO: error-check? */ + default_fa.namenode_name, + hdfs_namenode_name_env, + HDFS_NAMENODE_NAME_MAX_SIZE); } h5_reset(); @@ -1823,14 +1753,15 @@ main(void) if (nerrors > 0) { HDprintf("***** %d hdfs TEST%s FAILED! *****\n", - nerrors, + nerrors, nerrors > 1 ? "S" : ""); nerrors = 1; - } else { + } + else { HDprintf("All hdfs tests passed.\n"); } return nerrors; /* 0 if no errors, 1 if any errors */ -} /* main() */ +} /* end main() */ diff --git a/test/links.c b/test/links.c index f8be2b5..cd44433 100644 --- a/test/links.c +++ b/test/links.c @@ -39,8 +39,8 @@ /* File for external link test. Created with gen_udlinks.c */ #define LINKED_FILE "be_extlink2.h5" -#define TMPDIR "tmp/" -#define TMPDIR2 "tmp2/" +#define TMPDIR "tmp_links/" +#define TMPDIR2 "tmp2_links/" /* Symlinks for external link symlink test */ #define SYMLINK1 TMPDIR "sym1.h5" @@ -106,7 +106,7 @@ const char *FILENAME[] = { #define CORE_INCREMENT 1024 #define NUM40 40 -/* do not do check_all_closed() for "ext*" files and "tmp/ext*" */ +/* do not do check_all_closed() for "ext*" files and "tmp_links/ext*" */ #define EXTSTOP 12 #define LINK_BUF_SIZE 1024 @@ -2562,9 +2562,9 @@ error: * * Purpose: 1. target link: "extlinks2" * 2. main file: "extlinks0" - * 3. target file: "tmp/extlinks2" - * 4. Set up external link prefix via H5Pset_elink_prefix() to be "tmp" - * Should be able to access the target file in tmp directory via the prefix set + * 3. target file: "tmp_links/extlinks2" + * 4. Set up external link prefix via H5Pset_elink_prefix() to be "tmp_links" + * Should be able to access the target file in tmp_links directory via the prefix set * by H5Pset_elink_prefix() * * @@ -2592,11 +2592,11 @@ external_link_prefix(hid_t fapl, hbool_t new_format) /* set up name for external linked target file: "extlinks2" */ h5_fixname(FILENAME[16], fapl, filename2, sizeof filename2); - /* create tmp directory and get current working directory path */ + /* create tmp_links directory and get current working directory path */ if (HDmkdir(TMPDIR, (mode_t)0755) < 0 && errno != EEXIST) TEST_ERROR - /* set up name for target file: "tmp/extlinks2" */ + /* set up name for target file: "tmp_links/extlinks2" */ h5_fixname(FILENAME[17], fapl, filename3, sizeof filename3); /* Create the target file */ @@ -2626,7 +2626,7 @@ external_link_prefix(hid_t fapl, hbool_t new_format) /* should be able to find the target file from pathnames set via H5Pset_elink_prefix() */ if (gid < 0) { H5_FAILED(); - HDputs(" Should have found the file in tmp directory."); + HDputs(" Should have found the file in tmp_links directory."); goto error; } @@ -2650,8 +2650,8 @@ error: * Function: external_link_abs_mainpath: test 3 * * Purpose: 1. target link: "extlinks3" - * 2. main file: Linux:"/CWD/tmp/extlinks0"; Windows: "<cur drive>:/CWD/tmp/extlinks0" - * 3. target file: "tmp/extlinks3" + * 2. main file: Linux:"/CWD/tmp_links/extlinks0"; Windows: "<cur drive>:/CWD/tmp_links/extlinks0" + * 3. target file: "tmp_links/extlinks3" * Should be able to access the target file via the main file's absolute path * * Return: Success: 0 @@ -2676,17 +2676,17 @@ external_link_abs_mainpath(hid_t fapl, hbool_t new_format) /* set up name for external linked target file: "extlinks3" */ h5_fixname(FILENAME[18], fapl, filename2, sizeof filename2); - /* set up name for target file: "tmp/extlinks3" */ + /* set up name for target file: "tmp_links/extlinks3" */ h5_fixname(FILENAME[19], fapl, filename3, sizeof filename3); - /* create tmp directory and get current working directory path */ + /* create tmp_links directory and get current working directory path */ if((HDmkdir(TMPDIR, (mode_t)0755) < 0 && errno != EEXIST) || (NULL == HDgetcwd(cwdpath, (size_t)NAME_BUF_SIZE))) TEST_ERROR /* * set up name for main file: - * Linux: "/CWD/tmp/extlinks0" - * Window: "<cur drive>:/CWD/tmp/extlinks0" + * Linux: "/CWD/tmp_links/extlinks0" + * Window: "<cur drive>:/CWD/tmp_links/extlinks0" */ fix_ext_filename(tmpname, cwdpath, FILENAME[13]); h5_fixname(tmpname, fapl, filename1, sizeof filename1); @@ -2714,7 +2714,7 @@ external_link_abs_mainpath(hid_t fapl, hbool_t new_format) /* should be able to find the target file from absolute path set for main file */ if(gid < 0) { H5_FAILED(); - HDputs(" Should have found the file in tmp directory."); + HDputs(" Should have found the file in tmp_links directory."); goto error; } @@ -2738,8 +2738,8 @@ error: * Function: external_link_rel_mainpath: test 4 * * Purpose: 1. target link: "extlinks4" - * 2. main file: "tmp/extlinks0" - * 3. target file: "tmp/extlinks4" + * 2. main file: "tmp_links/extlinks0" + * 3. target file: "tmp_links/extlinks4" * Should be able to access the target file via the main file's CWD+relative path * * Return: Success: 0 @@ -2766,9 +2766,9 @@ external_link_rel_mainpath(hid_t fapl, hbool_t new_format) if (HDmkdir(TMPDIR, (mode_t)0755) < 0 && errno != EEXIST) TEST_ERROR - /* set up name for main file: "tmp/extlinks0" */ + /* set up name for main file: "tmp_links/extlinks0" */ h5_fixname(FILENAME[13], fapl, filename1, sizeof filename1); - /* set up name for target file: "tmp/extlinks4" */ + /* set up name for target file: "tmp_links/extlinks4" */ h5_fixname(FILENAME[21], fapl, filename3, sizeof filename3); /* Create the target file */ @@ -2817,7 +2817,7 @@ error: * Function: external_link_cwd: test 5 * * Purpose: 1. target link: "extlinks5" - * 2. main file: Linux:"/CWD/tmp/extlinks0"; Window: "<cur drive>:/CWD/tmp/extlinks0" + * 2. main file: Linux:"/CWD/tmp_links/extlinks0"; Window: "<cur drive>:/CWD/tmp_links/extlinks0" * 3. target file: "extlinks5" * Should be able to access the target file in the current working directory * @@ -2849,8 +2849,8 @@ external_link_cwd(hid_t fapl, hbool_t new_format) /* * set up name for main file: - * Linux: "/CWD/tmp/extlinks0" - * Windows: "<cur drive>:/CWD/tmp/extlinks0" + * Linux: "/CWD/tmp_links/extlinks0" + * Windows: "<cur drive>:/CWD/tmp_links/extlinks0" */ fix_ext_filename(tmpname, cwdpath, FILENAME[13]); h5_fixname(tmpname, fapl, filename1, sizeof filename1); @@ -2901,9 +2901,9 @@ error: /*------------------------------------------------------------------------- * Function: external_link_abstar: test 6 * - * Purpose: 1. target link: Linux:"/CWD/tmp/extlinks6"; Windows:"<cur drive>:/CWD/tmp/extlinks6" + * Purpose: 1. target link: Linux:"/CWD/tmp_links/extlinks6"; Windows:"<cur drive>:/CWD/tmp_links/extlinks6" * 2. main file: "extlinks0" - * 3. target file: "tmp/extlinks6" + * 3. target file: "tmp_links/extlinks6" * Should be able to access the target file's absolute path * * Return: Success: 0 @@ -2929,19 +2929,19 @@ external_link_abstar(hid_t fapl, hbool_t new_format) /* set up name for main file: "extlinks0" */ h5_fixname(FILENAME[12], fapl, filename1, sizeof filename1); - /* create tmp directory and get current working directory path */ + /* create tmp_links directory and get current working directory path */ if((HDmkdir(TMPDIR, (mode_t)0755) < 0 && errno != EEXIST) || (NULL == HDgetcwd(cwdpath, (size_t)NAME_BUF_SIZE))) TEST_ERROR /* * set up name for external linked target file: - * Linux: "/CWD/tmp/extlinks6" - * Windows: "<cur drive>:/CWD/tmp/extlinks6" + * Linux: "/CWD/tmp_links/extlinks6" + * Windows: "<cur drive>:/CWD/tmp_links/extlinks6" */ fix_ext_filename(tmpname, cwdpath, FILENAME[23]); h5_fixname(tmpname, fapl, filename2, sizeof filename2); - /* set up name for target file: "tmp/extlinks6" */ + /* set up name for target file: "tmp_links/extlinks6" */ h5_fixname(FILENAME[23], fapl, filename3, sizeof filename3); /* Create the target file */ @@ -2966,7 +2966,7 @@ external_link_abstar(hid_t fapl, hbool_t new_format) /* should be able to find the target file with abolute path */ if(gid < 0) { H5_FAILED(); - HDputs(" Should have found the file in tmp directory."); + HDputs(" Should have found the file in tmp_links directory."); goto error; } @@ -2988,7 +2988,7 @@ error: /*------------------------------------------------------------------------- * Function: external_link_abstar_cur: test 7 * - * Purpose: 1. target link: Linux: "/CWD/tmp/extlinks7"; Windows: "<cur drive>:/CWD/tmp/extlinks7" + * Purpose: 1. target link: Linux: "/CWD/tmp_links/extlinks7"; Windows: "<cur drive>:/CWD/tmp_links/extlinks7" * 2. main file: "extlinks0" * 3. target file: "extlinks7" * Should be able to access the target file via the main file's CWD. @@ -3019,14 +3019,14 @@ external_link_abstar_cur(hid_t fapl, hbool_t new_format) /* set up name for target file name: "extlinks7" */ h5_fixname(FILENAME[24], fapl, filename3, sizeof filename3); - /* create tmp directory and get current working directory path */ + /* create tmp_links directory and get current working directory path */ if((HDmkdir(TMPDIR, (mode_t)0755) < 0 && errno != EEXIST) || (NULL == HDgetcwd(cwdpath, (size_t)NAME_BUF_SIZE))) TEST_ERROR /* * set up name for external linked target file: - * Linux: "/CWD/tmp/extlinks7" - * Windows: "<cur drive>:/CWD/tmp/extlinks7" + * Linux: "/CWD/tmp_links/extlinks7" + * Windows: "<cur drive>:/CWD/tmp_links/extlinks7" */ fix_ext_filename(tmpname, cwdpath, FILENAME[25]); h5_fixname(tmpname, fapl, filename2, sizeof filename2); @@ -3076,9 +3076,9 @@ error: /*------------------------------------------------------------------------- * Function: external_link_reltar: test 8 * - * Purpose: 1. target link: Linux:"tmp/extlinks8" + * Purpose: 1. target link: Linux:"tmp_links/extlinks8" * 2. main file: "extlinks0" - * 3. target file: "tmp/extlinks8" + * 3. target file: "tmp_links/extlinks8" * Should be able to access the target file via the main file's CWD+ target's relative path * * Return: Success: 0 @@ -3101,11 +3101,11 @@ external_link_reltar(hid_t fapl, hbool_t new_format) /* set up name for main file: "extlinks0" */ h5_fixname(FILENAME[12], fapl, filename1, sizeof filename1); - /* create tmp directory */ + /* create tmp_links directory */ if (HDmkdir(TMPDIR, (mode_t)0755) < 0 && errno != EEXIST) TEST_ERROR - /* set up name for target file name: "tmp/extlinks8" */ - /* set up name for external linked target file: "tmp/extlinks8" */ + /* set up name for target file name: "tmp_links/extlinks8" */ + /* set up name for external linked target file: "tmp_links/extlinks8" */ h5_fixname(FILENAME[26], fapl, filename2, sizeof filename2); /* Create the target file */ @@ -3126,7 +3126,7 @@ external_link_reltar(hid_t fapl, hbool_t new_format) /* Open object through external link */ if((gid = H5Gopen2(fid, "ext_link", H5P_DEFAULT)) < 0) { H5_FAILED(); - HDputs(" Should have found the file in tmp directory."); + HDputs(" Should have found the file in tmp_links directory."); goto error; } /* end if */ @@ -3152,8 +3152,8 @@ error: * Purpose: * 1. target link: "extlinks9" * 2. main file: "extlinks0" - * 3. target file" "tmp/extlinks9" - * 3. chdir "tmp" + * 3. target file" "tmp_links/extlinks9" + * 3. chdir "tmp_links" * Should be able to access the target file in current working directory * * Return: Success: 0 @@ -3179,10 +3179,10 @@ external_link_chdir(hid_t fapl, hbool_t new_format) /* set up name for external linked target file ("extlinks9") */ h5_fixname(FILENAME[27], fapl, filename2, sizeof filename2); - /* create tmp directory */ + /* create tmp_links directory */ if (HDmkdir(TMPDIR, (mode_t)0755) < 0 && errno != EEXIST) TEST_ERROR - /* set up name for target file name ("tmp/extlinks9") */ + /* set up name for target file name ("tmp_links/extlinks9") */ h5_fixname(FILENAME[28], fapl, filename3, sizeof filename3); /* Create the target file */ @@ -3215,7 +3215,7 @@ external_link_chdir(hid_t fapl, hbool_t new_format) */ if (gid < 0) { H5_FAILED(); - HDputs(" Should have found the file in tmp directory."); + HDputs(" Should have found the file in tmp_links directory."); goto error; } @@ -3243,7 +3243,7 @@ error: * * 1. target link: "extlinks16" * 2. target file: "extlinks16" - * 3. main file: Linux:"/CWD/tmp/extlinks0"; Window: "<cur drive>:/CWD/tmp/extlinks0" + * 3. main file: Linux:"/CWD/tmp_links/extlinks0"; Window: "<cur drive>:/CWD/tmp_links/extlinks0" * 4. Create target file A to be a "family" file: extlinks16A * 4. Create target file B to be a "multi" file: extlinks16B * 5. Create external link from main file to target file A: ext_linkA->extlinks16A:/A @@ -3285,8 +3285,8 @@ external_set_elink_fapl1(hid_t fapl, hbool_t new_format) /* * set up name for main file: - * Linux: "/CWD/tmp/extlinks0" - * Windows: "<cur drive>:/CWD/tmp/extlinks0" + * Linux: "/CWD/tmp_links/extlinks0" + * Windows: "<cur drive>:/CWD/tmp_links/extlinks0" */ fix_ext_filename(tmpname, cwdpath, FILENAME[13]); h5_fixname(tmpname, fapl, filename1, sizeof filename1); @@ -3435,7 +3435,7 @@ error: * * 1. target link: "extlinks17" * 2. target file: "extlinks17" - * 3. main file: Linux:"/CWD/tmp/extlinks0"; Window: "<cur drive>:/CWD/tmp/extlinks0" + * 3. main file: Linux:"/CWD/tmp_links/extlinks0"; Window: "<cur drive>:/CWD/tmp_links/extlinks0" * 4. Create target file to be a "core" file:/A/Dataset * 5. Create external link from main file to target file:ext_link->target file:/A/Dataset * 6. Set the file access property list of the link access to use "core" file without @@ -3474,8 +3474,8 @@ external_set_elink_fapl2(hid_t fapl, hbool_t new_format) /* * set up name for main file: - * Linux: "/CWD/tmp/extlinks0" - * Windows: "<cur drive>:/CWD/tmp/extlinks0" + * Linux: "/CWD/tmp_links/extlinks0" + * Windows: "<cur drive>:/CWD/tmp_links/extlinks0" */ fix_ext_filename(tmpname, cwdpath, FILENAME[13]); h5_fixname(tmpname, fapl, filename1, sizeof filename1); @@ -4108,7 +4108,7 @@ error: * Function: external_link_win1 * * Purpose: - * 1. target link: "/CWD/tmp/extlinks10" + * 1. target link: "/CWD/tmp_links/extlinks10" * 2. main file: "extlinks0" * 3. target file: "extlinks10" * Should be able to find the target file via main file's current drive/rel path @@ -4139,7 +4139,7 @@ external_link_win1(hid_t fapl, hbool_t new_format) if(NULL == HDgetcwd(cwdpath, (size_t)NAME_BUF_SIZE)) TEST_ERROR - /* set up name for target link: "/CWD/tmp/extlinks10" */ + /* set up name for target link: "/CWD/tmp_links/extlinks10" */ HDstrcpy(tmpname, &cwdpath[2]); /* stripped the drive letter to make it rel drive but absolute path */ HDstrcat(tmpname, "/"); HDstrcat(tmpname, FILENAME[30]); @@ -4194,9 +4194,9 @@ error: * Function: external_link_win2 * * Purpose: - * 1. target link: "/CWD/tmp/extlinks11" + * 1. target link: "/CWD/tmp_links/extlinks11" * 2. main file: "extlinks0" - * 3. target file: "tmp/extlinks11" + * 3. target file: "tmp_links/extlinks11" * Should be able to access the target file directly (rel drive/abs path) * * Return: Success: 0 @@ -4222,17 +4222,17 @@ external_link_win2(hid_t fapl, hbool_t new_format) /* set up name for main file: "extlinks0" */ h5_fixname(FILENAME[12], fapl, filename1, sizeof filename1); - /* create tmp directory and get current working directory path */ + /* create tmp_links directory and get current working directory path */ if((HDmkdir(TMPDIR, (mode_t)0755) < 0 && errno != EEXIST) || (NULL == HDgetcwd(cwdpath, (size_t)NAME_BUF_SIZE))) TEST_ERROR - /* set up name for target link: "/CWD/tmp/extlinks11" */ + /* set up name for target link: "/CWD/tmp_links/extlinks11" */ HDstrcpy(tmpname, &cwdpath[2]); /* stripped the drive letter to make it relative drive but absolute path */ HDstrcat(tmpname, "/"); HDstrcat(tmpname, FILENAME[31]); h5_fixname(tmpname, fapl, filename2, sizeof filename2); - /* set up name for target file: "tmp/extlinks11" */ + /* set up name for target file: "tmp_links/extlinks11" */ h5_fixname(FILENAME[31], fapl, filename3, sizeof filename3); /* Create the target file */ @@ -4258,7 +4258,7 @@ external_link_win2(hid_t fapl, hbool_t new_format) /* should be able to find the target file directly */ if(gid < 0) { H5_FAILED(); - HDputs(" Should have found the file in tmp."); + HDputs(" Should have found the file in tmp_links."); goto error; } @@ -4282,9 +4282,9 @@ error: * Function: external_link_win3 * * Purpose: - * 1. target link: "<cur drive>:tmp/extlinks12" + * 1. target link: "<cur drive>:tmp_links/extlinks12" * 2. main file: "extlinks0" - * 3. target file: "tmp/extlinks12" + * 3. target file: "tmp_links/extlinks12" * Should be able to access the target file directly (abs drive/rel path) * * Return: Success: 0 @@ -4310,16 +4310,16 @@ external_link_win3(hid_t fapl, hbool_t new_format) /* set up name for main file: "extlinks0" */ h5_fixname(FILENAME[12], fapl, filename1, sizeof filename1); - /* create tmp directory */ + /* create tmp_links directory */ if (HDmkdir(TMPDIR, (mode_t)0755) < 0 && errno != EEXIST) TEST_ERROR - /* set up name for target link: "<drive-letter>:tmp/extlinks12" */ + /* set up name for target link: "<drive-letter>:tmp_links/extlinks12" */ drive = HDgetdrive(); HDsnprintf(tmpname, sizeof(tmpname), "%c:%s", (drive+'A'-1), FILENAME[32]); h5_fixname(tmpname, fapl, filename2, sizeof filename2); - /* set up name for target file: "tmp/extlinks12" */ + /* set up name for target file: "tmp_links/extlinks12" */ h5_fixname(FILENAME[32], fapl, filename3, sizeof filename3); /* Create the target file */ @@ -4345,7 +4345,7 @@ external_link_win3(hid_t fapl, hbool_t new_format) /* should be able to find the target file directly */ if (gid < 0) { H5_FAILED(); - HDputs(" Should have found the file in tmp."); + HDputs(" Should have found the file in tmp_links."); goto error; } @@ -4369,8 +4369,8 @@ external_link_win3(hid_t fapl, hbool_t new_format) * * Purpose: * 1. target link: "<cur drive>:extlinks13" - * 2. main file: "<cur-drive>:tmp/extlinks0" - * 3. target file: tmp/extlinks13 + * 2. main file: "<cur-drive>:tmp_links/extlinks0" + * 3. target file: tmp_links/extlinks13 * Should be able to access the target file via main file's abs drive/rel path * * Return: Success: 0 @@ -4393,7 +4393,7 @@ external_link_win4(hid_t fapl, hbool_t new_format) else TESTING("external links via main file's abs drive/rel path (windows)") - /* set up name for main file: "<drive-letter>:tmp/extlinks0" */ + /* set up name for main file: "<drive-letter>:tmp_links/extlinks0" */ drive = HDgetdrive(); HDsnprintf(tmpname, sizeof(tmpname), "%c:%s", (drive+'A'-1), FILENAME[13]); h5_fixname(tmpname, fapl, filename1, sizeof filename1); @@ -4402,7 +4402,7 @@ external_link_win4(hid_t fapl, hbool_t new_format) HDsnprintf(tmpname, sizeof(tmpname), "%c:%s", (drive+'A'-1), FILENAME[33]); h5_fixname(tmpname, fapl, filename2, sizeof filename2); - /* set up name for target file: "tmp/extlinks13" */ + /* set up name for target file: "tmp_links/extlinks13" */ h5_fixname(FILENAME[34], fapl, filename3, sizeof filename3); /* Create the target file */ @@ -4451,9 +4451,9 @@ error: * Function: external_link_win5 * * Purpose: - * 1. target link: "<cur drive+1>:tmp/extlinks14" + * 1. target link: "<cur drive+1>:tmp_links/extlinks14" * 2. main file: "/CWD/extlinks0" - * 3. target file: "tmp/extlinks14" + * 3. target file: "tmp_links/extlinks14" * Should be able to access the target file via main file's relative drive/absolute path * * Return: Success: 0 @@ -4491,11 +4491,11 @@ external_link_win5(hid_t fapl, hbool_t new_format) HDstrcat(tmpname, FILENAME[12]); h5_fixname(tmpname, fapl, filename1, sizeof filename1); - /* set up name for target link: "<drive-letter+1>:tmp/extlinks14" */ + /* set up name for target link: "<drive-letter+1>:tmp_links/extlinks14" */ HDsnprintf(tmpname, sizeof(tmpname), "%c:%s", (drive+'A'-1), FILENAME[35]); h5_fixname(tmpname, fapl, filename2, sizeof filename2); - /* set up name for target file: "tmp/extlinks14" */ + /* set up name for target file: "tmp_links/extlinks14" */ h5_fixname(FILENAME[35], fapl, filename3, sizeof filename3); /* Create the target file */ @@ -4544,9 +4544,9 @@ error: * Function: external_link_win6 * * Purpose: - * 1. target link: "<cur drive+1>:tmp/extlinks15" + * 1. target link: "<cur drive+1>:tmp_links/extlinks15" * 2. main file: "extlinks0" - * 3. target file: "tmp/extlinks15" + * 3. target file: "tmp_links/extlinks15" * Should be able to access the target file via target's current drive/rel path * * Return: Success: 0 @@ -4569,7 +4569,7 @@ external_link_win6(hid_t fapl, hbool_t new_format) else TESTING("external links via target's current drive/rel path (windows)") - /* create tmp directory */ + /* create tmp_links directory */ if (HDmkdir(TMPDIR, (mode_t)0755) < 0 && errno != EEXIST) TEST_ERROR drive = HDgetdrive(); @@ -4581,7 +4581,7 @@ external_link_win6(hid_t fapl, hbool_t new_format) /* set up name for main file: "extlinks0" */ h5_fixname(FILENAME[12], fapl, filename1, sizeof filename1); - /* set up name for target link: "<drive-letter+1>:tmp/extlinks15" */ + /* set up name for target link: "<drive-letter+1>:tmp_links/extlinks15" */ HDsnprintf(tmpname, sizeof(tmpname), "%c:%s", (drive+'A'-1), FILENAME[36]); h5_fixname(tmpname, fapl, filename2, sizeof filename2); @@ -4610,7 +4610,7 @@ external_link_win6(hid_t fapl, hbool_t new_format) /* should be able to find the target file via target file's rel path in current drive */ if (gid < 0) { H5_FAILED(); - HDputs(" Should have found the file in tmp."); + HDputs(" Should have found the file in tmp_links."); goto error; } @@ -4634,7 +4634,7 @@ error: * Function: external_link_win7 * * Purpose: - * 1. UNC target link: "\\127.0.01\c$/tmp/extlinks10" + * 1. UNC target link: "\\127.0.01\c$/tmp_links/extlinks10" * 2. main file: "extlinks0" * 3. target file: "extlinks15" * Should be able to find the target file via main file's local host/main drive/rel path @@ -4665,7 +4665,7 @@ external_link_win7(hid_t fapl, hbool_t new_format) if(NULL == HDgetcwd(cwdpath, (size_t)NAME_BUF_SIZE)) TEST_ERROR - /* set up name for target link: "\\127.0.0.1\c$/tmp/extlinks10" */ + /* set up name for target link: "\\127.0.0.1\c$/tmp_links/extlinks10" */ HDstrcpy(tmpname, "\\\\127.0.0.1\\c$"); /* absolute path */ HDstrcat(tmpname, "/"); HDstrcat(tmpname, FILENAME[30]); @@ -4752,7 +4752,7 @@ external_link_win8(hid_t fapl, hbool_t new_format) if(NULL == HDgetcwd(cwdpath, (size_t)NAME_BUF_SIZE)) TEST_ERROR - /* create tmp directory */ + /* create tmp_links directory */ if(HDmkdir(TMPDIR, (mode_t)0755) < 0 && errno != EEXIST) TEST_ERROR /* set up name for target link: "<drive-letter>:\CWD\extlinks10" */ @@ -4785,7 +4785,7 @@ external_link_win8(hid_t fapl, hbool_t new_format) /* should be able to find the target file directly */ if(gid < 0) { H5_FAILED(); - HDputs(" Should have found the file in tmp."); + HDputs(" Should have found the file in tmp_links."); goto error; } @@ -4809,7 +4809,7 @@ error: * Function: external_link_win9 * * Purpose: - * 1. Long UNC target link: "\\?\UNC\127.0.01\c$/tmp/extlinks10" + * 1. Long UNC target link: "\\?\UNC\127.0.01\c$/tmp_links/extlinks10" * 2. main file: "extlinks0" * 3. target file: "extlinks15" * Should be able to find the target file via main file's local host/main drive/rel path @@ -4839,7 +4839,7 @@ external_link_win9(hid_t fapl, hbool_t new_format) if(NULL == HDgetcwd(cwdpath, (size_t)NAME_BUF_SIZE)) TEST_ERROR - /* set up name for target link: "\\?\UNC\127.0.0.1\c$/tmp/extlinks10" */ + /* set up name for target link: "\\?\UNC\127.0.0.1\c$/tmp_links/extlinks10" */ HDstrcpy(tmpname, "\\\\?\\UNC\127.0.0.1\\c$"); /* absolute path */ HDstrcat(tmpname, "/"); HDstrcat(tmpname, FILENAME[30]); @@ -6087,7 +6087,7 @@ external_symlink(const char *env_h5_drvr, hid_t fapl, hbool_t new_format) /* set up name for main file: "extlinks21A" */ h5_fixname(FILENAME[45], fapl, filename1, sizeof(filename1)); - /* create tmp directory and get current working directory path */ + /* create tmp_links directory and get current working directory path */ if(HDmkdir(TMPDIR, (mode_t)0755) < 0 && errno != EEXIST) TEST_ERROR if(HDmkdir(TMPDIR2, (mode_t)0755) < 0 && errno != EEXIST) @@ -6097,29 +6097,29 @@ external_symlink(const char *env_h5_drvr, hid_t fapl, hbool_t new_format) /* Set up names for files in the subdirectories */ - /* set up names for file #2 in temporary directory #2: "tmp2/extlinks21B" */ + /* set up names for file #2 in temporary directory #2: "tmp2_links/extlinks21B" */ h5_fixname(FILENAME[46], fapl, filename2a, sizeof(filename2a)); fix_ext_filename(tmpname, cwdpath, FILENAME[46]); h5_fixname(tmpname, fapl, filename2b, sizeof(filename2b)); /* Create symbolic link #1 in temporary directory #1 to file #2 in temporary directory #2 */ - /* (i.e. tmp/sym1.h5 -> <full path to>/tmp2/extlinks21B.h5) */ + /* (i.e. tmp_links/sym1.h5 -> <full path to>/tmp2_links/extlinks21B.h5) */ if(HDsymlink(filename2b, SYMLINK1) < 0 && errno != EEXIST) TEST_ERROR - /* set up name for file #3 in temporary directory #2: "tmp2/extlinks21C" */ + /* set up name for file #3 in temporary directory #2: "tmp2_links/extlinks21C" */ h5_fixname(FILENAME[47], fapl, filename3a, sizeof(filename3a)); h5_fixname(FILENAME[48], fapl, filename3b, sizeof(filename3b)); - /* set up name for file #4 in temporary directory #1: "tmp/extlinks21D" */ + /* set up name for file #4 in temporary directory #1: "tmp_links/extlinks21D" */ h5_fixname(FILENAME[49], fapl, filename4a, sizeof(filename4a)); fix_ext_filename(tmpname, cwdpath, FILENAME[49]); h5_fixname(tmpname, fapl, filename4b, sizeof(filename4b)); /* Create symbolic link #2 in temporary directory #2 to file #4 in temporary directory #1 */ - /* (i.e. tmp2/sym2.h5 -> <full path to>/tmp/extlinks21D.h5) */ + /* (i.e. tmp2_links/sym2.h5 -> <full path to>/tmp_links/extlinks21D.h5) */ if(HDsymlink(filename4b, SYMLINK2) < 0 && errno != EEXIST) TEST_ERROR - /* set up name for file #5 in temporary directory #1: "tmp/extlinks21E" */ + /* set up name for file #5 in temporary directory #1: "tmp_links/extlinks21E" */ h5_fixname(FILENAME[50], fapl, filename5a, sizeof(filename5a)); h5_fixname(FILENAME[51], fapl, filename5b, sizeof(filename5b)); @@ -6132,11 +6132,11 @@ external_symlink(const char *env_h5_drvr, hid_t fapl, hbool_t new_format) /* Close file #1 */ if(H5Fclose(file1) < 0) TEST_ERROR - /* Create file #2 in tmp directory #2 */ + /* Create file #2 in tmp_links directory #2 */ if((file2 = H5Fcreate(filename2a, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR if(H5Fclose(file2) < 0) TEST_ERROR - /* Re-open file #2 in tmp directory through symlink */ + /* Re-open file #2 in tmp_links directory through symlink */ if((file2 = H5Fopen(SYMLINK1, H5F_ACC_RDWR, fapl)) < 0) TEST_ERROR /* Create group in file #2 in temporary directory */ @@ -7108,6 +7108,9 @@ done: ret_value = -1; break; + case H5I_MAP: + /* TODO: Not supported in native file format yet */ + case H5I_UNINIT: case H5I_BADID: case H5I_FILE: @@ -7197,6 +7200,9 @@ done: ret_value = -1; break; + case H5I_MAP: + /* TODO: Not supported in native file format yet */ + case H5I_UNINIT: case H5I_BADID: case H5I_FILE: @@ -9148,7 +9154,7 @@ static size_t link_filter_filter(unsigned int flags, size_t cd_nelmts, if(flags & H5Z_FLAG_REVERSE) { if(link_filter_state != LFS_ENCODED) return 0; link_filter_state = LFS_DECODED; - } + } else { if(link_filter_state < LFS_SET_LOCAL_CALLED) return 0; link_filter_state = LFS_ENCODED; @@ -13931,7 +13937,7 @@ main(void) HDprintf("\n-Testing with minimzed dataset object headers-\n"); dcpl_g = H5Pcreate(H5P_DATASET_CREATE); if (0 > dcpl_g) TEST_ERROR - } + } else { HDprintf("\n-Testing with unminimzed dataset object headers-\n"); dcpl_g = H5P_DEFAULT; @@ -13944,7 +13950,7 @@ main(void) if(new_format) { my_fapl = fapl2; HDprintf("\n--Testing with 'new format'--\n"); - } + } else { my_fapl = fapl; HDprintf("\n--Testing with 'old format'--\n"); @@ -13971,7 +13977,7 @@ main(void) #endif /* H5_NO_DEPRECATED_SYMBOLS */ /* tests for external link */ - /* Test external file cache first, so it sees the default efc setting on the fapl + /* Test external file cache first, so it sees the default efc setting on the fapl */ nerrors += external_file_cache(my_fapl, new_format) < 0 ? 1 : 0; @@ -13981,7 +13987,7 @@ main(void) nerrors += external_link_mult(my_fapl, new_format) < 0 ? 1 : 0; /* This test cannot run with the EFC because the EFC cannot currently - * reopen a cached file with a different intent + * reopen a cached file with a different intent */ nerrors += external_set_elink_acc_flags(env_h5_drvr, my_fapl, new_format) < 0 ? 1 : 0; @@ -14127,7 +14133,7 @@ main(void) HDremove(SYMLINK1); HDremove(SYMLINK2); - /* clean up tmp directory created by external link tests */ + /* clean up tmp_links and tmp2_links directory created by external link tests */ HDrmdir(TMPDIR); HDrmdir(TMPDIR2); diff --git a/test/links_env.c b/test/links_env.c index 0cd690a..dff185c 100644 --- a/test/links_env.c +++ b/test/links_env.c @@ -12,39 +12,39 @@ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* - * Purpose: Tests hard, soft (symbolic) & external links. + * Purpose: Tests hard, soft (symbolic) & external links. */ -#define H5G_FRIEND /*suppress error about including H5Gpkg */ +#define H5G_FRIEND /*suppress error about including H5Gpkg */ #define H5G_TESTING #include "h5test.h" -#include "H5Gpkg.h" /* Groups */ -#include "H5Iprivate.h" /* IDs */ +#include "H5Gpkg.h" /* Groups */ +#include "H5Iprivate.h" /* IDs */ #include "H5Lprivate.h" /* Links */ -#define TMPDIR "tmp/" +#define TMPDIR "tmp_links_env/" #define NAME_BUF_SIZE 1024 const char *FILENAME[] = { - "extlinks_env0", /* 0: main file */ - "extlinks_env1", /* 1: target file */ + "extlinks_env0", /* 0: main file */ + "extlinks_env1", /* 1: target file */ TMPDIR "extlinks_env1", /* 2 */ NULL }; static int external_link_env(hid_t fapl, hbool_t new_format); - + /*------------------------------------------------------------------------- * Function: external_link_env (moved from links.c) * - * Purpose: Verify that the target file is found successfully in "tmp" directory - * via searching the pathnames set in the environment variable HDF5_EXT_PREFIX. - * 1. Target link: "extlinks_env1" - * 2. Main file: "extlinks_env0" - * 3. Target file is created in: "tmp/extlinks_env1" - * 4. The environment variable "HDF5_EXT_PREFIX" is set to ".:tmp" + * Purpose: Verify that the target file is found successfully in "tmp_links_env" directory + * via searching the pathnames set in the environment variable HDF5_EXT_PREFIX. + * 1. Target link: "extlinks_env1" + * 2. Main file: "extlinks_env0" + * 3. Target file is created in: "tmp_links_env/extlinks_env1" + * 4. The environment variable "HDF5_EXT_PREFIX" is set to ".:tmp_links_env" * * Return: Success: 0 * Failure: -1 @@ -59,12 +59,12 @@ static int external_link_env(hid_t fapl, hbool_t new_format); static int external_link_env(hid_t fapl, hbool_t new_format) { - hid_t fid = (-1); /* File ID */ - hid_t gid = (-1); /* Group IDs */ - const char *envval = NULL; /* Pointer to environment variable */ - char filename1[NAME_BUF_SIZE], - filename2[NAME_BUF_SIZE], - filename3[NAME_BUF_SIZE]; /* Holders for filename */ + hid_t fid = (-1); /* File ID */ + hid_t gid = (-1); /* Group IDs */ + const char *envval = NULL; /* Pointer to environment variable */ + char filename1[NAME_BUF_SIZE], + filename2[NAME_BUF_SIZE], + filename3[NAME_BUF_SIZE]; /* Holders for filename */ if(new_format) TESTING("external links via environment variable (w/new group format)") @@ -73,7 +73,7 @@ external_link_env(hid_t fapl, hbool_t new_format) if ((envval = HDgetenv("HDF5_EXT_PREFIX")) == NULL) envval = "nomatch"; - if (HDstrcmp(envval, ".:tmp")) TEST_ERROR + if (HDstrcmp(envval, ".:tmp_links_env")) TEST_ERROR /* Set up name for main file:"extlinks_env0" */ h5_fixname(FILENAME[0], fapl, filename1, sizeof filename1); @@ -81,14 +81,14 @@ external_link_env(hid_t fapl, hbool_t new_format) /* Set up name for external linked target file: "extlinks_env1" */ h5_fixname(FILENAME[1], fapl, filename2, sizeof filename2); - /* Create "tmp" directory */ + /* Create "tmp_links_env" directory */ if(HDmkdir(TMPDIR, (mode_t)0755) < 0 && errno != EEXIST) - TEST_ERROR + TEST_ERROR - /* Set up name (location) for the target file: "tmp/extlinks1" */ + /* Set up name (location) for the target file: "tmp_links_env/extlinks1" */ h5_fixname(FILENAME[2], fapl, filename3, sizeof filename3); - /* Create the target file in "tmp" directory */ + /* Create the target file in "tmp_links_env" directory */ if((fid=H5Fcreate(filename3, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR if((gid=H5Gcreate2(fid, "A", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR @@ -110,9 +110,9 @@ external_link_env(hid_t fapl, hbool_t new_format) /* Should be able to find the target file from pathnames set via HDF5_EXT_PREFIX */ if (gid < 0) { - H5_FAILED(); - puts(" Should have found the file in tmp directory."); - goto error; + H5_FAILED(); + puts(" Should have found the file in tmp_links_env directory."); + goto error; } /* closing for main file */ @@ -124,30 +124,30 @@ external_link_env(hid_t fapl, hbool_t new_format) error: H5E_BEGIN_TRY { - H5Gclose (gid); - H5Fclose (fid); + H5Gclose (gid); + H5Fclose (fid); } H5E_END_TRY; return -1; } /* end external_link_env() */ - + /*------------------------------------------------------------------------- - * Function: main + * Function: main * - * Purpose: Test external link with environment variable HDF5_EXT_PREFIX + * Purpose: Test external link with environment variable HDF5_EXT_PREFIX * - * Return: Success: exit(EXIT_SUCCESS) - * Failure: exit(EXIT_FAILURE) + * Return: Success: exit(EXIT_SUCCESS) + * Failure: exit(EXIT_FAILURE) * - * Programmer: Vailin Choi; Nov 2010 + * Programmer: Vailin Choi; Nov 2010 * *------------------------------------------------------------------------- */ int main(void) { - hid_t fapl; /* File access property lists */ - int nerrors = 0; /* Error from tests */ + hid_t fapl; /* File access property lists */ + int nerrors = 0; /* Error from tests */ h5_reset(); fapl = h5_fileaccess(); @@ -172,7 +172,7 @@ main(void) } HDprintf("All external Link (HDF5_EXT_PREFIX) tests passed.\n"); - /* clean up tmp directory created by external link tests */ + /* clean up tmp_links_env directory created by external link tests */ HDrmdir(TMPDIR); return 0; diff --git a/test/objcopy.c b/test/objcopy.c index 47a1065..489d6dd 100644 --- a/test/objcopy.c +++ b/test/objcopy.c @@ -1080,6 +1080,9 @@ compare_data(hid_t parent1, hid_t parent2, hid_t pid, hid_t tid, size_t nelmts, if(H5Tequal(obj1_id, obj2_id) != TRUE) TEST_ERROR break; + case H5O_TYPE_MAP: + /* Maps not supported in native VOL connector */ + case H5O_TYPE_UNKNOWN: case H5O_TYPE_NTYPES: default: @@ -1138,6 +1141,9 @@ compare_data(hid_t parent1, hid_t parent2, hid_t pid, hid_t tid, size_t nelmts, if(H5Tequal(obj1_id, obj2_id) != TRUE) TEST_ERROR break; + case H5O_TYPE_MAP: + /* Maps not supported in native VOL connector */ + case H5O_TYPE_UNKNOWN: case H5O_TYPE_NTYPES: default: @@ -1454,10 +1460,13 @@ compare_groups(hid_t gid, hid_t gid2, hid_t pid, int depth, unsigned copy_flags) if(H5Tequal(oid, oid2) != TRUE) TEST_ERROR break; + case H5O_TYPE_MAP: + HDassert(0 && "maps not supported in native VOL connector"); + case H5O_TYPE_UNKNOWN: case H5O_TYPE_NTYPES: default: -HDassert(0 && "Unknown type of object"); + HDassert(0 && "Unknown type of object"); break; } /* end switch */ diff --git a/test/ros3.c b/test/ros3.c index 60d3932..6d58af0 100644 --- a/test/ros3.c +++ b/test/ros3.c @@ -11,7 +11,7 @@ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* - * Read-Only S3 Virtual File Driver (VFD) + * Read-Only S3 Virtual File Driver (VFD) * * Purpose: * @@ -32,6 +32,9 @@ +/* only include the testing macros if needed */ +#ifdef H5_HAVE_ROS3_VFD + /***************************************************************************** * * FILE-LOCAL TESTING MACROS @@ -368,15 +371,16 @@ if (strcmp((actual), (expected)) != 0) { \ #endif /* ifdef/else JSVERIFY_EXP_ACT */ +#endif /* H5_HAVE_ROS3_VFD */ + /******************************** * OTHER MACROS AND DEFINITIONS * ********************************/ -/* copied from src/ros3.c - */ +#ifdef H5_HAVE_ROS3_VFD + #define MAXADDR (((haddr_t)1<<(8*sizeof(HDoff_t)-1))-1) -#ifdef H5_HAVE_ROS3_VFD #define S3_TEST_PROFILE_NAME "ros3_vfd_test" #define S3_TEST_MAX_URL_SIZE 256 @@ -440,6 +444,15 @@ H5FD_ros3_fapl_t anonymous_fa = { static int test_fapl_config_validation(void) { +#ifndef H5_HAVE_ROS3_VFD + TESTING("ROS3 fapl configuration validation"); + SKIPPED(); + puts(" ROS3 VFD not enabled"); + fflush(stdout); + return 0; + +#else /* H5_HAVE_ROS3_VFD defined */ + /********************* * test-local macros * *********************/ @@ -458,7 +471,6 @@ test_fapl_config_validation(void) * test-local variables * ************************/ -#ifdef H5_HAVE_ROS3_VFD hid_t fapl_id = -1; /* file access property list ID */ H5FD_ros3_fapl_t config; H5FD_ros3_fapl_t fa_fetch; @@ -544,21 +556,12 @@ test_fapl_config_validation(void) }, }; -#endif /* H5_HAVE_ROS3_VFD */ - TESTING("ROS3 fapl configuration validation"); /********* * TESTS * *********/ -#ifndef H5_HAVE_ROS3_VFD - SKIPPED(); - puts(" ROS3 VFD not enabled"); - fflush(stdout); - return 0; -#else - if (FALSE == s3_test_bucket_defined) { SKIPPED(); puts(" environment variable HDF5_ROS3_TEST_BUCKET_URL not defined"); @@ -655,7 +658,7 @@ error: * Purpose: Tests the file handle interface for the ROS3 driver * * As the ROS3 driver is 1) read only, 2) requires access - * to an S3 server (minio for now), this test is quite + * to an S3 server, this test is quite * different from the other tests. * * For now, test only fapl & flags. Extend as the @@ -675,11 +678,19 @@ error: static int test_ros3_fapl(void) { +#ifndef H5_HAVE_ROS3_VFD + TESTING("ROS3 fapl "); + SKIPPED(); + puts(" ROS3 VFD not enabled"); + fflush(stdout); + return 0; + +#else /* H5_HAVE_ROS3 defined */ + /************************ * test-local variables * ************************/ -#ifdef H5_HAVE_ROS3_VFD hid_t fapl_id = -1; /* file access property list ID */ hid_t driver_id = -1; /* ID for this VFD */ unsigned long driver_flags = 0; /* VFD feature flags */ @@ -690,16 +701,9 @@ test_ros3_fapl(void) "", /* secret_id */ "plugh", /* secret_key */ }; -#endif /* H5_HAVE_ROS3_VFD */ TESTING("ROS3 fapl "); -#ifndef H5_HAVE_ROS3_VFD - SKIPPED(); - puts(" ROS3 VFD not enabled"); - fflush(stdout); - return 0; -#else /* Set property list and file name for ROS3 driver. */ fapl_id = H5Pcreate(H5P_FILE_ACCESS); @@ -759,11 +763,19 @@ error: static int test_vfd_open(void) { +#ifndef H5_HAVE_ROS3_VFD + TESTING("ROS3 VFD-level open"); + SKIPPED(); + puts(" ROS3 VFD not enabled"); + fflush(stdout); + return 0; + +#else /* H5_HAVE_ROS3_VFD defined */ + /********************* * test-local macros * *********************/ -#ifdef H5_HAVE_ROS3_VFD #define FAPL_H5P_DEFAULT -2 #define FAPL_FILE_ACCESS -3 @@ -853,17 +865,9 @@ test_vfd_open(void) hid_t fapl_file_access = -1; unsigned i = 0; unsigned tests_count = 10; -#endif /* H5_HAVE_ROS3_VFD */ TESTING("ROS3 VFD-level open"); -#ifndef H5_HAVE_ROS3_VFD - SKIPPED(); - puts(" ROS3 VFD not enabled"); - fflush(stdout); - return 0; -#else - if (FALSE == s3_test_bucket_defined) { SKIPPED(); puts(" environment variable HDF5_ROS3_TEST_BUCKET_URL not defined"); @@ -989,6 +993,15 @@ error: static int test_eof_eoa(void) { +#ifndef H5_HAVE_ROS3_VFD + TESTING("ROS3 eof/eoa gets and sets"); + SKIPPED(); + puts(" ROS3 VFD not enabled"); + fflush(stdout); + return 0; + +#else /* H5_HAVE_ROS3_VFD defined */ + /********************* * test-local macros * *********************/ @@ -1001,20 +1014,12 @@ test_eof_eoa(void) * test-local variables * ************************/ -#ifdef H5_HAVE_ROS3_VFD H5FD_t *fd_shakespeare = NULL; hbool_t curl_ready = FALSE; hid_t fapl_id = -1; -#endif /* H5_HAVE_ROS3_VFD */ TESTING("ROS3 eof/eoa gets and sets"); -#ifndef H5_HAVE_ROS3_VFD - SKIPPED(); - puts(" ROS3 VFD not enabled"); - fflush(stdout); - return 0; -#else if (s3_test_credentials_loaded == 0) { SKIPPED(); puts(" s3 credentials are not loaded"); @@ -1136,21 +1141,22 @@ error: static int test_H5FDread_without_eoa_set_fails(void) { -#ifdef H5_HAVE_ROS3_VFD +#ifndef H5_HAVE_ROS3_VFD + TESTING("ROS3 VFD read-eoa temporal coupling library limitation "); + SKIPPED(); + puts(" ROS3 VFD not enabled"); + fflush(stdout); + return 0; + +#else /* H5_HAVE_ROS3_VFD defined */ + char buffer[256]; unsigned int i = 0; H5FD_t *file_shakespeare = NULL; hid_t fapl_id = -1; -#endif /* H5_HAVE_ROS3_VFD */ TESTING("ROS3 VFD read-eoa temporal coupling library limitation "); -#ifndef H5_HAVE_ROS3_VFD - SKIPPED(); - puts(" ROS3 VFD not enabled"); - fflush(stdout); - return 0; -#else if (s3_test_credentials_loaded == 0) { SKIPPED(); puts(" s3 credentials are not loaded"); @@ -1256,6 +1262,15 @@ error: static int test_read(void) { +#ifndef H5_HAVE_ROS3_VFD + TESTING("ROS3 VFD read/range-gets"); + SKIPPED(); + puts(" ROS3 VFD not enabled"); + fflush(stdout); + return 0; + +#else /* H5_HAVE_ROS3_VFD defined */ + /********************* * test-local macros * *********************/ @@ -1275,7 +1290,6 @@ test_read(void) /************************ * test-local variables * ************************/ -#ifdef H5_HAVE_ROS3_VFD struct testcase cases[] = { { "successful range-get", 6464, @@ -1328,16 +1342,9 @@ test_read(void) unsigned int i = 0; H5FD_t *file_raven = NULL; hid_t fapl_id = -1; -#endif /* H5_HAVE_ROS3_VFD */ TESTING("ROS3 VFD read/range-gets"); -#ifndef H5_HAVE_ROS3_VFD - SKIPPED(); - puts(" ROS3 VFD not enabled"); - fflush(stdout); - return 0; -#else if (s3_test_credentials_loaded == 0) { SKIPPED(); puts(" s3 credentials are not loaded"); @@ -1471,6 +1478,15 @@ error: static int test_noops_and_autofails(void) { +#ifndef H5_HAVE_ROS3_VFD + TESTING("ROS3 VFD always-fail and no-op routines"); + SKIPPED(); + puts(" ROS3 VFD not enabled"); + fflush(stdout); + return 0; + +#else + /********************* * test-local macros * *********************/ @@ -1483,21 +1499,13 @@ test_noops_and_autofails(void) * test-local variables * ************************/ -#ifdef H5_HAVE_ROS3_VFD hbool_t curl_ready = FALSE; hid_t fapl_id = -1; H5FD_t *file = NULL; const char data[36] = "The Force shall be with you, always"; -#endif /* H5_HAVE_ROS3_VFD */ TESTING("ROS3 VFD always-fail and no-op routines"); -#ifndef H5_HAVE_ROS3_VFD - SKIPPED(); - puts(" ROS3 VFD not enabled"); - fflush(stdout); - return 0; -#else if (FALSE == s3_test_bucket_defined) { SKIPPED(); @@ -1624,6 +1632,15 @@ error: static int test_cmp(void) { +#ifndef H5_HAVE_ROS3_VFD + TESTING("ROS3 cmp (comparison)"); + SKIPPED(); + puts(" ROS3 VFD not enabled"); + fflush(stdout); + return 0; + +#else + /********************* * test-local macros * *********************/ @@ -1636,22 +1653,14 @@ test_cmp(void) * test-local variables * ************************/ -#ifdef H5_HAVE_ROS3_VFD H5FD_t *fd_raven = NULL; H5FD_t *fd_shakes = NULL; H5FD_t *fd_raven_2 = NULL; hbool_t curl_ready = FALSE; hid_t fapl_id = -1; -#endif /* H5_HAVE_ROS3_VFD */ TESTING("ROS3 cmp (comparison)"); -#ifndef H5_HAVE_ROS3_VFD - SKIPPED(); - puts(" ROS3 VFD not enabled"); - fflush(stdout); - return 0; -#else if (s3_test_credentials_loaded == 0) { SKIPPED(); puts(" s3 credentials are not loaded"); @@ -1767,6 +1776,15 @@ error: static int test_H5F_integration(void) { +#ifndef H5_HAVE_ROS3_VFD + TESTING("S3 file access through HD5F library (H5F API)"); + SKIPPED(); + puts(" ROS3 VFD not enabled"); + fflush(stdout); + return 0; + +#else + /********************* * test-local macros * *********************/ @@ -1779,19 +1797,11 @@ test_H5F_integration(void) * test-local variables * ************************/ -#ifdef H5_HAVE_ROS3_VFD hid_t file = -1; hid_t fapl_id = -1; -#endif /* H5_HAVE_ROS3_VFD */ TESTING("S3 file access through HD5F library (H5F API)"); -#ifndef H5_HAVE_ROS3_VFD - SKIPPED(); - puts(" ROS3 VFD not enabled"); - fflush(stdout); - return 0; -#else if (s3_test_credentials_loaded == 0) { SKIPPED(); puts(" s3 credentials are not loaded"); diff --git a/test/s3comms.c b/test/s3comms.c index a797e04..d636550 100644 --- a/test/s3comms.c +++ b/test/s3comms.c @@ -11,7 +11,7 @@ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* - * Read-Only S3 Virtual File Driver (VFD) + * Read-Only S3 Virtual File Driver (VFD) * * Purpose: Unit tests for the S3 Communications (s3comms) module. * @@ -386,7 +386,7 @@ static hbool_t s3_test_bucket_defined = FALSE; #endif /* H5_HAVE_ROS3_VFD */ - + /*--------------------------------------------------------------------------- * * Function: test_macro_format_credential() @@ -408,7 +408,6 @@ test_macro_format_credential(void) * test-local variables * ************************/ -#ifdef H5_HAVE_ROS3_VFD char dest[256]; const char access[] = "AKIAIOSFODNN7EXAMPLE"; const char date[] = "20130524"; @@ -416,16 +415,9 @@ test_macro_format_credential(void) const char service[] = "s3"; const char expected[] = "AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request"; -#endif /* H5_HAVE_ROS3_VFD */ TESTING("test_macro_format_credential"); -#ifndef H5_HAVE_ROS3_VFD - SKIPPED(); - puts(" ROS3 VFD is not enabled"); - fflush(stdout); - return 0; -#else FAIL_IF( S3COMMS_MAX_CREDENTIAL_SIZE < S3COMMS_FORMAT_CREDENTIAL(dest, access, date, region, service) ) @@ -433,14 +425,13 @@ test_macro_format_credential(void) PASSED(); return 0; -#endif /* H5_HAVE_ROS3_VFD */ error: return -1; -} /* test_macro_format_credential */ - +} /* end test_macro_format_credential() */ + /*--------------------------------------------------------------------------- * * Function: test_aws_canonical_request() @@ -465,7 +456,6 @@ test_aws_canonical_request(void) * test-local structures * *************************/ -#ifdef H5_HAVE_ROS3_VFD struct header { const char *name; const char *value; @@ -520,16 +510,9 @@ test_aws_canonical_request(void) hrb_node_t *node = NULL; /* http headers list pointer */ unsigned int n_cases = 3; char sh_dest[64]; /* signed headers */ -#endif /* H5_HAVE_ROS3_VFD */ TESTING("test_aws_canonical_request"); -#ifndef H5_HAVE_ROS3_VFD - SKIPPED(); - puts(" ROS3 VFD is not enabled"); - fflush(stdout); - return 0; -#else for (i = 0; i < n_cases; i++) { /* pre-test bookkeeping */ @@ -559,16 +542,22 @@ test_aws_canonical_request(void) /* test */ JSVERIFY( SUCCEED, - H5FD_s3comms_aws_canonical_request(cr_dest, sh_dest, hrb), + H5FD_s3comms_aws_canonical_request( + cr_dest, + 512, + sh_dest, + 64, + hrb), " unable to compose canonical request" ) JSVERIFY_STR( C->exp_headers, sh_dest, NULL ) JSVERIFY_STR( C->exp_request, cr_dest, NULL ) /* tear-down */ - while (node != NULL) + while (node != NULL) { FAIL_IF( FAIL == H5FD_s3comms_hrb_node_set(&node, node->name, NULL)); + } HDassert(NULL == node); FAIL_IF( FAIL == H5FD_s3comms_hrb_destroy(&hrb)); HDassert(NULL == hrb); @@ -581,14 +570,29 @@ test_aws_canonical_request(void) /* malformed hrb and/or node-list */ - JSVERIFY( FAIL, H5FD_s3comms_aws_canonical_request(cr_dest, sh_dest, NULL), + JSVERIFY( FAIL, H5FD_s3comms_aws_canonical_request( + cr_dest, + 20, + sh_dest, + 20, + NULL), "http request object cannot be null" ) hrb = H5FD_s3comms_hrb_init_request("GET", "/", "HTTP/1.1"); - JSVERIFY( FAIL, H5FD_s3comms_aws_canonical_request(NULL, sh_dest, hrb), + JSVERIFY( FAIL, H5FD_s3comms_aws_canonical_request( + NULL, + 20, + sh_dest, + 20, + hrb), "canonical request destination cannot be NULL" ) - JSVERIFY( FAIL, H5FD_s3comms_aws_canonical_request(cr_dest, NULL, hrb), + JSVERIFY( FAIL, H5FD_s3comms_aws_canonical_request( + cr_dest, + 20, + NULL, + 20, + hrb), "signed headers destination cannot be null" ) FAIL_IF( FAIL == H5FD_s3comms_hrb_destroy(&hrb) ) @@ -604,15 +608,15 @@ error: (void)H5FD_s3comms_hrb_node_set(&node, node->name, NULL); HDassert( node == NULL ); } - if (hrb != NULL) + if (hrb != NULL) { (void)H5FD_s3comms_hrb_destroy(&hrb); + } return -1; -#endif /* H5_HAVE_ROS3_VFD */ - -} /* test_aws_canonical_request */ +} /* end test_aws_canonical_request() */ + /*--------------------------------------------------------------------------- * * Function: test_bytes_to_hex @@ -706,9 +710,9 @@ test_bytes_to_hex(void) error: return -1; -} /* test_bytes_to_hex */ - +} /* end test_bytes_to_hex() */ + /*--------------------------------------------------------------------------- * * Function: test_hrb_init_request() @@ -725,7 +729,6 @@ error: static herr_t test_hrb_init_request(void) { -#ifdef H5_HAVE_ROS3_VFD /********************* * test-local macros * *********************/ @@ -769,7 +772,7 @@ test_hrb_init_request(void) "HTTP/1.1", FALSE, }, - { "slash prepented to resource path, if necessary", + { "slash prepended to resource path, if necessary", NULL, "MYPATH/MYFILE.tiff", "/MYPATH/MYFILE.tiff", @@ -788,29 +791,25 @@ test_hrb_init_request(void) unsigned int i = 0; unsigned int ncases = 5; hrb_t *req = NULL; -#endif /* H5_HAVE_ROS3_VFD */ TESTING("hrb_init_request"); -#ifndef H5_HAVE_ROS3_VFD - SKIPPED(); - puts(" ROS3 VFD is not enabled"); - fflush(stdout); - return 0; -#else for (i = 0; i < ncases; i++) { C = &cases[i]; - req = H5FD_s3comms_hrb_init_request(C->verb, - C->resource, - C->version); + req = H5FD_s3comms_hrb_init_request( + C->verb, + C->resource, + C->version); if (cases[i].ret_null == TRUE) { FAIL_IF( req != NULL ); - } else { + } + else { FAIL_IF( req == NULL ); JSVERIFY( S3COMMS_HRB_MAGIC, req->magic, NULL ) if (C->verb == NULL) { JSVERIFY_STR( "GET", req->verb, NULL ) - } else { + } + else { JSVERIFY_STR( req->verb, C->verb, NULL ) } JSVERIFY_STR( "HTTP/1.1", req->version, NULL ) @@ -823,7 +822,7 @@ test_hrb_init_request(void) FAIL_IF( NULL != req ); /* should annull pointer as well as free */ } - } /* for each testcase */ + } /* end for each testcase */ PASSED(); return 0; @@ -832,11 +831,10 @@ error: (void)H5FD_s3comms_hrb_destroy(&req); return -1; -#endif /* H5_HAVE_ROS3_VFD */ - -} /* test_hrb_init_request */ +} /* end test_hrb_init_request() */ + /*--------------------------------------------------------------------------- * * Function: test_hrb_node_set() @@ -853,7 +851,6 @@ error: static herr_t test_hrb_node_set(void) { -#ifdef H5_HAVE_ROS3_VFD /************************* * test-local structures * *************************/ @@ -1071,18 +1068,10 @@ test_hrb_node_set(void) }; unsigned testcases_count = 16; unsigned test_i = 0; - hrb_node_t *list = NULL; -#endif /* H5_HAVE_ROS3_VFD */ - TESTING("test_hrb_node_t"); + TESTING("hrb_node_t (test_hrb_node_set)"); -#ifndef H5_HAVE_ROS3_VFD - SKIPPED(); - puts(" ROS3 VFD is not enabled"); - fflush(stdout); - return 0; -#else for (test_i = 0; test_i < testcases_count; test_i++) { const hrb_node_t *node = NULL; const testcase *test = &(cases[test_i]); @@ -1137,21 +1126,22 @@ test_hrb_node_set(void) FAIL_IF( SUCCEED != H5FD_s3comms_hrb_node_set(&list, list->name, NULL) ) } - } + } /* end for each testcase */ PASSED(); return 0; error: - while (list != NULL) + while (list != NULL) { (void)H5FD_s3comms_hrb_node_set(&list, list->name, NULL); + } return -1; -#endif /* H5_HAVE_ROS3_VFD */ -} /* test_hrb_node_t */ +} /* end test_hrb_node_t() */ + /*--------------------------------------------------------------------------- * * Function: test_HMAC_SHA256() @@ -1265,13 +1255,13 @@ test_HMAC_SHA256(void) dest); TEST_ERROR; } -#else +#else /* VERBOSE not defined */ /* simple pass/fail test */ JSVERIFY( 0, strncmp(cases[i].exp, dest, HDstrlen(cases[i].exp)), NULL); -#endif +#endif /* VERBOSE */ } free(dest); } @@ -1284,9 +1274,9 @@ error: return -1; #endif /* H5_HAVE_ROS3_VFD */ -} /* test_HMAC_SHA256 */ - +} /* end test_HMAC_SHA256() */ + /*---------------------------------------------------------------------------- * * Function: test_nlowercase() @@ -1307,7 +1297,6 @@ test_nlowercase(void) * test-local structures * *************************/ -#ifdef H5_HAVE_ROS3_VFD struct testcase { const char *in; size_t len; @@ -1338,16 +1327,9 @@ test_nlowercase(void) char *dest = NULL; int i = 0; int n_cases = 3; -#endif /* H5_HAVE_ROS3_VFD */ TESTING("nlowercase"); -#ifndef H5_HAVE_ROS3_VFD - SKIPPED(); - puts(" ROS3 VFD is not enabled"); - fflush(stdout); - return 0; -#else for (i = 0; i < n_cases; i++) { dest = (char *)HDmalloc(sizeof(char) * 16); @@ -1360,7 +1342,7 @@ test_nlowercase(void) JSVERIFY( 0, strncmp(dest, cases[i].exp, cases[i].len), NULL ) } free(dest); - } + } /* end for each testcase */ JSVERIFY( FAIL, H5FD_s3comms_nlowercase(NULL, @@ -1374,11 +1356,10 @@ test_nlowercase(void) error: free(dest); return -1; -#endif /* H5_HAVE_ROS3_VFD */ - -} /* test_nlowercase */ +} /* end test_nlowercase() */ + /*--------------------------------------------------------------------------- * * Function: test_parse_url() @@ -1399,7 +1380,6 @@ test_parse_url(void) * test-local structures * *************************/ -#ifdef H5_HAVE_ROS3_VFD typedef struct { const char *scheme; const char *host; @@ -1540,16 +1520,9 @@ test_parse_url(void) "non-decimal PORT (01a3)", }, }; -#endif /* H5_HAVE_ROS3_VFD */ TESTING("url-parsing functionality"); -#ifndef H5_HAVE_ROS3_VFD - SKIPPED(); - puts(" ROS3 VFD is not enabled"); - fflush(stdout); - return 0; -#else /********* * TESTS * *********/ @@ -1564,7 +1537,8 @@ test_parse_url(void) if (cases[i].exp_ret == FAIL) { /* on FAIL, `purl` should be untouched--remains NULL */ FAIL_UNLESS( purl == NULL ) - } else { + } + else { /* on SUCCEED, `purl` should be set */ FAIL_IF( purl == NULL ) @@ -1612,7 +1586,7 @@ test_parse_url(void) } else { FAIL_UNLESS( NULL == purl->query ) } - } /* if parse-url return SUCCEED/FAIL */ + } /* end if parse-url return SUCCEED/FAIL */ /* per-test cleanup * well-behaved, even if `purl` is NULL @@ -1620,7 +1594,7 @@ test_parse_url(void) FAIL_IF( FAIL == H5FD_s3comms_free_purl(purl) ) purl = NULL; - } /* for each testcase */ + } /* end for each testcase */ PASSED(); return 0; @@ -1632,11 +1606,10 @@ error: (void)H5FD_s3comms_free_purl(purl); return -1; -#endif /* H5_HAVE_ROS3_VFD */ - -} /* test_parse_url */ +} /* end test_parse_url() */ + /*--------------------------------------------------------------------------- * * Function: test_percent_encode_char() @@ -1662,7 +1635,6 @@ test_percent_encode_char(void) * test-local structures * *************************/ -#ifdef H5_HAVE_ROS3_VFD struct testcase { const char c; const char *exp; @@ -1692,16 +1664,9 @@ test_percent_encode_char(void) size_t dest_len = 0; int i = 0; int n_cases = 5; -#endif /* H5_HAVE_ROS3_VFD */ TESTING("percent encode characters"); -#ifndef H5_HAVE_ROS3_VFD - SKIPPED(); - puts(" ROS3 VFD is not enabled"); - fflush(stdout); - return 0; -#else for (i = 0; i < n_cases; i++) { JSVERIFY( SUCCEED, H5FD_s3comms_percent_encode_char( @@ -1726,11 +1691,9 @@ test_percent_encode_char(void) error: return -1; -#endif /* H5_HAVE_ROS3_VFD */ - -} /* test_percent_encode_char */ - +} /* end test_percent_encode_char() */ + /*--------------------------------------------------------------------------- * Function: test_s3r_open() * @@ -1798,9 +1761,9 @@ error: return -1; #endif /* H5_HAVE_ROS3_VFD */ -} /* test_s3r_get_filesize */ - +} /* end test_s3r_get_filesize() */ + /*--------------------------------------------------------------------------- * Function: test_s3r_open() * @@ -2039,9 +2002,9 @@ error: return -1; #endif /* H5_HAVE_ROS3_VFD */ -} /* test_s3r_open */ - +} /* end test_s3r_open() */ + /*--------------------------------------------------------------------------- * * Function: test_s3r_read() @@ -2265,7 +2228,7 @@ error: #undef S3COMMS_TEST_BUFFER_SIZE #endif /* H5_HAVE_ROS3_VFD */ -} /* test_s3r_read */ +} /* end test_s3r_read() */ /*--------------------------------------------------------------------------- @@ -2404,9 +2367,9 @@ error: return -1; #endif /* H5_HAVE_ROS3_VFD */ -} /* test_signing_key */ - +} /* end test_signing_key() */ + /*--------------------------------------------------------------------------- * * Function: test_tostringtosign() @@ -2476,9 +2439,9 @@ error : return -1; #endif /* H5_HAVE_ROS3_VFD */ -} /* test_tostringtosign */ - +} /* end test_tostringtosign() */ + /*---------------------------------------------------------------------------- * * Function: test_trim() @@ -2563,7 +2526,7 @@ test_trim(void) } free(str); str = NULL; - } + } /* end for each testcase */ JSVERIFY( SUCCEED, H5FD_s3comms_trim(dest, NULL, 3, &dest_len), "should not fail when trimming a null string" ); @@ -2582,13 +2545,14 @@ test_trim(void) return 0; error: - if (str != NULL) + if (str != NULL) { free(str); + } return -1; -} /* test_trim */ - +} /* end test_trim() */ + /*---------------------------------------------------------------------------- * * Function: test_uriencode() @@ -2685,7 +2649,7 @@ test_uriencode(void) free(dest); dest = NULL; - } + } /* end for each testcase */ /*************** * ERROR CASES * @@ -2713,11 +2677,11 @@ error: } return -1; -} /* test_uriencode */ - +} /* end test_uriencode() */ + /*------------------------------------------------------------------------- * Function: main() * @@ -2774,7 +2738,8 @@ main(void) if (bucket_url_env == NULL || bucket_url_env[0] == '\0') { HDprintf("WARNING: S3 bucket url is not defined in enviornment " \ "variable 'HDF5_ROS3_TEST_BUCKET_URL'!\n"); - } else { + } + else { HDstrncpy(s3_test_bucket_url, bucket_url_env, S3_TEST_MAX_URL_SIZE); s3_test_bucket_defined = TRUE; } @@ -2799,12 +2764,12 @@ main(void) nerrors += test_s3r_get_filesize() < 0 ? 1 : 0; nerrors += test_s3r_read() < 0 ? 1 : 0; - if(nerrors) { + if (nerrors) { HDprintf("***** %d S3comms TEST%s FAILED! *****\n", nerrors, nerrors > 1 ? "S" : ""); return 1; - } /* end if */ + } HDprintf("All S3comms tests passed.\n"); diff --git a/test/testfiles/err_compat_2 b/test/testfiles/err_compat_2 index 75e8769..467ba4c 100644 --- a/test/testfiles/err_compat_2 +++ b/test/testfiles/err_compat_2 @@ -1 +1 @@ -Test skipped because backward compatbility with v1.6 is NOT configured in +Test skipped because backward compatibility with v1.6 is NOT configured in diff --git a/test/testfiles/error_test_2 b/test/testfiles/error_test_2 index 6852f6f..85bc2e7 100644 --- a/test/testfiles/error_test_2 +++ b/test/testfiles/error_test_2 @@ -1 +1 @@ -Test skipped because backward compatbility with v1.6 is configured in +Test skipped because backward compatibility with v1.6 is configured in diff --git a/test/testlinks_env.sh.in b/test/testlinks_env.sh.in index 94e6c7e..3d6b3ce 100644 --- a/test/testlinks_env.sh.in +++ b/test/testlinks_env.sh.in @@ -19,15 +19,15 @@ nerrors=0 ############################################################################## ############################################################################## -### T H E T E S T S ### +### T H E T E S T S ### ############################################################################## ############################################################################## # test for external links with HDF5_EXT_PREFIX echo "Testing external link with HDF5_EXT_PREFIX" -TEST_NAME=links_env # The test name -TEST_BIN=`pwd`/$TEST_NAME # The path of the test binary -ENVCMD="env HDF5_EXT_PREFIX=.:tmp" # The environment variable & value +TEST_NAME=links_env # The test name +TEST_BIN=`pwd`/$TEST_NAME # The path of the test binary +ENVCMD="env HDF5_EXT_PREFIX=.:tmp_links_env" # The environment variable & value # # Run the test echo "$ENVCMD $RUNSERIAL $TEST_BIN" @@ -36,7 +36,7 @@ exitcode=$? if [ $exitcode -eq 0 ]; then echo "Test for HDF5_EXT_PREFIX PASSED" else - nerrors="`expr $nerrors + 1`" - echo "***Error encountered for HDF5_EXT_PREFIX test***" + nerrors="`expr $nerrors + 1`" + echo "***Error encountered for HDF5_EXT_PREFIX test***" fi exit $nerrors diff --git a/test/testvds_env.sh.in b/test/testvds_env.sh.in index 894e52e..e9a27da 100644 --- a/test/testvds_env.sh.in +++ b/test/testvds_env.sh.in @@ -19,7 +19,7 @@ nerrors=0 ############################################################################## ############################################################################## -### T H E T E S T S ### +### T H E T E S T S ### ############################################################################## ############################################################################## @@ -27,7 +27,7 @@ nerrors=0 echo "Testing basic virtual dataset I/O via H5Pset_vds_prefix(): all selection with ENV prefix" TEST_NAME=vds_env # The test name TEST_BIN=`pwd`/$TEST_NAME # The path of the test binary -ENVCMD="env HDF5_VDS_PREFIX=\${ORIGIN}/tmp" # Set the environment variable & value +ENVCMD="env HDF5_VDS_PREFIX=\${ORIGIN}/tmp_vds_env" # Set the environment variable & value UNENVCMD="unset HDF5_VDS_PREFIX" # Unset the environment variable & value # # Run the test @@ -37,8 +37,8 @@ exitcode=$? if [ $exitcode -eq 0 ]; then echo "Test prefix for HDF5_VDS_PREFIX PASSED" else - nerrors="`expr $nerrors + 1`" - echo "***Error encountered for HDF5_VDS_PREFIX test***" + nerrors="`expr $nerrors + 1`" + echo "***Error encountered for HDF5_VDS_PREFIX test***" fi $UNENVCMD exit $nerrors diff --git a/test/tfile.c b/test/tfile.c index 9e17c34..0fc391e 100644 --- a/test/tfile.c +++ b/test/tfile.c @@ -1434,6 +1434,9 @@ test_obj_count_and_id(hid_t fid1, hid_t fid2, hid_t did, hid_t gid1, VERIFY(oid_list[i], did, "H5Fget_obj_ids"); break; + case H5I_MAP: + /* TODO: Not supported in native VOL connector yet */ + case H5I_UNINIT: case H5I_BADID: case H5I_DATATYPE: @@ -55,7 +55,7 @@ const char *FILENAME[] = { #define FILENAME_BUF_SIZE 1024 -#define TMPDIR "tmp/" +#define TMPDIR "tmp_vds/" /*------------------------------------------------------------------------- diff --git a/test/vds_env.c b/test/vds_env.c index b2ca9d0..19b2d96 100644 --- a/test/vds_env.c +++ b/test/vds_env.c @@ -34,7 +34,7 @@ const char *FILENAME[] = { #define FILENAME_BUF_SIZE 1024 -#define TMPDIR "tmp/" +#define TMPDIR "tmp_vds_env/" /*------------------------------------------------------------------------- * Function: test_vds_prefix_second diff --git a/testpar/t_chunk_alloc.c b/testpar/t_chunk_alloc.c index 2340ae0..bfa0bfe 100644 --- a/testpar/t_chunk_alloc.c +++ b/testpar/t_chunk_alloc.c @@ -20,23 +20,23 @@ */ #include "testphdf5.h" -static int mpi_size, mpi_rank; +static int mpi_size, mpi_rank; #define DSET_NAME "ExtendibleArray" -#define CHUNK_SIZE 1000 /* #elements per chunk */ -#define CHUNK_FACTOR 200 /* default dataset size in terms of chunks */ +#define CHUNK_SIZE 1000 /* #elements per chunk */ +#define CHUNK_FACTOR 200 /* default dataset size in terms of chunks */ #define CLOSE 1 #define NO_CLOSE 0 static MPI_Offset get_filesize(const char *filename) { - int mpierr; - MPI_File fd; - MPI_Offset filesize; + int mpierr; + MPI_File fd; + MPI_Offset filesize; mpierr = MPI_File_open(MPI_COMM_SELF, filename, MPI_MODE_RDONLY, - MPI_INFO_NULL, &fd); + MPI_INFO_NULL, &fd); VRFY((mpierr == MPI_SUCCESS), ""); mpierr = MPI_File_get_size(fd, &filesize); @@ -85,8 +85,8 @@ create_chunked_dataset(const char *filename, int chunk_factor, write_type write_ long nchunks; herr_t hrc; - MPI_Offset filesize, /* actual file size */ - est_filesize; /* estimated file size */ + MPI_Offset filesize, /* actual file size */ + est_filesize; /* estimated file size */ /* set up MPI parameters */ MPI_Comm_size(MPI_COMM_WORLD,&mpi_size); @@ -95,34 +95,33 @@ create_chunked_dataset(const char *filename, int chunk_factor, write_type write_ /* Only MAINPROCESS should create the file. Others just wait. */ if (MAINPROCESS){ nchunks=chunk_factor*mpi_size; - dims[0]=nchunks*CHUNK_SIZE; - /* Create the data space with unlimited dimensions. */ - dataspace = H5Screate_simple (1, dims, maxdims); - VRFY((dataspace >= 0), ""); + dims[0]=nchunks*CHUNK_SIZE; + /* Create the data space with unlimited dimensions. */ + dataspace = H5Screate_simple (1, dims, maxdims); + VRFY((dataspace >= 0), ""); - memspace = H5Screate_simple(1, chunk_dims, NULL); - VRFY((memspace >= 0), ""); + memspace = H5Screate_simple(1, chunk_dims, NULL); + VRFY((memspace >= 0), ""); - /* Create a new file. If file exists its contents will be overwritten. */ - file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, - H5P_DEFAULT); - VRFY((file_id >= 0), "H5Fcreate"); + /* Create a new file. If file exists its contents will be overwritten. */ + file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + VRFY((file_id >= 0), "H5Fcreate"); - /* Modify dataset creation properties, i.e. enable chunking */ - cparms = H5Pcreate(H5P_DATASET_CREATE); - VRFY((cparms >= 0), ""); + /* Modify dataset creation properties, i.e. enable chunking */ + cparms = H5Pcreate(H5P_DATASET_CREATE); + VRFY((cparms >= 0), ""); - hrc = H5Pset_alloc_time(cparms, H5D_ALLOC_TIME_EARLY); - VRFY((hrc >= 0), ""); + hrc = H5Pset_alloc_time(cparms, H5D_ALLOC_TIME_EARLY); + VRFY((hrc >= 0), ""); - hrc = H5Pset_chunk(cparms, 1, chunk_dims); - VRFY((hrc >= 0), ""); + hrc = H5Pset_chunk(cparms, 1, chunk_dims); + VRFY((hrc >= 0), ""); - /* Create a new dataset within the file using cparms creation properties. */ - dataset = H5Dcreate2(file_id, DSET_NAME, H5T_NATIVE_UCHAR, dataspace, H5P_DEFAULT, cparms, H5P_DEFAULT); - VRFY((dataset >= 0), ""); + /* Create a new dataset within the file using cparms creation properties. */ + dataset = H5Dcreate2(file_id, DSET_NAME, H5T_NATIVE_UCHAR, dataspace, H5P_DEFAULT, cparms, H5P_DEFAULT); + VRFY((dataset >= 0), ""); - if(write_pattern == sec_last) { + if(write_pattern == sec_last) { HDmemset(buffer, 100, CHUNK_SIZE); count[0] = 1; @@ -138,28 +137,28 @@ create_chunked_dataset(const char *filename, int chunk_factor, write_type write_ VRFY((hrc >= 0), "H5Dwrite"); } /* end if */ - /* Close resources */ - hrc = H5Dclose (dataset); - VRFY((hrc >= 0), ""); - dataset = -1; + /* Close resources */ + hrc = H5Dclose (dataset); + VRFY((hrc >= 0), ""); + dataset = -1; - hrc = H5Sclose (dataspace); - VRFY((hrc >= 0), ""); + hrc = H5Sclose (dataspace); + VRFY((hrc >= 0), ""); - hrc = H5Sclose (memspace); - VRFY((hrc >= 0), ""); + hrc = H5Sclose (memspace); + VRFY((hrc >= 0), ""); - hrc = H5Pclose (cparms); - VRFY((hrc >= 0), ""); + hrc = H5Pclose (cparms); + VRFY((hrc >= 0), ""); - hrc = H5Fclose (file_id); - VRFY((hrc >= 0), ""); - file_id = -1; + hrc = H5Fclose (file_id); + VRFY((hrc >= 0), ""); + file_id = -1; - /* verify file size */ - filesize = get_filesize(filename); - est_filesize = nchunks * CHUNK_SIZE * sizeof(unsigned char); - VRFY((filesize >= est_filesize), "file size check"); + /* verify file size */ + filesize = get_filesize(filename); + est_filesize = nchunks * CHUNK_SIZE * sizeof(unsigned char); + VRFY((filesize >= est_filesize), "file size check"); } @@ -200,8 +199,8 @@ parallel_access_dataset(const char *filename, int chunk_factor, access_type acti int i; long nchunks; /* MPI Gubbins */ - MPI_Offset filesize, /* actual file size */ - est_filesize; /* estimated file size */ + MPI_Offset filesize, /* actual file size */ + est_filesize; /* estimated file size */ /* Initialize MPI */ MPI_Comm_size(MPI_COMM_WORLD,&mpi_size); @@ -241,19 +240,19 @@ parallel_access_dataset(const char *filename, int chunk_factor, access_type acti /* all chunks are written by all the processes in an interleaved way*/ case write_all: - memset(buffer, mpi_rank+1, CHUNK_SIZE); - count[0] = 1; - stride[0] = 1; - block[0] = chunk_dims[0]; - for (i=0; i<nchunks/mpi_size; i++){ - offset[0] = (i*mpi_size+mpi_rank)*chunk_dims[0]; + HDmemset(buffer, mpi_rank+1, CHUNK_SIZE); + count[0] = 1; + stride[0] = 1; + block[0] = chunk_dims[0]; + for (i=0; i<nchunks/mpi_size; i++) { + offset[0] = (i*mpi_size+mpi_rank)*chunk_dims[0]; - hrc = H5Sselect_hyperslab(dataspace, H5S_SELECT_SET, offset, stride, count, block); - VRFY((hrc >= 0), ""); + hrc = H5Sselect_hyperslab(dataspace, H5S_SELECT_SET, offset, stride, count, block); + VRFY((hrc >= 0), ""); - /* Write the buffer out */ - hrc = H5Dwrite(*dataset, H5T_NATIVE_UCHAR, memspace, dataspace, H5P_DEFAULT, buffer); - VRFY((hrc >= 0), "H5Dwrite"); + /* Write the buffer out */ + hrc = H5Dwrite(*dataset, H5T_NATIVE_UCHAR, memspace, dataspace, H5P_DEFAULT, buffer); + VRFY((hrc >= 0), "H5Dwrite"); } break; @@ -318,7 +317,7 @@ parallel_access_dataset(const char *filename, int chunk_factor, access_type acti * interleaved pattern. */ static void -verify_data(const char *filename, int chunk_factor, write_type write_pattern, int vclose, +verify_data(const char *filename, int chunk_factor, write_type write_pattern, int vclose, hid_t *file_id, hid_t *dataset) { /* HDF5 gubbins */ @@ -372,8 +371,8 @@ verify_data(const char *filename, int chunk_factor, write_type write_pattern, in stride[0] = 1; block[0] = chunk_dims[0]; for (i=0; i<nchunks; i++){ - /* reset buffer values */ - memset(buffer, -1, CHUNK_SIZE); + /* reset buffer values */ + HDmemset(buffer, -1, CHUNK_SIZE); offset[0] = i*chunk_dims[0]; @@ -385,22 +384,22 @@ verify_data(const char *filename, int chunk_factor, write_type write_pattern, in VRFY((hrc >= 0), "H5Dread"); /* set expected value according the write pattern */ - switch (write_pattern) { - case all: - value = i%mpi_size + 1; - break; - case none: - value = 0; - break; - case sec_last: - if (i==nchunks-2) - value = 100; - else - value = 0; + switch (write_pattern) { + case all: + value = i%mpi_size + 1; + break; + case none: + value = 0; + break; + case sec_last: + if (i==nchunks-2) + value = 100; + else + value = 0; break; default: HDassert(0); - } + } /* verify content of the chunk */ for (index_l = 0; index_l < CHUNK_SIZE; index_l++) @@ -408,10 +407,10 @@ verify_data(const char *filename, int chunk_factor, write_type write_pattern, in } hrc = H5Sclose (dataspace); - VRFY((hrc >= 0), ""); + VRFY((hrc >= 0), ""); - hrc = H5Sclose (memspace); - VRFY((hrc >= 0), ""); + hrc = H5Sclose (memspace); + VRFY((hrc >= 0), ""); /* Can close some plists */ hrc = H5Pclose(access_plist); @@ -469,7 +468,7 @@ test_chunk_alloc(void) filename = (const char*)GetTestParameters(); if (VERBOSE_MED) - printf("Extend Chunked allocation test on file %s\n", filename); + HDprintf("Extend Chunked allocation test on file %s\n", filename); /* Case 1 */ /* Create chunked dataset without writing anything.*/ diff --git a/testpar/testphdf5.c b/testpar/testphdf5.c index e1ccbed..b89c790 100644 --- a/testpar/testphdf5.c +++ b/testpar/testphdf5.c @@ -29,7 +29,7 @@ int chunkdim1; int nerrors = 0; /* errors count */ int ndatasets = 300; /* number of datasets to create*/ int ngroups = 512; /* number of groups to create in root - * group. */ + * group. */ int facc_type = FACC_MPIO; /*Test file access type */ int dxfer_coll_type = DXFER_COLLECTIVE_IO; @@ -79,15 +79,15 @@ void pause_proc(void) MPI_Get_processor_name(mpi_name, &mpi_namelen); if (MAINPROCESS) - while ((HDstat(greenlight, &statbuf) == -1) && loops < maxloop){ - if (!loops++){ - printf("Proc %d (%*s, %d): to debug, attach %d\n", - mpi_rank, mpi_namelen, mpi_name, pid, pid); - } - printf("waiting(%ds) for file %s ...\n", time_int, greenlight); - fflush(stdout); + while ((HDstat(greenlight, &statbuf) == -1) && loops < maxloop){ + if (!loops++){ + HDprintf("Proc %d (%*s, %d): to debug, attach %d\n", + mpi_rank, mpi_namelen, mpi_name, pid, pid); + } + HDprintf("waiting(%ds) for file %s ...\n", time_int, greenlight); + HDfflush(stdout); HDsleep(time_int); - } + } MPI_Barrier(MPI_COMM_WORLD); } @@ -108,18 +108,18 @@ int MPI_Init(int *argc, char ***argv) static void usage(void) { - printf(" [-r] [-w] [-m<n_datasets>] [-n<n_groups>] " - "[-o] [-f <prefix>] [-d <dim0> <dim1>]\n"); - printf("\t-m<n_datasets>" - "\tset number of datasets for the multiple dataset test\n"); - printf("\t-n<n_groups>" - "\tset number of groups for the multiple group test\n"); - printf("\t-f <prefix>\tfilename prefix\n"); - printf("\t-2\t\tuse Split-file together with MPIO\n"); - printf("\t-d <factor0> <factor1>\tdataset dimensions factors. Defaults (%d,%d)\n", - ROW_FACTOR, COL_FACTOR); - printf("\t-c <dim0> <dim1>\tdataset chunk dimensions. Defaults (dim0/10,dim1/10)\n"); - printf("\n"); + HDprintf(" [-r] [-w] [-m<n_datasets>] [-n<n_groups>] " + "[-o] [-f <prefix>] [-d <dim0> <dim1>]\n"); + HDprintf("\t-m<n_datasets>" + "\tset number of datasets for the multiple dataset test\n"); + HDprintf("\t-n<n_groups>" + "\tset number of groups for the multiple group test\n"); + HDprintf("\t-f <prefix>\tfilename prefix\n"); + HDprintf("\t-2\t\tuse Split-file together with MPIO\n"); + HDprintf("\t-d <factor0> <factor1>\tdataset dimensions factors. Defaults (%d,%d)\n", + ROW_FACTOR, COL_FACTOR); + HDprintf("\t-c <dim0> <dim1>\tdataset chunk dimensions. Defaults (dim0/10,dim1/10)\n"); + HDprintf("\n"); } @@ -140,44 +140,44 @@ parse_options(int argc, char **argv) chunkdim1 = (dim1+9)/10; while (--argc){ - if (**(++argv) != '-'){ - break; - }else{ - switch(*(*argv+1)){ - case 'm': ndatasets = atoi((*argv+1)+1); - if (ndatasets < 0){ + if (**(++argv) != '-'){ + break; + }else{ + switch(*(*argv+1)){ + case 'm': ndatasets = atoi((*argv+1)+1); + if (ndatasets < 0){ nerrors++; return(1); - } - break; + } + break; case 'n': ngroups = atoi((*argv+1)+1); - if (ngroups < 0){ - nerrors++; - return(1); - } - break; - case 'f': if (--argc < 1) { + if (ngroups < 0){ nerrors++; return(1); - } - if (**(++argv) == '-') { + } + break; + case 'f': if (--argc < 1) { nerrors++; return(1); - } - paraprefix = *argv; - break; - case 'i': /* Collective MPI-IO access with independent IO */ + } + if (**(++argv) == '-') { + nerrors++; + return(1); + } + paraprefix = *argv; + break; + case 'i': /* Collective MPI-IO access with independent IO */ dxfer_coll_type = DXFER_INDEPENDENT_IO; break; - case '2': /* Use the split-file driver with MPIO access */ + case '2': /* Use the split-file driver with MPIO access */ /* Can use $HDF5_METAPREFIX to define the */ /* meta-file-prefix. */ facc_type = FACC_MPIO | FACC_SPLIT; break; - case 'd': /* dimensizes */ + case 'd': /* dimensizes */ if (--argc < 2){ - nerrors++; - return(1); + nerrors++; + return(1); } dim0 = atoi(*(++argv))*mpi_size; argc--; @@ -186,61 +186,61 @@ parse_options(int argc, char **argv) chunkdim0 = (dim0+9)/10; chunkdim1 = (dim1+9)/10; break; - case 'c': /* chunk dimensions */ + case 'c': /* chunk dimensions */ if (--argc < 2){ - nerrors++; - return(1); + nerrors++; + return(1); } chunkdim0 = atoi(*(++argv)); argc--; chunkdim1 = atoi(*(++argv)); break; - case 'h': /* print help message--return with nerrors set */ - return(1); - default: printf("Illegal option(%s)\n", *argv); - nerrors++; + case 'h': /* print help message--return with nerrors set */ return(1); + default: HDprintf("Illegal option(%s)\n", *argv); + nerrors++; + return(1); + } } - } } /*while*/ /* check validity of dimension and chunk sizes */ if (dim0 <= 0 || dim1 <= 0){ - printf("Illegal dim sizes (%d, %d)\n", dim0, dim1); - nerrors++; - return(1); + HDprintf("Illegal dim sizes (%d, %d)\n", dim0, dim1); + nerrors++; + return(1); } if (chunkdim0 <= 0 || chunkdim1 <= 0){ - printf("Illegal chunkdim sizes (%d, %d)\n", chunkdim0, chunkdim1); - nerrors++; - return(1); + HDprintf("Illegal chunkdim sizes (%d, %d)\n", chunkdim0, chunkdim1); + nerrors++; + return(1); } /* Make sure datasets can be divided into equal portions by the processes */ if ((dim0 % mpi_size) || (dim1 % mpi_size)){ - if (MAINPROCESS) - printf("dim0(%d) and dim1(%d) must be multiples of processes(%d)\n", - dim0, dim1, mpi_size); - nerrors++; - return(1); + if (MAINPROCESS) + HDprintf("dim0(%d) and dim1(%d) must be multiples of processes(%d)\n", + dim0, dim1, mpi_size); + nerrors++; + return(1); } /* compose the test filenames */ { - int i, n; + int i, n; - n = sizeof(FILENAME)/sizeof(FILENAME[0]) - 1; /* exclude the NULL */ + n = sizeof(FILENAME)/sizeof(FILENAME[0]) - 1; /* exclude the NULL */ - for (i=0; i < n; i++) - if (h5_fixname(FILENAME[i],fapl,filenames[i],sizeof(filenames[i])) - == NULL){ - printf("h5_fixname failed\n"); - nerrors++; - return(1); - } - printf("Test filenames are:\n"); - for (i=0; i < n; i++) - printf(" %s\n", filenames[i]); + for (i=0; i < n; i++) + if (h5_fixname(FILENAME[i],fapl,filenames[i],sizeof(filenames[i])) + == NULL){ + HDprintf("h5_fixname failed\n"); + nerrors++; + return(1); + } + HDprintf("Test filenames are:\n"); + for (i=0; i < n; i++) + HDprintf(" %s\n", filenames[i]); } return(0); @@ -264,36 +264,36 @@ create_faccess_plist(MPI_Comm comm, MPI_Info info, int l_facc_type) VRFY((ret_pl >= 0), "H5P_FILE_ACCESS"); if (l_facc_type == FACC_DEFAULT) - return (ret_pl); + return (ret_pl); if (l_facc_type == FACC_MPIO){ - /* set Parallel access with communicator */ - ret = H5Pset_fapl_mpio(ret_pl, comm, info); - VRFY((ret >= 0), ""); + /* set Parallel access with communicator */ + ret = H5Pset_fapl_mpio(ret_pl, comm, info); + VRFY((ret >= 0), ""); ret = H5Pset_all_coll_metadata_ops(ret_pl, TRUE); - VRFY((ret >= 0), ""); + VRFY((ret >= 0), ""); ret = H5Pset_coll_metadata_write(ret_pl, TRUE); - VRFY((ret >= 0), ""); - return(ret_pl); + VRFY((ret >= 0), ""); + return(ret_pl); } if (l_facc_type == (FACC_MPIO | FACC_SPLIT)){ - hid_t mpio_pl; - - mpio_pl = H5Pcreate (H5P_FILE_ACCESS); - VRFY((mpio_pl >= 0), ""); - /* set Parallel access with communicator */ - ret = H5Pset_fapl_mpio(mpio_pl, comm, info); - VRFY((ret >= 0), ""); - - /* setup file access template */ - ret_pl = H5Pcreate (H5P_FILE_ACCESS); - VRFY((ret_pl >= 0), ""); - /* set Parallel access with communicator */ - ret = H5Pset_fapl_split(ret_pl, ".meta", mpio_pl, ".raw", mpio_pl); - VRFY((ret >= 0), "H5Pset_fapl_split succeeded"); - H5Pclose(mpio_pl); - return(ret_pl); + hid_t mpio_pl; + + mpio_pl = H5Pcreate (H5P_FILE_ACCESS); + VRFY((mpio_pl >= 0), ""); + /* set Parallel access with communicator */ + ret = H5Pset_fapl_mpio(mpio_pl, comm, info); + VRFY((ret >= 0), ""); + + /* setup file access template */ + ret_pl = H5Pcreate (H5P_FILE_ACCESS); + VRFY((ret_pl >= 0), ""); + /* set Parallel access with communicator */ + ret = H5Pset_fapl_split(ret_pl, ".meta", mpio_pl, ".raw", mpio_pl); + VRFY((ret >= 0), "H5Pset_fapl_split succeeded"); + H5Pclose(mpio_pl); + return(ret_pl); } /* unknown file access types */ @@ -323,18 +323,18 @@ int main(int argc, char **argv) dim1 = COL_FACTOR*mpi_size; if (MAINPROCESS){ - printf("===================================\n"); - printf("PHDF5 TESTS START\n"); - printf("===================================\n"); + HDprintf("===================================\n"); + HDprintf("PHDF5 TESTS START\n"); + HDprintf("===================================\n"); } /* Attempt to turn off atexit post processing so that in case errors - * happen during the test and the process is aborted, it will not get - * hang in the atexit post processing in which it may try to make MPI - * calls. By then, MPI calls may not work. - */ + * happen during the test and the process is aborted, it will not get + * hang in the atexit post processing in which it may try to make MPI + * calls. By then, MPI calls may not work. + */ if (H5dont_atexit() < 0){ - printf("Failed to turn off atexit processing. Continue.\n"); + HDprintf("Failed to turn off atexit processing. Continue.\n"); }; H5open(); h5_show_hostname(); @@ -344,10 +344,10 @@ int main(int argc, char **argv) /* Tests are generally arranged from least to most complexity... */ AddTest("mpiodup", test_fapl_mpio_dup, NULL, - "fapl_mpio duplicate", NULL); + "fapl_mpio duplicate", NULL); AddTest("split", test_split_comm_access, NULL, - "dataset using split communicators", PARATESTFILE); + "dataset using split communicators", PARATESTFILE); #ifdef PB_OUT /* temporary: disable page buffering when parallel */ AddTest("page_buffer", test_page_buffer_access, NULL, @@ -355,57 +355,57 @@ int main(int argc, char **argv) #endif AddTest("props", test_file_properties, NULL, - "Coll Metadata file property settings", PARATESTFILE); + "Coll Metadata file property settings", PARATESTFILE); AddTest("idsetw", dataset_writeInd, NULL, - "dataset independent write", PARATESTFILE); + "dataset independent write", PARATESTFILE); AddTest("idsetr", dataset_readInd, NULL, - "dataset independent read", PARATESTFILE); + "dataset independent read", PARATESTFILE); AddTest("cdsetw", dataset_writeAll, NULL, - "dataset collective write", PARATESTFILE); + "dataset collective write", PARATESTFILE); AddTest("cdsetr", dataset_readAll, NULL, - "dataset collective read", PARATESTFILE); + "dataset collective read", PARATESTFILE); AddTest("eidsetw", extend_writeInd, NULL, - "extendible dataset independent write", PARATESTFILE); + "extendible dataset independent write", PARATESTFILE); AddTest("eidsetr", extend_readInd, NULL, - "extendible dataset independent read", PARATESTFILE); + "extendible dataset independent read", PARATESTFILE); AddTest("ecdsetw", extend_writeAll, NULL, - "extendible dataset collective write", PARATESTFILE); + "extendible dataset collective write", PARATESTFILE); AddTest("ecdsetr", extend_readAll, NULL, - "extendible dataset collective read", PARATESTFILE); + "extendible dataset collective read", PARATESTFILE); AddTest("eidsetw2", extend_writeInd2, NULL, - "extendible dataset independent write #2", PARATESTFILE); + "extendible dataset independent write #2", PARATESTFILE); AddTest("selnone", none_selection_chunk, NULL, "chunked dataset with none-selection", PARATESTFILE); AddTest("calloc", test_chunk_alloc, NULL, "parallel extend Chunked allocation on serial file", PARATESTFILE); AddTest("fltread", test_filter_read, NULL, - "parallel read of dataset written serially with filters", PARATESTFILE); + "parallel read of dataset written serially with filters", PARATESTFILE); #ifdef H5_HAVE_FILTER_DEFLATE AddTest("cmpdsetr", compress_readAll, NULL, - "compressed dataset collective read", PARATESTFILE); + "compressed dataset collective read", PARATESTFILE); #endif /* H5_HAVE_FILTER_DEFLATE */ AddTest("zerodsetr", zero_dim_dset, NULL, - "zero dim dset", PARATESTFILE); + "zero dim dset", PARATESTFILE); ndsets_params.name = PARATESTFILE; ndsets_params.count = ndatasets; AddTest("ndsetw", multiple_dset_write, NULL, - "multiple datasets write", &ndsets_params); + "multiple datasets write", &ndsets_params); ngroups_params.name = PARATESTFILE; ngroups_params.count = ngroups; AddTest("ngrpw", multiple_group_write, NULL, - "multiple groups write", &ngroups_params); + "multiple groups write", &ngroups_params); AddTest("ngrpr", multiple_group_read, NULL, - "multiple groups read", &ngroups_params); + "multiple groups read", &ngroups_params); AddTest("compact", compact_dataset, NULL, - "compact dataset test", PARATESTFILE); + "compact dataset test", PARATESTFILE); collngroups_params.name = PARATESTFILE; collngroups_params.count = ngroups; @@ -417,79 +417,79 @@ int main(int argc, char **argv) AddTest("bigdset", big_dataset, NULL, "big dataset test", PARATESTFILE); #else - printf("big dataset test will be skipped on Windows (JIRA HDDFV-8064)\n"); + HDprintf("big dataset test will be skipped on Windows (JIRA HDDFV-8064)\n"); #endif AddTest("fill", dataset_fillvalue, NULL, - "dataset fill value", PARATESTFILE); + "dataset fill value", PARATESTFILE); AddTest("cchunk1", - coll_chunk1,NULL, "simple collective chunk io",PARATESTFILE); + coll_chunk1,NULL, "simple collective chunk io",PARATESTFILE); AddTest("cchunk2", - coll_chunk2,NULL, "noncontiguous collective chunk io",PARATESTFILE); + coll_chunk2,NULL, "noncontiguous collective chunk io",PARATESTFILE); AddTest("cchunk3", - coll_chunk3,NULL, "multi-chunk collective chunk io",PARATESTFILE); + coll_chunk3,NULL, "multi-chunk collective chunk io",PARATESTFILE); AddTest("cchunk4", - coll_chunk4,NULL, "collective chunk io with partial non-selection ",PARATESTFILE); + coll_chunk4,NULL, "collective chunk io with partial non-selection ",PARATESTFILE); if((mpi_size < 3)&& MAINPROCESS ) { - printf("Collective chunk IO optimization APIs "); - printf("needs at least 3 processes to participate\n"); - printf("Collective chunk IO API tests will be skipped \n"); + HDprintf("Collective chunk IO optimization APIs "); + HDprintf("needs at least 3 processes to participate\n"); + HDprintf("Collective chunk IO API tests will be skipped \n"); } AddTest((mpi_size <3)? "-cchunk5":"cchunk5" , - coll_chunk5,NULL, - "linked chunk collective IO without optimization",PARATESTFILE); + coll_chunk5,NULL, + "linked chunk collective IO without optimization",PARATESTFILE); AddTest((mpi_size < 3)? "-cchunk6" : "cchunk6", - coll_chunk6,NULL, - "multi-chunk collective IO with direct request",PARATESTFILE); + coll_chunk6,NULL, + "multi-chunk collective IO with direct request",PARATESTFILE); AddTest((mpi_size < 3)? "-cchunk7" : "cchunk7", - coll_chunk7,NULL, - "linked chunk collective IO with optimization",PARATESTFILE); + coll_chunk7,NULL, + "linked chunk collective IO with optimization",PARATESTFILE); AddTest((mpi_size < 3)? "-cchunk8" : "cchunk8", - coll_chunk8,NULL, - "linked chunk collective IO transferring to multi-chunk",PARATESTFILE); + coll_chunk8,NULL, + "linked chunk collective IO transferring to multi-chunk",PARATESTFILE); AddTest((mpi_size < 3)? "-cchunk9" : "cchunk9", - coll_chunk9,NULL, - "multiple chunk collective IO with optimization",PARATESTFILE); + coll_chunk9,NULL, + "multiple chunk collective IO with optimization",PARATESTFILE); AddTest((mpi_size < 3)? "-cchunk10" : "cchunk10", - coll_chunk10,NULL, - "multiple chunk collective IO transferring to independent IO",PARATESTFILE); + coll_chunk10,NULL, + "multiple chunk collective IO transferring to independent IO",PARATESTFILE); -/* irregular collective IO tests*/ + /* irregular collective IO tests*/ AddTest("ccontw", - coll_irregular_cont_write,NULL, - "collective irregular contiguous write",PARATESTFILE); + coll_irregular_cont_write,NULL, + "collective irregular contiguous write",PARATESTFILE); AddTest("ccontr", - coll_irregular_cont_read,NULL, - "collective irregular contiguous read",PARATESTFILE); + coll_irregular_cont_read,NULL, + "collective irregular contiguous read",PARATESTFILE); AddTest("cschunkw", - coll_irregular_simple_chunk_write,NULL, - "collective irregular simple chunk write",PARATESTFILE); + coll_irregular_simple_chunk_write,NULL, + "collective irregular simple chunk write",PARATESTFILE); AddTest("cschunkr", - coll_irregular_simple_chunk_read,NULL, - "collective irregular simple chunk read",PARATESTFILE); + coll_irregular_simple_chunk_read,NULL, + "collective irregular simple chunk read",PARATESTFILE); AddTest("ccchunkw", - coll_irregular_complex_chunk_write,NULL, - "collective irregular complex chunk write",PARATESTFILE); + coll_irregular_complex_chunk_write,NULL, + "collective irregular complex chunk write",PARATESTFILE); AddTest("ccchunkr", - coll_irregular_complex_chunk_read,NULL, - "collective irregular complex chunk read",PARATESTFILE); + coll_irregular_complex_chunk_read,NULL, + "collective irregular complex chunk read",PARATESTFILE); AddTest("null", null_dataset, NULL, - "null dataset test", PARATESTFILE); + "null dataset test", PARATESTFILE); io_mode_confusion_params.name = PARATESTFILE; io_mode_confusion_params.count = 0; /* value not used */ AddTest("I/Omodeconf", io_mode_confusion, NULL, - "I/O mode confusion test -- hangs quickly on failure", + "I/O mode confusion test -- hangs quickly on failure", &io_mode_confusion_params); if((mpi_size < 3) && MAINPROCESS) { - printf("rr_obj_hdr_flush_confusion test needs at least 3 processes.\n"); - printf("rr_obj_hdr_flush_confusion test will be skipped \n"); + HDprintf("rr_obj_hdr_flush_confusion test needs at least 3 processes.\n"); + HDprintf("rr_obj_hdr_flush_confusion test will be skipped \n"); } if(mpi_size > 2) { rr_obj_flush_confusion_params.name = PARATESTFILE; @@ -523,21 +523,21 @@ int main(int argc, char **argv) PARATESTFILE); AddTest("edpl", test_plist_ed, NULL, - "encode/decode Property Lists", NULL); + "encode/decode Property Lists", NULL); if((mpi_size < 2) && MAINPROCESS) { - printf("File Image Ops daisy chain test needs at least 2 processes.\n"); - printf("File Image Ops daisy chain test will be skipped \n"); + HDprintf("File Image Ops daisy chain test needs at least 2 processes.\n"); + HDprintf("File Image Ops daisy chain test will be skipped \n"); } AddTest((mpi_size < 2)? "-fiodc" : "fiodc", file_image_daisy_chain_test, NULL, "file image ops daisy chain", NULL); if((mpi_size < 2)&& MAINPROCESS ) { - printf("Atomicity tests need at least 2 processes to participate\n"); - printf("8 is more recommended.. Atomicity tests will be skipped \n"); + HDprintf("Atomicity tests need at least 2 processes to participate\n"); + HDprintf("8 is more recommended.. Atomicity tests will be skipped \n"); } else if (facc_type != FACC_MPIO && MAINPROCESS) { - printf("Atomicity tests will not work with a non MPIO VFD\n"); + HDprintf("Atomicity tests will not work with a non MPIO VFD\n"); } else if(mpi_size >= 2 && facc_type == FACC_MPIO){ AddTest("atomicity", dataset_atomicity, NULL, @@ -545,7 +545,7 @@ int main(int argc, char **argv) } AddTest("denseattr", test_dense_attr, NULL, - "Store Dense Attributes", PARATESTFILE); + "Store Dense Attributes", PARATESTFILE); AddTest("noselcollmdread", test_partial_no_selection_coll_md_read, NULL, "Collective Metadata read with some ranks having no selection", PARATESTFILE); @@ -565,9 +565,9 @@ int main(int argc, char **argv) TestParseCmdLine(argc, argv); if (dxfer_coll_type == DXFER_INDEPENDENT_IO && MAINPROCESS){ - printf("===================================\n" - " Using Independent I/O with file set view to replace collective I/O \n" - "===================================\n"); + HDprintf("===================================\n" + " Using Independent I/O with file set view to replace collective I/O \n" + "===================================\n"); } @@ -575,8 +575,8 @@ int main(int argc, char **argv) PerformTests(); /* make sure all processes are finished before final report, cleanup - * and exit. - */ + * and exit. + */ MPI_Barrier(MPI_COMM_WORLD); /* Display test summary, if requested */ @@ -592,16 +592,16 @@ int main(int argc, char **argv) { int temp; MPI_Allreduce(&nerrors, &temp, 1, MPI_INT, MPI_MAX, MPI_COMM_WORLD); - nerrors=temp; + nerrors=temp; } if (MAINPROCESS){ /* only process 0 reports */ - printf("===================================\n"); - if (nerrors) - printf("***PHDF5 tests detected %d errors***\n", nerrors); - else - printf("PHDF5 tests finished with no errors\n"); - printf("===================================\n"); + HDprintf("===================================\n"); + if (nerrors) + HDprintf("***PHDF5 tests detected %d errors***\n", nerrors); + else + HDprintf("PHDF5 tests finished with no errors\n"); + HDprintf("===================================\n"); } /* close HDF5 library */ diff --git a/tools/lib/h5tools_str.c b/tools/lib/h5tools_str.c index 17e3f18..5921609 100644 --- a/tools/lib/h5tools_str.c +++ b/tools/lib/h5tools_str.c @@ -1140,6 +1140,7 @@ h5tools_str_sprint(h5tools_str_t *str, const h5tool_format_t *info, hid_t contai h5tools_str_append(str, H5_TOOLS_DATATYPE); break; + case H5O_TYPE_MAP: case H5O_TYPE_UNKNOWN: case H5O_TYPE_NTYPES: default: diff --git a/tools/lib/h5tools_utils.c b/tools/lib/h5tools_utils.c index a3cd7d9..e140fff 100644 --- a/tools/lib/h5tools_utils.c +++ b/tools/lib/h5tools_utils.c @@ -763,6 +763,7 @@ find_objs_cb(const char *name, const H5O_info_t *oinfo, const char *already_seen } /* end if */ break; + case H5O_TYPE_MAP: case H5O_TYPE_UNKNOWN: case H5O_TYPE_NTYPES: default: diff --git a/tools/lib/h5trav.c b/tools/lib/h5trav.c index 5519437..78240db 100644 --- a/tools/lib/h5trav.c +++ b/tools/lib/h5trav.c @@ -914,6 +914,7 @@ trav_print_visit_obj(const char *path, const H5O_info_t *oinfo, printf(" %-10s %s", "datatype", path); break; + case H5O_TYPE_MAP: case H5O_TYPE_UNKNOWN: case H5O_TYPE_NTYPES: default: diff --git a/tools/src/h5dump/h5dump.c b/tools/src/h5dump/h5dump.c index 347c189..5df701a 100644 --- a/tools/src/h5dump/h5dump.c +++ b/tools/src/h5dump/h5dump.c @@ -24,6 +24,7 @@ static int doxml = 0; static int useschema = 1; static const char *xml_dtd_uri = NULL; +#ifdef H5_HAVE_ROS3_VFD static H5FD_ros3_fapl_t ros3_fa = { 1, /* version */ false, /* authenticate */ @@ -31,7 +32,9 @@ static H5FD_ros3_fapl_t ros3_fa = { "", /* access key id */ "", /* secret access key */ }; +#endif /* H5_HAVE_ROS3_VFD */ +#ifdef H5_HAVE_LIBHDFS static H5FD_hdfs_fapl_t hdfs_fa = { 1, /* fapl version */ "localhost", /* namenode name */ @@ -40,6 +43,7 @@ static H5FD_hdfs_fapl_t hdfs_fa = { "", /* user name */ 2048, /* stream buffer size */ }; +#endif /* H5_HAVE_LIBHDFS */ /* module-scoped variables for XML option */ #define DEFAULT_XSD "http://www.hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd" diff --git a/tools/src/h5dump/h5dump_ddl.c b/tools/src/h5dump/h5dump_ddl.c index 5c47abd..821d2c7 100644 --- a/tools/src/h5dump/h5dump_ddl.c +++ b/tools/src/h5dump/h5dump_ddl.c @@ -393,6 +393,7 @@ dump_all_cb(hid_t group, const char *name, const H5L_info_t *linfo, void H5_ATTR } break; + case H5O_TYPE_MAP: case H5O_TYPE_UNKNOWN: case H5O_TYPE_NTYPES: default: @@ -1404,6 +1405,7 @@ obj_search(const char *path, const H5O_info_t *oi, const char H5_ATTR_UNUSED *al handle_datatypes(handle_data->fid, path, NULL, 0, NULL); break; + case H5O_TYPE_MAP: case H5O_TYPE_UNKNOWN: case H5O_TYPE_NTYPES: default: @@ -2143,6 +2145,7 @@ dump_extlink(hid_t group, const char *linkname, const char *objname) handle_datatypes(group, linkname, NULL, 0, objname); break; + case H5O_TYPE_MAP: case H5O_TYPE_UNKNOWN: case H5O_TYPE_NTYPES: default: diff --git a/tools/src/h5dump/h5dump_xml.c b/tools/src/h5dump/h5dump_xml.c index 2fa9fd0..fc56433 100644 --- a/tools/src/h5dump/h5dump_xml.c +++ b/tools/src/h5dump/h5dump_xml.c @@ -346,6 +346,7 @@ xml_dump_all_cb(hid_t group, const char *name, const H5L_info_t *linfo, void H5_ } break; + case H5O_TYPE_MAP: case H5O_TYPE_UNKNOWN: case H5O_TYPE_NTYPES: default: diff --git a/tools/src/h5ls/h5ls.c b/tools/src/h5ls/h5ls.c index 2364f23..7e2a431 100644 --- a/tools/src/h5ls/h5ls.c +++ b/tools/src/h5ls/h5ls.c @@ -2612,6 +2612,7 @@ main(int argc, const char *argv[]) int err_exit = 0; hid_t fapl_id = H5P_DEFAULT; +#ifdef H5_HAVE_ROS3_VFD /* default "anonymous" s3 configuration */ H5FD_ros3_fapl_t ros3_fa = { 1, /* fapl version */ @@ -2620,7 +2621,9 @@ main(int argc, const char *argv[]) "", /* access key id */ "", /* secret access key */ }; +#endif /* H5_HVAE_ROS3_VFD */ +#ifdef H5_HAVE_LIBHDFS /* "default" HDFS configuration */ H5FD_hdfs_fapl_t hdfs_fa = { 1, /* fapl version */ @@ -2630,6 +2633,7 @@ main(int argc, const char *argv[]) "", /* user name */ 2048, /* stream buffer size */ }; +#endif /* H5_HAVE_LIBHDFS */ h5tools_setprogname(PROGRAMNAME); h5tools_setstatus(EXIT_SUCCESS); diff --git a/tools/src/h5stat/h5stat.c b/tools/src/h5stat/h5stat.c index 5f0452c..75d325a 100644 --- a/tools/src/h5stat/h5stat.c +++ b/tools/src/h5stat/h5stat.c @@ -120,6 +120,7 @@ typedef struct iter_t { static const char *drivername = ""; +#ifdef H5_HAVE_ROS3_VFD /* default "anonymous" s3 configuration */ static H5FD_ros3_fapl_t ros3_fa = { @@ -129,7 +130,9 @@ static H5FD_ros3_fapl_t ros3_fa = { "", /* access key id */ "", /* secret access key */ }; +#endif /* H5_HAVE_ROS3_VFD */ +#ifdef H5_HAVE_LIBHDFS /* default HDFS access configuration */ static H5FD_hdfs_fapl_t hdfs_fa = { @@ -140,6 +143,7 @@ static H5FD_hdfs_fapl_t hdfs_fa = { "", /* user name */ 2048, /* stream buffer size */ }; +#endif /* H5_HAVE_LIBHDFS */ static int display_all = TRUE; @@ -544,8 +548,8 @@ dataset_stats(iter_t *iter, const char *name, const H5O_info_t *oi) HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "attribute_stats() failed"); /* Get storage info */ - if((storage = H5Dget_storage_size(did)) < 0) - HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Dget_storage_size() failed"); + /* Failure 0 indistinguishable from no-data-stored 0 */ + storage = H5Dget_storage_size(did); /* Gather layout statistics */ if((dcpl = H5Dget_create_plist(did)) < 0) @@ -758,6 +762,7 @@ obj_stats(const char *path, const H5O_info_t *oi, const char *already_visited, HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "datatype_stats failed"); break; + case H5O_TYPE_MAP: case H5O_TYPE_UNKNOWN: case H5O_TYPE_NTYPES: default: diff --git a/tools/test/perform/perf.c b/tools/test/perform/perf.c index 1d52471..34b8a2d 100644 --- a/tools/test/perform/perf.c +++ b/tools/test/perform/perf.c @@ -64,13 +64,13 @@ #define H5FATAL 1 #define VRFY(val, mesg, fatal) do { \ if (!val) { \ - printf("Proc %d: ", mynod); \ + printf("Proc %d: ", mynod); \ printf("*** Assertion failed (%s) at line %4d in %s\n", \ - mesg, (int)__LINE__, __FILE__); \ - if (fatal){ \ - fflush(stdout); \ - goto die_jar_jar_die; \ - } \ + mesg, (int)__LINE__, __FILE__); \ + if (fatal){ \ + fflush(stdout); \ + goto die_jar_jar_die; \ + } \ } \ } while(0) #define RANK 1 diff --git a/tools/test/perform/sio_engine.c b/tools/test/perform/sio_engine.c index ed15fa5..aefd2b3 100644 --- a/tools/test/perform/sio_engine.c +++ b/tools/test/perform/sio_engine.c @@ -264,7 +264,7 @@ done: case HDF5: if (fd.h5fd != -1) hrc = do_fclose(iot, &fd); - break; + break; default: /* unknown request */ HDassert(0 && "Unknown IO type"); @@ -685,7 +685,7 @@ dset_write(int local_dim, file_descr *fd, parameters *parms, void *buffer) VRFY((hrc >= 0), "H5Dwrite"); break; - + default: /* unknown request */ HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)parms->io_type); @@ -863,7 +863,7 @@ do_read(results *res, file_descr *fd, parameters *parms, void *buffer) GOTOERROR(FAIL); } break; - + default: /* unknown request */ HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)parms->io_type); @@ -987,7 +987,7 @@ dset_read(int local_dim, file_descr *fd, parameters *parms, void *buffer, h5dset_space_id, h5dxpl, buffer); VRFY((hrc >= 0), "H5Dread"); break; - + default: /* unknown request */ HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)parms->io_type); @@ -1114,7 +1114,7 @@ do_fopen(parameters *param, char *fname, file_descr *fd /*out*/, int flags) GOTOERROR(FAIL); } break; - + default: /* unknown request */ HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)param->io_type); @@ -1242,7 +1242,7 @@ do_fclose(iotype iot, file_descr *fd /*out*/) fd->h5fd = -1; break; - + default: /* unknown request */ HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)iot); diff --git a/tools/test/perform/sio_perf.c b/tools/test/perform/sio_perf.c index e77b99e..731be47 100644 --- a/tools/test/perform/sio_perf.c +++ b/tools/test/perform/sio_perf.c @@ -98,7 +98,7 @@ static const char *progname = "h5perf_serial"; * It seems that only the options that accept additional information * such as dataset size (-e) require the colon next to it. */ -static const char *s_opts = "a:A:B:b:c:Cd:D:e:F:G:ghi:Imno:p:P:r:stT:v:wx:X:"; +static const char *s_opts = "a:A:B:c:Cd:D:e:F:ghi:Imno:p:P:r:stT:v:wx:X:"; static struct long_options l_opts[] = { { "align", require_arg, 'a' }, { "alig", require_arg, 'a' }, |