From 5655e5a91a538bd2cc885e5927f8ed61ab8e166b Mon Sep 17 00:00:00 2001 From: Dana Robinson Date: Wed, 10 Feb 2016 23:40:10 -0500 Subject: [svn-r29084] Revert of: r29069 and 72 (gheap cleanup) r29041 and 43 (HDFFV-8740 external storage) These cause problems in the daily tests. They will be re-introduced when their respective problems have been addressed. Tested on: 64-bit Ubuntu 15.10 (Linux 4.2.0 x86_64) gcc 5.2.1 autotools serial (check-vfd) w/ Fortran and C++ autotools parallel w/ Fortran CMake serial --- src/H5.c | 3 +- src/H5Defl.c | 172 ++++++------- src/H5Dint.c | 113 +-------- src/H5Dpkg.h | 2 - src/H5Dprivate.h | 1 - src/H5Fquery.c | 2 +- src/H5MM.c | 44 ++-- src/H5Pdapl.c | 384 +--------------------------- src/H5Plapl.c | 3 +- src/H5Ppublic.h | 2 - src/H5private.h | 6 +- src/H5system.c | 129 +--------- src/H5win32defs.h | 23 +- test/Makefile.am | 2 +- test/external.c | 739 +++++++----------------------------------------------- test/gheap.c | 684 +++++++++++++++++++++++--------------------------- 16 files changed, 526 insertions(+), 1783 deletions(-) diff --git a/src/H5.c b/src/H5.c index 41fb3ba..4de5731 100644 --- a/src/H5.c +++ b/src/H5.c @@ -193,8 +193,7 @@ H5_init_library(void) /* Normal library termination code */ (void)HDatexit(H5_term_library); - - H5_dont_atexit_g = TRUE; + H5_dont_atexit_g = TRUE; } /* end if */ /* diff --git a/src/H5Defl.c b/src/H5Defl.c index cf1b36c..ec96ae7 100644 --- a/src/H5Defl.c +++ b/src/H5Defl.c @@ -28,13 +28,12 @@ /***********/ /* Headers */ /***********/ -#include "H5private.h" /* Generic Functions */ -#include "H5Dpkg.h" /* Datasets */ -#include "H5Eprivate.h" /* Error handling */ -#include "H5Fprivate.h" /* Files */ -#include "H5HLprivate.h" /* Local Heaps */ -#include "H5MMprivate.h" /* Memory management */ -#include "H5VMprivate.h" /* Vector and array functions */ +#include "H5private.h" /* Generic Functions */ +#include "H5Dpkg.h" /* Datasets */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5Fprivate.h" /* Files */ +#include "H5HLprivate.h" /* Local Heaps */ +#include "H5VMprivate.h" /* Vector and array functions */ /****************/ @@ -49,14 +48,12 @@ /* Callback info for readvv operation */ typedef struct H5D_efl_readvv_ud_t { const H5O_efl_t *efl; /* Pointer to efl info */ - const H5D_t *dset; /* The dataset */ unsigned char *rbuf; /* Read buffer */ } H5D_efl_readvv_ud_t; /* Callback info for writevv operation */ typedef struct H5D_efl_writevv_ud_t { const H5O_efl_t *efl; /* Pointer to efl info */ - const H5D_t *dset; /* The dataset */ const unsigned char *wbuf; /* Write buffer */ } H5D_efl_writevv_ud_t; @@ -78,9 +75,9 @@ static ssize_t H5D__efl_writevv(const H5D_io_info_t *io_info, size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[]); /* Helper routines */ -static herr_t H5D__efl_read(const H5O_efl_t *efl, const H5D_t *dset, haddr_t addr, size_t size, +static herr_t H5D__efl_read(const H5O_efl_t *efl, haddr_t addr, size_t size, uint8_t *buf); -static herr_t H5D__efl_write(const H5O_efl_t *efl, const H5D_t *dset, haddr_t addr, size_t size, +static herr_t H5D__efl_write(const H5O_efl_t *efl, haddr_t addr, size_t size, const uint8_t *buf); @@ -235,22 +232,25 @@ H5D__efl_io_init(const H5D_io_info_t *io_info, const H5D_type_info_t H5_ATTR_UNU /*------------------------------------------------------------------------- - * Function: H5D__efl_read + * Function: H5D__efl_read * - * Purpose: Reads data from an external file list. It is an error to - * read past the logical end of file, but reading past the end - * of any particular member of the external file list results in - * zeros. + * Purpose: Reads data from an external file list. It is an error to + * read past the logical end of file, but reading past the end + * of any particular member of the external file list results in + * zeros. * - * Return: SUCCEED/FAIL + * Return: Non-negative on success/Negative on failure * - * Programmer: Robb Matzke + * Programmer: Robb Matzke * Wednesday, March 4, 1998 * + * Modifications: + * Robb Matzke, 1999-07-28 + * The ADDR argument is passed by value. *------------------------------------------------------------------------- */ static herr_t -H5D__efl_read(const H5O_efl_t *efl, const H5D_t *dset, haddr_t addr, size_t size, uint8_t *buf) +H5D__efl_read(const H5O_efl_t *efl, haddr_t addr, size_t size, uint8_t *buf) { int fd = -1; size_t to_read; @@ -261,7 +261,6 @@ H5D__efl_read(const H5O_efl_t *efl, const H5D_t *dset, haddr_t addr, size_t size haddr_t cur; ssize_t n; size_t u; /* Local index variable */ - char *full_name = NULL; /* File name with prefix */ herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_STATIC @@ -274,49 +273,44 @@ H5D__efl_read(const H5O_efl_t *efl, const H5D_t *dset, haddr_t addr, size_t size /* Find the first efl member from which to read */ for (u=0, cur=0; unused; u++) { - if(H5O_EFL_UNLIMITED == efl->slot[u].size || addr < cur + efl->slot[u].size) { - skip = addr - cur; - break; - } /* end if */ - cur += efl->slot[u].size; + if(H5O_EFL_UNLIMITED == efl->slot[u].size || addr < cur + efl->slot[u].size) { + skip = addr - cur; + break; + } /* end if */ + cur += efl->slot[u].size; } /* end for */ /* Read the data */ while(size) { HDassert(buf); - if(u >= efl->nused) - HGOTO_ERROR(H5E_EFL, H5E_OVERFLOW, FAIL, "read past logical end of file") - if(H5F_OVERFLOW_HSIZET2OFFT(efl->slot[u].offset + skip)) - HGOTO_ERROR(H5E_EFL, H5E_OVERFLOW, FAIL, "external file address overflowed") - if(H5_combine_path(dset->shared->extfile_prefix, efl->slot[u].name, &full_name) < 0) - HGOTO_ERROR(H5E_EFL, H5E_NOSPACE, FAIL, "can't build external file name") - if((fd = HDopen(full_name, O_RDONLY, 0)) < 0) - HGOTO_ERROR(H5E_EFL, H5E_CANTOPENFILE, FAIL, "unable to open external raw data file") - if(HDlseek(fd, (HDoff_t)(efl->slot[u].offset + skip), SEEK_SET) < 0) - HGOTO_ERROR(H5E_EFL, H5E_SEEKERROR, FAIL, "unable to seek in external raw data file") + if(u >= efl->nused) + HGOTO_ERROR(H5E_EFL, H5E_OVERFLOW, FAIL, "read past logical end of file") + if(H5F_OVERFLOW_HSIZET2OFFT(efl->slot[u].offset + skip)) + HGOTO_ERROR(H5E_EFL, H5E_OVERFLOW, FAIL, "external file address overflowed") + if((fd = HDopen(efl->slot[u].name, O_RDONLY, 0)) < 0) + HGOTO_ERROR(H5E_EFL, H5E_CANTOPENFILE, FAIL, "unable to open external raw data file") + if(HDlseek(fd, (HDoff_t)(efl->slot[u].offset + skip), SEEK_SET) < 0) + HGOTO_ERROR(H5E_EFL, H5E_SEEKERROR, FAIL, "unable to seek in external raw data file") #ifndef NDEBUG - tempto_read = MIN((size_t)(efl->slot[u].size-skip), (hsize_t)size); + tempto_read = MIN(efl->slot[u].size-skip, (hsize_t)size); H5_CHECK_OVERFLOW(tempto_read, hsize_t, size_t); - to_read = (size_t)tempto_read; + to_read = (size_t)tempto_read; #else /* NDEBUG */ - to_read = MIN((size_t)(efl->slot[u].size - skip), (hsize_t)size); + to_read = MIN((size_t)(efl->slot[u].size - skip), size); #endif /* NDEBUG */ - if((n = HDread(fd, buf, to_read)) < 0) - HGOTO_ERROR(H5E_EFL, H5E_READERROR, FAIL, "read error in external raw data file") - else if((size_t)n < to_read) - HDmemset(buf + n, 0, to_read - (size_t)n); - full_name = (char *)H5MM_xfree(full_name); - HDclose(fd); - fd = -1; - size -= to_read; - buf += to_read; - skip = 0; - u++; + if((n = HDread(fd, buf, to_read)) < 0) + HGOTO_ERROR(H5E_EFL, H5E_READERROR, FAIL, "read error in external raw data file") + else if((size_t)n < to_read) + HDmemset(buf + n, 0, to_read - (size_t)n); + HDclose(fd); + fd = -1; + size -= to_read; + buf += to_read; + skip = 0; + u++; } /* end while */ done: - if(full_name) - full_name = (char *)H5MM_xfree(full_name); if(fd >= 0) HDclose(fd); @@ -343,7 +337,7 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5D__efl_write(const H5O_efl_t *efl, const H5D_t *dset, haddr_t addr, size_t size, const uint8_t *buf) +H5D__efl_write(const H5O_efl_t *efl, haddr_t addr, size_t size, const uint8_t *buf) { int fd = -1; size_t to_write; @@ -352,8 +346,7 @@ H5D__efl_write(const H5O_efl_t *efl, const H5D_t *dset, haddr_t addr, size_t siz #endif /* NDEBUG */ haddr_t cur; hsize_t skip = 0; - size_t u; /* Local index variable */ - char *full_name = NULL; /* File name with prefix */ + size_t u; /* Local index variable */ herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_STATIC @@ -366,51 +359,46 @@ H5D__efl_write(const H5O_efl_t *efl, const H5D_t *dset, haddr_t addr, size_t siz /* Find the first efl member in which to write */ for(u = 0, cur = 0; u < efl->nused; u++) { - if(H5O_EFL_UNLIMITED == efl->slot[u].size || addr < cur + efl->slot[u].size) { - skip = addr - cur; - break; - } /* end if */ - cur += efl->slot[u].size; + if(H5O_EFL_UNLIMITED == efl->slot[u].size || addr < cur + efl->slot[u].size) { + skip = addr - cur; + break; + } /* end if */ + cur += efl->slot[u].size; } /* end for */ /* Write the data */ while(size) { HDassert(buf); - if(u >= efl->nused) - HGOTO_ERROR(H5E_EFL, H5E_OVERFLOW, FAIL, "write past logical end of file") - if(H5F_OVERFLOW_HSIZET2OFFT(efl->slot[u].offset + skip)) - HGOTO_ERROR(H5E_EFL, H5E_OVERFLOW, FAIL, "external file address overflowed") - if(H5_combine_path(dset->shared->extfile_prefix, efl->slot[u].name, &full_name) < 0) - HGOTO_ERROR(H5E_EFL, H5E_NOSPACE, FAIL, "can't build external file name") - if((fd = HDopen(full_name, O_CREAT | O_RDWR, 0666)) < 0) { - if(HDaccess(full_name, F_OK) < 0) - HGOTO_ERROR(H5E_EFL, H5E_CANTOPENFILE, FAIL, "external raw data file does not exist") - else - HGOTO_ERROR(H5E_EFL, H5E_CANTOPENFILE, FAIL, "unable to open external raw data file") - } /* end if */ - if(HDlseek(fd, (HDoff_t)(efl->slot[u].offset + skip), SEEK_SET) < 0) - HGOTO_ERROR(H5E_EFL, H5E_SEEKERROR, FAIL, "unable to seek in external raw data file") + if(u >= efl->nused) + HGOTO_ERROR(H5E_EFL, H5E_OVERFLOW, FAIL, "write past logical end of file") + if(H5F_OVERFLOW_HSIZET2OFFT(efl->slot[u].offset + skip)) + HGOTO_ERROR(H5E_EFL, H5E_OVERFLOW, FAIL, "external file address overflowed") + if((fd = HDopen(efl->slot[u].name, O_CREAT | O_RDWR, 0666)) < 0) { + if(HDaccess(efl->slot[u].name, F_OK) < 0) + HGOTO_ERROR(H5E_EFL, H5E_CANTOPENFILE, FAIL, "external raw data file does not exist") + else + HGOTO_ERROR(H5E_EFL, H5E_CANTOPENFILE, FAIL, "unable to open external raw data file") + } /* end if */ + if(HDlseek(fd, (HDoff_t)(efl->slot[u].offset + skip), SEEK_SET) < 0) + HGOTO_ERROR(H5E_EFL, H5E_SEEKERROR, FAIL, "unable to seek in external raw data file") #ifndef NDEBUG - tempto_write = MIN(efl->slot[u].size - skip, (hsize_t)size); + tempto_write = MIN(efl->slot[u].size - skip, (hsize_t)size); H5_CHECK_OVERFLOW(tempto_write, hsize_t, size_t); to_write = (size_t)tempto_write; #else /* NDEBUG */ - to_write = MIN((size_t)(efl->slot[u].size - skip), size); + to_write = MIN((size_t)(efl->slot[u].size - skip), size); #endif /* NDEBUG */ - if((size_t)HDwrite(fd, buf, to_write) != to_write) - HGOTO_ERROR(H5E_EFL, H5E_READERROR, FAIL, "write error in external raw data file") - full_name = (char *)H5MM_xfree(full_name); - HDclose (fd); - fd = -1; - size -= to_write; - buf += to_write; - skip = 0; - u++; + if((size_t)HDwrite(fd, buf, to_write) != to_write) + HGOTO_ERROR(H5E_EFL, H5E_READERROR, FAIL, "write error in external raw data file") + HDclose (fd); + fd = -1; + size -= to_write; + buf += to_write; + skip = 0; + u++; } /* end while */ done: - if(full_name) - full_name = (char *)H5MM_xfree(full_name); if(fd >= 0) HDclose(fd); @@ -439,7 +427,7 @@ H5D__efl_readvv_cb(hsize_t dst_off, hsize_t src_off, size_t len, void *_udata) FUNC_ENTER_STATIC /* Read data */ - if(H5D__efl_read(udata->efl, udata->dset, dst_off, len, (udata->rbuf + src_off)) < 0) + if(H5D__efl_read(udata->efl, dst_off, len, (udata->rbuf + src_off)) < 0) HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "EFL read failed") done: @@ -476,9 +464,6 @@ H5D__efl_readvv(const H5D_io_info_t *io_info, HDassert(io_info); HDassert(io_info->store->efl.nused > 0); HDassert(io_info->u.rbuf); - HDassert(io_info->dset); - HDassert(io_info->dset->shared); - HDassert(io_info->dset->shared->extfile_prefix); HDassert(dset_curr_seq); HDassert(dset_len_arr); HDassert(dset_off_arr); @@ -488,7 +473,6 @@ H5D__efl_readvv(const H5D_io_info_t *io_info, /* Set up user data for H5VM_opvv() */ udata.efl = &(io_info->store->efl); - udata.dset = io_info->dset; udata.rbuf = (unsigned char *)io_info->u.rbuf; /* Call generic sequence operation routine */ @@ -523,7 +507,7 @@ H5D__efl_writevv_cb(hsize_t dst_off, hsize_t src_off, size_t len, void *_udata) FUNC_ENTER_STATIC /* Write data */ - if(H5D__efl_write(udata->efl, udata->dset, dst_off, len, (udata->wbuf + src_off)) < 0) + if(H5D__efl_write(udata->efl, dst_off, len, (udata->wbuf + src_off)) < 0) HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "EFL write failed") done: @@ -560,9 +544,6 @@ H5D__efl_writevv(const H5D_io_info_t *io_info, HDassert(io_info); HDassert(io_info->store->efl.nused > 0); HDassert(io_info->u.wbuf); - HDassert(io_info->dset); - HDassert(io_info->dset->shared); - HDassert(io_info->dset->shared->extfile_prefix); HDassert(dset_curr_seq); HDassert(dset_len_arr); HDassert(dset_off_arr); @@ -572,7 +553,6 @@ H5D__efl_writevv(const H5D_io_info_t *io_info, /* Set up user data for H5VM_opvv() */ udata.efl = &(io_info->store->efl); - udata.dset = io_info->dset; udata.wbuf = (const unsigned char *)io_info->u.wbuf; /* Call generic sequence operation routine */ diff --git a/src/H5Dint.c b/src/H5Dint.c index fe34718..3e2d212 100644 --- a/src/H5Dint.c +++ b/src/H5Dint.c @@ -63,8 +63,6 @@ static herr_t H5D__cache_dataspace_info(const H5D_t *dset); static herr_t H5D__init_space(H5F_t *file, const H5D_t *dset, const H5S_t *space); static herr_t H5D__update_oh_info(H5F_t *file, hid_t dxpl_id, H5D_t *dset, hid_t dapl_id); -static herr_t H5D_build_extfile_prefix(const H5D_t *dset, hid_t dapl_id, - char **extfile_prefix); static herr_t H5D__open_oid(H5D_t *dataset, hid_t dapl_id, hid_t dxpl_id); static herr_t H5D__init_storage(const H5D_io_info_t *io_info, hbool_t full_overwrite, hsize_t old_dim[]); @@ -984,84 +982,6 @@ done: } /* end H5D__update_oh_info() */ -/*-------------------------------------------------------------------------- - * Function: H5D_build_extfile_prefix - * - * Purpose: Determine the external file prefix to be used and store - * it in extfile_prefix. Stores an empty string if no prefix - * should be used. - * - * Return: SUCCEED/FAIL - * - * Programmer: Steffen Kiess - * October 16, 2015 - *-------------------------------------------------------------------------- - */ -static herr_t -H5D_build_extfile_prefix(const H5D_t *dset, hid_t dapl_id, char **extfile_prefix /*out*/) -{ - char *prefix = NULL; /* prefix used to look for the file */ - char *extpath = NULL; /* absolute path of directory the HDF5 file is in */ - size_t extpath_len; /* length of extpath */ - size_t prefix_len; /* length of prefix */ - size_t extfile_prefix_len; /* length of expanded prefix */ - H5P_genplist_t *plist = NULL; /* Property list pointer */ - herr_t ret_value = SUCCEED; /* Return value */ - - - FUNC_ENTER_NOAPI_NOINIT - - HDassert(dset); - HDassert(dset->oloc.file); - - extpath = H5F_EXTPATH(dset->oloc.file); - HDassert(extpath); - - /* XXX: Future thread-safety note - getenv is not required - * to be reentrant. - */ - prefix = HDgetenv("HDF5_EXTFILE_PREFIX"); - - if(prefix == NULL || *prefix == '\0') { - /* Set prefix to value of H5D_ACS_EFILE_PREFIX_NAME property */ - if(NULL == (plist = H5P_object_verify(dapl_id, H5P_DATASET_ACCESS))) - HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID") - if(H5P_peek(plist, H5D_ACS_EFILE_PREFIX_NAME, &prefix) < 0) - HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get external file prefix") - } /* end if */ - - /* Prefix has to be checked for NULL / empty string again because the - * code above might have updated it. - */ - if(prefix == NULL || *prefix == '\0' || HDstrcmp(prefix, ".") == 0) { - /* filename is interpreted as relative to the current directory, - * does not need to be expanded - */ - if(NULL == (*extfile_prefix = (char *)H5MM_strdup(""))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed") - } /* end if */ - else { - if (HDstrncmp(prefix, "${ORIGIN}", HDstrlen("${ORIGIN}")) == 0) { - /* Replace ${ORIGIN} at beginning of prefix by directory of HDF5 file */ - extpath_len = HDstrlen(extpath); - prefix_len = HDstrlen(prefix); - extfile_prefix_len = extpath_len + prefix_len - HDstrlen("${ORIGIN}") + 1; - - if(NULL == (*extfile_prefix = (char *)H5MM_malloc(extfile_prefix_len))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate buffer") - HDsnprintf(*extfile_prefix, extfile_prefix_len, "%s%s", extpath, prefix + HDstrlen("${ORIGIN}")); - } /* end if */ - else { - if(NULL == (*extfile_prefix = (char *)H5MM_strdup(prefix))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed") - } /* end else */ - } /* end else */ - -done: - FUNC_LEAVE_NOAPI(ret_value) -} /* H5D_build_extfile_prefix() */ - - /*------------------------------------------------------------------------- * Function: H5D__create * @@ -1231,10 +1151,6 @@ H5D__create(H5F_t *file, hid_t type_id, const H5S_t *space, hid_t dcpl_id, /* Indicate that the layout information was initialized */ layout_init = TRUE; - /* Set the external file prefix */ - if(H5D_build_extfile_prefix(new_dset, dapl_id, &new_dset->shared->extfile_prefix) < 0) - HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, "unable to initialize external file prefix") - /* Add the dataset to the list of opened objects in the file */ if(H5FO_top_incr(new_dset->oloc.file, new_dset->oloc.addr) < 0) HGOTO_ERROR(H5E_DATASET, H5E_CANTINC, NULL, "can't incr object ref. count") @@ -1279,7 +1195,6 @@ done: } /* end if */ if(new_dset->shared->dcpl_id != 0 && H5I_dec_ref(new_dset->shared->dcpl_id) < 0) HDONE_ERROR(H5E_DATASET, H5E_CANTDEC, NULL, "unable to decrement ref count on property list") - new_dset->shared->extfile_prefix = (char *)H5MM_xfree(new_dset->shared->extfile_prefix); new_dset->shared = H5FL_FREE(H5D_shared_t, new_dset->shared); } /* end if */ new_dset->oloc.file = NULL; @@ -1373,8 +1288,7 @@ H5D_open(const H5G_loc_t *loc, hid_t dapl_id, hid_t dxpl_id) { H5D_shared_t *shared_fo = NULL; H5D_t *dataset = NULL; - char *extfile_prefix = NULL; /* Expanded external file prefix */ - H5D_t *ret_value = NULL; /* Return value */ + H5D_t *ret_value = NULL; /* Return value */ FUNC_ENTER_NOAPI(NULL) @@ -1393,10 +1307,6 @@ H5D_open(const H5G_loc_t *loc, hid_t dapl_id, hid_t dxpl_id) if(H5G_name_copy(&(dataset->path), loc->path, H5_COPY_SHALLOW) < 0) HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, NULL, "can't copy path") - /* Get the external file prefix */ - if(H5D_build_extfile_prefix(dataset, dapl_id, &extfile_prefix) < 0) - HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, "unable to initialize external file prefix") - /* Check if dataset was already open */ if(NULL == (shared_fo = (H5D_shared_t *)H5FO_opened(dataset->oloc.file, dataset->oloc.addr))) { /* Clear any errors from H5FO_opened() */ @@ -1416,12 +1326,6 @@ H5D_open(const H5G_loc_t *loc, hid_t dapl_id, hid_t dxpl_id) /* We're the first dataset to use the the shared info */ dataset->shared->fo_count = 1; - - /* Set the external file prefix */ - dataset->shared->extfile_prefix = extfile_prefix; - /* Prevent string from being freed during done: */ - extfile_prefix = NULL; - } /* end if */ else { /* Point to shared info */ @@ -1430,12 +1334,6 @@ H5D_open(const H5G_loc_t *loc, hid_t dapl_id, hid_t dxpl_id) /* Increment # of datasets using shared information */ shared_fo->fo_count++; - /* Check whether the external file prefix of the already open dataset - * matches the new external file prefix - */ - if(HDstrcmp(extfile_prefix, dataset->shared->extfile_prefix) != 0) - HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, NULL, "new external file prefix does not match external file prefix of already open dataset") - /* Check if the object has been opened through the top file yet */ if(H5FO_top_count(dataset->oloc.file, dataset->oloc.addr) == 0) { /* Open the object through this top file */ @@ -1452,15 +1350,11 @@ H5D_open(const H5G_loc_t *loc, hid_t dapl_id, hid_t dxpl_id) ret_value = dataset; done: - extfile_prefix = (char *)H5MM_xfree(extfile_prefix); - if(ret_value == NULL) { /* Free the location--casting away const*/ if(dataset) { - if(shared_fo == NULL && dataset->shared) { /* Need to free shared fo */ - dataset->shared->extfile_prefix = (char *)H5MM_xfree(dataset->shared->extfile_prefix); + if(shared_fo == NULL) /* Need to free shared fo */ dataset->shared = H5FL_FREE(H5D_shared_t, dataset->shared); - } H5O_loc_free(&(dataset->oloc)); H5G_name_free(&(dataset->path)); @@ -1764,9 +1658,6 @@ H5D_close(H5D_t *dataset) if(dataset->shared->layout.ops->dest && (dataset->shared->layout.ops->dest)(dataset, H5AC_ind_read_dxpl_id) < 0) HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "unable to destroy layout info") - /* Free the external file prefix */ - dataset->shared->extfile_prefix = (char *)H5MM_xfree(dataset->shared->extfile_prefix); - /* Release layout, fill-value, efl & pipeline messages */ if(dataset->shared->dcpl_id != H5P_DATASET_CREATE_DEFAULT) free_failed |= (H5O_msg_reset(H5O_PLINE_ID, &dataset->shared->dcpl_cache.pline) < 0) || diff --git a/src/H5Dpkg.h b/src/H5Dpkg.h index bc04300..5972d9e 100644 --- a/src/H5Dpkg.h +++ b/src/H5Dpkg.h @@ -441,8 +441,6 @@ typedef struct H5D_shared_t { */ H5D_rdcc_t chunk; /* Information about chunked data */ } cache; - - char *extfile_prefix; /* expanded external file prefix */ } H5D_shared_t; struct H5D_t { diff --git a/src/H5Dprivate.h b/src/H5Dprivate.h index ab60a50..3b43aaf 100644 --- a/src/H5Dprivate.h +++ b/src/H5Dprivate.h @@ -54,7 +54,6 @@ #define H5D_ACS_PREEMPT_READ_CHUNKS_NAME "rdcc_w0" /* Preemption read chunks first */ #define H5D_ACS_VDS_VIEW_NAME "vds_view" /* VDS view option */ #define H5D_ACS_VDS_PRINTF_GAP_NAME "vds_printf_gap" /* VDS printf gap size */ -#define H5D_ACS_EFILE_PREFIX_NAME "external file prefix" /* External file prefix */ /* ======== Data transfer properties ======== */ #define H5D_XFER_MAX_TEMP_BUF_NAME "max_temp_buf" /* Maximum temp buffer size */ diff --git a/src/H5Fquery.c b/src/H5Fquery.c index e9af300..66f002c 100644 --- a/src/H5Fquery.c +++ b/src/H5Fquery.c @@ -158,7 +158,7 @@ H5F_get_actual_name(const H5F_t *f) * Function: H5F_get_extpath * * Purpose: Retrieve the file's 'extpath' flags - * This is used by H5L_extern_traverse() and H5D_build_extfile_prefix() to retrieve the main file's location + * This is used by H5L_extern_traverse() to retrieve the main file's location * when searching the target file. * * Return: 'extpath' on success/abort on failure (shouldn't fail) diff --git a/src/H5MM.c b/src/H5MM.c index 5c2a731..09e6461 100644 --- a/src/H5MM.c +++ b/src/H5MM.c @@ -125,10 +125,10 @@ static size_t H5MM_peak_alloc_blocks_count_s = 0; * Function: H5MM__is_our_block * * Purpose: Try to determine if a memory buffer has been allocated through - * the H5MM* interface, instead of the system's malloc() routines. + * the H5MM* interface, instead of the system's malloc() routines. * - * Return: Success: TRUE/FALSE - * Failure: (Can't fail) + * Return: Success: TRUE/FALSE + * Failure: (Can't fail) * * Programmer: Quincey Koziol * Dec 30 2015 @@ -149,7 +149,7 @@ H5MM__is_our_block(void *mem) * * Purpose: Check a block wrapper around a buffer to validate it. * - * Return: N/A (void) + * Return: N/A (void) * * Programmer: Quincey Koziol * Dec 30 2015 @@ -173,9 +173,9 @@ H5MM__sanity_check_block(const H5MM_block_t *block) * Function: H5MM__sanity_check * * Purpose: Check a buffer to validate it (just calls - * H5MM__sanity_check_block after finding block for buffer) + * H5MM__sanity_check_block after finding block for buffer) * - * Return: N/A (void) + * Return: N/A (void) * * Programmer: Quincey Koziol * Dec 30 2015 @@ -196,7 +196,7 @@ H5MM__sanity_check(void *mem) * * Purpose: Sanity check all current memory allocations. * - * Return: N/A (void) + * Return: N/A (void) * * Programmer: Quincey Koziol * Jan 5 2016 @@ -206,7 +206,7 @@ H5MM__sanity_check(void *mem) void H5MM_sanity_check_all(void) { - H5MM_block_t *curr = NULL; + H5MM_block_t *curr; curr = H5MM_block_head_s.next; while(curr != &H5MM_block_head_s) { @@ -221,7 +221,7 @@ H5MM_sanity_check_all(void) * * Purpose: Final sanity checks on memory allocation. * - * Return: N/A (void) + * Return: N/A (void) * * Programmer: Quincey Koziol * Jan 1 2016 @@ -257,8 +257,8 @@ H5MM_final_sanity_check(void) * considered an error condition since allocations of zero * bytes usually indicate problems. * - * Return: Success: Pointer to new memory - * Failure: NULL + * Return: Success: Pointer new memory + * Failure: NULL * * Programmer: Quincey Koziol * Nov 8 2003 @@ -268,7 +268,7 @@ H5MM_final_sanity_check(void) void * H5MM_malloc(size_t size) { - void *ret_value = NULL; + void *ret_value; HDassert(size); @@ -346,8 +346,8 @@ H5MM_malloc(size_t size) * bytes usually indicate problems. * * - * Return: Success: Pointer to new memory - * Failure: NULL + * Return: Success: Pointer new memory + * Failure: NULL * * Programmer: Quincey Koziol * Nov 8 2003 @@ -357,7 +357,7 @@ H5MM_malloc(size_t size) void * H5MM_calloc(size_t size) { - void *ret_value = NULL; + void *ret_value; HDassert(size); @@ -392,9 +392,8 @@ H5MM_calloc(size_t size) * Note that the (NULL, 0) combination is undefined behavior * in the C standard. * - * Return: Success: Ptr to new memory if size > 0 - * NULL if size is zero - * Failure: NULL (input buffer is unchanged on failure) + * Return: Success: Ptr to new memory if size > 0, NULL if size is zero + * Failure: NULL (input buffer is unchanged on failure) * * Programmer: Robb Matzke * Jul 10 1997 @@ -404,7 +403,7 @@ H5MM_calloc(size_t size) void * H5MM_realloc(void *mem, size_t size) { - void *ret_value = NULL; + void *ret_value; /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */ FUNC_ENTER_NOAPI_NOINIT_NOERR @@ -459,6 +458,7 @@ H5MM_realloc(void *mem, size_t size) * Failure: abort() * * Programmer: Robb Matzke + * matzke@llnl.gov * Jul 10 1997 *------------------------------------------------------------------------- */ @@ -490,16 +490,17 @@ done: * an error will be raised. * * Return: Success: Pointer to a new string - * Failure: NULL + * Failure: abort() * * Programmer: Robb Matzke + * matzke@llnl.gov * Jul 10 1997 *------------------------------------------------------------------------- */ char * H5MM_strdup(const char *s) { - char *ret_value = NULL; + char *ret_value; FUNC_ENTER_NOAPI(NULL) @@ -527,6 +528,7 @@ done: * Failure: never fails * * Programmer: Robb Matzke + * matzke@llnl.gov * Jul 10 1997 * *------------------------------------------------------------------------- diff --git a/src/H5Pdapl.c b/src/H5Pdapl.c index 6407d4c..eab9337 100644 --- a/src/H5Pdapl.c +++ b/src/H5Pdapl.c @@ -16,8 +16,8 @@ /*------------------------------------------------------------------------- * * Created: H5Pdapl.c - * October 27, 2008 - * Neil Fortner + * October 27, 2008 + * Neil Fortner * * Purpose: Dataset access property list class routines * @@ -39,8 +39,7 @@ #include "H5Eprivate.h" /* Error handling */ #include "H5Fprivate.h" /* Files */ #include "H5Iprivate.h" /* IDs */ -#include "H5Ppkg.h" /* Property lists */ -#include "H5MMprivate.h" /* Memory management */ +#include "H5Ppkg.h" /* Property lists */ /****************/ @@ -73,17 +72,6 @@ #define H5D_ACS_VDS_PRINTF_GAP_DEF (hsize_t)0 #define H5D_ACS_VDS_PRINTF_GAP_ENC H5P__encode_hsize_t #define H5D_ACS_VDS_PRINTF_GAP_DEC H5P__decode_hsize_t -/* Definitions for external file prefix */ -#define H5D_ACS_EFILE_PREFIX_SIZE sizeof(char *) -#define H5D_ACS_EFILE_PREFIX_DEF NULL /*default is no prefix */ -#define H5D_ACS_EFILE_PREFIX_SET H5P__dapl_efile_pref_set -#define H5D_ACS_EFILE_PREFIX_GET H5P__dapl_efile_pref_get -#define H5D_ACS_EFILE_PREFIX_ENC H5P__dapl_efile_pref_enc -#define H5D_ACS_EFILE_PREFIX_DEC H5P__dapl_efile_pref_dec -#define H5D_ACS_EFILE_PREFIX_DEL H5P__dapl_efile_pref_del -#define H5D_ACS_EFILE_PREFIX_COPY H5P__dapl_efile_pref_copy -#define H5D_ACS_EFILE_PREFIX_CMP H5P__dapl_efile_pref_cmp -#define H5D_ACS_EFILE_PREFIX_CLOSE H5P__dapl_efile_pref_close /******************/ /* Local Typedefs */ @@ -112,16 +100,6 @@ static herr_t H5P__decode_chunk_cache_nbytes(const void **_pp, void *_value); static herr_t H5P__dacc_vds_view_enc(const void *value, void **pp, size_t *size); static herr_t H5P__dacc_vds_view_dec(const void **pp, void *value); -/* Property list callbacks */ -static herr_t H5P__dapl_efile_pref_set(hid_t prop_id, const char* name, size_t size, void* value); -static herr_t H5P__dapl_efile_pref_get(hid_t prop_id, const char* name, size_t size, void* value); -static herr_t H5P__dapl_efile_pref_enc(const void *value, void **_pp, size_t *size); -static herr_t H5P__dapl_efile_pref_dec(const void **_pp, void *value); -static herr_t H5P__dapl_efile_pref_del(hid_t prop_id, const char* name, size_t size, void* value); -static herr_t H5P__dapl_efile_pref_copy(const char* name, size_t size, void* value); -static int H5P__dapl_efile_pref_cmp(const void *value1, const void *value2, size_t size); -static herr_t H5P__dapl_efile_pref_close(const char* name, size_t size, void* value); - /*********************/ /* Package Variables */ @@ -156,9 +134,6 @@ const H5P_libclass_t H5P_CLS_DACC[1] = {{ /* Local Variables */ /*******************/ -/* Property value defaults */ -static const char *H5D_def_efile_prefix_g = H5D_ACS_EFILE_PREFIX_DEF; /* Default external file prefix string */ - /*------------------------------------------------------------------------- @@ -212,274 +187,12 @@ H5P__dacc_reg_prop(H5P_genclass_t *pclass) NULL, NULL, NULL, NULL) < 0) HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class") - /* Register property for external file prefix */ - if(H5P_register_real(pclass, H5D_ACS_EFILE_PREFIX_NAME, H5D_ACS_EFILE_PREFIX_SIZE, &H5D_def_efile_prefix_g, - NULL, H5D_ACS_EFILE_PREFIX_SET, H5D_ACS_EFILE_PREFIX_GET, H5D_ACS_EFILE_PREFIX_ENC, H5D_ACS_EFILE_PREFIX_DEC, - H5D_ACS_EFILE_PREFIX_DEL, H5D_ACS_EFILE_PREFIX_COPY, H5D_ACS_EFILE_PREFIX_CMP, H5D_ACS_EFILE_PREFIX_CLOSE) < 0) - HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class") - done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5P__dacc_reg_prop() */ /*------------------------------------------------------------------------- - * Function: H5P__dapl_efile_pref_set - * - * Purpose: Copies an external file prefix property when it's set - * for a property list - * - * Return: SUCCEED/FAIL - * - *------------------------------------------------------------------------- - */ -static herr_t -H5P__dapl_efile_pref_set(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name, - size_t H5_ATTR_UNUSED size, void *value) -{ - FUNC_ENTER_STATIC_NOERR - - /* Sanity check */ - HDassert(value); - - /* Copy the prefix */ - *(char **)value = H5MM_xstrdup(*(const char **)value); - - FUNC_LEAVE_NOAPI(SUCCEED) -} /* end H5P__dapl_efile_pref_set() */ - - -/*------------------------------------------------------------------------- - * Function: H5P__dapl_efile_pref_get - * - * Purpose: Copies an external file prefix property when it's retrieved - * from a property list - * - * Return: SUCCEED/FAIL - * - *------------------------------------------------------------------------- - */ -static herr_t -H5P__dapl_efile_pref_get(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name, - size_t H5_ATTR_UNUSED size, void *value) -{ - FUNC_ENTER_STATIC_NOERR - - /* Sanity check */ - HDassert(value); - - /* Copy the prefix */ - *(char **)value = H5MM_xstrdup(*(const char **)value); - - FUNC_LEAVE_NOAPI(SUCCEED) -} /* end H5P__dapl_efile_pref_get() */ - - -/*------------------------------------------------------------------------- - * Function: H5P__dapl_efile_pref_enc - * - * Purpose: Callback routine which is called whenever the efile flags - * property in the dataset access property list is - * encoded. - * - * Return: SUCCEED/FAIL - * - *------------------------------------------------------------------------- - */ -static herr_t -H5P__dapl_efile_pref_enc(const void *value, void **_pp, size_t *size) -{ - const char *efile_pref = *(const char * const *)value; - uint8_t **pp = (uint8_t **)_pp; - size_t len = 0; - uint64_t enc_value; - unsigned enc_size; - - FUNC_ENTER_NOAPI_NOINIT_NOERR - - HDcompile_assert(sizeof(size_t) <= sizeof(uint64_t)); - - /* calculate prefix length */ - if(NULL != efile_pref) - len = HDstrlen(efile_pref); - - enc_value = (uint64_t)len; - enc_size = H5VM_limit_enc_size(enc_value); - HDassert(enc_size < 256); - - if(NULL != *pp) { - /* encode the length of the prefix */ - *(*pp)++ = (uint8_t)enc_size; - UINT64ENCODE_VAR(*pp, enc_value, enc_size); - - /* encode the prefix */ - if(NULL != efile_pref) { - HDmemcpy(*(char **)pp, efile_pref, len); - *pp += len; - } /* end if */ - } /* end if */ - - *size += (1 + enc_size); - if(NULL != efile_pref) - *size += len; - - FUNC_LEAVE_NOAPI(SUCCEED) -} /* end H5P__dapl_efile_pref_enc() */ - - -/*------------------------------------------------------------------------- - * Function: H5P__dapl_efile_pref_dec - * - * Purpose: Callback routine which is called whenever the efile prefix - * property in the dataset access property list is - * decoded. - * - * Return: SUCCEED/FAIL - * - *------------------------------------------------------------------------- - */ -static herr_t -H5P__dapl_efile_pref_dec(const void **_pp, void *_value) -{ - char **efile_pref = (char **)_value; - const uint8_t **pp = (const uint8_t **)_pp; - size_t len; - uint64_t enc_value; /* Decoded property value */ - unsigned enc_size; /* Size of encoded property */ - herr_t ret_value = SUCCEED; - - FUNC_ENTER_NOAPI_NOINIT - - HDassert(pp); - HDassert(*pp); - HDassert(efile_pref); - HDcompile_assert(sizeof(size_t) <= sizeof(uint64_t)); - - /* Decode the size */ - enc_size = *(*pp)++; - HDassert(enc_size < 256); - - /* Decode the value */ - UINT64DECODE_VAR(*pp, enc_value, enc_size); - len = (size_t)enc_value; - - if(0 != len) { - /* Make a copy of the user's prefix string */ - if(NULL == (*efile_pref = (char *)H5MM_malloc(len + 1))) - HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "memory allocation failed for prefix") - HDstrncpy(*efile_pref, *(const char **)pp, len); - (*efile_pref)[len] = '\0'; - - *pp += len; - } /* end if */ - else - *efile_pref = NULL; - -done: - FUNC_LEAVE_NOAPI(ret_value) -} /* end H5P__dapl_efile_pref_dec() */ - - -/*------------------------------------------------------------------------- - * Function: H5P__dapl_efile_pref_del - * - * Purpose: Frees memory used to store the external file prefix string - * - * Return: SUCCEED (Can't fail) - * - *------------------------------------------------------------------------- - */ -static herr_t -H5P__dapl_efile_pref_del(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name, - size_t H5_ATTR_UNUSED size, void *value) -{ - FUNC_ENTER_NOAPI_NOINIT_NOERR - - HDassert(value); - - H5MM_xfree(*(void **)value); - - FUNC_LEAVE_NOAPI(SUCCEED) -} /* end H5P__dapl_efile_pref_del() */ - - -/*------------------------------------------------------------------------- - * Function: H5P__dapl_efile_pref_copy - * - * Purpose: Creates a copy of the external file prefix string - * - * Return: SUCCEED/FAIL - * - *------------------------------------------------------------------------- - */ -static herr_t -H5P__dapl_efile_pref_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value) -{ - FUNC_ENTER_NOAPI_NOINIT_NOERR - - HDassert(value); - - *(char **)value = H5MM_xstrdup(*(const char **)value); - - FUNC_LEAVE_NOAPI(SUCCEED) -} /* end H5P__dapl_efile_pref_copy() */ - - -/*------------------------------------------------------------------------- - * Function: H5P__dapl_efile_pref_cmp - * - * Purpose: Callback routine which is called whenever the efile prefix - * property in the dataset creation property list is - * compared. - * - * Return: zero if VALUE1 and VALUE2 are equal, non zero otherwise. - * - *------------------------------------------------------------------------- - */ -static int -H5P__dapl_efile_pref_cmp(const void *value1, const void *value2, size_t H5_ATTR_UNUSED size) -{ - const char *pref1 = *(const char * const *)value1; - const char *pref2 = *(const char * const *)value2; - int ret_value = 0; - - FUNC_ENTER_NOAPI_NOINIT_NOERR - - if(NULL == pref1 && NULL != pref2) - HGOTO_DONE(1); - if(NULL != pref1 && NULL == pref2) - HGOTO_DONE(-1); - if(NULL != pref1 && NULL != pref2) - ret_value = HDstrcmp(pref1, pref2); - -done: - FUNC_LEAVE_NOAPI(ret_value) -} /* end H5P__dapl_efile_pref_cmp() */ - - -/*------------------------------------------------------------------------- - * Function: H5P__dapl_efile_pref_close - * - * Purpose: Frees memory used to store the external file prefix string - * - * Return: SUCCEED/FAIL - * - *------------------------------------------------------------------------- - */ -static herr_t -H5P__dapl_efile_pref_close(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value) -{ - FUNC_ENTER_NOAPI_NOINIT_NOERR - - HDassert(value); - - H5MM_xfree(*(void **)value); - - FUNC_LEAVE_NOAPI(SUCCEED) -} /* end H5P__dapl_efile_pref_close() */ - - -/*------------------------------------------------------------------------- * Function: H5Pset_chunk_cache * * Purpose: Set the number of objects in the meta data cache and the @@ -1074,94 +787,3 @@ done: FUNC_LEAVE_API(ret_value) } /* end H5Pget_virtual_printf_gap() */ - -/*------------------------------------------------------------------------- - * Function: H5Pset_efile_prefix - * - * Purpose: Set a prefix to be used for any external files. - * - * If the prefix starts with ${ORIGIN}, this will be replaced by - * the absolute path of the directory of the HDF5 file containing - * the dataset. - * - * If the prefix is ".", no prefix will be applied. - * - * This property can be overwritten by the environment variable - * HDF5_EXTFILE_PREFIX. - * - * Return: Non-negative on success/Negative on failure - * - *------------------------------------------------------------------------- - */ -herr_t -H5Pset_efile_prefix(hid_t plist_id, const char *prefix) -{ - H5P_genplist_t *plist; /* Property list pointer */ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_API(FAIL) - H5TRACE2("e", "i*s", plist_id, prefix); - - /* Get the plist structure */ - if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_ACCESS))) - HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID") - - /* Set prefix */ - if(H5P_set(plist, H5D_ACS_EFILE_PREFIX_NAME, &prefix) < 0) - HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set prefix info") - -done: - FUNC_LEAVE_API(ret_value) -} /* end H5Pset_efile_prefix() */ - - -/*------------------------------------------------------------------------- - * Function: H5Pget_efile_prefix - * - * Purpose: Gets the prefix to be used for any external files. - * - * If the pointer is not NULL, it points to a user-allocated - * buffer. - * - * Return: Non-negative on success/Negative on failure - * - *------------------------------------------------------------------------- - */ -ssize_t -H5Pget_efile_prefix(hid_t plist_id, char *prefix, size_t size) -{ - H5P_genplist_t *plist; /* Property list pointer */ - char *my_prefix; /* Library's copy of the prefix */ - size_t len; /* Length of prefix string */ - ssize_t ret_value; /* Return value */ - - FUNC_ENTER_API(FAIL) - H5TRACE3("Zs", "i*sz", plist_id, prefix, size); - - /* Get the plist structure */ - if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_ACCESS))) - HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID") - - /* Get the current prefix */ - if(H5P_peek(plist, H5D_ACS_EFILE_PREFIX_NAME, &my_prefix) < 0) - HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get external file prefix") - - /* Check for prefix being set */ - if(my_prefix) { - /* Copy to user's buffer, if given */ - len = HDstrlen(my_prefix); - if(prefix) { - HDstrncpy(prefix, my_prefix, MIN(len + 1, size)); - if(len >= size) - prefix[size - 1] = '\0'; - } /* end if */ - } /* end if */ - else - len = 0; - - /* Set return value */ - ret_value = (ssize_t)len; - -done: - FUNC_LEAVE_API(ret_value) -} /* end H5Pget_efile_prefix() */ diff --git a/src/H5Plapl.c b/src/H5Plapl.c index f2711e8..6cb2149 100644 --- a/src/H5Plapl.c +++ b/src/H5Plapl.c @@ -795,8 +795,7 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5P__lacc_elink_pref_del(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name, - size_t H5_ATTR_UNUSED size, void *value) +H5P__lacc_elink_pref_del(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value) { FUNC_ENTER_STATIC_NOERR diff --git a/src/H5Ppublic.h b/src/H5Ppublic.h index 9308339..9ab1944 100644 --- a/src/H5Ppublic.h +++ b/src/H5Ppublic.h @@ -406,8 +406,6 @@ H5_DLL herr_t H5Pset_virtual_view(hid_t plist_id, H5D_vds_view_t view); H5_DLL herr_t H5Pget_virtual_view(hid_t plist_id, H5D_vds_view_t *view); H5_DLL herr_t H5Pset_virtual_printf_gap(hid_t plist_id, hsize_t gap_size); H5_DLL herr_t H5Pget_virtual_printf_gap(hid_t plist_id, hsize_t *gap_size); -H5_DLL herr_t H5Pset_efile_prefix(hid_t dapl_id, const char* prefix); -H5_DLL ssize_t H5Pget_efile_prefix(hid_t dapl_id, char* prefix /*out*/, size_t size); /* Dataset xfer property list (DXPL) routines */ H5_DLL herr_t H5Pset_data_transform(hid_t plist_id, const char* expression); diff --git a/src/H5private.h b/src/H5private.h index fa5a114..8d5f4c9 100644 --- a/src/H5private.h +++ b/src/H5private.h @@ -1189,9 +1189,6 @@ typedef off_t h5_stat_size_t; #ifndef HDsetbuf #define HDsetbuf(F,S) setbuf(F,S) #endif /* HDsetbuf */ -#ifndef HDsetenv - #define HDsetenv(N,V,O) setenv(N,V,O) -#endif /* HDsetenv */ #ifndef HDsetgid #define HDsetgid(G) setgid(G) #endif /* HDsetgid */ @@ -2563,8 +2560,7 @@ H5_DLL uint32_t H5_hash_string(const char *str); H5_DLL time_t H5_make_time(struct tm *tm); /* Functions for building paths, etc. */ -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*/); +H5_DLL herr_t H5_build_extpath(const char *, char ** /*out*/ ); /* Functions for debugging */ H5_DLL herr_t H5_buffer_dump(FILE *stream, int indent, const uint8_t *buf, diff --git a/src/H5system.c b/src/H5system.c index eb09b15..4baebc5 100644 --- a/src/H5system.c +++ b/src/H5system.c @@ -757,7 +757,7 @@ done: */ int Wgettimeofday(struct timeval *tv, struct timezone *tz) -{ + { union { unsigned long long ns100; /*time since 1 Jan 1601 in 100ns units */ FILETIME ft; @@ -783,42 +783,7 @@ Wgettimeofday(struct timeval *tv, struct timezone *tz) /* Always return 0 as per Open Group Base Specifications Issue 6. Do not set errno on error. */ return 0; -} /* end Wgettimeofday() */ - - -/*------------------------------------------------------------------------- - * Function: Wsetenv - * - * Purpose: Wrapper function for setenv on Windows systems. - * Interestingly, getenv *is* available in the Windows - * POSIX layer, just not setenv. - * - * Return: Success: 0 - * Failure: non-zero error code - * - * Programmer: Dana Robinson - * February 2016 - * - *------------------------------------------------------------------------- - */ -int -Wsetenv(const char *name, const char *value, int overwrite) -{ - size_t bufsize; - errno_t err; - - /* If we're not overwriting, check if the environment variable exists. - * If it does (i.e.: the required buffer size to store the variable's - * value is non-zero), then return an error code. - */ - if(!overwrite) { - err = getenv_s(&bufsize, NULL, 0, name); - if (err || bufsize) - return (int)err; - } /* end if */ - - return (int)_putenv_s(name, value); -} /* end Wsetenv() */ +} #ifdef H5_HAVE_WINSOCK2_H #pragma comment(lib, "advapi32.lib") @@ -916,25 +881,26 @@ Wflock(int fd, int operation) { /*------------------------------------------------------------------------- - * Function: H5_build_extpath + * Function: H5_build_extpath * - * Purpose: To build the path for later searching of target file for external - * links and external files. This path can be either: + * Purpose: To build the path for later searching of target file for external + * link. This path can be either: * 1. The absolute path of NAME * or * 2. The current working directory + relative path of NAME * - * Return: SUCCEED/FAIL + * Return: Success: 0 + * Failure: -1 * * Programmer: Vailin Choi - * April 2, 2008 + * April 2, 2008 * *------------------------------------------------------------------------- */ #define MAX_PATH_LEN 1024 herr_t -H5_build_extpath(const char *name, char **extpath /*out*/) +H5_build_extpath(const char *name, char **extpath/*out*/) { char *full_path = NULL; /* Pointer to the full path, as built or passed in */ char *cwdpath = NULL; /* Pointer to the current working directory path */ @@ -1032,80 +998,5 @@ done: H5MM_xfree(new_name); FUNC_LEAVE_NOAPI(ret_value) -} /* end H5_build_extpath() */ - - -/*-------------------------------------------------------------------------- - * Function: H5_combine_path - * - * Purpose: If path2 is relative, interpret path2 as relative to path1 - * and store the result in full_name. Otherwise store path2 - * in full_name. - * - * Return: SUCCEED/FAIL - * - * Programmer: Steffen Kiess - * June 22, 2015 - *-------------------------------------------------------------------------- - */ -herr_t -H5_combine_path(const char* path1, const char* path2, char **full_name /*out*/) -{ - size_t path1_len; /* length of path1 */ - size_t path2_len; /* length of path2 */ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI_NOINIT - - HDassert(path1); - HDassert(path2); - - path1_len = HDstrlen(path1); - path2_len = HDstrlen(path2); - - if(*path1 == '\0' || H5_CHECK_ABSOLUTE(path2)) { - - /* If path1 is empty or path2 is absolute, simply use path2 */ - if(NULL == (*full_name = (char *)H5MM_strdup(path2))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed") - - } /* end if */ - else if(H5_CHECK_ABS_PATH(path2)) { - - /* On windows path2 is a path absolute name */ - if (H5_CHECK_ABSOLUTE(path1) || H5_CHECK_ABS_DRIVE(path1)) { - /* path1 is absolute or drive absolute and path2 is path absolute. - * Use the drive letter of path1 + path2 - */ - if(NULL == (*full_name = (char *)H5MM_malloc(path2_len + 3))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate path2 buffer") - HDsnprintf(*full_name, (path2_len + 3), "%c:%s", path1[0], path2); - } /* end if */ - else { - /* On windows path2 is path absolute name ("\foo\bar"), - * path1 does not have a drive letter (i.e. is "a\b" or "\a\b"). - * Use path2. - */ - if(NULL == (*full_name = (char *)H5MM_strdup(path2))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed") - } /* end else */ - - } /* end else if */ - else { - - /* Relative path2: - * Allocate a buffer to hold path1 + path2 + possibly the delimiter - * + terminating null byte - */ - if(NULL == (*full_name = (char *)H5MM_malloc(path1_len + path2_len + 2))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate filename buffer") - - /* Compose the full file name */ - HDsnprintf(*full_name, (path1_len + path2_len + 2), "%s%s%s", path1, - (H5_CHECK_DELIMITER(path1[path1_len - 1]) ? "" : H5_DIR_SEPS), path2); - } /* end else */ - -done: - FUNC_LEAVE_NOAPI(ret_value) -} /* end H5_combine_name() */ +} /* H5_build_extpath() */ diff --git a/src/H5win32defs.h b/src/H5win32defs.h index 2a0f22d..e84def9 100644 --- a/src/H5win32defs.h +++ b/src/H5win32defs.h @@ -71,24 +71,21 @@ struct timezone { }; #ifdef __cplusplus -extern "C" { + extern "C" { #endif /* __cplusplus */ - H5_DLL int Wgettimeofday(struct timeval *tv, struct timezone *tz); - H5_DLL int Wsetenv(const char *name, const char *value, int overwrite); - H5_DLL int Wflock(int fd, int operation); - H5_DLL char* Wgetlogin(void); - H5_DLL int c99_snprintf(char* str, size_t size, const char* format, ...); - H5_DLL int c99_vsnprintf(char* str, size_t size, const char* format, va_list ap); + H5_DLL int Wgettimeofday(struct timeval *tv, struct timezone *tz); + H5_DLL int Wflock(int fd, int operation); + H5_DLL char* Wgetlogin(void); + H5_DLL int c99_snprintf(char* str, size_t size, const char* format, ...); + H5_DLL int c99_vsnprintf(char* str, size_t size, const char* format, va_list ap); #ifdef __cplusplus -} + } #endif /* __cplusplus */ - #define HDgettimeofday(V,Z) Wgettimeofday(V,Z) -#define HDsetenv(N,V,O) Wsetenv(N,V,O) #define HDflock(F,L) Wflock(F,L) #define HDgetlogin() Wgetlogin() #define HDsnprintf c99_snprintf /*varargs*/ -#define HDvsnprintf c99_vsnprintf /*varargs*/ +#define HDvsnprintf c99_vsnprintf #endif /* H5_HAVE_VISUAL_STUDIO */ @@ -101,7 +98,5 @@ extern "C" { #ifndef H5_HAVE_MINGW #define HDftruncate(F,L) _chsize_s(F,L) #define HDfseek(F,O,W) _fseeki64(F,O,W) -#endif /* H5_HAVE_MINGW */ - +#endif #endif /* H5_HAVE_WIN32_API */ - diff --git a/test/Makefile.am b/test/Makefile.am index 667c0e7..8389cc4 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -129,7 +129,7 @@ CHECK_CLEANFILES+=accum.h5 cmpd_dset.h5 compact_dataset.h5 dataset.h5 dset_offse huge_chunks.h5 chunk_cache.h5 big_chunk.h5 chunk_expand.h5 \ copy_dcpl_newfile.h5 extend.h5 istore.h5 extlinks*.h5 frspace.h5 links*.h5 \ sys_file1 tfile[1-7].h5 th5s[1-4].h5 lheap.h5 fheap.h5 ohdr.h5 \ - stab.h5 extern_[1-4].h5 extern_[1-4][rw].raw gheap[0-5].h5 \ + stab.h5 extern_[1-3].h5 extern_[1-4][ab].raw gheap[0-4].h5 \ dt_arith[1-2] links.h5 links[0-6]*.h5 extlinks[0-15].h5 tmp \ 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 \ diff --git a/test/external.c b/test/external.c index 67fa2ec..a37dc94 100644 --- a/test/external.c +++ b/test/external.c @@ -25,19 +25,9 @@ const char *FILENAME[] = { "extern_1", "extern_2", "extern_3", - "extern_4", - "extern_dir/file_1", NULL }; -/* A similar collection of files is used for the tests that - * perform file I/O. - */ -#define N_EXT_FILES 4 -#define PART_SIZE 25 -#define TOTAL_SIZE 100 -#define GARBAGE_PER_FILE 10 - /*------------------------------------------------------------------------- * Function: files_have_same_contents @@ -100,106 +90,6 @@ out: /*------------------------------------------------------------------------- - * Function: reset_raw_data_files - * - * Purpose: Resets the data in the raw data files for tests that - * perform dataset I/O on a set of files. - * - * Return: SUCCEED/FAIL - * - * Programmer: Dana Robinson - * February 2016 - * - *------------------------------------------------------------------------- - */ -static herr_t -reset_raw_data_files(void) -{ - int fd = 0; /* external file descriptor */ - size_t i, j; /* iterators */ - hssize_t n; /* bytes of I/O */ - char filename[1024]; /* file name */ - int data[PART_SIZE]; /* raw data buffer */ - uint8_t *garbage = NULL; /* buffer of garbage data */ - size_t garbage_count; /* size of garbage buffer */ - size_t garbage_bytes; /* # of garbage bytes written to file */ - - /* Set up garbage buffer */ - garbage_count = N_EXT_FILES * GARBAGE_PER_FILE; - if(NULL == (garbage = (uint8_t *)HDcalloc(garbage_count, sizeof(uint8_t)))) - goto error; - for(i = 0; i < garbage_count; i++) - garbage[i] = 0xFF; - - /* The *r files are pre-filled with data and are used to - * verify that read operations work correctly. - */ - for(i = 0; i < N_EXT_FILES; i++) { - - /* Open file */ - HDsprintf(filename, "extern_%lur.raw", (unsigned long)i + 1); - if((fd = HDopen(filename, O_RDWR|O_CREAT|O_TRUNC, 0666)) < 0) - goto error; - - /* Write garbage data to the file. This allows us to test the - * the ability to set an offset in the raw data file. - */ - garbage_bytes = i * 10; - n = HDwrite(fd, garbage, garbage_bytes); - if(n < 0 || (size_t)n != garbage_bytes) - goto error; - - /* Fill array with data */ - for(j = 0; j < PART_SIZE; j++) { - data[j] = (int)(i * 25 + j); - } /* end for */ - - /* Write raw data to the file. */ - n = HDwrite(fd, data, sizeof(data)); - if(n != sizeof(data)) - goto error; - - /* Close this file */ - HDclose(fd); - - } /* end for */ - - /* The *w files are only pre-filled with the garbage data and are - * used to verify that write operations work correctly. The individual - * tests fill in the actual data. - */ - for(i = 0; i < N_EXT_FILES; i++) { - - /* Open file */ - HDsprintf(filename, "extern_%luw.raw", (unsigned long)i + 1); - if((fd = HDopen(filename, O_RDWR|O_CREAT|O_TRUNC, 0666)) < 0) - goto error; - - /* Write garbage data to the file. This allows us to test the - * the ability to set an offset in the raw data file. - */ - garbage_bytes = i * 10; - n = HDwrite(fd, garbage, garbage_bytes); - if(n < 0 || (size_t)n != garbage_bytes) - goto error; - - /* Close this file */ - HDclose(fd); - - } /* end for */ - HDfree(garbage); - return SUCCEED; - -error: - if(fd) - HDclose(fd); - if(garbage) - HDfree(garbage); - return FAIL; -} /* end reset_raw_data_files() */ - - -/*------------------------------------------------------------------------- * Function: test_non_extendible * * Purpose: Tests a non-extendible dataset with a single external file. @@ -222,7 +112,7 @@ test_non_extendible(hid_t file) hsize_t max_size[1]; /* data space maximum size */ int n; /* number of external files */ char name[256]; /* external file name */ - off_t file_offset; /* external file offset */ + HDoff_t file_offset; /* external file offset */ hsize_t file_size; /* sizeof external file segment */ haddr_t dset_addr; /* address of dataset */ @@ -471,7 +361,7 @@ test_large_enough_current_not_eventual(hid_t file) /*------------------------------------------------------------------------- - * Function: test_unlimited + * Function: test_1e * * Purpose: Test a single external file of unlimited size and an * unlimited data space. @@ -494,7 +384,7 @@ test_unlimited(hid_t file) hsize_t max_size[1]; /* data space maximum size */ int n; /* number of external files */ char name[256]; /* external file name */ - off_t file_offset; /* external file offset */ + HDoff_t file_offset; /* external file offset */ hsize_t file_size; /* sizeof external file segment */ TESTING("unlimited dataspace, unlimited external storage"); @@ -739,25 +629,38 @@ test_read_file_set(hid_t fapl) hid_t space = -1; /* data space */ hid_t dset = -1; /* dataset */ hid_t grp = -1; /* group to emit diagnostics */ - size_t i; /* miscellaneous counter */ + int fd = -1; /* external file descriptors */ + size_t i, j; /* miscellaneous counters */ + hssize_t n; /* bytes of I/O */ char filename[1024]; /* file names */ - int part[PART_SIZE]; /* raw data buffer (partial) */ - int whole[TOTAL_SIZE]; /* raw data buffer (total) */ + int part[25], whole[100]; /* raw data buffers */ hsize_t cur_size; /* current data space size */ - hid_t hs_space = -1; /* hyperslab data space */ + hid_t hs_space; /* hyperslab data space */ hsize_t hs_start = 30; /* hyperslab starting offset */ hsize_t hs_count = 25; /* hyperslab size */ + int temparray[10] = {0x0f0f0f0f,0x0f0f0f0f,0x0f0f0f0f,0x0f0f0f0f,0x0f0f0f0f,0x0f0f0f0f,0x0f0f0f0f,0x0f0f0f0f,0x0f0f0f0f,0x0f0f0f0f}; TESTING("read external dataset"); - if(HDsetenv("HDF5_EXTFILE_PREFIX", "", 1) < 0) - TEST_ERROR - - /* Reset the raw data files */ - if(reset_raw_data_files() < 0) + /* Write the data to external files directly */ + for(i=0; i<4; i++) { + for(j=0; j<25; j++) { + part[j] = (int)(i*25+j); + } /* end for */ + HDsprintf(filename, "extern_%lua.raw", (unsigned long)i+1); + if((fd = HDopen(filename, O_RDWR|O_CREAT|O_TRUNC, 0666)) < 0) + TEST_ERROR + n = HDwrite(fd, temparray, (size_t)i*10); + if(n < 0 || (size_t)n != i*10) + TEST_ERROR + n = HDwrite(fd, part, sizeof(part)); + if(n != sizeof(part)) TEST_ERROR + HDclose(fd); + } /* end for */ - /* Create the file and an initial group. This causes messages about + /* + * Create the file and an initial group. This causes messages about * debugging to be emitted before we start playing games with what the * output looks like. */ @@ -768,57 +671,50 @@ test_read_file_set(hid_t fapl) FAIL_STACK_ERROR if(H5Gclose(grp) < 0) FAIL_STACK_ERROR - /* Create the dcpl */ + /* Create the dataset */ if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) FAIL_STACK_ERROR - for(i = 0; i < N_EXT_FILES; i++) { - HDsnprintf(filename, sizeof(filename), "extern_%dr.raw", (int) i + 1); - if(H5Pset_external(dcpl, filename, (HDoff_t)(i * GARBAGE_PER_FILE), (hsize_t)sizeof(part)) < 0) - FAIL_STACK_ERROR - } /* end for */ - - /* Create the dataspace */ - cur_size = TOTAL_SIZE; + if(H5Pset_external(dcpl, "extern_1a.raw", (HDoff_t)0, (hsize_t)sizeof part) < 0 || + H5Pset_external(dcpl, "extern_2a.raw", (HDoff_t)10, (hsize_t)sizeof part) < 0 || + H5Pset_external(dcpl, "extern_3a.raw", (HDoff_t)20, (hsize_t)sizeof part) < 0 || + H5Pset_external(dcpl, "extern_4a.raw", (HDoff_t)30, (hsize_t)sizeof part) < 0) + FAIL_STACK_ERROR + cur_size = 100; if((space = H5Screate_simple(1, &cur_size, NULL)) < 0) FAIL_STACK_ERROR - - /* Create the dataset */ if((dset = H5Dcreate2(file, "dset1", H5T_NATIVE_INT, space, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) FAIL_STACK_ERROR - /* Read the entire dataset */ + /* + * Read the entire dataset and compare with the original + */ HDmemset(whole, 0, sizeof(whole)); if(H5Dread(dset, H5T_NATIVE_INT, space, space, H5P_DEFAULT, whole) < 0) FAIL_STACK_ERROR - - /* Compare data */ - for(i = 0; i < TOTAL_SIZE; i++) + for(i = 0; i < 100; i++) if(whole[i] != (signed)i) - FAIL_PUTS_ERROR("Incorrect value(s) read."); + FAIL_PUTS_ERROR(" Incorrect value(s) read."); - /* Read via a hypserslab in the middle of the dataset */ + /* Read the middle of the dataset */ + if((hs_space = H5Scopy(space)) < 0) + FAIL_STACK_ERROR + if(H5Sselect_hyperslab(hs_space, H5S_SELECT_SET, &hs_start, NULL, &hs_count, NULL) < 0) + FAIL_STACK_ERROR - /* Set up dataspace */ - if((hs_space = H5Scopy(space)) < 0) - FAIL_STACK_ERROR - if(H5Sselect_hyperslab(hs_space, H5S_SELECT_SET, &hs_start, NULL, &hs_count, NULL) < 0) - FAIL_STACK_ERROR + HDmemset(whole, 0, sizeof(whole)); + if(H5Dread(dset, H5T_NATIVE_INT, hs_space, hs_space, H5P_DEFAULT, whole) < 0) + FAIL_STACK_ERROR - /* Read */ - HDmemset(whole, 0, sizeof(whole)); - if(H5Dread(dset, H5T_NATIVE_INT, hs_space, hs_space, H5P_DEFAULT, whole) < 0) - FAIL_STACK_ERROR + if(H5Sclose(hs_space) < 0) FAIL_STACK_ERROR - /* Verify data */ - for(i = (size_t)hs_start; i < (size_t)(hs_start + hs_count); i++) { - if(whole[i] != (signed)i) - FAIL_PUTS_ERROR("Incorrect value(s) read (hyperslab)."); - } /* end for */ + for(i = hs_start; i= 0) - FAIL_PUTS_ERROR("reopening the dataset with a different efile_prefix succeded"); - - /* Read the entire dataset and compare with the original */ - HDmemset(whole, 0, sizeof(whole)); - if(H5Dread(dset, H5T_NATIVE_INT, space, space, H5P_DEFAULT, whole) < 0) - FAIL_STACK_ERROR - for(i = 0; i < TOTAL_SIZE; i++) - if(whole[i] != (signed)i) - FAIL_PUTS_ERROR("Incorrect value(s) read."); - - /* Close dataset */ - if(H5Dclose(dset2) < 0) FAIL_STACK_ERROR - if(H5Dclose(dset) < 0) FAIL_STACK_ERROR - - /* Open dataset (use a differend prefix than for create. - * This works because the dataset was closed. - */ - if(H5Pset_efile_prefix(dapl2, "${ORIGIN}/.") < 0) - FAIL_STACK_ERROR - if((dset = H5Dopen2(file, "dset1", dapl2)) < 0) - FAIL_STACK_ERROR - - /* Reopen dataset with same efile_prefix property */ - if((dset2 = H5Dopen2(file, "dset1", dapl2)) < 0) - FAIL_STACK_ERROR - - /* Reopen dataset with different efile_prefix property */ - if(H5Pset_efile_prefix(dapl, NULL) < 0) - FAIL_STACK_ERROR - H5E_BEGIN_TRY { - dset3 = H5Dopen2(file, "dset1", dapl); - } H5E_END_TRY; - if(dset3 >= 0) - FAIL_PUTS_ERROR("reopening the dataset with a different efile_prefix succeded"); - - /* Read the entire dataset and compare with the original */ - HDmemset(whole, 0, sizeof(whole)); - if(H5Dread(dset, H5T_NATIVE_INT, space, space, H5P_DEFAULT, whole) < 0) - FAIL_STACK_ERROR - for(i = 0; i < TOTAL_SIZE; i++) - if(whole[i] != (signed)i) - FAIL_PUTS_ERROR("Incorrect value(s) read."); - - if(H5Dclose(dset2) < 0) FAIL_STACK_ERROR - if(H5Dclose(dset) < 0) FAIL_STACK_ERROR - if(H5Pclose(dapl2) < 0) FAIL_STACK_ERROR - if(H5Pclose(dapl) < 0) FAIL_STACK_ERROR - if(H5Pclose(dcpl) < 0) FAIL_STACK_ERROR - if(H5Sclose(space) < 0) FAIL_STACK_ERROR - if(H5Fclose(file) < 0) FAIL_STACK_ERROR - PASSED(); - return 0; - -error: - H5E_BEGIN_TRY { - H5Pclose(dapl2); - H5Pclose(dapl); - H5Dclose(dset3); - H5Dclose(dset2); - H5Dclose(dset); - H5Pclose(dcpl); - H5Sclose(space); - H5Fclose(file); - } H5E_END_TRY; - return 1; -} /* end test_path_relative_cwd() */ - - -/*------------------------------------------------------------------------- - * Function: test_path_env - * - * Purpose: Test whether the value of HDF5_EXTFILE_PREFIX will overwrite - * the efile_prefix dataset access property. - * This will create an HDF5 file in a subdirectory which will - * refer to ../extern_*a.raw - * The files are then accessed by setting the HDF5_EXTFILE_PREFIX - * environment variable to "${ORIGIN}". - * The efile_prefix dataset access property is set to "someprefix", - * which will cause an error if the value is not overwritten by - * the environment variable. - * - * Return: Success: 0 - * Failure: 1 - * - * Programmer: Steffen Kiess - * March 10, 2015 - * - *------------------------------------------------------------------------- - */ -static int -test_path_env(hid_t fapl) -{ - hid_t file = -1; /* file to write to */ - hid_t dcpl = -1; /* dataset creation properties */ - hid_t space = -1; /* data space */ - hid_t dapl = -1; /* dataset access property list */ - hid_t dset = -1; /* dataset */ - size_t i; /* miscellaneous counters */ - char cwdpath[1024]; /* working directory */ - char filename[1024]; /* file name */ - int part[PART_SIZE]; /* raw data buffer (partial) */ - int whole[TOTAL_SIZE]; /* raw data buffer (total) */ - hsize_t cur_size; /* current data space size */ - char buffer[1024]; /* buffer to read efile_prefix */ - - TESTING("prefix in HDF5_EXTFILE_PREFIX"); - - if(HDsetenv("HDF5_EXTFILE_PREFIX", "${ORIGIN}", 1)) - TEST_ERROR - - if(HDmkdir("extern_dir", (mode_t)0755) < 0 && errno != EEXIST) - TEST_ERROR; - - h5_fixname(FILENAME[4], fapl, filename, sizeof(filename)); - if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) - FAIL_STACK_ERROR - - /* Reset the raw data files */ - if(reset_raw_data_files() < 0) - TEST_ERROR - - /* Create the dataset */ - if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) - FAIL_STACK_ERROR - if(NULL == HDgetcwd(cwdpath, sizeof(cwdpath))) - TEST_ERROR - for(i = 0; i < N_EXT_FILES; i++) { - HDsnprintf(filename, sizeof(filename), "..%sextern_%dr.raw", H5_DIR_SEPS, (int) i + 1); - if(H5Pset_external(dcpl, filename, (HDoff_t)(i * GARBAGE_PER_FILE), (hsize_t)sizeof(part)) < 0) - FAIL_STACK_ERROR - } /* end for */ - - cur_size = TOTAL_SIZE; - if((space = H5Screate_simple(1, &cur_size, NULL)) < 0) - FAIL_STACK_ERROR - if((dapl = H5Pcreate(H5P_DATASET_ACCESS)) < 0) - FAIL_STACK_ERROR - - /* Set prefix to a nonexistent directory, will be overwritten by environment variable */ - if(H5Pset_efile_prefix(dapl, "someprefix") < 0) - FAIL_STACK_ERROR - if(H5Pget_efile_prefix(dapl, buffer, sizeof(buffer)) < 0) - FAIL_STACK_ERROR - if(HDstrcmp(buffer, "someprefix") != 0) - FAIL_PUTS_ERROR("efile prefix not set correctly"); - - /* Create dataset */ - if((dset = H5Dcreate2(file, "dset1", H5T_NATIVE_INT, space, H5P_DEFAULT, dcpl, dapl)) < 0) - FAIL_STACK_ERROR - - /* Read the entire dataset and compare with the original */ - HDmemset(whole, 0, sizeof(whole)); - if(H5Dread(dset, H5T_NATIVE_INT, space, space, H5P_DEFAULT, whole) < 0) - FAIL_STACK_ERROR - for(i = 0; i < TOTAL_SIZE; i++) - if(whole[i] != (signed)i) - FAIL_PUTS_ERROR("Incorrect value(s) read."); - - if(H5Dclose(dset) < 0) FAIL_STACK_ERROR - if(H5Pclose(dapl) < 0) FAIL_STACK_ERROR - if(H5Pclose(dcpl) < 0) FAIL_STACK_ERROR - if(H5Sclose(space) < 0) FAIL_STACK_ERROR - if(H5Fclose(file) < 0) FAIL_STACK_ERROR - PASSED(); - return 0; - -error: - H5E_BEGIN_TRY { - H5Pclose(dapl); - H5Dclose(dset); - H5Pclose(dcpl); - H5Sclose(space); - H5Fclose(file); - } H5E_END_TRY; - return 1; -} /* end test_path_env() */ - /*------------------------------------------------------------------------- * Function: main @@ -1478,14 +926,10 @@ main(void) nerrors += test_add_to_unlimited(); nerrors += test_overflow(); - /* These file set tests use the VFD-aware fapl */ + /* These tests use the VFD-aware fapl */ nerrors += test_read_file_set(current_fapl_id); nerrors += test_write_file_set(current_fapl_id); - nerrors += test_path_absolute(current_fapl_id); - nerrors += test_path_relative(current_fapl_id); - nerrors += test_path_relative_cwd(current_fapl_id); - nerrors += test_path_env(current_fapl_id); - + /* Verify symbol table messages are cached */ nerrors += (h5_verify_cached_stabs(FILENAME, current_fapl_id) < 0 ? 1 : 0); @@ -1503,17 +947,14 @@ main(void) /* Clean up files used by file set tests */ if(h5_cleanup(FILENAME, fapl_id_old)) { - HDremove("extern_1r.raw"); - HDremove("extern_2r.raw"); - HDremove("extern_3r.raw"); - HDremove("extern_4r.raw"); - - HDremove("extern_1w.raw"); - HDremove("extern_2w.raw"); - HDremove("extern_3w.raw"); - HDremove("extern_4w.raw"); - - HDrmdir("extern_dir"); + HDremove("extern_1a.raw"); + HDremove("extern_1b.raw"); + HDremove("extern_2a.raw"); + HDremove("extern_2b.raw"); + HDremove("extern_3a.raw"); + HDremove("extern_3b.raw"); + HDremove("extern_4a.raw"); + HDremove("extern_4b.raw"); } /* end if */ return EXIT_SUCCESS; diff --git a/test/gheap.c b/test/gheap.c index c03d099..3f66d35 100644 --- a/test/gheap.c +++ b/test/gheap.c @@ -51,480 +51,412 @@ const char *FILENAME[] = { "gheap2", "gheap3", "gheap4", - "gheap5", + "gheapooo", NULL }; -/* Number of heap objects in tests */ -#define N_GHEAP_OBJS 1024 - -/* Size of heap object buffers */ -#define OBJ_BUF_SIZE N_GHEAP_OBJS - -/* Size of filename */ -#define FILENAME_SIZE 1024 - /*------------------------------------------------------------------------- - * Function: test_monotonic_increasing + * Function: test_1 + * + * Purpose: Writes a sequence of objects to the global heap where each + * object is larger than the one before. * - * Purpose: Writes a sequence of objects to the global heap where each - * object is larger than the one before. + * Return: Success: 0 * - * Return: Success: 0 - * Failure: number of errors + * Failure: number of errors * - * Programmer: Robb Matzke + * Programmer: Robb Matzke * Tuesday, March 31, 1998 * + * Modifications: + * *------------------------------------------------------------------------- */ static int -test_monotonic_increasing(hid_t fapl) +test_1 (hid_t fapl) { - char *filename = NULL; /* VFD-dependent filename */ - hid_t fid = -1; /* HDF5 file ID */ - H5F_t *f = NULL; /* file object pointer */ - H5HG_t *obj = NULL; /* global heap objects */ - uint8_t *in = NULL; /* global heap data sent */ - uint8_t *out = NULL; /* global heap data received */ - unsigned i; /* iterator */ - size_t size; /* heap object size */ - int nerrors = 0; /* # of errors encountered */ + hid_t file = -1; + H5F_t *f = NULL; + H5HG_t obj[1024]; + uint8_t out[1024]; + uint8_t in[1024]; + int i; + size_t size; + herr_t status; + int nerrors = 0; + char filename[1024]; TESTING("monotonically increasing lengths"); - /* allocate memory */ - if(NULL == (filename = (char *)HDcalloc(FILENAME_SIZE, sizeof(char)))) - goto error; - if(NULL == (obj = (H5HG_t *)HDcalloc(N_GHEAP_OBJS, sizeof(H5HG_t)))) - goto error; - if(NULL == (in = (uint8_t *)HDcalloc(OBJ_BUF_SIZE, sizeof(uint8_t)))) - goto error; - if(NULL == (out = (uint8_t *)HDcalloc(OBJ_BUF_SIZE, sizeof(uint8_t)))) - goto error; - /* Open a clean file */ - h5_fixname(FILENAME[0], fapl, filename, sizeof(filename)); - if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) - goto error; - if(NULL == (f = (H5F_t *)H5I_object(fid))) { - H5_FAILED(); - HDputs(" Unable to create file"); - goto error; - } /* end if */ - - /* Write the objects, monotonically increasing in length. Since this is + h5_fixname(FILENAME[0], fapl, filename, sizeof filename); + if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) + goto error; + if(NULL == (f = (H5F_t *)H5I_object(file))) { + H5_FAILED(); + puts(" Unable to create file"); + goto error; + } + + /* + * Write the objects, monotonically increasing in length. Since this is * a clean file, the addresses allocated for the collections should also * be monotonically increasing. */ - for(i = 0; i < N_GHEAP_OBJS; i++) { - size = i + 1; - HDmemset(out, 'A' + (int)i % 26, size); - H5Eclear2(H5E_DEFAULT); - if(H5HG_insert(f, H5AC_ind_read_dxpl_id, size, out, obj + i) < 0) { - H5_FAILED(); - HDputs(" Unable to insert object into global heap"); - nerrors++; - } else if(i && H5F_addr_gt(obj[i - 1].addr, obj[i].addr)) { - H5_FAILED(); - HDputs(" Collection addresses are not monotonically increasing"); - nerrors++; - } /* end if */ - } /* end for */ - - /* Now try to read each object back. */ - for(i = 0; i < N_GHEAP_OBJS; i++) { - size = i + 1; - HDmemset(out, 'A' + (int)i % 26, size); - H5Eclear2(H5E_DEFAULT); - if(NULL == H5HG_read(f, H5AC_ind_read_dxpl_id, obj + i, in, NULL)) { - H5_FAILED(); - HDputs(" Unable to read object"); - nerrors++; - } else if(HDmemcmp(in, out, size)) { - H5_FAILED(); - HDputs(" Value read doesn't match value written"); - nerrors++; - } /* end if */ - } /* end for */ - - if(H5Fclose(fid) < 0) goto error; + for(i = 0; i < 1024; i++) { + size = i + 1; + HDmemset(out, 'A' + i % 26, size); + H5Eclear2(H5E_DEFAULT); + status = H5HG_insert(f, H5AC_ind_read_dxpl_id, size, out, obj + i); + if(status < 0) { + H5_FAILED(); + puts(" Unable to insert object into global heap"); + nerrors++; + } else if(i && H5F_addr_gt(obj[i - 1].addr, obj[i].addr)) { + H5_FAILED(); + puts(" Collection addresses are not monotonically increasing"); + nerrors++; + } + } + + /* + * Now try to read each object back. + */ + for(i = 0; i < 1024; i++) { + size = i + 1; + HDmemset(out, 'A' + i % 26, size); + H5Eclear2(H5E_DEFAULT); + if(NULL == H5HG_read(f, H5AC_ind_read_dxpl_id, obj + i, in, NULL)) { + H5_FAILED(); + puts(" Unable to read object"); + nerrors++; + } else if(HDmemcmp(in, out, size)) { + H5_FAILED(); + puts(" Value read doesn't match value written"); + nerrors++; + } + } + + if(H5Fclose(file) < 0) goto error; if(nerrors) goto error; - HDfree(filename); - HDfree(obj); - HDfree(in); - HDfree(out); - PASSED(); return 0; error: H5E_BEGIN_TRY { - H5Fclose(fid); + H5Fclose(file); } H5E_END_TRY; - if(filename) - HDfree(filename); - if(obj) - HDfree(obj); - if(in) - HDfree(in); - if(out) - HDfree(out); return MAX(1, nerrors); -} /* end test_monotonic_increasing() */ +} /*------------------------------------------------------------------------- - * Function: test_monotonic_decreasing + * Function: test_2 + * + * Purpose: Writes a sequence of objects to the global heap where each + * object is smaller than the one before. * - * Purpose: Writes a sequence of objects to the global heap where each - * object is smaller than the one before. + * Return: Success: 0 * - * Return: Success: 0 - * Failure: number of errors + * Failure: number of errors * - * Programmer: Robb Matzke + * Programmer: Robb Matzke * Tuesday, March 31, 1998 * + * Modifications: + * *------------------------------------------------------------------------- */ static int -test_monotonic_decreasing(hid_t fapl) +test_2 (hid_t fapl) { - char *filename = NULL; /* VFD-dependent filename */ - hid_t fid = -1; /* HDF5 file ID */ - H5F_t *f = NULL; /* file object pointer */ - H5HG_t *obj = NULL; /* global heap objects */ - uint8_t *in = NULL; /* global heap data sent */ - uint8_t *out = NULL; /* global heap data received */ - unsigned i; /* iterator */ - size_t size; /* heap object size */ - int nerrors = 0; /* # of errors encountered */ + hid_t file = -1; + H5F_t *f = NULL; + H5HG_t obj[1024]; + uint8_t out[1024]; + uint8_t in[1024]; + int i; + size_t size; + int nerrors = 0; + char filename[1024]; TESTING("monotonically decreasing lengths"); - /* allocate memory */ - if(NULL == (filename = (char *)HDcalloc(FILENAME_SIZE, sizeof(char)))) - goto error; - if(NULL == (obj = (H5HG_t *)HDcalloc(N_GHEAP_OBJS, sizeof(H5HG_t)))) - goto error; - if(NULL == (in = (uint8_t *)HDcalloc(OBJ_BUF_SIZE, sizeof(uint8_t)))) - goto error; - if(NULL == (out = (uint8_t *)HDcalloc(OBJ_BUF_SIZE, sizeof(uint8_t)))) - goto error; - /* Open a clean file */ - h5_fixname(FILENAME[1], fapl, filename, sizeof(filename)); - if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) - goto error; - if(NULL == (f = (H5F_t *)H5I_object(fid))) { - H5_FAILED(); - HDputs(" Unable to create file"); - goto error; - } /* end if */ - - /* Write the objects, monotonically decreasing in length. */ - for(i = 0; i < N_GHEAP_OBJS; i++) { - size = N_GHEAP_OBJS - i; - HDmemset(out, 'A' + (int)i % 26, size); - H5Eclear2(H5E_DEFAULT); - if(H5HG_insert(f, H5AC_ind_read_dxpl_id, size, out, obj+i) < 0) { - H5_FAILED(); - HDputs(" Unable to insert object into global heap"); - nerrors++; - } /* end if */ - } /* end for */ - - /* Now try to read each object back. */ - for(i = 0; i < N_GHEAP_OBJS; i++) { - size = N_GHEAP_OBJS - i; - HDmemset(out, 'A' + (int)i % 26, size); - H5Eclear2(H5E_DEFAULT); - if(NULL == H5HG_read(f, H5AC_ind_read_dxpl_id, obj+i, in, NULL)) { - H5_FAILED(); - HDputs(" Unable to read object"); - nerrors++; - } else if (HDmemcmp(in, out, size)) { - H5_FAILED(); - HDputs(" Value read doesn't match value written"); - nerrors++; - } /* end if */ - } /* end for */ - - if(H5Fclose(fid) < 0) goto error; - if(nerrors) goto error; - - HDfree(filename); - HDfree(obj); - HDfree(in); - HDfree(out); - + h5_fixname(FILENAME[1], fapl, filename, sizeof filename); + if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) + goto error; + if(NULL == (f = (H5F_t *)H5I_object(file))) { + H5_FAILED(); + puts(" Unable to create file"); + goto error; + } + + /* + * Write the objects, monotonically decreasing in length. + */ + for (i=0; i<1024; i++) { + size = 1024-i; + memset (out, 'A'+i%26, size); + H5Eclear2(H5E_DEFAULT); + if (H5HG_insert (f, H5AC_ind_read_dxpl_id, size, out, obj+i)<0) { + H5_FAILED(); + puts(" Unable to insert object into global heap"); + nerrors++; + } + } + + /* + * Now try to read each object back. + */ + for (i=0; i<1024; i++) { + size = 1024-i; + memset (out, 'A'+i%26, size); + H5Eclear2(H5E_DEFAULT); + if (NULL==H5HG_read (f, H5AC_ind_read_dxpl_id, obj+i, in, NULL)) { + H5_FAILED(); + puts(" Unable to read object"); + nerrors++; + } else if (memcmp (in, out, size)) { + H5_FAILED(); + puts(" Value read doesn't match value written"); + nerrors++; + } + } + + if (H5Fclose(file)<0) goto error; + if (nerrors) goto error; PASSED(); return 0; error: H5E_BEGIN_TRY { - H5Fclose(fid); + H5Fclose(file); } H5E_END_TRY; - if(filename) - HDfree(filename); - if(obj) - HDfree(obj); - if(in) - HDfree(in); - if(out) - HDfree(out); return MAX(1, nerrors); -} /* end test_monotonic_decreasing() */ +} /*------------------------------------------------------------------------- - * Function: test_complete_removal + * Function: test_3 * - * Purpose: Creates a few global heap objects and then removes them all. - * The collection should also be removed. + * Purpose: Creates a few global heap objects and then removes them all. + * The collection should also be removed. * - * Return: Success: 0 - * Failure: number of errors + * Return: Success: 0 * - * Programmer: Robb Matzke + * Failure: number of errors + * + * Programmer: Robb Matzke * Tuesday, March 31, 1998 * + * Modifications: + * *------------------------------------------------------------------------- */ static int -test_complete_removal(hid_t fapl) +test_3 (hid_t fapl) { - char *filename = NULL; /* VFD-dependent filename */ - hid_t fid = -1; /* HDF5 file ID */ - H5F_t *f = NULL; /* file object pointer */ - H5HG_t *obj = NULL; /* global heap objects */ - uint8_t *out = NULL; /* global heap data received */ - unsigned i; /* iterator */ - size_t size; /* heap object size */ - int nerrors = 0; /* # of errors encountered */ + hid_t file = -1; + H5F_t *f = NULL; + H5HG_t obj[1024]; + uint8_t out[1024]; + int i; + size_t size; + herr_t status; + int nerrors = 0; + char filename[1024]; TESTING("complete object removal"); - /* allocate memory */ - if(NULL == (filename = (char *)HDcalloc(FILENAME_SIZE, sizeof(char)))) - goto error; - if(NULL == (obj = (H5HG_t *)HDcalloc(N_GHEAP_OBJS, sizeof(H5HG_t)))) - goto error; - if(NULL == (out = (uint8_t *)HDcalloc(OBJ_BUF_SIZE, sizeof(uint8_t)))) - goto error; - /* Open a clean file */ - h5_fixname(FILENAME[2], fapl, filename, sizeof(filename)); - if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) - goto error; - if(NULL == (f = (H5F_t *)H5I_object(fid))) { - H5_FAILED(); - HDputs(" Unable to create file"); - goto error; - } /* end if */ + h5_fixname(FILENAME[2], fapl, filename, sizeof filename); + if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) + goto error; + if(NULL == (f = (H5F_t *)H5I_object(file))) { + H5_FAILED(); + puts(" Unable to create file"); + goto error; + } /* Create some stuff */ - for(i = 0; i < N_GHEAP_OBJS; i++) { - size = i % 30 + 100; - HDmemset(out, 'A' + (int)i % 26, size); - H5Eclear2(H5E_DEFAULT); - if(H5HG_insert(f, H5AC_ind_read_dxpl_id, size, out, obj+i) < 0) { - H5_FAILED(); - HDputs(" Unable to insert object into global heap"); - nerrors++; - } /* end if */ - } /* end for */ + for (i=0; i<1024; i++) { + size = i%30+100; + memset (out, 'A'+i%26, size); + H5Eclear2(H5E_DEFAULT); + status = H5HG_insert (f, H5AC_ind_read_dxpl_id, size, out, obj+i); + if (status<0) { + H5_FAILED(); + puts(" Unable to insert object into global heap"); + nerrors++; + } + } /* Remove everything */ - for(i = 0; i < N_GHEAP_OBJS; i++) { - if(H5HG_remove(f, H5AC_ind_read_dxpl_id, obj+i) < 0) { - H5_FAILED(); - HDputs(" Unable to remove object"); - nerrors++; - } /* end if */ - } /* end for */ - - if(H5Fclose(fid) < 0) goto error; - if(nerrors) goto error; - - HDfree(filename); - HDfree(obj); - HDfree(out); - + for (i=0; i<1024; i++) { + status = H5HG_remove (f, H5AC_ind_read_dxpl_id, obj+i); + if (status<0) { + H5_FAILED(); + puts(" Unable to remove object"); + nerrors++; + } + } + + if (H5Fclose(file)<0) goto error; + if (nerrors) goto error; PASSED(); return 0; error: H5E_BEGIN_TRY { - H5Fclose(fid); + H5Fclose(file); } H5E_END_TRY; - if(filename) - HDfree(filename); - if(obj) - HDfree(obj); - if(out) - HDfree(out); return MAX(1, nerrors); -} /* end test_complete_removal() */ +} /*------------------------------------------------------------------------- - * Function: test_partial_removal + * Function: test_4 * - * Purpose: Tests the H5HG_remove() feature by writing lots of objects - * and occassionally removing some. When we're done they're all - * removed. + * Purpose: Tests the H5HG_remove() feature by writing lots of objects + * and occassionally removing some. When we're done they're all + * removed. * - * Return: Success: 0 - * Failure: number of errors + * Return: Success: 0 * - * Programmer: Robb Matzke + * Failure: number of errors + * + * Programmer: Robb Matzke * Tuesday, March 31, 1998 * + * Modifications: + * *------------------------------------------------------------------------- */ static int -test_partial_removal(hid_t fapl) +test_4 (hid_t fapl) { - char *filename = NULL; /* VFD-dependent filename */ - hid_t fid = -1; /* HDF5 file ID */ - H5F_t *f = NULL; /* file object pointer */ - H5HG_t *obj = NULL; /* global heap objects */ - uint8_t *out = NULL; /* global heap data received */ - unsigned i; /* iterator */ - size_t size; /* heap object size */ - int nerrors = 0; /* # of errors encountered */ + hid_t file = -1; + H5F_t *f = NULL; + H5HG_t obj[1024]; + uint8_t out[1024]; + int i; + size_t size; + herr_t status; + int nerrors = 0; + char filename[1024]; TESTING("partial object removal"); - /* allocate memory */ - if(NULL == (filename = (char *)HDcalloc(FILENAME_SIZE, sizeof(char)))) - goto error; - if(NULL == (obj = (H5HG_t *)HDcalloc(N_GHEAP_OBJS, sizeof(H5HG_t)))) - goto error; - if(NULL == (out = (uint8_t *)HDcalloc(OBJ_BUF_SIZE, sizeof(uint8_t)))) - goto error; - /* Open a clean file */ - h5_fixname(FILENAME[3], fapl, filename, sizeof(filename)); - if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) - goto error; - if(NULL == (f = (H5F_t *)H5I_object(fid))) { - H5_FAILED(); - HDputs(" Unable to create file"); - goto error; - } /* end if */ - - for(i = 0; i < N_GHEAP_OBJS; i++) { - - /* Insert */ - size = i % 30 + 100; - HDmemset(out, 'A' + (int)i % 26, size); - H5Eclear2(H5E_DEFAULT); - if(H5HG_insert(f, H5AC_ind_read_dxpl_id, size, out, obj+i) < 0) { - H5_FAILED(); - HDputs(" Unable to insert object into global heap"); - nerrors++; - } /* end if */ - - /* Remove every third one beginning with the second, but after the - * next one has already been inserted. That is, insert A, B, C; - * remove B, insert D, E, F; remove E; etc. - */ - if(1 == i % 3) { - H5Eclear2(H5E_DEFAULT); - if(H5HG_remove(f, H5AC_ind_read_dxpl_id, obj+i-1) < 0) { - H5_FAILED(); - HDputs(" Unable to remove object"); - nerrors++; - } /* end if */ - HDmemset(obj+i-1, 0, sizeof(*obj)); - } /* end if */ - } /* end for */ - - if(H5Fclose(fid) < 0) goto error; - if(nerrors) goto error; - - HDfree(filename); - HDfree(obj); - HDfree(out); - + h5_fixname(FILENAME[3], fapl, filename, sizeof filename); + if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) + goto error; + if(NULL == (f = (H5F_t *)H5I_object(file))) { + H5_FAILED(); + puts(" Unable to create file"); + goto error; + } + + for (i=0; i<1024; i++) { + /* Insert */ + size = i%30+100; + memset (out, 'A'+i%26, size); + H5Eclear2(H5E_DEFAULT); + status = H5HG_insert (f, H5AC_ind_read_dxpl_id, size, out, obj+i); + if (status<0) { + H5_FAILED(); + puts(" Unable to insert object into global heap"); + nerrors++; + } + + /* + * Remove every third one beginning with the second, but after the + * next one has already been inserted. That is, insert A, B, C; + * remove B, insert D, E, F; remove E; etc. + */ + if (1==i%3) { + H5Eclear2(H5E_DEFAULT); + status = H5HG_remove (f, H5AC_ind_read_dxpl_id, obj+i-1); + if (status<0) { + H5_FAILED(); + puts(" Unable to remove object"); + nerrors++; + } + memset (obj+i-1, 0, sizeof *obj); + } + } + + if (H5Fclose(file)<0) goto error; + if (nerrors) goto error; PASSED(); return 0; error: H5E_BEGIN_TRY { - H5Fclose(fid); + H5Fclose(file); } H5E_END_TRY; - if(filename) - HDfree(filename); - if(obj) - HDfree(obj); - if(out) - HDfree(out); return MAX(1, nerrors); -} /* end test_partial_removal() */ +} /*------------------------------------------------------------------------- - * Function: test_ooo_indices + * Function: test_ooo_indices * - * Purpose: Tests that indices can be stored out of order. This can + * Purpose: Tests that indices can be stored out of order. This can * happen when the indices "wrap around" due to many * insertions and deletions (for example, from rewriting a * VL dataset). * - * Return: Success: 0 - * Failure: number of errors + * Return: Success: 0 * - * Programmer: Neil Fortner + * Failure: number of errors + * + * Programmer: Neil Fortner * Monday, October 26, 2009 * + * Modifications: + * *------------------------------------------------------------------------- */ static int test_ooo_indices(hid_t fapl) { - char *filename = NULL; /* VFD-dependent filename */ - hid_t fid = -1; /* HDF5 file ID */ - H5F_t *f = NULL; /* file object pointer */ - H5HG_t *obj = NULL; /* global heap objects */ - unsigned i, j; /* iterators */ - int nerrors = 0; /* # of errors encountered */ + hid_t file = -1; + H5F_t *f = NULL; + unsigned i, j; + H5HG_t *obj = NULL; + herr_t status; + int nerrors=0; + char filename[1024]; TESTING("out of order indices"); - /* allocate memory */ - if(NULL == (filename = (char *)HDcalloc(FILENAME_SIZE, sizeof(char)))) - goto error; if(NULL == (obj = (H5HG_t *)HDmalloc(2000 * sizeof(*obj)))) goto error; /* Open a clean file */ - h5_fixname(FILENAME[4], fapl, filename, sizeof(filename)); - if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) + h5_fixname(FILENAME[4], fapl, filename, sizeof filename); + if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) goto error; - if(NULL == (f = (H5F_t *)H5I_object(fid))) { + if(NULL == (f = (H5F_t *)H5I_object(file))) { H5_FAILED(); - HDputs(" Unable to create file"); + puts(" Unable to create file"); goto error; } /* end if */ /* Alternately insert 1000 entries and remove the previous group of 1000 - * entries, until the indices wrap around. - */ - for(i = 0; i < 66; i++) { - + * entries, until the indices wrap around */ + for(i=0; i<66; i++) { /* Insert 1000 entries. The index into the obj array will alternate up * and down by 1000 so the previous set of insertions is preserved and - * can be deleted. - */ - for(j = 1000 * ((~i & 1)); j < 1000 * ((~i & 1) + 1); j++) { + * can be deleted. */ + for(j=1000*((~i&1)); j<1000*((~i&1)+1); j++) { H5Eclear2(H5E_DEFAULT); - if(H5HG_insert(f, H5AC_ind_read_dxpl_id, sizeof(j), &j, &obj[j]) < 0) + status = H5HG_insert(f, H5AC_ind_read_dxpl_id, sizeof(j), &j, &obj[j]); + if (status<0) GHEAP_REPEATED_ERR(" Unable to insert object into global heap") /* Check that the index is as expected */ @@ -533,10 +465,11 @@ test_ooo_indices(hid_t fapl) } /* end for */ /* Remove the previous 1000 entries */ - if(i > 0) - for(j = 1000 * (i & 1); j < 1000 * ((i & 1) + 1); j++) { + if(i>0) + for(j=1000*(i&1); j<1000*((i&1)+1); j++) { H5Eclear2(H5E_DEFAULT); - if(H5HG_remove(f, H5AC_ind_read_dxpl_id, &obj[j]) < 0) + status = H5HG_remove(f, H5AC_ind_read_dxpl_id, &obj[j]); + if (status<0) GHEAP_REPEATED_ERR(" Unable to remove object from global heap"); } /* end for */ } /* end for */ @@ -546,41 +479,37 @@ test_ooo_indices(hid_t fapl) HDassert(obj[535].idx == 1); /* Reopen the file */ - if(H5Fclose(fid) < 0) goto error; - if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) + if (H5Fclose(file)<0) goto error; + if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) goto error; - if(NULL == (f = (H5F_t *)H5I_object(fid))) { + if(NULL == (f = (H5F_t *)H5I_object(file))) { H5_FAILED(); - HDputs(" Unable to open file"); + puts(" Unable to open file"); goto error; } /* end if */ /* Read the objects to make sure the heap is still readable */ - for(i = 0; i < 1000; i++) { + for(i=0; i<1000; i++) { if(NULL == H5HG_read(f, H5AC_ind_read_dxpl_id, &obj[i], &j, NULL)) goto error; if(i != j) { H5_FAILED(); - HDputs(" Incorrect read value"); + puts(" Incorrect read value"); goto error; } /* end if */ } /* end for */ - if(H5Fclose(fid) < 0) goto error; - if(nerrors) goto error; - - HDfree(filename); + if (H5Fclose(file)<0) goto error; + if (nerrors) goto error; HDfree(obj); - + obj = NULL; PASSED(); return 0; -error: + error: H5E_BEGIN_TRY { - H5Fclose(fid); + H5Fclose(file); } H5E_END_TRY; - if(filename) - HDfree(filename); if(obj) HDfree(obj); return MAX(1, nerrors); @@ -588,43 +517,46 @@ error: /*------------------------------------------------------------------------- - * Function: main + * Function: main * - * Purpose: Tests global heap + * Purpose: Tests global heap. * - * Return: EXIT_SUCCESS/EXIT_FAILURE + * Return: Success: zero * - * Programmer: Robb Matzke + * Failure: non-zero + * + * Programmer: Robb Matzke * Tuesday, March 31, 1998 * + * Modifications: + * *------------------------------------------------------------------------- */ int -main(void) +main (void) { - int nerrors = 0; /* # of errors */ - hid_t fapl = -1; /* VFD-dependent fapl ID */ + int nerrors=0; + hid_t fapl; h5_reset(); fapl = h5_fileaccess(); - nerrors += test_monotonic_increasing(fapl); - nerrors += test_monotonic_decreasing(fapl); - nerrors += test_complete_removal(fapl); - nerrors += test_partial_removal(fapl); + nerrors += test_1(fapl); + nerrors += test_2(fapl); + nerrors += test_3(fapl); + nerrors += test_4(fapl); nerrors += test_ooo_indices(fapl); /* Verify symbol table messages are cached */ nerrors += (h5_verify_cached_stabs(FILENAME, fapl) < 0 ? 1 : 0); - if(nerrors) goto error; + if (nerrors) goto error; - HDputs("All global heap tests passed."); + puts("All global heap tests passed."); h5_cleanup(FILENAME, fapl); - return EXIT_SUCCESS; - -error: - HDputs("*** TESTS FAILED ***"); - return EXIT_FAILURE; -} /* end main() */ + return 0; + error: + puts("*** TESTS FAILED ***"); + return 1; +} -- cgit v0.12