diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2009-01-31 18:19:49 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2009-01-31 18:19:49 (GMT) |
commit | 2d74d46d3fe259ed51b2b996b56559563999e852 (patch) | |
tree | faff172323e140a2446f90e935589708f9bd0830 | |
parent | 7191f26717255667e86c86559ffc316f73f4c1bd (diff) | |
download | hdf5-2d74d46d3fe259ed51b2b996b56559563999e852.zip hdf5-2d74d46d3fe259ed51b2b996b56559563999e852.tar.gz hdf5-2d74d46d3fe259ed51b2b996b56559563999e852.tar.bz2 |
[svn-r16392] Description:
Bring r16367:16391 back from trunk into revise_chunks branch.
Tested on:
FreeBSD 6.3/32 (duty)
(h5committest not required on this branch)
36 files changed, 1609 insertions, 872 deletions
diff --git a/release_docs/RELEASE.txt b/release_docs/RELEASE.txt index 4e35418..7ca6ecf 100644 --- a/release_docs/RELEASE.txt +++ b/release_docs/RELEASE.txt @@ -51,6 +51,7 @@ New Features Library: -------- + - Added support for dense attributes to H5Ocopy. (XCao/NAF - 2009/01/29) - Added H5Pset_elink_cb and H5Pget_elink_cb functions to support a user-defined callback function for external link traversal. (NAF - 2009/01/08) @@ -141,6 +142,8 @@ Bug Fixes since HDF5-1.8.0 release Library ------- + - Fixed a bug that could cause problems when copying an object with a shared + message in its own object header. (NAF - 2009/01/29) - Changed H5Tset_order to properly reject H5T_ORDER_NONE for most datatypes. (NAF - 2009/01/27) - Fixed a bug where H5Tpack wouldn't remove trailing space from an diff --git a/src/H5Aint.c b/src/H5Aint.c index aadf79c..a47c5c3 100644 --- a/src/H5Aint.c +++ b/src/H5Aint.c @@ -37,9 +37,12 @@ /***********/ #include "H5private.h" /* Generic Functions */ #include "H5Apkg.h" /* Attributes */ +#include "H5Dprivate.h" /* Datasets */ #include "H5Eprivate.h" /* Error handling */ +#include "H5Iprivate.h" /* IDs */ #include "H5MMprivate.h" /* Memory management */ #include "H5Opkg.h" /* Object headers */ +#include "H5SMprivate.h" /* Shared Object Header Messages */ /****************/ @@ -66,6 +69,17 @@ typedef struct { size_t curr_attr; /* Current attribute to operate on */ } H5A_dense_bt_ud_t; +/* Data exchange structure to use when copying an attribute from _SRC to _DST */ +typedef struct { + const H5O_ainfo_t *ainfo; /* dense information */ + H5F_t *file; /* file */ + hbool_t *recompute_size; /* Flag to indicate if size changed */ + H5O_copy_t *cpy_info; /* Information on copying options */ + hid_t dxpl_id; /* DXPL for operation */ + const H5O_loc_t *oloc_src; + H5O_loc_t *oloc_dst; +} H5A_dense_file_cp_ud_t; + /********************/ /* Package Typedefs */ @@ -765,3 +779,526 @@ H5A_set_version(const H5F_t *f, H5A_t *attr) FUNC_LEAVE_NOAPI(SUCCEED) } /* end H5A_set_version() */ + +/*------------------------------------------------------------------------- + * Function: H5A_attr_copy_file + * + * Purpose: Copies a message from _MESG to _DEST in file + * + * Return: Success: Ptr to _DEST + * + * Failure: NULL + * + * Programmer: Quincey Koziol + * November 1, 2005 + * + *------------------------------------------------------------------------- + */ +H5A_t * +H5A_attr_copy_file(const H5A_t *attr_src, H5F_t *file_dst, hbool_t *recompute_size, + H5O_copy_t *cpy_info, hid_t dxpl_id) +{ + H5A_t *attr_dst = NULL; + + /* for dataype conversion */ + hid_t tid_src = -1; /* Datatype ID for source datatype */ + hid_t tid_dst = -1; /* Datatype ID for destination datatype */ + hid_t tid_mem = -1; /* Datatype ID for memory datatype */ + void *buf = NULL; /* Buffer for copying data */ + void *reclaim_buf = NULL; /* Buffer for reclaiming data */ + hid_t buf_sid = -1; /* ID for buffer dataspace */ + + H5A_t *ret_value; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT(H5A_attr_copy_file) + + /* check args */ + HDassert(attr_src); + HDassert(file_dst); + HDassert(cpy_info); + HDassert(!cpy_info->copy_without_attr); + + /* Allocate space for the destination message */ + if(NULL == (attr_dst = H5FL_CALLOC(H5A_t))) + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") + + /* Copy the top level of the attribute */ + *attr_dst = *attr_src; + + if(NULL == (attr_dst->shared = H5FL_CALLOC(H5A_shared_t))) + HGOTO_ERROR(H5E_FILE, H5E_NOSPACE, NULL, "can't allocate shared attr structure") + + /* Don't have an opened group location for copy */ + H5O_loc_reset(&(attr_dst->shared->oloc)); + H5G_name_reset(&(attr_dst->path)); + attr_dst->obj_opened = FALSE; + + /* Reference count for the header message in the cache */ + attr_dst->shared->nrefs = 1; + + /* Copy attribute's name */ + attr_dst->shared->name = H5MM_strdup(attr_src->shared->name); + HDassert(attr_dst->shared->name); + + /* Copy attribute's datatype */ + /* (Start destination datatype as transient, even if source is named) */ + if(NULL == (attr_dst->shared->dt = H5T_copy(attr_src->shared->dt, H5T_COPY_ALL))) + HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, NULL, "cannot copy datatype") + + /* Set the location of the destination datatype */ + if(H5T_set_loc(attr_dst->shared->dt, file_dst, H5T_LOC_DISK) < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "cannot mark datatype on disk") + + /* Check for named datatype being copied */ + if(H5T_committed(attr_src->shared->dt)) { + H5O_loc_t *src_oloc; /* Pointer to source datatype's object location */ + H5O_loc_t *dst_oloc; /* Pointer to dest. datatype's object location */ + + /* Get group entries for source & destination */ + src_oloc = H5T_oloc(attr_src->shared->dt); + HDassert(src_oloc); + dst_oloc = H5T_oloc(attr_dst->shared->dt); + HDassert(dst_oloc); + + /* Reset object location for new object */ + H5O_loc_reset(dst_oloc); + dst_oloc->file = file_dst; + + /* Copy the shared object from source to destination */ + if(H5O_copy_header_map(src_oloc, dst_oloc, dxpl_id, cpy_info, FALSE) < 0) + HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, NULL, "unable to copy object") + + /* Update shared message info from named datatype info */ + H5T_update_shared(attr_dst->shared->dt); + } /* end if */ + else { + /* If the datatype is not named, it may have been shared in the + * source file's heap. Un-share it for now. We'll try to shared + * it in the destination file below. + */ + if(H5O_msg_reset_share(H5O_DTYPE_ID, attr_dst->shared->dt) < 0) + HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "unable to reset datatype sharing") + } /* end else */ + + /* Copy the dataspace for the attribute */ + attr_dst->shared->ds = H5S_copy(attr_src->shared->ds, FALSE, FALSE); + HDassert(attr_dst->shared->ds); + + /* Reset the dataspace's sharing in the source file before trying to share + * it in the destination. + */ + if(H5O_msg_reset_share(H5O_SDSPACE_ID, attr_dst->shared->ds) < 0) + HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "unable to reset dataspace sharing") + + + /* Try to share both the datatype and dataset. This does nothing if the + * datatype is committed or sharing is disabled. + */ + if(H5SM_try_share(file_dst, dxpl_id, NULL, H5O_DTYPE_ID, attr_dst->shared->dt, NULL) < 0) + HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, NULL, "can't share attribute datatype") + if(H5SM_try_share(file_dst, dxpl_id, NULL, H5O_SDSPACE_ID, attr_dst->shared->ds, NULL) < 0) + HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, NULL, "can't share attribute dataspace") + + /* Compute the sizes of the datatype and dataspace. This is their raw + * size unless they're shared. + */ + attr_dst->shared->dt_size = H5O_msg_raw_size(file_dst, H5O_DTYPE_ID, FALSE, attr_dst->shared->dt); + HDassert(attr_dst->shared->dt_size > 0); + attr_dst->shared->ds_size = H5O_msg_raw_size(file_dst, H5O_SDSPACE_ID, FALSE, attr_dst->shared->ds); + HDassert(attr_dst->shared->ds_size > 0); + + /* Check whether to recompute the size of the attribute */ + /* (happens when the datatype or dataspace changes sharing status) */ + if(attr_dst->shared->dt_size != attr_src->shared->dt_size || attr_dst->shared->ds_size != attr_src->shared->ds_size) + *recompute_size = TRUE; + + /* Compute the size of the data */ + H5_ASSIGN_OVERFLOW(attr_dst->shared->data_size, H5S_GET_EXTENT_NPOINTS(attr_dst->shared->ds) * H5T_get_size(attr_dst->shared->dt), hsize_t, size_t); + + /* Copy (& convert) the data, if necessary */ + if(attr_src->shared->data) { + if(NULL == (attr_dst->shared->data = H5FL_BLK_MALLOC(attr_buf, attr_dst->shared->data_size))) + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") + + /* Check if we need to convert data */ + if(H5T_detect_class(attr_src->shared->dt, H5T_VLEN) > 0) { + H5T_path_t *tpath_src_mem, *tpath_mem_dst; /* Datatype conversion paths */ + H5T_t *dt_mem; /* Memory datatype */ + size_t src_dt_size; /* Source datatype size */ + size_t tmp_dt_size; /* Temp. datatype size */ + size_t max_dt_size; /* Max atatype size */ + H5S_t *buf_space; /* Dataspace describing buffer */ + hsize_t buf_dim; /* Dimension for buffer */ + size_t nelmts; /* Number of elements in buffer */ + size_t buf_size; /* Size of copy buffer */ + + /* Create datatype ID for src datatype */ + if((tid_src = H5I_register(H5I_DATATYPE, attr_src->shared->dt, FALSE)) < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, NULL, "unable to register source file datatype") + + /* create a memory copy of the variable-length datatype */ + if(NULL == (dt_mem = H5T_copy(attr_src->shared->dt, H5T_COPY_TRANSIENT))) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to copy") + if((tid_mem = H5I_register(H5I_DATATYPE, dt_mem, FALSE)) < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, NULL, "unable to register memory datatype") + + /* create variable-length datatype at the destinaton file */ + if((tid_dst = H5I_register(H5I_DATATYPE, attr_dst->shared->dt, FALSE)) < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, NULL, "unable to register destination file datatype") + + /* Set up the conversion functions */ + if(NULL == (tpath_src_mem = H5T_path_find(attr_src->shared->dt, dt_mem, NULL, NULL, dxpl_id, FALSE))) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to convert between src and mem datatypes") + if(NULL == (tpath_mem_dst = H5T_path_find(dt_mem, attr_dst->shared->dt, NULL, NULL, dxpl_id, FALSE))) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to convert between mem and dst datatypes") + + /* Determine largest datatype size */ + if(0 == (src_dt_size = H5T_get_size(attr_src->shared->dt))) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to determine datatype size") + if(0 == (tmp_dt_size = H5T_get_size(dt_mem))) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to determine datatype size") + max_dt_size = MAX(src_dt_size, tmp_dt_size); + if(0 == (tmp_dt_size = H5T_get_size(attr_dst->shared->dt))) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to determine datatype size") + max_dt_size = MAX(max_dt_size, tmp_dt_size); + + /* Set number of whole elements that fit in buffer */ + if(0 == (nelmts = attr_src->shared->data_size / src_dt_size)) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "element size too large") + + /* Set up number of bytes to copy, and initial buffer size */ + buf_size = nelmts * max_dt_size; + + /* Create dataspace for number of elements in buffer */ + buf_dim = nelmts; + + /* Create the space and set the initial extent */ + if(NULL == (buf_space = H5S_create_simple((unsigned)1, &buf_dim, NULL))) + HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCREATE, NULL, "can't create simple dataspace") + + /* Atomize */ + if((buf_sid = H5I_register(H5I_DATASPACE, buf_space, FALSE)) < 0) { + H5S_close(buf_space); + HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, NULL, "unable to register dataspace ID") + } /* end if */ + + /* Allocate memory for recclaim buf */ + if(NULL == (reclaim_buf = H5FL_BLK_MALLOC(attr_buf, buf_size))) + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation NULLed for raw data chunk") + + /* Allocate memory for copying the chunk */ + if(NULL == (buf = H5FL_BLK_MALLOC(attr_buf, buf_size))) + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation NULLed for raw data chunk") + + HDmemcpy(buf, attr_src->shared->data, attr_src->shared->data_size); + + /* Convert from source file to memory */ + if(H5T_convert(tpath_src_mem, tid_src, tid_mem, nelmts, (size_t)0, (size_t)0, buf, NULL, dxpl_id) < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "datatype conversion NULLed") + + HDmemcpy(reclaim_buf, buf, buf_size); + + /* Convert from memory to destination file */ + if(H5T_convert(tpath_mem_dst, tid_mem, tid_dst, nelmts, (size_t)0, (size_t)0, buf, NULL, dxpl_id) < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "datatype conversion NULLed") + + HDmemcpy(attr_dst->shared->data, buf, attr_dst->shared->data_size); + + if(H5D_vlen_reclaim(tid_mem, buf_space, H5P_DATASET_XFER_DEFAULT, reclaim_buf) < 0) + HGOTO_ERROR(H5E_DATASET, H5E_BADITER, NULL, "unable to reclaim variable-length data") + } /* end if */ + else { + HDassert(attr_dst->shared->data_size == attr_src->shared->data_size); + HDmemcpy(attr_dst->shared->data, attr_src->shared->data, attr_src->shared->data_size); + } /* end else */ + } /* end if(attr_src->shared->data) */ + + /* Recompute the version to encode the destination attribute */ + if(H5A_set_version(file_dst, attr_dst) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTSET, NULL, "unable to update attribute version") + + /* Indicate that the fill values aren't to be written out */ + attr_dst->shared->initialized = TRUE; + + /* Set return value */ + ret_value = attr_dst; + +done: + if(buf_sid > 0) + if(H5I_dec_ref(buf_sid, FALSE) < 0) + HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, NULL, "Can't decrement temporary dataspace ID") + if(tid_src > 0) + /* Don't decrement ID, we want to keep underlying datatype */ + if(H5I_remove(tid_src) == NULL) + HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, NULL, "Can't decrement temporary datatype ID") + if(tid_dst > 0) + /* Don't decrement ID, we want to keep underlying datatype */ + if(H5I_remove(tid_dst) == NULL) + HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, NULL, "Can't decrement temporary datatype ID") + if(tid_mem > 0) + /* Decrement the memory datatype ID, it's transient */ + if(H5I_dec_ref(tid_mem, FALSE) < 0) + HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, NULL, "Can't decrement temporary datatype ID") + if(buf) + buf = H5FL_BLK_FREE(attr_buf, buf); + if(reclaim_buf) + reclaim_buf = H5FL_BLK_FREE(attr_buf, reclaim_buf); + + /* Release destination attribute information on failure */ + if(!ret_value && attr_dst && H5A_close(attr_dst) < 0) + HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, NULL, "can't close attribute") + + FUNC_LEAVE_NOAPI(ret_value) +} /* H5A_attr_copy_file() */ + + +/*------------------------------------------------------------------------- + * Function: H5A_attr_post_copy_file + * + * Purpose: Finish copying a message from between files. + * We have to copy the values of a reference attribute in the + * post copy because H5O_post_copy_file() fails at the case that + * an object may have a reference attribute that points to the + * object itself. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Peter Cao + * March 6, 2005 + * + *------------------------------------------------------------------------- + */ +herr_t +H5A_attr_post_copy_file(const H5O_loc_t *src_oloc, const H5A_t UNUSED *attr_src, + H5O_loc_t *dst_oloc, const H5A_t *attr_dst, hid_t dxpl_id, H5O_copy_t *cpy_info) +{ + H5F_t *file_src = src_oloc->file; + H5F_t *file_dst = dst_oloc->file; + herr_t ret_value = SUCCEED; /* Return value */ + + + FUNC_ENTER_NOAPI_NOINIT(H5A_attr_post_copy_file) + + /* check args */ + HDassert(attr_dst); + HDassert(file_dst); + + + /* Only need to fix reference attribute with real data being copied to + * another file. + */ + if((NULL != attr_dst->shared->data) && (H5T_get_class(attr_dst->shared->dt, FALSE) == H5T_REFERENCE) ) { + + /* copy object pointed by reference. The current implementation does not + * deal with nested reference such as reference in a compound structure + */ + + /* Check for expanding references */ + if(cpy_info->expand_ref) { + size_t ref_count; + + /* Determine # of reference elements to copy */ + ref_count = attr_dst->shared->data_size / H5T_get_size(attr_dst->shared->dt); + + /* Copy objects referenced in source buffer to destination file and set destination elements */ + if(H5O_copy_expand_ref(file_src, attr_dst->shared->data, dxpl_id, + file_dst, attr_dst->shared->data, ref_count, H5T_get_ref_type(attr_dst->shared->dt), cpy_info) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, FAIL, "unable to copy reference attribute") + } /* end if */ + else + /* Reset value to zero */ + HDmemset(attr_dst->shared->data, 0, attr_dst->shared->data_size); + } /* end if */ + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* H5A_attr_post_copy_file() */ + + +/*------------------------------------------------------------------------- + * Function: H5A_dense_copy_file_cb + * + * Purpose: Callback routine for copying a dense attribute from SRC to DST. + * + * Return: Success: Non-negative + * Failure: Negative + * + * Programmer: Peter Cao + * xcao@hdfgroup.org + * July 20, 2007 + * + *------------------------------------------------------------------------- + */ +static herr_t +H5A_dense_copy_file_cb(const H5A_t *attr_src, void *_udata) +{ + H5A_dense_file_cp_ud_t *udata = (H5A_dense_file_cp_ud_t *)_udata; + H5A_t *attr_dst = NULL; + herr_t ret_value = H5_ITER_CONT; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT(H5A_dense_copy_file_cb) + + /* check arguments */ + HDassert(attr_src); + HDassert(udata); + HDassert(udata->ainfo); + HDassert(udata->file); + HDassert(udata->cpy_info); + + if ( NULL == (attr_dst=H5A_attr_copy_file(attr_src, udata->file, + udata->recompute_size, udata->cpy_info, udata->dxpl_id))) + HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, H5_ITER_ERROR, "can't copy attribute") + + /* Reset shared location information */ + if(H5O_msg_reset_share(H5O_ATTR_ID, attr_dst) < 0) + HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to reset attribute sharing") + + /* Insert attribute into dense storage */ + if(H5A_dense_insert(udata->file, udata->dxpl_id, udata->ainfo, attr_dst) < 0) + HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, H5_ITER_ERROR, "unable to add to dense storage") + +done: + if (attr_dst) { + (void)H5A_free(attr_dst); + (void)H5FL_FREE(H5A_t, attr_dst); + } + + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5A_dense_copy_file_cb() */ + + +/*------------------------------------------------------------------------- + * Function: H5A_dense_copy_file_all + * + * Purpose: Copy all dense attributes from SRC to DST. + * + * Return: Success: Non-negative + * Failure: Negative + * + * Programmer: Peter Cao + * xcao@hdfgroup.org + * July 20, 2007 + * + *------------------------------------------------------------------------- + */ +herr_t +H5A_dense_copy_file_all(H5F_t *file_src, H5O_ainfo_t *ainfo_src, H5F_t *file_dst, + const H5O_ainfo_t *ainfo_dst, hbool_t *recompute_size, H5O_copy_t *cpy_info, hid_t dxpl_id) +{ + H5A_dense_file_cp_ud_t udata; /* User data for iteration callback */ + H5A_attr_iter_op_t attr_op; /* Attribute operator */ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT(H5A_dense_copy_file_all) + + /* check arguments */ + HDassert(ainfo_src); + HDassert(ainfo_dst); + + udata.ainfo = ainfo_dst; /* Destination dense information */ + udata.file = file_dst; /* Destination file */ + udata.recompute_size = recompute_size; /* Flag to indicate if size changed */ + udata.cpy_info = cpy_info; /* Information on copying options */ + udata.dxpl_id = dxpl_id; /* DXPL for operation */ + + attr_op.op_type = H5A_ATTR_OP_LIB; + attr_op.u.lib_op = H5A_dense_copy_file_cb; + + if(H5A_dense_iterate(file_src, dxpl_id, (hid_t)0, ainfo_src, H5_INDEX_NAME, + H5_ITER_NATIVE, (hsize_t)0, NULL, &attr_op, &udata) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "error building attribute table") + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5A_dense_copy_file_all */ + + +/*------------------------------------------------------------------------- + * Function: H5A_dense_post_copy_file_cb + * + * Purpose: Callback routine to perfom post copy for a dense attribute. + * + * Return: Success: Non-negative + * Failure: Negative + * + * Programmer: Peter Cao + * xcao@hdfgroup.org + * July 25, 2007 + * + *------------------------------------------------------------------------- + */ +static herr_t +H5A_dense_post_copy_file_cb(const H5A_t *attr_dst, void *_udata) +{ + H5A_dense_file_cp_ud_t *udata = (H5A_dense_file_cp_ud_t *)_udata; + herr_t ret_value = H5_ITER_CONT; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT(H5A_dense_post_copy_file_cb) + + /* check arguments */ + HDassert(attr_dst); + HDassert(udata); + HDassert(udata->ainfo); + HDassert(udata->file); + HDassert(udata->cpy_info); + + if ( H5A_attr_post_copy_file(udata->oloc_src, NULL, + udata->oloc_dst, attr_dst, udata->dxpl_id, udata->cpy_info) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, H5_ITER_ERROR, "can't copy attribute") + +done: + + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5A_dense_post_copy_file_cb() */ + + +/*------------------------------------------------------------------------- + * Function: H5A_dense_post_copy_file_all + * + * Purpose: Do post copy for all dense attributes. + * + * Return: Success: Non-negative + * Failure: Negative + * + * Programmer: Peter Cao + * xcao@hdfgroup.org + * July 25, 2007 + * + *------------------------------------------------------------------------- + */ +herr_t +H5A_dense_post_copy_file_all(const H5O_loc_t *src_oloc, const H5O_ainfo_t *ainfo_src, + H5O_loc_t *dst_oloc, H5O_ainfo_t *ainfo_dst, hid_t dxpl_id, H5O_copy_t *cpy_info) +{ + H5A_dense_file_cp_ud_t udata; /* User data for iteration callback */ + H5A_attr_iter_op_t attr_op; /* Attribute operator */ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT(H5A_dense_post_copy_file_all) + + /* check arguments */ + HDassert(ainfo_src); + HDassert(ainfo_dst); + HDassert(src_oloc); + HDassert(dst_oloc); + HDassert(src_oloc->file); + HDassert(dst_oloc->file); + + udata.ainfo = ainfo_src; + udata.file = src_oloc->file; + udata.cpy_info = cpy_info; /* Information on copying options */ + udata.dxpl_id = dxpl_id; /* DXPL for operation */ + udata.oloc_src = src_oloc; + udata.oloc_dst = dst_oloc; + + attr_op.op_type = H5A_ATTR_OP_LIB; + attr_op.u.lib_op = H5A_dense_post_copy_file_cb; + + if(H5A_dense_iterate(dst_oloc->file, dxpl_id, (hid_t)0, ainfo_dst, H5_INDEX_NAME, + H5_ITER_NATIVE, (hsize_t)0, NULL, &attr_op, &udata) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "error building attribute table") + +done: + FUNC_LEAVE_NOAPI(ret_value) +} + diff --git a/src/H5Apkg.h b/src/H5Apkg.h index a1b5e62..9027864 100644 --- a/src/H5Apkg.h +++ b/src/H5Apkg.h @@ -279,6 +279,15 @@ H5_DLL htri_t H5O_attr_exists(const H5O_loc_t *loc, const char *name, hid_t dxpl #ifndef H5_NO_DEPRECATED_SYMBOLS H5_DLL int H5O_attr_count(const H5O_loc_t *loc, hid_t dxpl_id); #endif /* H5_NO_DEPRECATED_SYMBOLS */ +H5_DLL H5A_t *H5A_attr_copy_file(const H5A_t *attr_src, H5F_t *file_dst, hbool_t *recompute_size, + H5O_copy_t *cpy_info, hid_t dxpl_id); +H5_DLL herr_t H5A_attr_post_copy_file(const H5O_loc_t *src_oloc, const H5A_t *mesg_src, + H5O_loc_t *dst_oloc, const H5A_t *mesg_dst, hid_t dxpl_id, H5O_copy_t *cpy_info); +H5_DLL herr_t H5A_dense_copy_file_all(H5F_t *file_src, H5O_ainfo_t *ainfo_src, H5F_t *file_dst, + const H5O_ainfo_t *ainfo_dst, hbool_t *recompute_size, H5O_copy_t *cpy_info, hid_t dxpl_id); +H5_DLL herr_t H5A_dense_post_copy_file_all(const H5O_loc_t *src_oloc, const H5O_ainfo_t * ainfo_src, + H5O_loc_t *dst_oloc, H5O_ainfo_t *ainfo_dst, hid_t dxpl_id, H5O_copy_t *cpy_info); + /* Testing functions */ #ifdef H5A_TESTING @@ -355,15 +355,9 @@ HDfprintf(stderr, "%s: Index %Hu\n", FUNC, idx); HDfprintf(stderr, "%s: Index block address not defined!\n", FUNC, idx); #endif /* QAK */ /* Create the index block */ - hdr->idx_blk_addr = H5EA__iblock_create(hdr, dxpl_id); + hdr->idx_blk_addr = H5EA__iblock_create(hdr, dxpl_id, &hdr_dirty); if(!H5F_addr_defined(hdr->idx_blk_addr)) H5E_THROW(H5E_CANTCREATE, "unable to create index block") - - /* Increment count of elements "realized" */ - hdr->stats.nelmts += hdr->cparam.idx_blk_elmts; - - /* Mark the header dirty */ - hdr_dirty = TRUE; } /* end if */ #ifdef QAK HDfprintf(stderr, "%s: Index block address is: %a\n", FUNC, hdr->idx_blk_addr); @@ -415,18 +409,13 @@ HDfprintf(stderr, "%s: dblk_idx = %u, iblock->ndblk_addrs = %Zu\n", FUNC, dblk_i /* Create data block */ dblk_off = hdr->sblk_info[sblk_idx].start_idx + (dblk_idx * hdr->sblk_info[sblk_idx].dblk_nelmts); - dblk_addr = H5EA__dblock_create(hdr, dxpl_id, dblk_off, hdr->sblk_info[sblk_idx].dblk_nelmts); + dblk_addr = H5EA__dblock_create(hdr, dxpl_id, &hdr_dirty, dblk_off, hdr->sblk_info[sblk_idx].dblk_nelmts); if(!H5F_addr_defined(dblk_addr)) H5E_THROW(H5E_CANTCREATE, "unable to create extensible array data block") /* Set data block address in index block */ iblock->dblk_addrs[dblk_idx] = dblk_addr; iblock_cache_flags |= H5AC__DIRTIED_FLAG; - - /* Increment count of elements "realized" and actual data blocks created */ - hdr->stats.ndata_blks++; - hdr->stats.nelmts += hdr->sblk_info[sblk_idx].dblk_nelmts; - hdr_dirty = TRUE; } /* end if */ /* Protect data block */ @@ -452,7 +441,7 @@ HDfprintf(stderr, "%s: dblk_idx = %u, iblock->ndblk_addrs = %Zu\n", FUNC, dblk_i haddr_t sblk_addr; /* Address of data block created */ /* Create super block */ - sblk_addr = H5EA__sblock_create(hdr, dxpl_id, sblk_idx); + sblk_addr = H5EA__sblock_create(hdr, dxpl_id, &hdr_dirty, sblk_idx); #ifdef QAK HDfprintf(stderr, "%s: New super block address is: %a\n", FUNC, sblk_addr); #endif /* QAK */ @@ -462,10 +451,6 @@ HDfprintf(stderr, "%s: New super block address is: %a\n", FUNC, sblk_addr); /* Set super block address in index block */ iblock->sblk_addrs[sblk_off] = sblk_addr; iblock_cache_flags |= H5AC__DIRTIED_FLAG; - - /* Increment count of actual super blocks created */ - hdr->stats.nsuper_blks++; - hdr_dirty = TRUE; } /* end if */ /* Protect super block */ @@ -486,18 +471,13 @@ HDfprintf(stderr, "%s: dblk_idx = %u, sblock->ndblks = %Zu\n", FUNC, dblk_idx, s /* Create data block */ dblk_off = hdr->sblk_info[sblk_idx].start_idx + (dblk_idx * hdr->sblk_info[sblk_idx].dblk_nelmts); - dblk_addr = H5EA__dblock_create(hdr, dxpl_id, dblk_off, sblock->dblk_nelmts); + dblk_addr = H5EA__dblock_create(hdr, dxpl_id, &hdr_dirty, dblk_off, sblock->dblk_nelmts); if(!H5F_addr_defined(dblk_addr)) H5E_THROW(H5E_CANTCREATE, "unable to create extensible array data block") /* Set data block address in index block */ sblock->dblk_addrs[dblk_idx] = dblk_addr; sblock_cache_flags |= H5AC__DIRTIED_FLAG; - - /* Increment count of elements "realized" and actual data blocks created */ - hdr->stats.ndata_blks++; - hdr->stats.nelmts += hdr->sblk_info[sblk_idx].dblk_nelmts; - hdr_dirty = TRUE; } /* end if */ #ifdef QAK @@ -832,7 +812,7 @@ CATCH if(dblk_page && H5EA__dblk_page_unprotect(dblk_page, dxpl_id, H5AC__NO_FLAGS_SET) < 0) H5E_THROW(H5E_CANTUNPROTECT, "unable to release extensible array data block page") -END_FUNC(PRIV) /* end H5EA_set() */ +END_FUNC(PRIV) /* end H5EA_get() */ /*------------------------------------------------------------------------- diff --git a/src/H5EAcache.c b/src/H5EAcache.c index bf2bf43..286c6a5 100644 --- a/src/H5EAcache.c +++ b/src/H5EAcache.c @@ -254,14 +254,38 @@ H5EA__cache_hdr_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void *_cls, hdr->cparam.max_dblk_page_nelmts_bits = *p++; /* Log2(Max. # of elements in data block page) - i.e. # of bits needed to store max. # of elements in data block page */ /* Array statistics */ - H5F_DECODE_LENGTH(f, p, hdr->stats.max_idx_set); /* Max. index set (+1) */ + hdr->stats.hdr_size = size; /* Size of header in file */ H5F_DECODE_LENGTH(f, p, hdr->stats.nsuper_blks); /* Number of super blocks created */ + H5F_DECODE_LENGTH(f, p, hdr->stats.super_blk_size); /* Size of super blocks created */ H5F_DECODE_LENGTH(f, p, hdr->stats.ndata_blks); /* Number of data blocks created */ + H5F_DECODE_LENGTH(f, p, hdr->stats.data_blk_size); /* Size of data blocks created */ + H5F_DECODE_LENGTH(f, p, hdr->stats.max_idx_set); /* Max. index set (+1) */ H5F_DECODE_LENGTH(f, p, hdr->stats.nelmts); /* Number of elements 'realized' */ /* Internal information */ H5F_addr_decode(f, &p, &hdr->idx_blk_addr); /* Address of index block */ + /* Index block statistics */ + if(H5F_addr_defined(hdr->idx_blk_addr)) { + H5EA_iblock_t iblock; /* Fake index block for computing size */ + + /* Set index block count for file */ + hdr->stats.nindex_blks = 1; + + /* Set up fake index block for computing size on disk */ + iblock.hdr = hdr; + iblock.nsblks = H5EA_SBLK_FIRST_IDX(hdr->cparam.sup_blk_min_data_ptrs); + iblock.ndblk_addrs = 2 * ((size_t)hdr->cparam.sup_blk_min_data_ptrs - 1); + iblock.nsblk_addrs = hdr->nsblks - iblock.nsblks; + + /* Compute size of index block in file */ + hdr->stats.index_blk_size = H5EA_IBLOCK_SIZE(&iblock); + } /* end if */ + else { + hdr->stats.nindex_blks = 0; /* Number of index blocks in file */ + hdr->stats.index_blk_size = 0; /* Size of index blocks in file */ + } /* end else */ + /* Sanity check */ /* (allow for checksum not decoded yet) */ HDassert((size_t)(p - buf) == (size - H5EA_SIZEOF_CHKSUM)); @@ -365,9 +389,11 @@ H5EA__cache_hdr_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, *p++ = hdr->cparam.max_dblk_page_nelmts_bits; /* Log2(Max. # of elements in data block page) - i.e. # of bits needed to store max. # of elements in data block page */ /* Array statistics */ - H5F_ENCODE_LENGTH(f, p, hdr->stats.max_idx_set); /* Max. index set (+1) */ H5F_ENCODE_LENGTH(f, p, hdr->stats.nsuper_blks); /* Number of super blocks created */ + H5F_ENCODE_LENGTH(f, p, hdr->stats.super_blk_size); /* Size of super blocks created */ H5F_ENCODE_LENGTH(f, p, hdr->stats.ndata_blks); /* Number of data blocks created */ + H5F_ENCODE_LENGTH(f, p, hdr->stats.data_blk_size); /* Size of data blocks created */ + H5F_ENCODE_LENGTH(f, p, hdr->stats.max_idx_set); /* Max. index set (+1) */ H5F_ENCODE_LENGTH(f, p, hdr->stats.nelmts); /* Number of elements 'realized' */ /* Internal information */ diff --git a/src/H5EAdblock.c b/src/H5EAdblock.c index b64cb7d..aec5af2 100644 --- a/src/H5EAdblock.c +++ b/src/H5EAdblock.c @@ -160,10 +160,12 @@ END_FUNC(PKG) /* end H5EA__dblock_alloc() */ */ BEGIN_FUNC(PKG, ERR, haddr_t, HADDR_UNDEF, HADDR_UNDEF, -H5EA__dblock_create(H5EA_hdr_t *hdr, hid_t dxpl_id, hsize_t dblk_off, size_t nelmts)) +H5EA__dblock_create(H5EA_hdr_t *hdr, hid_t dxpl_id, hbool_t *hdr_dirty, + hsize_t dblk_off, size_t nelmts)) /* Local variables */ - H5EA_dblock_t *dblock = NULL; /* Extensible array data block */ + H5EA_dblock_t *dblock = NULL; /* Extensible array data block */ + haddr_t dblock_addr; /* Extensible array data block address */ #ifdef QAK HDfprintf(stderr, "%s: Called, hdr->dblk_page_nelmts = %Zu, nelmts = %Zu\n", FUNC, hdr->dblk_page_nelmts, nelmts); @@ -171,6 +173,7 @@ HDfprintf(stderr, "%s: Called, hdr->dblk_page_nelmts = %Zu, nelmts = %Zu\n", FUN /* Sanity check */ HDassert(hdr); + HDassert(hdr_dirty); HDassert(nelmts > 0); /* Allocate the data block */ @@ -190,8 +193,9 @@ HDfprintf(stderr, "%s: dblock->block_off = %Hu\n", FUNC, dblock->block_off); #endif /* QAK */ /* Allocate space for the data block on disk */ - if(HADDR_UNDEF == (dblock->addr = H5MF_alloc(hdr->f, H5FD_MEM_EARRAY_DBLOCK, dxpl_id, (hsize_t)dblock->size))) + if(HADDR_UNDEF == (dblock_addr = H5MF_alloc(hdr->f, H5FD_MEM_EARRAY_DBLOCK, dxpl_id, (hsize_t)dblock->size))) H5E_THROW(H5E_CANTALLOC, "file allocation failed for extensible array data block") + dblock->addr = dblock_addr; /* Don't initialize elements if paged */ if(!dblock->npages) @@ -200,11 +204,21 @@ HDfprintf(stderr, "%s: dblock->block_off = %Hu\n", FUNC, dblock->block_off); H5E_THROW(H5E_CANTSET, "can't set extensible array data block elements to class's fill value") /* Cache the new extensible array data block */ - if(H5AC_set(hdr->f, dxpl_id, H5AC_EARRAY_DBLOCK, dblock->addr, dblock, H5AC__NO_FLAGS_SET) < 0) + if(H5AC_set(hdr->f, dxpl_id, H5AC_EARRAY_DBLOCK, dblock_addr, dblock, H5AC__NO_FLAGS_SET) < 0) H5E_THROW(H5E_CANTINSERT, "can't add extensible array data block to cache") + /* Update extensible array data block statistics */ + hdr->stats.ndata_blks++; + hdr->stats.data_blk_size += dblock->size; + + /* Increment count of elements "realized" */ + hdr->stats.nelmts += nelmts; + + /* Mark the header dirty (for updating statistics) */ + *hdr_dirty = TRUE; + /* Set address of data block to return */ - ret_value = dblock->addr; + ret_value = dblock_addr; CATCH if(!H5F_addr_defined(ret_value)) diff --git a/src/H5EAhdr.c b/src/H5EAhdr.c index 349dceb..998e169 100644 --- a/src/H5EAhdr.c +++ b/src/H5EAhdr.c @@ -235,8 +235,8 @@ HDfprintf(stderr, "%s: hdr->sblk_info[%Zu] = {%Zu, %Zu, %Hu, %Hu}\n", FUNC, u, h start_dblk += (hsize_t)hdr->sblk_info[u].ndblks; } /* end for */ - /* Set size of header on disk */ - hdr->size = H5EA_HEADER_SIZE(hdr); + /* Set size of header on disk (locally and in statistics) */ + hdr->stats.hdr_size = hdr->size = H5EA_HEADER_SIZE(hdr); CATCH diff --git a/src/H5EAiblock.c b/src/H5EAiblock.c index dcb75d1..6fd6f2a 100644 --- a/src/H5EAiblock.c +++ b/src/H5EAiblock.c @@ -178,10 +178,11 @@ END_FUNC(PKG) /* end H5EA__iblock_alloc() */ */ BEGIN_FUNC(PKG, ERR, haddr_t, HADDR_UNDEF, HADDR_UNDEF, -H5EA__iblock_create(H5EA_hdr_t *hdr, hid_t dxpl_id)) +H5EA__iblock_create(H5EA_hdr_t *hdr, hid_t dxpl_id, hbool_t *hdr_dirty)) /* Local variables */ - H5EA_iblock_t *iblock = NULL; /* Extensible array index block */ + H5EA_iblock_t *iblock = NULL; /* Extensible array index block */ + haddr_t iblock_addr; /* Extensible array index block address */ #ifdef QAK HDfprintf(stderr, "%s: Called\n", FUNC); @@ -189,6 +190,7 @@ HDfprintf(stderr, "%s: Called\n", FUNC); /* Sanity check */ HDassert(hdr); + HDassert(hdr_dirty); /* Allocate the index block */ if(NULL == (iblock = H5EA__iblock_alloc(hdr))) @@ -201,8 +203,9 @@ HDfprintf(stderr, "%s: iblock->size = %Zu\n", FUNC, iblock->size); #endif /* QAK */ /* Allocate space for the index block on disk */ - if(HADDR_UNDEF == (iblock->addr = H5MF_alloc(hdr->f, H5FD_MEM_EARRAY_IBLOCK, dxpl_id, (hsize_t)iblock->size))) + if(HADDR_UNDEF == (iblock_addr = H5MF_alloc(hdr->f, H5FD_MEM_EARRAY_IBLOCK, dxpl_id, (hsize_t)iblock->size))) H5E_THROW(H5E_CANTALLOC, "file allocation failed for extensible array index block") + iblock->addr = iblock_addr; /* Clear any elements in index block to fill value */ if(hdr->cparam.idx_blk_elmts > 0) { @@ -228,11 +231,23 @@ HDfprintf(stderr, "%s: iblock->size = %Zu\n", FUNC, iblock->size); } /* end if */ /* Cache the new extensible array index block */ - if(H5AC_set(hdr->f, dxpl_id, H5AC_EARRAY_IBLOCK, iblock->addr, iblock, H5AC__NO_FLAGS_SET) < 0) + if(H5AC_set(hdr->f, dxpl_id, H5AC_EARRAY_IBLOCK, iblock_addr, iblock, H5AC__NO_FLAGS_SET) < 0) H5E_THROW(H5E_CANTINSERT, "can't add extensible array index block to cache") + /* Update extensible array index block statistics */ + HDassert(0 == hdr->stats.nindex_blks); + HDassert(0 == hdr->stats.index_blk_size); + hdr->stats.nindex_blks = 1; + hdr->stats.index_blk_size = iblock->size; + + /* Increment count of elements "realized" */ + hdr->stats.nelmts += hdr->cparam.idx_blk_elmts; + + /* Mark the header dirty (for updating statistics) */ + *hdr_dirty = TRUE; + /* Set address of index block to return */ - ret_value = iblock->addr; + ret_value = iblock_addr; CATCH if(!H5F_addr_defined(ret_value)) diff --git a/src/H5EApkg.h b/src/H5EApkg.h index 7ac5be6..e374d3a 100644 --- a/src/H5EApkg.h +++ b/src/H5EApkg.h @@ -372,9 +372,11 @@ func_init_failed: \ + 1 /* Log2(Max. # of elements in data block page) - i.e. # of bits needed to store max. # of elements in data block page */ \ \ /* Extensible Array Header statistics fields */ \ - + (h)->sizeof_size /* Max. index set */ \ + (h)->sizeof_size /* Number of super blocks created */ \ + + (h)->sizeof_size /* Size of super blocks created */ \ + (h)->sizeof_size /* Number of data blocks created */ \ + + (h)->sizeof_size /* Size of data blocks created */ \ + + (h)->sizeof_size /* Max. index set */ \ + (h)->sizeof_size /* Number of elements 'realized' */ \ \ /* Extensible Array Header specific fields */ \ @@ -471,6 +473,7 @@ typedef struct H5EA_hdr_t { haddr_t idx_blk_addr; /* Address of index block in header */ /* Statistics for array (stored in header) */ + /* (header and index number/size fields not stored) */ H5EA_stat_t stats; /* Statistics for extensible array */ /* Data block element buffer factory info (not stored in header) */ @@ -636,7 +639,8 @@ H5_DLL herr_t H5EA__hdr_dest(H5EA_hdr_t *hdr); /* Index block routines */ H5_DLL H5EA_iblock_t *H5EA__iblock_alloc(H5EA_hdr_t *hdr); -H5_DLL haddr_t H5EA__iblock_create(H5EA_hdr_t *hdr, hid_t dxpl_id); +H5_DLL haddr_t H5EA__iblock_create(H5EA_hdr_t *hdr, hid_t dxpl_id, + hbool_t *hdr_dirty); H5_DLL H5EA_iblock_t *H5EA__iblock_protect(H5EA_hdr_t *hdr, hid_t dxpl_id, H5AC_protect_t rw); H5_DLL herr_t H5EA__iblock_unprotect(H5EA_iblock_t *iblock, hid_t dxpl_id, @@ -646,7 +650,8 @@ H5_DLL herr_t H5EA__iblock_dest(H5F_t *f, H5EA_iblock_t *iblock); /* Super block routines */ H5_DLL H5EA_sblock_t *H5EA__sblock_alloc(H5EA_hdr_t *hdr, unsigned sblk_idx); -H5_DLL haddr_t H5EA__sblock_create(H5EA_hdr_t *hdr, hid_t dxpl_id, unsigned sblk_idx); +H5_DLL haddr_t H5EA__sblock_create(H5EA_hdr_t *hdr, hid_t dxpl_id, hbool_t *hdr_dirty, + unsigned sblk_idx); H5_DLL H5EA_sblock_t *H5EA__sblock_protect(H5EA_hdr_t *hdr, hid_t dxpl_id, haddr_t sblk_addr, unsigned sblk_idx, H5AC_protect_t rw); H5_DLL herr_t H5EA__sblock_unprotect(H5EA_sblock_t *sblock, hid_t dxpl_id, @@ -657,7 +662,7 @@ H5_DLL herr_t H5EA__sblock_dest(H5F_t *f, H5EA_sblock_t *sblock); /* Data block routines */ H5_DLL H5EA_dblock_t *H5EA__dblock_alloc(H5EA_hdr_t *hdr, size_t nelmts); -H5_DLL haddr_t H5EA__dblock_create(H5EA_hdr_t *hdr, hid_t dxpl_id, +H5_DLL haddr_t H5EA__dblock_create(H5EA_hdr_t *hdr, hid_t dxpl_id, hbool_t *hdr_dirty, hsize_t dblk_off, size_t nelmts); H5_DLL unsigned H5EA__dblock_sblk_idx(const H5EA_hdr_t *hdr, hsize_t idx); H5_DLL H5EA_dblock_t *H5EA__dblock_protect(H5EA_hdr_t *hdr, hid_t dxpl_id, diff --git a/src/H5EAprivate.h b/src/H5EAprivate.h index 3b9ba4d..f44d046 100644 --- a/src/H5EAprivate.h +++ b/src/H5EAprivate.h @@ -83,9 +83,17 @@ typedef struct H5EA_create_t { /* Extensible array metadata statistics info */ typedef struct H5EA_stat_t { - hsize_t max_idx_set; /* Highest element index stored (+1 - i.e. if element 0 has been set, this value with be '1', if no elements have been stored, this value will be '0') */ + /* Non-stored (i.e. computed) fields */ + hsize_t hdr_size; /* Size of header */ + hsize_t nindex_blks; /* # of index blocks (should be 0 or 1) */ + hsize_t index_blk_size; /* Size of index blocks allocated */ + + /* Stored fields */ hsize_t nsuper_blks; /* # of super blocks */ + hsize_t super_blk_size; /* Size of super blocks allocated */ hsize_t ndata_blks; /* # of data blocks */ + hsize_t data_blk_size; /* Size of data blocks allocated */ + hsize_t max_idx_set; /* Highest element index stored (+1 - i.e. if element 0 has been set, this value with be '1', if no elements have been stored, this value will be '0') */ hsize_t nelmts; /* # of elements "realized" */ } H5EA_stat_t; diff --git a/src/H5EAsblock.c b/src/H5EAsblock.c index 3d3d4e3..4ad83b0 100644 --- a/src/H5EAsblock.c +++ b/src/H5EAsblock.c @@ -190,11 +190,13 @@ END_FUNC(PKG) /* end H5EA__sblock_alloc() */ */ BEGIN_FUNC(PKG, ERR, haddr_t, HADDR_UNDEF, HADDR_UNDEF, -H5EA__sblock_create(H5EA_hdr_t *hdr, hid_t dxpl_id, unsigned sblk_idx)) +H5EA__sblock_create(H5EA_hdr_t *hdr, hid_t dxpl_id, hbool_t *hdr_dirty, + unsigned sblk_idx)) /* Local variables */ - H5EA_sblock_t *sblock = NULL; /* Extensible array super block */ - haddr_t tmp_addr = HADDR_UNDEF; /* Address value to fill data block addresses with */ + H5EA_sblock_t *sblock = NULL; /* Extensible array super block */ + haddr_t sblock_addr; /* Extensible array super block address */ + haddr_t tmp_addr = HADDR_UNDEF; /* Address value to fill data block addresses with */ #ifdef QAK HDfprintf(stderr, "%s: Called\n", FUNC); @@ -202,6 +204,7 @@ HDfprintf(stderr, "%s: Called\n", FUNC); /* Sanity check */ HDassert(hdr); + HDassert(hdr_dirty); /* Allocate the super block */ if(NULL == (sblock = H5EA__sblock_alloc(hdr, sblk_idx))) @@ -220,18 +223,26 @@ HDfprintf(stderr, "%s: sblock->block_off = %Hu\n", FUNC, sblock->block_off); #endif /* QAK */ /* Allocate space for the super block on disk */ - if(HADDR_UNDEF == (sblock->addr = H5MF_alloc(hdr->f, H5FD_MEM_EARRAY_SBLOCK, dxpl_id, (hsize_t)sblock->size))) + if(HADDR_UNDEF == (sblock_addr = H5MF_alloc(hdr->f, H5FD_MEM_EARRAY_SBLOCK, dxpl_id, (hsize_t)sblock->size))) H5E_THROW(H5E_CANTALLOC, "file allocation failed for extensible array super block") + sblock->addr = sblock_addr; /* Reset data block addresses to "undefined" address value */ H5V_array_fill(sblock->dblk_addrs, &tmp_addr, sizeof(haddr_t), sblock->ndblks); /* Cache the new extensible array super block */ - if(H5AC_set(hdr->f, dxpl_id, H5AC_EARRAY_SBLOCK, sblock->addr, sblock, H5AC__NO_FLAGS_SET) < 0) + if(H5AC_set(hdr->f, dxpl_id, H5AC_EARRAY_SBLOCK, sblock_addr, sblock, H5AC__NO_FLAGS_SET) < 0) H5E_THROW(H5E_CANTINSERT, "can't add extensible array super block to cache") + /* Update extensible array super block statistics */ + hdr->stats.nsuper_blks++; + hdr->stats.super_blk_size += sblock->size; + + /* Mark the header dirty (for updating statistics) */ + *hdr_dirty = TRUE; + /* Set address of super block to return */ - ret_value = sblock->addr; + ret_value = sblock_addr; CATCH if(!H5F_addr_defined(ret_value)) diff --git a/src/H5FDcore.c b/src/H5FDcore.c index cda7308..1e30ace 100644 --- a/src/H5FDcore.c +++ b/src/H5FDcore.c @@ -378,6 +378,9 @@ done: * Raymond Lu, 2006-11-30 * Enabled the driver to read an existing file depending on * the setting of the backing_store and file open flags. + * + * Allen Byrne, 2008-1-23 + * changed if of fapl_id to assert *------------------------------------------------------------------------- */ static H5FD_t * @@ -401,11 +404,10 @@ H5FD_core_open(const char *name, unsigned flags, hid_t fapl_id, HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, NULL, "bogus maxaddr") if(ADDR_OVERFLOW(maxaddr)) HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, NULL, "maxaddr overflow") - if(H5P_DEFAULT != fapl_id) { - if(NULL == (plist = (H5P_genplist_t *)H5I_object(fapl_id))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list") - fa = (H5FD_core_fapl_t *)H5P_get_driver_info(plist); - } /* end if */ + assert(H5P_DEFAULT != fapl_id); + if(NULL == (plist = (H5P_genplist_t *)H5I_object(fapl_id))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list") + fa = (H5FD_core_fapl_t *)H5P_get_driver_info(plist); /* Build the open flags */ o_flags = (H5F_ACC_RDWR & flags) ? O_RDWR : O_RDONLY; @@ -2273,8 +2273,7 @@ H5O_get_info(H5O_loc_t *oloc, hid_t dxpl_id, hbool_t want_ih_info, H5O_info_t *o HDassert(oinfo); /* Get the object header */ - if(NULL == (oh = (H5O_t *)H5AC_protect(oloc->file, dxpl_id, H5AC_OHDR, oloc->addr, NULL, NULL, - (H5F_get_intent(oloc->file) & H5F_ACC_RDWR) ? H5AC_WRITE : H5AC_READ))) + if(NULL == (oh = (H5O_t *)H5AC_protect(oloc->file, dxpl_id, H5AC_OHDR, oloc->addr, NULL, NULL, H5AC_READ))) HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "unable to load object header") /* Reset the object info structure */ diff --git a/src/H5Oainfo.c b/src/H5Oainfo.c index 2a9d403..7f6a55d 100644 --- a/src/H5Oainfo.c +++ b/src/H5Oainfo.c @@ -48,6 +48,9 @@ static herr_t H5O_ainfo_pre_copy_file(H5F_t *file_src, const void *mesg_src, static void *H5O_ainfo_copy_file(H5F_t *file_src, void *mesg_src, H5F_t *file_dst, hbool_t *recompute_size, H5O_copy_t *cpy_info, void *udata, hid_t dxpl_id); +static herr_t H5O_ainfo_post_copy_file(const H5O_loc_t *src_oloc, + const void *mesg_src, H5O_loc_t *dst_oloc, void *mesg_dst, hid_t dxpl_id, + H5O_copy_t *cpy_info); static herr_t H5O_ainfo_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE * stream, int indent, int fwidth); @@ -69,7 +72,7 @@ const H5O_msg_class_t H5O_MSG_AINFO[1] = {{ NULL, /*can share method */ H5O_ainfo_pre_copy_file, /* pre copy native value to file */ H5O_ainfo_copy_file, /* copy native value to file */ - NULL, /* post copy native value to file */ + H5O_ainfo_post_copy_file, /* post copy native value to file */ NULL, /* get creation index */ NULL, /* set creation index */ H5O_ainfo_debug /*debug the message */ @@ -393,15 +396,14 @@ H5O_ainfo_pre_copy_file(H5F_t UNUSED *file_src, const void UNUSED *native_src, * Return: Success: Ptr to _DEST * Failure: NULL * - * Programmer: Quincey Koziol - * March 9, 2007 + * Programmer: Peter Cao + * July 18, 2007 * *------------------------------------------------------------------------- */ static void * -H5O_ainfo_copy_file(H5F_t UNUSED *file_src, void *mesg_src, - H5F_t UNUSED *file_dst, hbool_t UNUSED *recompute_size, - H5O_copy_t UNUSED *cpy_info, void UNUSED *udata, hid_t UNUSED dxpl_id) +H5O_ainfo_copy_file(H5F_t *file_src, void *mesg_src, H5F_t *file_dst, + hbool_t *recompute_size, H5O_copy_t *cpy_info, void *udata, hid_t dxpl_id) { H5O_ainfo_t *ainfo_src = (H5O_ainfo_t *)mesg_src; H5O_ainfo_t *ainfo_dst = NULL; @@ -416,10 +418,6 @@ H5O_ainfo_copy_file(H5F_t UNUSED *file_src, void *mesg_src, HDassert(cpy_info); HDassert(!cpy_info->copy_without_attr); -/* XXX: Bail out for now, if the source object has densely stored attributes */ - if(H5F_addr_defined(ainfo_src->fheap_addr)) - HGOTO_ERROR(H5E_OHDR, H5E_UNSUPPORTED, NULL, "densely stored attributes not supported yet") - /* Allocate space for the destination message */ if(NULL == (ainfo_dst = H5FL_MALLOC(H5O_ainfo_t))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") @@ -427,6 +425,16 @@ H5O_ainfo_copy_file(H5F_t UNUSED *file_src, void *mesg_src, /* Copy the top level of the information */ *ainfo_dst = *ainfo_src; + if(H5F_addr_defined(ainfo_src->fheap_addr)) { + /* copy dense attribute */ + + if(H5A_dense_create(file_dst, dxpl_id, ainfo_dst) < 0) + HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "unable to create dense storage for attributes") + + if ( (H5A_dense_copy_file_all(file_src, ainfo_src, file_dst, ainfo_dst, recompute_size, cpy_info, dxpl_id)) <0) + HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "unable to create dense storage for attributes") + } + /* Set return value */ ret_value = ainfo_dst; @@ -440,6 +448,44 @@ done: /*------------------------------------------------------------------------- + * Function: H5O_ainfo_post_copy_file + * + * Purpose: Finish copying a message from between files. + * We have to copy the values of a reference attribute in the + * post copy because H5O_post_copy_file() fails at the case that + * an object may have a reference attribute that points to the + * object itself. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Peter Cao + * July 25, 2007 + * + *------------------------------------------------------------------------- + */ +static herr_t +H5O_ainfo_post_copy_file(const H5O_loc_t *src_oloc, const void *mesg_src, + H5O_loc_t *dst_oloc, void *mesg_dst, hid_t dxpl_id, H5O_copy_t *cpy_info) +{ + H5O_ainfo_t *ainfo_src = (const H5O_ainfo_t *)mesg_src; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT(H5O_ainfo_post_copy_file) + + HDassert(ainfo_src); + + if(H5F_addr_defined(ainfo_src->fheap_addr)) { + if ( H5A_dense_post_copy_file_all(src_oloc, ainfo_src, dst_oloc, + (H5O_ainfo_t *)mesg_dst, dxpl_id, cpy_info) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, FAIL, "can't copy attribute") + } + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* H5O_ainfo_post_copy_file() */ + + +/*------------------------------------------------------------------------- * Function: H5O_ainfo_debug * * Purpose: Prints debugging info for a message. diff --git a/src/H5Oattr.c b/src/H5Oattr.c index 85b1ef3..b875d02 100644 --- a/src/H5Oattr.c +++ b/src/H5Oattr.c @@ -20,13 +20,10 @@ #include "H5private.h" /* Generic Functions */ #include "H5Apkg.h" /* Attributes */ -#include "H5Dprivate.h" /* Datasets */ #include "H5Eprivate.h" /* Error handling */ -#include "H5Iprivate.h" /* IDs */ #include "H5MMprivate.h" /* Memory management */ #include "H5Opkg.h" /* Object headers */ #include "H5Spkg.h" /* Dataspaces */ -#include "H5SMprivate.h" /* Shared Object Header Messages */ /* PRIVATE PROTOTYPES */ static herr_t H5O_attr_encode(H5F_t *f, uint8_t *p, const void *mesg); @@ -641,257 +638,20 @@ H5O_attr_copy_file(H5F_t UNUSED *file_src, const H5O_msg_class_t UNUSED *mesg_ty void *native_src, H5F_t *file_dst, hbool_t *recompute_size, H5O_copy_t *cpy_info, void UNUSED *udata, hid_t dxpl_id) { - H5A_t *attr_src = (H5A_t *)native_src; - H5A_t *attr_dst = NULL; - - /* for dataype conversion */ - hid_t tid_src = -1; /* Datatype ID for source datatype */ - hid_t tid_dst = -1; /* Datatype ID for destination datatype */ - hid_t tid_mem = -1; /* Datatype ID for memory datatype */ - void *buf = NULL; /* Buffer for copying data */ - void *reclaim_buf = NULL; /* Buffer for reclaiming data */ - hid_t buf_sid = -1; /* ID for buffer dataspace */ - void *ret_value; /* Return value */ FUNC_ENTER_NOAPI_NOINIT(H5O_attr_copy_file) /* check args */ - HDassert(attr_src); + HDassert(native_src); HDassert(file_dst); HDassert(cpy_info); HDassert(!cpy_info->copy_without_attr); - /* Allocate space for the destination message */ - if(NULL == (attr_dst = H5FL_CALLOC(H5A_t))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") - - /* Copy the top level of the attribute */ - *attr_dst = *attr_src; - - if(NULL == (attr_dst->shared = H5FL_CALLOC(H5A_shared_t))) - HGOTO_ERROR(H5E_FILE, H5E_NOSPACE, NULL, "can't allocate shared attr structure") - - /* Don't have an opened group location for copy */ - H5O_loc_reset(&(attr_dst->shared->oloc)); - H5G_name_reset(&(attr_dst->path)); - attr_dst->obj_opened = FALSE; - - /* Reference count for the header message in the cache */ - attr_dst->shared->nrefs = 1; - - /* Copy attribute's name */ - attr_dst->shared->name = H5MM_strdup(attr_src->shared->name); - HDassert(attr_dst->shared->name); - - /* Copy attribute's datatype */ - /* (Start destination datatype as transient, even if source is named) */ - if(NULL == (attr_dst->shared->dt = H5T_copy(attr_src->shared->dt, H5T_COPY_ALL))) - HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, NULL, "cannot copy datatype") - - /* Set the location of the destination datatype */ - if(H5T_set_loc(attr_dst->shared->dt, file_dst, H5T_LOC_DISK) < 0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "cannot mark datatype on disk") - - /* Check for named datatype being copied */ - if(H5T_committed(attr_src->shared->dt)) { - H5O_loc_t *src_oloc; /* Pointer to source datatype's object location */ - H5O_loc_t *dst_oloc; /* Pointer to dest. datatype's object location */ - - /* Get group entries for source & destination */ - src_oloc = H5T_oloc(attr_src->shared->dt); - HDassert(src_oloc); - dst_oloc = H5T_oloc(attr_dst->shared->dt); - HDassert(dst_oloc); - - /* Reset object location for new object */ - H5O_loc_reset(dst_oloc); - dst_oloc->file = file_dst; - - /* Copy the shared object from source to destination */ - if(H5O_copy_header_map(src_oloc, dst_oloc, dxpl_id, cpy_info, FALSE) < 0) - HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, NULL, "unable to copy object") - - /* Update shared message info from named datatype info */ - H5T_update_shared(attr_dst->shared->dt); - } /* end if */ - else { - /* If the datatype is not named, it may have been shared in the - * source file's heap. Un-share it for now. We'll try to shared - * it in the destination file below. - */ - if(H5O_msg_reset_share(H5O_DTYPE_ID, attr_dst->shared->dt) < 0) - HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "unable to reset datatype sharing") - } /* end else */ - - /* Copy the dataspace for the attribute */ - attr_dst->shared->ds = H5S_copy(attr_src->shared->ds, FALSE, FALSE); - HDassert(attr_dst->shared->ds); - - /* Reset the dataspace's sharing in the source file before trying to share - * it in the destination. - */ - if(H5O_msg_reset_share(H5O_SDSPACE_ID, attr_dst->shared->ds) < 0) - HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "unable to reset dataspace sharing") - - - /* Try to share both the datatype and dataset. This does nothing if the - * datatype is committed or sharing is disabled. - */ - if(H5SM_try_share(file_dst, dxpl_id, NULL, H5O_DTYPE_ID, attr_dst->shared->dt, NULL) < 0) - HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, NULL, "can't share attribute datatype") - if(H5SM_try_share(file_dst, dxpl_id, NULL, H5O_SDSPACE_ID, attr_dst->shared->ds, NULL) < 0) - HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, NULL, "can't share attribute dataspace") - - /* Compute the sizes of the datatype and dataspace. This is their raw - * size unless they're shared. - */ - attr_dst->shared->dt_size = H5O_msg_raw_size(file_dst, H5O_DTYPE_ID, FALSE, attr_dst->shared->dt); - HDassert(attr_dst->shared->dt_size > 0); - attr_dst->shared->ds_size = H5O_msg_raw_size(file_dst, H5O_SDSPACE_ID, FALSE, attr_dst->shared->ds); - HDassert(attr_dst->shared->ds_size > 0); - - /* Check whether to recompute the size of the attribute */ - /* (happens when the datatype or dataspace changes sharing status) */ - if(attr_dst->shared->dt_size != attr_src->shared->dt_size || attr_dst->shared->ds_size != attr_src->shared->ds_size) - *recompute_size = TRUE; - - /* Compute the size of the data */ - H5_ASSIGN_OVERFLOW(attr_dst->shared->data_size, H5S_GET_EXTENT_NPOINTS(attr_dst->shared->ds) * H5T_get_size(attr_dst->shared->dt), hsize_t, size_t); - - /* Copy (& convert) the data, if necessary */ - if(attr_src->shared->data) { - if(NULL == (attr_dst->shared->data = H5FL_BLK_MALLOC(attr_buf, attr_dst->shared->data_size))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") - - /* Check if we need to convert data */ - if(H5T_detect_class(attr_src->shared->dt, H5T_VLEN) > 0) { - H5T_path_t *tpath_src_mem, *tpath_mem_dst; /* Datatype conversion paths */ - H5T_t *dt_mem; /* Memory datatype */ - size_t src_dt_size; /* Source datatype size */ - size_t tmp_dt_size; /* Temp. datatype size */ - size_t max_dt_size; /* Max atatype size */ - H5S_t *buf_space; /* Dataspace describing buffer */ - hsize_t buf_dim; /* Dimension for buffer */ - size_t nelmts; /* Number of elements in buffer */ - size_t buf_size; /* Size of copy buffer */ - - /* Create datatype ID for src datatype */ - if((tid_src = H5I_register(H5I_DATATYPE, attr_src->shared->dt, FALSE)) < 0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, NULL, "unable to register source file datatype") - - /* create a memory copy of the variable-length datatype */ - if(NULL == (dt_mem = H5T_copy(attr_src->shared->dt, H5T_COPY_TRANSIENT))) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to copy") - if((tid_mem = H5I_register(H5I_DATATYPE, dt_mem, FALSE)) < 0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, NULL, "unable to register memory datatype") - - /* create variable-length datatype at the destinaton file */ - if((tid_dst = H5I_register(H5I_DATATYPE, attr_dst->shared->dt, FALSE)) < 0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, NULL, "unable to register destination file datatype") - - /* Set up the conversion functions */ - if(NULL == (tpath_src_mem = H5T_path_find(attr_src->shared->dt, dt_mem, NULL, NULL, dxpl_id, FALSE))) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to convert between src and mem datatypes") - if(NULL == (tpath_mem_dst = H5T_path_find(dt_mem, attr_dst->shared->dt, NULL, NULL, dxpl_id, FALSE))) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to convert between mem and dst datatypes") - - /* Determine largest datatype size */ - if(0 == (src_dt_size = H5T_get_size(attr_src->shared->dt))) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to determine datatype size") - if(0 == (tmp_dt_size = H5T_get_size(dt_mem))) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to determine datatype size") - max_dt_size = MAX(src_dt_size, tmp_dt_size); - if(0 == (tmp_dt_size = H5T_get_size(attr_dst->shared->dt))) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to determine datatype size") - max_dt_size = MAX(max_dt_size, tmp_dt_size); - - /* Set number of whole elements that fit in buffer */ - if(0 == (nelmts = attr_src->shared->data_size / src_dt_size)) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "element size too large") - - /* Set up number of bytes to copy, and initial buffer size */ - buf_size = nelmts * max_dt_size; - - /* Create dataspace for number of elements in buffer */ - buf_dim = nelmts; - - /* Create the space and set the initial extent */ - if(NULL == (buf_space = H5S_create_simple((unsigned)1, &buf_dim, NULL))) - HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCREATE, NULL, "can't create simple dataspace") - - /* Atomize */ - if((buf_sid = H5I_register(H5I_DATASPACE, buf_space, FALSE)) < 0) { - H5S_close(buf_space); - HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, NULL, "unable to register dataspace ID") - } /* end if */ - - /* Allocate memory for recclaim buf */ - if(NULL == (reclaim_buf = H5FL_BLK_MALLOC(attr_buf, buf_size))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation NULLed for raw data chunk") - - /* Allocate memory for copying the chunk */ - if(NULL == (buf = H5FL_BLK_MALLOC(attr_buf, buf_size))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation NULLed for raw data chunk") - - HDmemcpy(buf, attr_src->shared->data, attr_src->shared->data_size); - - /* Convert from source file to memory */ - if(H5T_convert(tpath_src_mem, tid_src, tid_mem, nelmts, (size_t)0, (size_t)0, buf, NULL, dxpl_id) < 0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "datatype conversion NULLed") - - HDmemcpy(reclaim_buf, buf, buf_size); - - /* Convert from memory to destination file */ - if(H5T_convert(tpath_mem_dst, tid_mem, tid_dst, nelmts, (size_t)0, (size_t)0, buf, NULL, dxpl_id) < 0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "datatype conversion NULLed") - - HDmemcpy(attr_dst->shared->data, buf, attr_dst->shared->data_size); - - if(H5D_vlen_reclaim(tid_mem, buf_space, H5P_DATASET_XFER_DEFAULT, reclaim_buf) < 0) - HGOTO_ERROR(H5E_DATASET, H5E_BADITER, NULL, "unable to reclaim variable-length data") - } /* end if */ - else { - HDassert(attr_dst->shared->data_size == attr_src->shared->data_size); - HDmemcpy(attr_dst->shared->data, attr_src->shared->data, attr_src->shared->data_size); - } /* end else */ - } /* end if(attr_src->shared->data) */ - - /* Recompute the version to encode the destination attribute */ - if(H5A_set_version(file_dst, attr_dst) < 0) - HGOTO_ERROR(H5E_ATTR, H5E_CANTSET, NULL, "unable to update attribute version") - - /* Indicate that the fill values aren't to be written out */ - attr_dst->shared->initialized = TRUE; - - /* Set return value */ - ret_value = attr_dst; + if ( NULL == (ret_value=H5A_attr_copy_file((H5A_t *)native_src, file_dst, recompute_size, cpy_info, dxpl_id))) + HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, NULL, "can't copy attribute") done: - if(buf_sid > 0) - if(H5I_dec_ref(buf_sid, FALSE) < 0) - HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, NULL, "Can't decrement temporary dataspace ID") - if(tid_src > 0) - /* Don't decrement ID, we want to keep underlying datatype */ - if(H5I_remove(tid_src) == NULL) - HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, NULL, "Can't decrement temporary datatype ID") - if(tid_dst > 0) - /* Don't decrement ID, we want to keep underlying datatype */ - if(H5I_remove(tid_dst) == NULL) - HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, NULL, "Can't decrement temporary datatype ID") - if(tid_mem > 0) - /* Decrement the memory datatype ID, it's transient */ - if(H5I_dec_ref(tid_mem, FALSE) < 0) - HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, NULL, "Can't decrement temporary datatype ID") - if(buf) - buf = H5FL_BLK_FREE(attr_buf, buf); - if(reclaim_buf) - reclaim_buf = H5FL_BLK_FREE(attr_buf, reclaim_buf); - - /* Release destination attribute information on failure */ - if(!ret_value && attr_dst && H5A_close(attr_dst) < 0) - HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, NULL, "can't close attribute") - FUNC_LEAVE_NOAPI(ret_value) } /* H5O_attr_copy_file() */ @@ -916,48 +676,14 @@ static herr_t H5O_attr_post_copy_file(const H5O_loc_t *src_oloc, const void *mesg_src, H5O_loc_t *dst_oloc, void *mesg_dst, hid_t dxpl_id, H5O_copy_t *cpy_info) { - const H5A_t *attr_src = (const H5A_t *)mesg_src; - H5A_t *attr_dst = (H5A_t *)mesg_dst; - H5F_t *file_src = src_oloc->file; - H5F_t *file_dst = dst_oloc->file; herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI_NOINIT(H5O_attr_post_copy_file) - /* check args */ - HDassert(attr_src); - HDassert(file_src); - HDassert(attr_dst); - HDassert(file_dst); - - /* Only need to fix reference attribute with real data being copied to - * another file. - */ - if((NULL != attr_src->shared->data) && - (H5T_get_class(attr_src->shared->dt, FALSE) == H5T_REFERENCE) && - (file_src != file_dst)) { - - /* copy object pointed by reference. The current implementation does not - * deal with nested reference such as reference in a compound structure - */ - - /* Check for expanding references */ - if(cpy_info->expand_ref) { - size_t ref_count; - - /* Determine # of reference elements to copy */ - ref_count = attr_dst->shared->data_size / H5T_get_size(attr_dst->shared->dt); - - /* Copy objects referenced in source buffer to destination file and set destination elements */ - if(H5O_copy_expand_ref(file_src, attr_src->shared->data, dxpl_id, - file_dst, attr_dst->shared->data, ref_count, H5T_get_ref_type(attr_src->shared->dt), cpy_info) < 0) - HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, FAIL, "unable to copy reference attribute") - } /* end if */ - else - /* Reset value to zero */ - HDmemset(attr_dst->shared->data, 0, attr_dst->shared->data_size); - } /* end if */ + if ( H5A_attr_post_copy_file(src_oloc, (const H5A_t *)mesg_src, + dst_oloc, (H5A_t *)mesg_dst, dxpl_id, cpy_info) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, FAIL, "can't copy attribute") done: FUNC_LEAVE_NOAPI(ret_value) diff --git a/src/H5Oattribute.c b/src/H5Oattribute.c index 846d2ec..ea9a7f5 100644 --- a/src/H5Oattribute.c +++ b/src/H5Oattribute.c @@ -1207,7 +1207,7 @@ H5O_attr_iterate_real(hid_t loc_id, const H5O_loc_t *loc, hid_t dxpl_id, /* Protect the object header to iterate over */ if(NULL == (oh = (H5O_t *)H5AC_protect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, - NULL, NULL, (H5F_get_intent(loc->file) & H5F_ACC_RDWR) ? H5AC_WRITE : H5AC_READ))) + NULL, NULL, H5AC_READ))) HGOTO_ERROR(H5E_ATTR, H5E_CANTLOAD, FAIL, "unable to load object header") /* Check for attribute info stored */ diff --git a/src/H5Ocache.c b/src/H5Ocache.c index e5a772f..db093a4 100644 --- a/src/H5Ocache.c +++ b/src/H5Ocache.c @@ -880,12 +880,21 @@ HDfprintf(stderr, "%s: oh->cache_info.free_file_space_on_destroy = %t\n", FUNC, /* destroy messages */ if(oh->mesg) { for(u = 0; u < oh->nmesgs; u++) { - /* Verify that message is clean */ - HDassert(oh->mesg[u].dirty == 0); + /* Verify that message is clean, unless it could have been marked + * dirty by decoding */ +#ifndef NDEBUG + if(oh->ndecode_dirtied && oh->mesg[u].dirty) + oh->ndecode_dirtied--; + else + HDassert(oh->mesg[u].dirty == 0); +#endif /* NDEBUG */ H5O_msg_free_mesg(&oh->mesg[u]); } /* end for */ + /* Make sure we accounted for all the messages dirtied by decoding */ + HDassert(!oh->ndecode_dirtied); + oh->mesg = (H5O_mesg_t *)H5FL_SEQ_FREE(H5O_mesg_t, oh->mesg); } /* end if */ @@ -929,6 +938,11 @@ H5O_clear(H5F_t *f, H5O_t *oh, hbool_t destroy) for(u = 0; u < oh->nmesgs; u++) oh->mesg[u].dirty = FALSE; +#ifndef NDEBUG + /* Reset the number of messages dirtied by decoding */ + oh->ndecode_dirtied = 0; +#endif /* NDEBUG */ + /* Mark whole header as clean */ oh->cache_info.is_dirty = FALSE; diff --git a/src/H5Ocopy.c b/src/H5Ocopy.c index 9a905d2..5334539 100644 --- a/src/H5Ocopy.c +++ b/src/H5Ocopy.c @@ -315,8 +315,7 @@ H5O_copy_header_real(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out */, HDassert(cpy_info); /* Get source object header */ - if(NULL == (oh_src = (H5O_t *)H5AC_protect(oloc_src->file, dxpl_id, H5AC_OHDR, oloc_src->addr, NULL, NULL, - (H5F_get_intent(oloc_src->file) & H5F_ACC_RDWR) ? H5AC_WRITE : H5AC_READ))) + if(NULL == (oh_src = (H5O_t *)H5AC_protect(oloc_src->file, dxpl_id, H5AC_OHDR, oloc_src->addr, NULL, NULL, H5AC_READ))) HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "unable to load object header") /* Get pointer to object class for this object */ diff --git a/src/H5Omessage.c b/src/H5Omessage.c index 1682117..5a0577a 100644 --- a/src/H5Omessage.c +++ b/src/H5Omessage.c @@ -484,8 +484,7 @@ H5O_msg_read(const H5O_loc_t *loc, unsigned type_id, void *mesg, HDassert(type_id < NELMTS(H5O_msg_class_g)); /* Get the object header */ - if(NULL == (oh = (H5O_t *)H5AC_protect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, NULL, NULL, - (H5F_get_intent(loc->file) & H5F_ACC_RDWR) ? H5AC_WRITE : H5AC_READ))) + if(NULL == (oh = (H5O_t *)H5AC_protect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, NULL, NULL, H5AC_READ))) HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "unable to load object header") /* Call the "real" read routine */ @@ -1231,8 +1230,7 @@ H5O_msg_iterate(const H5O_loc_t *loc, unsigned type_id, HDassert(op); /* Protect the object header to iterate over */ - if(NULL == (oh = (H5O_t *)H5AC_protect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, NULL, NULL, - (H5F_get_intent(loc->file) & H5F_ACC_RDWR) ? H5AC_WRITE : H5AC_READ))) + if(NULL == (oh = (H5O_t *)H5AC_protect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, NULL, NULL, H5AC_READ))) HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "unable to load object header") /* Call the "real" iterate routine */ @@ -2229,6 +2227,12 @@ H5O_flush_msgs(H5F_t *f, H5O_t *oh) if(oh->nmesgs != u) HGOTO_ERROR(H5E_OHDR, H5E_CANTFLUSH, FAIL, "corrupt object header - too few messages") +#ifndef NDEBUG + /* Reset the number of messages dirtied by decoding, as they have all + * been flushed */ + oh->ndecode_dirtied = 0; +#endif /* NDEBUG */ + done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5O_flush_msgs() */ diff --git a/src/H5Opkg.h b/src/H5Opkg.h index f15198e..b7d4202 100644 --- a/src/H5Opkg.h +++ b/src/H5Opkg.h @@ -171,6 +171,13 @@ #define H5O_DECODEIO_NOCHANGE 0x01u /* IN: do not modify values */ #define H5O_DECODEIO_DIRTY 0x02u /* OUT: message has been changed */ +/* Macro to incremend ndecode_dirtied (only if we are debugging) */ +#ifndef NDEBUG +#define INCR_NDECODE_DIRTIED(OH) (OH)->ndecode_dirtied++; +#else /* NDEBUG */ +#define INCR_NDECODE_DIRTIED(OH) ; +#endif /* NDEBUG */ + /* Load native information for a message, if it's not already present */ /* (Only works for messages with decode callback) */ #define H5O_LOAD_NATIVE(F, DXPL, IOF, OH, MSG, ERR) \ @@ -183,11 +190,12 @@ if(NULL == ((MSG)->native = (msg_type->decode)((F), (DXPL), (MSG)->flags, &ioflags, (MSG)->raw))) \ HGOTO_ERROR(H5E_OHDR, H5E_CANTDECODE, ERR, "unable to decode message") \ \ - /* Mark the object header dirty if the message was changed by decoding */ \ + /* Mark the message dirty if it was changed by decoding */ \ if((ioflags & H5O_DECODEIO_DIRTY) && (H5F_get_intent((F)) & H5F_ACC_RDWR)) { \ (MSG)->dirty = TRUE; \ - if(H5AC_mark_pinned_or_protected_entry_dirty((F), (OH)) < 0) \ - HGOTO_ERROR(H5E_OHDR, H5E_CANTMARKDIRTY, ERR, "unable to mark object header as dirty") \ + /* Increment the count of messages dirtied by decoding, but */ \ + /* only ifndef NDEBUG */ \ + INCR_NDECODE_DIRTIED(OH) \ } \ \ /* Set the message's "shared info", if it's shareable */ \ @@ -264,6 +272,9 @@ struct H5O_t { * versions of the library) */ #endif /* H5O_ENABLE_BAD_MESG_COUNT */ +#ifndef NDEBUG + size_t ndecode_dirtied; /* Number of messages dirtied by decoding */ +#endif /* NDEBUG */ /* Object information (stored) */ hbool_t has_refcount_msg; /* Whether the object has a ref. count message */ diff --git a/test/Makefile.am b/test/Makefile.am index 817829a..1709d44 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -114,7 +114,7 @@ CHECK_CLEANFILES+=cmpd_dset.h5 compact_dataset.h5 dataset.h5 dset_offset.h5 \ fillval_[0-9].h5 fillval.raw mount_[0-9].h5 testmeta.h5 ttime.h5 \ trefer[1-3].h5 tvltypes.h5 tvlstr.h5 tvlstr2.h5 flush.h5 \ enum1.h5 titerate.h5 ttsafe.h5 tarray1.h5 tgenprop.h5 \ - tmisc[0-9]*.h5 set_extent_read.h5 set_extent_create.h5 \ + tmisc[0-9]*.h5 set_extent[1-5].h5 ext[12].bin \ getname.h5 getname[1-3].h5 sec2_file.h5 direct_file.h5 \ family_file000[0-3][0-9].h5 multi_file-[rs].h5 core_file \ new_move_[ab].h5 ntypes.h5 dangle.h5 error_test.h5 err_compat.h5 \ diff --git a/test/cmpd_dset.c b/test/cmpd_dset.c index c05844e..d1f317f 100644 --- a/test/cmpd_dset.c +++ b/test/cmpd_dset.c @@ -1840,117 +1840,109 @@ test_pack_ooo(void) PASSED(); - /* Change to reverse ordering, insert compound last */ - for(i=0; i<PACK_NMEMBS; i++) - order[i] = PACK_NMEMBS - i - 1; - sub_cmpd_order = PACK_NMEMBS - 1; - TESTING("reverse member insertion with empty compound subtype"); /* Create inner compound type. It will be empty for the first run */ - if((sub_cmpd = H5Tcreate(H5T_COMPOUND, 4)) < 0) TEST_ERROR + if((sub_cmpd = H5Tcreate(H5T_COMPOUND, 4)) < 0) PACK_OOO_ERROR /* Create main compound type, with extra space at the end */ - if((cmpd = H5Tcreate(H5T_COMPOUND, (4 * PACK_NMEMBS) + 1)) < 0) TEST_ERROR + if((cmpd = H5Tcreate(H5T_COMPOUND, (4 * PACK_NMEMBS) + 1)) < 0) PACK_OOO_ERROR - /* Insert the compound members in the reverse order previously generated */ + /* Insert the compound members in reverse order, with compound last */ for(i=0; i<PACK_NMEMBS; i++) { sprintf(name, "%05d", i); - if(i == sub_cmpd_order) { - if(H5Tinsert(cmpd, name, 4 * order[i], sub_cmpd) < 0) TEST_ERROR + if(i == PACK_NMEMBS - 1) { + if(H5Tinsert(cmpd, name, 4 * (PACK_NMEMBS - i - 1), sub_cmpd) < 0) PACK_OOO_ERROR } else - if(H5Tinsert(cmpd, name, 4 * order[i], H5T_STD_I32BE) < 0) TEST_ERROR + if(H5Tinsert(cmpd, name, 4 * (PACK_NMEMBS - i - 1), H5T_STD_I32BE) < 0) PACK_OOO_ERROR } /* end for */ /* Verify that the compound is not packed */ - if(NULL == (dt = (H5T_t *) H5I_object_verify(cmpd, H5I_DATATYPE))) TEST_ERROR - if(dt->shared->u.compnd.packed) TEST_ERROR + if(NULL == (dt = (H5T_t *) H5I_object_verify(cmpd, H5I_DATATYPE))) PACK_OOO_ERROR + if(dt->shared->u.compnd.packed) PACK_OOO_ERROR /* Close the main compound */ - if(H5Tclose(cmpd) < 0) TEST_ERROR + if(H5Tclose(cmpd) < 0) PACK_OOO_ERROR PASSED(); TESTING("reverse member insertion with full compound subtype"); /* Complete the inner compound type */ - if(H5Tinsert(sub_cmpd, "int", 0, H5T_STD_I32LE) < 0) TEST_ERROR + if(H5Tinsert(sub_cmpd, "int", 0, H5T_STD_I32LE) < 0) PACK_OOO_ERROR /* Recreate main compound type */ - if((cmpd = H5Tcreate(H5T_COMPOUND, (4 * PACK_NMEMBS) + 1)) < 0) TEST_ERROR + if((cmpd = H5Tcreate(H5T_COMPOUND, (4 * PACK_NMEMBS) + 1)) < 0) PACK_OOO_ERROR - /* Insert the compound members in the reverse order previously generated */ + /* Insert the compound members in reverse order, with compound last */ for(i=0; i<PACK_NMEMBS; i++) { sprintf(name, "%05d", i); - if(i == sub_cmpd_order) { - if(H5Tinsert(cmpd, name, 4 * order[i], sub_cmpd) < 0) TEST_ERROR + if(i == PACK_NMEMBS - 1) { + if(H5Tinsert(cmpd, name, 4 * (PACK_NMEMBS - i - 1), sub_cmpd) < 0) PACK_OOO_ERROR } else - if(H5Tinsert(cmpd, name, 4 * order[i], H5T_STD_I32BE) < 0) TEST_ERROR + if(H5Tinsert(cmpd, name, 4 * (PACK_NMEMBS - i - 1), H5T_STD_I32BE) < 0) PACK_OOO_ERROR } /* end for */ /* Verify that the compound is packed */ - if(NULL == (dt = (H5T_t *) H5I_object_verify(cmpd, H5I_DATATYPE))) TEST_ERROR - if(!dt->shared->u.compnd.packed) TEST_ERROR + if(NULL == (dt = (H5T_t *) H5I_object_verify(cmpd, H5I_DATATYPE))) PACK_OOO_ERROR + if(!dt->shared->u.compnd.packed) PACK_OOO_ERROR /* Close */ - if(H5Tclose(cmpd) < 0) TEST_ERROR - if(H5Tclose(sub_cmpd) < 0) TEST_ERROR + if(H5Tclose(cmpd) < 0) PACK_OOO_ERROR + if(H5Tclose(sub_cmpd) < 0) PACK_OOO_ERROR PASSED(); - /* Change to forward ordering, insert compound first */ - sub_cmpd_order = 0; - TESTING("forward member insertion with empty compound subtype"); /* Create inner compound type. It will be empty for the first run */ - if((sub_cmpd = H5Tcreate(H5T_COMPOUND, 4)) < 0) TEST_ERROR + if((sub_cmpd = H5Tcreate(H5T_COMPOUND, 4)) < 0) PACK_OOO_ERROR /* Create main compound type, with extra space at the end */ - if((cmpd = H5Tcreate(H5T_COMPOUND, (4 * PACK_NMEMBS) + 1)) < 0) TEST_ERROR + if((cmpd = H5Tcreate(H5T_COMPOUND, (4 * PACK_NMEMBS) + 1)) < 0) PACK_OOO_ERROR - /* Insert the compound members in forward order */ + /* Insert the compound members in forward order, with compound first */ for(i=0; i<PACK_NMEMBS; i++) { sprintf(name, "%05d", i); - if(i == sub_cmpd_order) { - if(H5Tinsert(cmpd, name, 4 * i, sub_cmpd) < 0) TEST_ERROR + if(i == 0) { + if(H5Tinsert(cmpd, name, 4 * i, sub_cmpd) < 0) PACK_OOO_ERROR } else - if(H5Tinsert(cmpd, name, 4 * i, H5T_STD_I32BE) < 0) TEST_ERROR + if(H5Tinsert(cmpd, name, 4 * i, H5T_STD_I32BE) < 0) PACK_OOO_ERROR } /* end for */ /* Verify that the compound is not packed */ - if(NULL == (dt = (H5T_t *) H5I_object_verify(cmpd, H5I_DATATYPE))) TEST_ERROR - if(dt->shared->u.compnd.packed) TEST_ERROR + if(NULL == (dt = (H5T_t *) H5I_object_verify(cmpd, H5I_DATATYPE))) PACK_OOO_ERROR + if(dt->shared->u.compnd.packed) PACK_OOO_ERROR /* Close the main compound */ - if(H5Tclose(cmpd) < 0) TEST_ERROR + if(H5Tclose(cmpd) < 0) PACK_OOO_ERROR PASSED(); TESTING("forward member insertion with full compound subtype"); /* Complete the inner compound type */ - if(H5Tinsert(sub_cmpd, "int", 0, H5T_STD_I32LE) < 0) TEST_ERROR + if(H5Tinsert(sub_cmpd, "int", 0, H5T_STD_I32LE) < 0) PACK_OOO_ERROR /* Recreate main compound type */ - if((cmpd = H5Tcreate(H5T_COMPOUND, (4 * PACK_NMEMBS) + 1)) < 0) TEST_ERROR + if((cmpd = H5Tcreate(H5T_COMPOUND, (4 * PACK_NMEMBS) + 1)) < 0) PACK_OOO_ERROR /* Insert the compound members in forward order */ for(i=0; i<PACK_NMEMBS; i++) { sprintf(name, "%05d", i); - if(i == sub_cmpd_order) { - if(H5Tinsert(cmpd, name, 4 * i, sub_cmpd) < 0) TEST_ERROR + if(i == 0) { + if(H5Tinsert(cmpd, name, 4 * i, sub_cmpd) < 0) PACK_OOO_ERROR } else - if(H5Tinsert(cmpd, name, 4 * i, H5T_STD_I32BE) < 0) TEST_ERROR + if(H5Tinsert(cmpd, name, 4 * i, H5T_STD_I32BE) < 0) PACK_OOO_ERROR } /* end for */ /* Verify that the compound is packed */ - if(NULL == (dt = (H5T_t *) H5I_object_verify(cmpd, H5I_DATATYPE))) TEST_ERROR - if(!dt->shared->u.compnd.packed) TEST_ERROR + if(NULL == (dt = (H5T_t *) H5I_object_verify(cmpd, H5I_DATATYPE))) PACK_OOO_ERROR + if(!dt->shared->u.compnd.packed) PACK_OOO_ERROR /* Close */ - if(H5Tclose(cmpd) < 0) TEST_ERROR - if(H5Tclose(sub_cmpd) < 0) TEST_ERROR + if(H5Tclose(cmpd) < 0) PACK_OOO_ERROR + if(H5Tclose(sub_cmpd) < 0) PACK_OOO_ERROR PASSED(); diff --git a/test/earray.c b/test/earray.c index c80352d..6935a15 100644 --- a/test/earray.c +++ b/test/earray.c @@ -45,6 +45,8 @@ #define MAX_DBLOCK_PAGE_NELMTS_BITS 10 /* i.e. 1024 elements per data block page */ /* Convenience macros for computing earray state */ +#define EA_HDR_SIZE 72 /* (hard-coded, current size) */ +#define EA_IBLOCK_SIZE 298 /* (hard-coded, current size) */ #define EA_NELMTS(cparam, tparam, idx, sblk_idx) \ (hsize_t)(cparam->idx_blk_elmts + \ tparam->sblk_info[sblk_idx].start_idx + \ @@ -97,9 +99,14 @@ typedef enum { /* Extensible array state information */ typedef struct earray_state_t { - hsize_t max_idx_set; /* Highest element index stored (+1 - i.e. if element 0 has been set, this value with be '1', if no elements have been stored, this value will be '0') */ + hsize_t hdr_size; /* Size of header */ + hsize_t nindex_blks; /* # of index blocks */ + hsize_t index_blk_size; /* Size of index blocks */ hsize_t nsuper_blks; /* # of super blocks */ + hsize_t super_blk_size; /* Size of super blocks */ hsize_t ndata_blks; /* # of data blocks */ + hsize_t data_blk_size; /* Size of data blocks */ + hsize_t max_idx_set; /* Highest element index stored (+1 - i.e. if element 0 has been set, this value with be '1', if no elements have been stored, this value will be '0') */ hsize_t nelmts; /* # of elements "realized" */ } earray_state_t; @@ -111,7 +118,7 @@ typedef struct earray_iter_t { void *(*init)(const H5EA_create_t *cparam, const earray_test_param_t *tparam, hsize_t cnt); /* Initialize/allocate iterator private info */ hssize_t (*next)(void *info); /* Get the next element to test */ - hssize_t (*max)(const void *info); /* Get the max. element set */ + hssize_t (*max_elem)(const void *info); /* Get the max. element set */ int (*state)(void *_eiter, const H5EA_create_t *cparam, const earray_test_param_t *tparam, earray_state_t *state, hsize_t idx); /* Get the state of the extensible array */ herr_t (*term)(void *info); /* Shutdown/free iterator private info */ @@ -313,14 +320,44 @@ check_stats(const H5EA_t *ea, const earray_state_t *state) HDfprintf(stdout, "earray_stats.nelmts = %Hu, state->nelmts = %Hu\n", earray_stats.nelmts, state->nelmts); TEST_ERROR } /* end if */ + if(earray_stats.hdr_size != state->hdr_size) { + HDfprintf(stdout, "earray_stats.hdr_size = %Hu, state->hdr_size = %Hu\n", earray_stats.hdr_size, state->hdr_size); + TEST_ERROR + } /* end if */ + if(earray_stats.nindex_blks != state->nindex_blks) { + HDfprintf(stdout, "earray_stats.nindex_blks = %Hu, state->nindex_blks = %Hu\n", earray_stats.nindex_blks, state->nindex_blks); + TEST_ERROR + } /* end if */ + if(earray_stats.index_blk_size != state->index_blk_size) { + HDfprintf(stdout, "earray_stats.index_blk_size = %Hu, state->index_blk_size = %Hu\n", earray_stats.index_blk_size, state->index_blk_size); + TEST_ERROR + } /* end if */ if(earray_stats.ndata_blks != state->ndata_blks) { HDfprintf(stdout, "earray_stats.ndata_blks = %Hu, state->ndata_blks = %Hu\n", earray_stats.ndata_blks, state->ndata_blks); TEST_ERROR } /* end if */ +/* Don't compare this currently, it's very hard to compute */ +#ifdef NOT_YET + if(earray_stats.data_blk_size != state->data_blk_size) { + HDfprintf(stdout, "earray_stats.data_blk_size = %Hu, state->data_blk_size = %Hu\n", earray_stats.data_blk_size, state->data_blk_size); + TEST_ERROR + } /* end if */ +#endif /* NOT_YET */ if(earray_stats.nsuper_blks != state->nsuper_blks) { HDfprintf(stdout, "earray_stats.nsuper_blks = %Hu, state->nsuper_blks = %Hu\n", earray_stats.nsuper_blks, state->nsuper_blks); TEST_ERROR } /* end if */ +/* Don't compare this currently, it's very hard to compute */ +#ifdef NOT_YET + if(earray_stats.super_blk_size != state->super_blk_size) { + HDfprintf(stdout, "earray_stats.super_blk_size = %Hu, state->super_blk_size = %Hu\n", earray_stats.super_blk_size, state->super_blk_size); + TEST_ERROR + } /* end if */ +#endif /* NOT_YET */ +#ifdef QAK +HDfprintf(stderr, "nelmts = %Hu, total EA size = %Hu\n", earray_stats.nelmts, + (earray_stats.hdr_size + earray_stats.index_blk_size + earray_stats.super_blk_size + earray_stats.data_blk_size)); +#endif /* QAK */ /* All tests passed */ return(0); @@ -422,6 +459,7 @@ create_array(H5F_t *f, hid_t dxpl, const H5EA_create_t *cparam, if(!H5F_addr_defined(*ea_addr)) TEST_ERROR HDmemset(&state, 0, sizeof(state)); + state.hdr_size = EA_HDR_SIZE; if(check_stats(*ea, &state)) TEST_ERROR @@ -1059,7 +1097,7 @@ typedef struct eiter_fw_t { *------------------------------------------------------------------------- */ static void * -eiter_fw_init(const H5EA_create_t UNUSED *cparam, const earray_test_param_t UNUSED *tparam, +eiter_fw_init(const H5EA_create_t UNUSED *cparam, const earray_test_param_t UNUSED *tparam, hsize_t UNUSED cnt) { eiter_fw_t *eiter; /* Forward element iteration object */ @@ -1131,7 +1169,7 @@ eiter_fw_max(const void *_eiter) return((hssize_t)(eiter->idx - 1)); } /* end eiter_fw_max() */ - + /*------------------------------------------------------------------------- * Function: eiter_fw_state * @@ -1158,10 +1196,14 @@ eiter_fw_state(void *_eiter, const H5EA_create_t *cparam, HDassert(state); /* Compute the state of the extensible array */ + state->hdr_size = EA_HDR_SIZE; + state->nindex_blks = 1; + state->index_blk_size = 298; state->max_idx_set = idx + 1; if(idx < cparam->idx_blk_elmts) { state->nelmts = (hsize_t)cparam->idx_blk_elmts; state->nsuper_blks = state->ndata_blks = (hsize_t)0; + state->super_blk_size = state->data_blk_size = (hsize_t)0; } /* end if */ else { unsigned sblk_idx; /* Which superblock does this index fall in? */ @@ -1261,7 +1303,7 @@ typedef struct eiter_rv_t { *------------------------------------------------------------------------- */ static void * -eiter_rv_init(const H5EA_create_t *cparam, const earray_test_param_t *tparam, +eiter_rv_init(const H5EA_create_t *cparam, const earray_test_param_t *tparam, hsize_t cnt) { eiter_rv_t *eiter; /* Reverse element iteration object */ @@ -1372,6 +1414,9 @@ eiter_rv_state(void *_eiter, const H5EA_create_t *cparam, HDassert(state); /* Compute the state of the extensible array */ + state->hdr_size = EA_HDR_SIZE; + state->nindex_blks = 1; + state->index_blk_size = 298; state->max_idx_set = eiter->max + 1; if(eiter->max < cparam->idx_blk_elmts) { state->nelmts = (hsize_t)cparam->idx_blk_elmts; @@ -1497,7 +1542,7 @@ typedef struct eiter_rnd_t { *------------------------------------------------------------------------- */ static void * -eiter_rnd_init(const H5EA_create_t UNUSED *cparam, const earray_test_param_t UNUSED *tparam, +eiter_rnd_init(const H5EA_create_t UNUSED *cparam, const earray_test_param_t UNUSED *tparam, hsize_t cnt) { eiter_rnd_t *eiter; /* Random element iteration object */ @@ -1650,7 +1695,7 @@ static const earray_iter_t ea_iter_rnd = { *------------------------------------------------------------------------- */ static void * -eiter_rnd2_init(const H5EA_create_t UNUSED *cparam, const earray_test_param_t UNUSED *tparam, +eiter_rnd2_init(const H5EA_create_t UNUSED *cparam, const earray_test_param_t UNUSED *tparam, hsize_t cnt) { eiter_rnd_t *eiter; /* Random element iteration object */ @@ -1734,7 +1779,7 @@ typedef struct eiter_cyc_t { *------------------------------------------------------------------------- */ static void * -eiter_cyc_init(const H5EA_create_t UNUSED *cparam, const earray_test_param_t UNUSED *tparam, +eiter_cyc_init(const H5EA_create_t UNUSED *cparam, const earray_test_param_t UNUSED *tparam, hsize_t cnt) { eiter_cyc_t *eiter; /* Cyclic element iteration object */ @@ -1915,6 +1960,7 @@ test_set_elmts(hid_t fapl, H5EA_create_t *cparam, earray_test_param_t *tparam, /* Verify array state */ HDmemset(&state, 0, sizeof(state)); + state.hdr_size = EA_HDR_SIZE; if(check_stats(ea, &state)) TEST_ERROR @@ -1974,7 +2020,7 @@ test_set_elmts(hid_t fapl, H5EA_create_t *cparam, earray_test_param_t *tparam, FAIL_STACK_ERROR /* Get the max. array index */ - if((smax = tparam->eiter->max(eiter_info)) < 0) + if((smax = tparam->eiter->max_elem(eiter_info)) < 0) TEST_ERROR max = (hsize_t)smax; @@ -2088,6 +2134,7 @@ test_skip_elmts(hid_t fapl, H5EA_create_t *cparam, earray_test_param_t *tparam, /* Verify array state */ HDmemset(&state, 0, sizeof(state)); + state.hdr_size = EA_HDR_SIZE; if(check_stats(ea, &state)) TEST_ERROR @@ -2117,6 +2164,9 @@ test_skip_elmts(hid_t fapl, H5EA_create_t *cparam, earray_test_param_t *tparam, /* Set array state */ HDmemset(&state, 0, sizeof(state)); + state.hdr_size = EA_HDR_SIZE; + state.nindex_blks = 1; + state.index_blk_size = EA_IBLOCK_SIZE; state.max_idx_set = idx + 1; if(1 == skip_elmts) { state.nelmts = (hsize_t)cparam->idx_blk_elmts; @@ -2328,14 +2378,14 @@ main(void) for(sblk = 0; sblk < 9; sblk++) { for(dblk = 0; dblk < tparam.sblk_info[sblk].ndblks; dblk ++) { /* Test first element in data block */ - nelmts = (hsize_t)(1 + cparam.idx_blk_elmts + + nelmts = (hsize_t)(1 + cparam.idx_blk_elmts + tparam.sblk_info[sblk].start_idx + (tparam.sblk_info[sblk].dblk_nelmts * dblk)); sprintf(test_str, "setting first element of array's data block #%llu", (unsigned long_long)ndblks); nerrors += test_set_elmts(fapl, &cparam, &tparam, nelmts, test_str); /* Test all elements in data block */ - nelmts = (hsize_t)(cparam.idx_blk_elmts + + nelmts = (hsize_t)(cparam.idx_blk_elmts + tparam.sblk_info[sblk].start_idx + (tparam.sblk_info[sblk].dblk_nelmts * (dblk + 1))); sprintf(test_str, "setting all elements of array's data block #%llu", (unsigned long_long)ndblks); diff --git a/test/fillval.c b/test/fillval.c index 00e06ea..5bf5c03 100644 --- a/test/fillval.c +++ b/test/fillval.c @@ -2188,7 +2188,7 @@ main(int argc, char *argv[]) puts("All fill value tests passed."); if(h5_cleanup(FILENAME, fapl)) - remove(FILE_NAME_RAW); + HDremove(FILE_NAME_RAW); return 0; diff --git a/test/objcopy.c b/test/objcopy.c index aca041f..61963b5 100755 --- a/test/objcopy.c +++ b/test/objcopy.c @@ -55,7 +55,8 @@ const char *FILENAME[] = { #define CONFIG_SHARE_SRC 1 #define CONFIG_SHARE_DST 2 #define CONFIG_NEW_FORMAT 4 -#define MAX_CONFIGURATION 7 +#define CONFIG_DENSE 8 +#define MAX_CONFIGURATION 15 #define FILE_EXT "objcopy_ext.dat" /* The fill_old.h5 is generated from gen_old_fill.c in HDF5 'test' directory @@ -69,6 +70,7 @@ const char *FILENAME[] = { #define NAME_DATATYPE_VL "vlen of int" #define NAME_DATATYPE_VL_VL "vlen of vlen of int" #define NAME_DATASET_SIMPLE "dataset_simple" +#define NAME_DATASET_SIMPLE2 "dataset_simple_copy" #define NAME_DATASET_COMPOUND "dataset_compound" #define NAME_DATASET_CHUNKED "dataset_chunked" #define NAME_DATASET_COMPACT "dataset_compact" @@ -104,7 +106,6 @@ const char *FILENAME[] = { #define NAME_OLD_FORMAT "/dset1" #define NAME_BUF_SIZE 1024 -#define NUM_ATTRIBUTES 4 #define ATTR_NAME_LEN 80 #define DIM_SIZE_1 12 #define DIM_SIZE_2 6 @@ -116,6 +117,8 @@ const char *FILENAME[] = { char src_obj_full_name[215]; /* the full path + name of the object to be copied */ +int num_attributes_g; /* Number of attributes created */ + /* Table containing object id and object name */ /* (Used for detecting duplicate objects when comparing groups */ static struct { @@ -535,7 +538,7 @@ test_copy_attach_attributes(hid_t loc_id, hid_t type_id) if((sid = H5Screate_simple(1, &dim1, NULL)) < 0 ) goto done; - for (i=0; i<NUM_ATTRIBUTES; i++) { + for (i=0; i<num_attributes_g; i++) { sprintf(attr_name, "%d attr", i); /* Set attribute data */ @@ -588,7 +591,7 @@ test_copy_attach_paired_attributes(hid_t loc_id, hid_t loc_id2, hid_t type_id) if((sid = H5Screate_simple(1, &dim1, NULL)) < 0 ) goto done; - for (i=0; i<NUM_ATTRIBUTES; i++) { + for (i=0; i<num_attributes_g; i++) { sprintf(attr_name, "%d attr", i); /* Set attribute data */ @@ -1779,6 +1782,112 @@ error: /*------------------------------------------------------------------------- + * Function: test_copy_dataset_simple_samefile + * + * Purpose: Create a simple dataset in SRC file and copy it to SRC file + * + * Return: Success: 0 + * Failure: number of errors + * + * Programmer: Neil Fortner + * Thursday, January 15, 2009 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +static int +test_copy_dataset_simple_samefile(hid_t fcpl, hid_t fapl, int config) +{ + hid_t fid = -1; /* File ID */ + hid_t sid = -1; /* Dataspace ID */ + hid_t did = -1, did2 = -1; /* Dataset IDs */ + int buf[DIM_SIZE_1][DIM_SIZE_2]; /* Buffer for writing data */ + hsize_t dim2d[2]; /* Dataset dimensions */ + int i, j; /* local index variables */ + char filename[NAME_BUF_SIZE]; + + TESTING("H5Ocopy(): simple dataset within the same file"); + + /* Initialize write buffer */ + for (i=0; i<DIM_SIZE_1; i++) + for (j=0; j<DIM_SIZE_2; j++) + buf[i][j] = 10000 + 100*i+j; + + /* Initialize the filenames */ + h5_fixname(FILENAME[0], fapl, filename, sizeof filename); + + /* Reset file address checking info */ + addr_reset(); + + /* create source file */ + if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl)) < 0) TEST_ERROR + + /* Set dataspace dimensions */ + dim2d[0] = DIM_SIZE_1; + dim2d[1] = DIM_SIZE_2; + + /* create 2D dataspace */ + if((sid = H5Screate_simple(2, dim2d, NULL)) < 0) TEST_ERROR + + /* create 2D int dataset at SRC file */ + if((did = H5Dcreate2(fid, NAME_DATASET_SIMPLE, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR + + /* write data into file */ + if(H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0) TEST_ERROR + + /* close dataspace */ + if(H5Sclose(sid) < 0) TEST_ERROR + + /* attach attributes to the dataset */ + if(test_copy_attach_attributes(did, H5T_NATIVE_INT) < 0) TEST_ERROR + + /* close the dataset */ + if(H5Dclose(did) < 0) TEST_ERROR + + /* close the SRC file */ + if(H5Fclose(fid) < 0) TEST_ERROR + + + /* open the source file with read-write */ + if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) TEST_ERROR + + /* copy the dataset from SRC to DST */ + if(H5Ocopy(fid, NAME_DATASET_SIMPLE, fid, NAME_DATASET_SIMPLE2, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR + + /* open the dataset for copy */ + if((did = H5Dopen2(fid, NAME_DATASET_SIMPLE, H5P_DEFAULT)) < 0) TEST_ERROR + + /* open the destination dataset */ + if((did2 = H5Dopen2(fid, NAME_DATASET_SIMPLE2, H5P_DEFAULT)) < 0) TEST_ERROR + + /* Check if the datasets are equal */ + if(compare_datasets(did, did2, H5P_DEFAULT, buf) != TRUE) TEST_ERROR + + /* close the destination dataset */ + if(H5Dclose(did2) < 0) TEST_ERROR + + /* close the source dataset */ + if(H5Dclose(did) < 0) TEST_ERROR + + /* close the SRC file */ + if(H5Fclose(fid) < 0) TEST_ERROR + + PASSED(); + return 0; + +error: + H5E_BEGIN_TRY { + H5Dclose(did2); + H5Dclose(did); + H5Sclose(sid); + H5Fclose(fid); + } H5E_END_TRY; + return 1; +} /* end test_copy_dataset_simple_samefile */ + + +/*------------------------------------------------------------------------- * Function: test_copy_dataset_simple_empty * * Purpose: Create a simple dataset in SRC file and copy it to DST file @@ -7150,7 +7259,8 @@ main(void) { int nerrors = 0; hid_t fapl, fapl2; - hid_t fcpl_shared; + hid_t fcpl_shared, ocpl; + unsigned max_compact, min_dense; int configuration; /* Configuration of tests. */ int ExpressMode; @@ -7173,6 +7283,11 @@ main(void) if(H5Pset_shared_mesg_nindexes(fcpl_shared, 1) < 0) TEST_ERROR if(H5Pset_shared_mesg_index(fcpl_shared, 0, H5O_SHMESG_ALL_FLAG, (size_t) 10) < 0) TEST_ERROR + /* Obtain the default attribute storage phase change values */ + if((ocpl = H5Pcreate(H5P_OBJECT_CREATE)) < 0) TEST_ERROR + if(H5Pget_attr_phase_change(ocpl, &max_compact, &min_dense) < 0) TEST_ERROR + if(H5Pclose(ocpl) < 0) TEST_ERROR + /* Test in all configurations */ for(configuration = 0; configuration <= MAX_CONFIGURATION; configuration++) { hid_t my_fapl; @@ -7207,40 +7322,29 @@ main(void) my_fapl = fapl; } /* end else */ + /* Test with and without dense attributes */ + if(configuration & CONFIG_DENSE) { + puts("Testing with dense attributes:"); + num_attributes_g = max_compact + 1; + } + else { + puts("Testing without dense attributes:"); + num_attributes_g = MAX(min_dense, 2) - 1; + } /* The tests... */ - nerrors += test_copy_named_datatype(fcpl_src, fcpl_dst, my_fapl); - nerrors += test_copy_named_datatype_vl(fcpl_src, fcpl_dst, my_fapl); - nerrors += test_copy_named_datatype_vl_vl(fcpl_src, fcpl_dst, my_fapl); nerrors += test_copy_dataset_simple(fcpl_src, fcpl_dst, my_fapl); + nerrors += test_copy_dataset_simple_samefile(fcpl_src, my_fapl, configuration); nerrors += test_copy_dataset_simple_empty(fcpl_src, fcpl_dst, my_fapl); nerrors += test_copy_dataset_compound(fcpl_src, fcpl_dst, my_fapl); nerrors += test_copy_dataset_chunked(fcpl_src, fcpl_dst, my_fapl); - nerrors += test_copy_dataset_chunked_empty(fcpl_src, fcpl_dst, my_fapl); nerrors += test_copy_dataset_chunked_sparse(fcpl_src, fcpl_dst, my_fapl); nerrors += test_copy_dataset_compressed(fcpl_src, fcpl_dst, my_fapl); nerrors += test_copy_dataset_compact(fcpl_src, fcpl_dst, my_fapl); - nerrors += test_copy_dataset_external(fcpl_src, fcpl_dst, my_fapl); - nerrors += test_copy_dataset_named_dtype(fcpl_src, fcpl_dst, my_fapl); - nerrors += test_copy_dataset_named_dtype_hier(fcpl_src, fcpl_dst, my_fapl); - nerrors += test_copy_dataset_named_dtype_hier_outside(fcpl_src, fcpl_dst, my_fapl); nerrors += test_copy_dataset_multi_ohdr_chunks(fcpl_src, fcpl_dst, my_fapl); nerrors += test_copy_dataset_attr_named_dtype(fcpl_src, fcpl_dst, my_fapl); - nerrors += test_copy_dataset_contig_vl(fcpl_src, fcpl_dst, my_fapl); - nerrors += test_copy_dataset_chunked_vl(fcpl_src, fcpl_dst, my_fapl); - nerrors += test_copy_dataset_compact_vl(fcpl_src, fcpl_dst, my_fapl); - nerrors += test_copy_dataset_compressed_vl(fcpl_src, fcpl_dst, my_fapl); - nerrors += test_copy_attribute_vl(fcpl_src, fcpl_dst, my_fapl); - nerrors += test_copy_dataset_compact_named_vl(fcpl_src, fcpl_dst, my_fapl); - nerrors += test_copy_dataset_contig_named_vl(fcpl_src, fcpl_dst, my_fapl); - nerrors += test_copy_dataset_chunked_named_vl(fcpl_src, fcpl_dst, my_fapl); - nerrors += test_copy_dataset_compressed_named_vl(fcpl_src, fcpl_dst, my_fapl); - nerrors += test_copy_dataset_compact_vl_vl(fcpl_src, fcpl_dst, my_fapl); - nerrors += test_copy_dataset_contig_vl_vl(fcpl_src, fcpl_dst, my_fapl); - nerrors += test_copy_dataset_chunked_vl_vl(fcpl_src, fcpl_dst, my_fapl); - nerrors += test_copy_dataset_compressed_vl_vl(fcpl_src, fcpl_dst, my_fapl); nerrors += test_copy_group_empty(fcpl_src, fcpl_dst, my_fapl); nerrors += test_copy_root_group(fcpl_src, fcpl_dst, my_fapl); nerrors += test_copy_group(fcpl_src, fcpl_dst, my_fapl); @@ -7254,8 +7358,7 @@ main(void) #endif /* H5_CANNOT_OPEN_TWICE */ nerrors += test_copy_exist(fcpl_src, fcpl_dst, my_fapl); nerrors += test_copy_path(fcpl_src, fcpl_dst, my_fapl); - nerrors += test_copy_same_file_named_datatype(fcpl_src, my_fapl); - nerrors += test_copy_old_layout(fcpl_dst, my_fapl); + nerrors += test_copy_option(fcpl_src, fcpl_dst, my_fapl, H5O_COPY_WITHOUT_ATTR_FLAG, FALSE, "H5Ocopy(): without attributes"); nerrors += test_copy_option(fcpl_src, fcpl_dst, my_fapl, 0, TRUE, @@ -7271,6 +7374,36 @@ main(void) nerrors += test_copy_option(fcpl_src, fcpl_dst, my_fapl, H5O_COPY_WITHOUT_ATTR_FLAG | H5O_COPY_PRESERVE_NULL_FLAG, TRUE, "H5Ocopy(): preserve NULL messages"); + /* Tests that do not use attributes and do not need to be tested + * multiple times for different attribute configurations */ + if(configuration < CONFIG_DENSE) { + nerrors += test_copy_named_datatype(fcpl_src, fcpl_dst, my_fapl); + nerrors += test_copy_named_datatype_vl(fcpl_src, fcpl_dst, my_fapl); + nerrors += test_copy_named_datatype_vl_vl(fcpl_src, fcpl_dst, my_fapl); + + nerrors += test_copy_dataset_external(fcpl_src, fcpl_dst, my_fapl); + nerrors += test_copy_dataset_named_dtype(fcpl_src, fcpl_dst, my_fapl); + nerrors += test_copy_dataset_named_dtype_hier(fcpl_src, fcpl_dst, my_fapl); + nerrors += test_copy_dataset_named_dtype_hier_outside(fcpl_src, fcpl_dst, my_fapl); + + nerrors += test_copy_dataset_contig_vl(fcpl_src, fcpl_dst, my_fapl); + nerrors += test_copy_dataset_chunked_vl(fcpl_src, fcpl_dst, my_fapl); + nerrors += test_copy_dataset_compact_vl(fcpl_src, fcpl_dst, my_fapl); + nerrors += test_copy_dataset_compressed_vl(fcpl_src, fcpl_dst, my_fapl); + nerrors += test_copy_attribute_vl(fcpl_src, fcpl_dst, my_fapl); + nerrors += test_copy_dataset_compact_named_vl(fcpl_src, fcpl_dst, my_fapl); + nerrors += test_copy_dataset_contig_named_vl(fcpl_src, fcpl_dst, my_fapl); + nerrors += test_copy_dataset_chunked_named_vl(fcpl_src, fcpl_dst, my_fapl); + nerrors += test_copy_dataset_compressed_named_vl(fcpl_src, fcpl_dst, my_fapl); + nerrors += test_copy_dataset_compact_vl_vl(fcpl_src, fcpl_dst, my_fapl); + nerrors += test_copy_dataset_contig_vl_vl(fcpl_src, fcpl_dst, my_fapl); + nerrors += test_copy_dataset_chunked_vl_vl(fcpl_src, fcpl_dst, my_fapl); + nerrors += test_copy_dataset_compressed_vl_vl(fcpl_src, fcpl_dst, my_fapl); + + nerrors += test_copy_same_file_named_datatype(fcpl_src, my_fapl); + nerrors += test_copy_old_layout(fcpl_dst, my_fapl); + } + /* TODO: not implemented nerrors += test_copy_option(my_fapl, H5O_COPY_EXPAND_EXT_LINK_FLAG, FALSE, "H5Ocopy: expand external link"); nerrors += test_copy_mount(my_fapl); diff --git a/test/set_extent.c b/test/set_extent.c index 47a6ce5..b16bbd0 100644 --- a/test/set_extent.c +++ b/test/set_extent.c @@ -36,6 +36,8 @@ #define FILE_NAME3 "set_extent3.h5" #define FILE_NAME4 "set_extent4.h5" #define FILE_NAME5 "set_extent5.h5" +#define EXT_FILE_NAME1 "ext1.bin" +#define EXT_FILE_NAME2 "ext2.bin" #define RANK1 1 #define RANK2 2 @@ -94,9 +96,17 @@ int main( void ) puts("All set_extent tests passed."); + + HDremove(FILE_NAME1); + HDremove(FILE_NAME2); + HDremove(FILE_NAME3); + HDremove(FILE_NAME4); + HDremove(FILE_NAME5); + HDremove(EXT_FILE_NAME1); + HDremove(EXT_FILE_NAME2); + return 0; - error: H5_FAILED(); return 1; @@ -2044,12 +2054,12 @@ static int test_external( void ) goto error; } - if(H5Pset_external(dcpl, "ext1.bin", (off_t)0, size) < 0) + if(H5Pset_external(dcpl, EXT_FILE_NAME1, (off_t)0, size) < 0) { goto error; } - if(H5Pset_external(dcpl, "ext2.bin", (off_t)0, size) < 0) + if(H5Pset_external(dcpl, EXT_FILE_NAME2, (off_t)0, size) < 0) { goto error; } @@ -2617,6 +2627,3 @@ error: } - - - diff --git a/tools/lib/h5diff.c b/tools/lib/h5diff.c index 38c5f54..432dd95 100644 --- a/tools/lib/h5diff.c +++ b/tools/lib/h5diff.c @@ -197,7 +197,7 @@ hsize_t h5diff(const char *fname1, if(options->m_quiet && (options->m_verbose || options->m_report)) { - printf("Error: -q (quiet mode) cannot be added to verbose or report modes\n"); + parallel_print("Error: -q (quiet mode) cannot be added to verbose or report modes\n"); options->err_stat=1; return 0; } /* end if */ @@ -213,7 +213,7 @@ hsize_t h5diff(const char *fname1, /* open the files */ if((file1_id = H5Fopen(fname1, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0) { - printf("h5diff: <%s>: unable to open file\n", fname1); + parallel_print("h5diff: <%s>: unable to open file\n", fname1); options->err_stat = 1; #ifdef H5_HAVE_PARALLEL @@ -225,7 +225,7 @@ hsize_t h5diff(const char *fname1, } /* end if */ if((file2_id = H5Fopen(fname2, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0) { - printf("h5diff: <%s>: unable to open file\n", fname2); + parallel_print("h5diff: <%s>: unable to open file\n", fname2); options->err_stat = 1; #ifdef H5_HAVE_PARALLEL @@ -250,7 +250,7 @@ hsize_t h5diff(const char *fname1, *------------------------------------------------------------------------- */ if(h5trav_getinfo(file1_id, info1) < 0 || h5trav_getinfo(file2_id, info2) < 0) { - printf("Error: Could not get file contents\n"); + parallel_print("Error: Could not get file contents\n"); options->err_stat = 1; #ifdef H5_HAVE_PARALLEL if(g_Parallel) @@ -431,17 +431,17 @@ hsize_t diff_match(hid_t file1_id, */ if(options->m_verbose) { - printf("\n"); - printf("file1 file2\n"); - printf("---------------------------------------\n"); + parallel_print("\n"); + parallel_print("file1 file2\n"); + parallel_print("---------------------------------------\n"); for(i = 0; i < table->nobjs; i++) { char c1, c2; c1 = (table->objs[i].flags[0]) ? 'x' : ' '; c2 = (table->objs[i].flags[1]) ? 'x' : ' '; - printf("%5c %6c %-15s\n", c1, c2, table->objs[i].name); + parallel_print("%5c %6c %-15s\n", c1, c2, table->objs[i].name); } /* end for */ - printf ("\n"); + parallel_print ("\n"); } /* end if */ @@ -1143,7 +1143,7 @@ hsize_t diff(hid_t file1_id, default: if(options->m_verbose) - printf("Comparison not supported: <%s> and <%s> are of type %s\n", + parallel_print("Comparison not supported: <%s> and <%s> are of type %s\n", path1, path2, get_type(type) ); options->not_cmp = 1; break; diff --git a/tools/lib/h5diff_array.c b/tools/lib/h5diff_array.c index 8d733b3..f9c6261 100644 --- a/tools/lib/h5diff_array.c +++ b/tools/lib/h5diff_array.c @@ -5397,7 +5397,6 @@ my_isnan(dtype_t type, void *val) double x; HDmemcpy(&x, val, sizeof(double)); retval = (x!=x); - //printf("x=%g retval =%d\n", x,retval); #if H5_SIZEOF_LONG_DOUBLE!=H5_SIZEOF_DOUBLE && H5_SIZEOF_LONG_DOUBLE!=0 } diff --git a/tools/lib/h5diff_attr.c b/tools/lib/h5diff_attr.c index 747b12c..c527310 100644 --- a/tools/lib/h5diff_attr.c +++ b/tools/lib/h5diff_attr.c @@ -185,7 +185,7 @@ hsize_t diff_attr(hid_t loc1_id, buf1=(void *) HDmalloc((unsigned)(nelmts1*msize1)); buf2=(void *) HDmalloc((unsigned)(nelmts1*msize2)); if ( buf1==NULL || buf2==NULL){ - printf( "cannot read into memory\n" ); + parallel_print( "cannot read into memory\n" ); goto error; } if (H5Aread(attr1_id,mtype1_id,buf1)<0) diff --git a/tools/lib/h5diff_dset.c b/tools/lib/h5diff_dset.c index 1a5778a..9710419 100644 --- a/tools/lib/h5diff_dset.c +++ b/tools/lib/h5diff_dset.c @@ -55,12 +55,12 @@ hsize_t diff_dataset( hid_t file1_id, /* Open the datasets */ if((did1 = H5Dopen2(file1_id, obj1_name, H5P_DEFAULT)) < 0) { - printf("Cannot open dataset <%s>\n", obj1_name); + parallel_print("Cannot open dataset <%s>\n", obj1_name); goto error; } if((did2 = H5Dopen2(file2_id, obj2_name, H5P_DEFAULT)) < 0) { - printf("Cannot open dataset <%s>\n", obj2_name); + parallel_print("Cannot open dataset <%s>\n", obj2_name); goto error; } /* enable error reporting */ @@ -880,33 +880,33 @@ void print_sizes( const char *obj1, m_size1 = H5Tget_size( m_tid1 ); m_size2 = H5Tget_size( m_tid2 ); - printf("\n"); - printf("------------------\n"); - printf("sizeof(char) %u\n", sizeof(char) ); - printf("sizeof(short) %u\n", sizeof(short) ); - printf("sizeof(int) %u\n", sizeof(int) ); - printf("sizeof(long) %u\n", sizeof(long) ); - printf("<%s> ------------------\n", obj1); - printf("type on file "); + parallel_print("\n"); + parallel_print("------------------\n"); + parallel_print("sizeof(char) %u\n", sizeof(char) ); + parallel_print("sizeof(short) %u\n", sizeof(short) ); + parallel_print("sizeof(int) %u\n", sizeof(int) ); + parallel_print("sizeof(long) %u\n", sizeof(long) ); + parallel_print("<%s> ------------------\n", obj1); + parallel_print("type on file "); print_type(f_tid1); - printf("\n"); - printf("size on file %u\n", f_size1 ); + parallel_print("\n"); + parallel_print("size on file %u\n", f_size1 ); - printf("type on memory "); + parallel_print("type on memory "); print_type(m_tid1); - printf("\n"); - printf("size on memory %u\n", m_size1 ); + parallel_print("\n"); + parallel_print("size on memory %u\n", m_size1 ); - printf("<%s> ------------------\n", obj2); - printf("type on file "); + parallel_print("<%s> ------------------\n", obj2); + parallel_print("type on file "); print_type(f_tid2); - printf("\n"); - printf("size on file %u\n", f_size2 ); + parallel_print("\n"); + parallel_print("size on file %u\n", f_size2 ); - printf("type on memory "); + parallel_print("type on memory "); print_type(m_tid2); - printf("\n"); - printf("size on memory %u\n", m_size2 ); - printf("\n"); + parallel_print("\n"); + parallel_print("size on memory %u\n", m_size2 ); + parallel_print("\n"); } #endif /* H5DIFF_DEBUG */ diff --git a/vms/build.com b/vms/build.com index f65a45b..c1de293 100644 --- a/vms/build.com +++ b/vms/build.com @@ -17,7 +17,7 @@ $! $! This file builds C, Frtran, C++ HDF5 librraies and runs the tests $! Specify location of the top HDF5 source directory $ -$ hdf5top == "sys$sysusers:[pourmale.hdf5]" +$ hdf5top == "sys$sysusers:[pourmal.hdf5]" $ len = F$LENGTH(hdf5top) $ tmp = F$EXTRACT(0, len-1, hdf5top) $ hdf5vms = tmp + ".VMS]" diff --git a/vms/make.com b/vms/make.com index 224e095..a5d0f10 100644 --- a/vms/make.com +++ b/vms/make.com @@ -36,15 +36,15 @@ $ copy [.tools.testfiles]*.ddl [-.tools.testfiles] $! $! Define location of ZLIB library. If you do not have it on your system, download $! source code from http://www.zlib.net/, build and install on your system -$ define zlib_dir sys$sysusers:[pourmale.zlib-1_2_3] -$! define zlib_dir sys$sysusers:[pourmale.zlib-1_2_3-ieee] +$ define zlib_dir sys$sysusers:[pourmal.zlib-1_2_3] +$! define zlib_dir sys$sysusers:[pourmal.zlib-1_2_3-ieee] $! $! Set up compilation flags here $! Do not remove define=H5_VMS and standard=strict_ansi qualifiers. $! -$ ccopt == "/float=ieee_float/define=H5_VMS/debug/nooptimize/include=zlib_dir" -$ fcopt == "/float=ieee_float/define=H5_VMS/debug/nooptimize/include=zlib_dir" -$ cxxopt == "/float=ieee_float/define=H5_VMS/debug/nooptimize/"+- +$ ccopt == "/float=ieee_float/define=(_LARGEFILE,H5_VMS)/debug/nooptimize/include=zlib_dir" +$ fcopt == "/float=ieee_float/define=(_LARGEFILE,H5_VMS)/debug/nooptimize/include=zlib_dir" +$ cxxopt == "/float=ieee_float/define=(_LARGEFILE,H5_VMS)/debug/nooptimize/"+- "standard=strict_ansi/include=zlib_dir" $! $! diff --git a/vms/src/h5pubconf.h b/vms/src/h5pubconf.h index fd9393e..3991ad3 100644 --- a/vms/src/h5pubconf.h +++ b/vms/src/h5pubconf.h @@ -12,16 +12,25 @@ * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * * access to either file, you may request a copy from help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -/* src/H5config.h. Generated by configure. */ +/* src/H5config.h. Generated from H5config.h.in by configure. */ /* src/H5config.h.in. Generated from configure.in by autoheader. */ +/* Define if your system generates wrong code for log2 routine. */ +/* #undef H5_BAD_LOG2_CODE_GENERATED */ + +/* Define if the memory buffers being written to disk should be cleared before + writing. */ +#define H5_CLEAR_MEMORY 1 + /* Define if your system can handle converting denormalized floating-point values. */ #define H5_CONVERT_DENORMAL_FLOAT 1 -/* Define if your system can convert long double to unsigned int values - correctly. */ -#define H5_CV_LDOUBLE_TO_UINT_WORKS 1 +/* Define if C++ compiler recognizes offsetof */ +#define H5_CXX_HAVE_OFFSETOF 1 + +/* Define the default virtual file driver to compile */ +#define H5_DEFAULT_VFD H5FD_SEC2 /* Define if `dev_t' is a scalar */ #define H5_DEV_T_IS_SCALAR 1 @@ -40,9 +49,13 @@ /* As FC_FUNC, but for C identifiers containing underscores. */ /* #undef H5_FC_FUNC_ */ -/* Define if your system roundup accurately convert floating-point to unsigned - long long values. */ -#define H5_FP_TO_ULLONG_BOTTOM_BIT_WORKS 1 +/* Define if your system can handle overflow converting floating-point to + integer values. */ +#define H5_FP_TO_INTEGER_OVERFLOW_WORKS 1 + +/* Define if your system roundup accurately converting floating-point to + unsigned long long values. */ +#define H5_FP_TO_ULLONG_ACCURATE 1 /* Define if your system has right maximum convert floating-point to unsigned long long values. */ @@ -51,15 +64,35 @@ /* Define if gettimeofday() populates the tz pointer passed in */ #define H5_GETTIMEOFDAY_GIVES_TZ 1 +/* Define to 1 if you have the `alarm' function. */ +#define H5_HAVE_ALARM 1 + /* Define if the __attribute__(()) extension is present */ -/*#define H5_HAVE_ATTRIBUTE a 1 */ +/* #define H5_HAVE_ATTRIBUTE 1 */ /* Define to 1 if you have the `BSDgettimeofday' function. */ /* #undef H5_HAVE_BSDGETTIMEOFDAY */ +/* Define if the compiler understands C99 designated initialization of structs + and unions */ +#define H5_HAVE_C99_DESIGNATED_INITIALIZER 1 + +/* Define if the compiler understands the __func__ keyword */ +#define H5_HAVE_C99_FUNC 1 + +/* Define if the function stack tracing code is to be compiled in */ +/* #undef H5_HAVE_CODESTACK */ + +/* Define to 1 if you have the declaration of `tzname', and to 0 if you don't. + */ +/* #undef H5_HAVE_DECL_TZNAME */ + /* Define to 1 if you have the `difftime' function. */ #define H5_HAVE_DIFFTIME 1 +/* Define if the direct I/O virtual file driver should be compiled */ +/* #undef H5_HAVE_DIRECT */ + /* Define to 1 if you have the <dlfcn.h> header file. */ #define H5_HAVE_DLFCN_H 1 @@ -67,7 +100,7 @@ /* #undef H5_HAVE_DMALLOC_H */ /* Define to 1 if you have the <features.h> header file. */ -/*EIP #define H5_HAVE_FEATURES_H */ +/* #define H5_HAVE_FEATURES_H 1 */ /* Define if support for deflate (zlib) filter is enabled */ #define H5_HAVE_FILTER_DEFLATE 1 @@ -88,7 +121,7 @@ /* #undef H5_HAVE_FILTER_SZIP */ /* Define to 1 if you have the `fork' function. */ -/*#undefine H5_HAVE_FORK */ +/* #define H5_HAVE_FORK 1 */ /* Define to 1 if you have the `frexpf' function. */ #define H5_HAVE_FREXPF 1 @@ -99,18 +132,20 @@ /* Define to 1 if you have the `fseek64' function. */ /* #undef H5_HAVE_FSEEK64 */ -/* Define if the compiler understands C99 designated initialization of structs - and unions */ -#define H5_HAVE_C99_DESIGNATED_INITIALIZER 1 +/* Define to 1 if you have the `fseeko' function. */ +#define H5_HAVE_FSEEKO 1 -/* Define if the compiler understands the __func__ keyword */ -#define H5_HAVE_C99_FUNC 1 +/* Define to 1 if you have the `fstat64' function. */ +/* #define H5_HAVE_FSTAT64 1 */ -/* Define if the function stack tracing code is to be compiled in */ -/*#define H5_HAVE_CODESTACK 1*/ +/* Define to 1 if you have the `ftello' function. */ +#define H5_HAVE_FTELLO 1 -/* Define if the compiler understand the __FUNCTION__ keyword */ -/* EIP #define H5_HAVE_FUNCTION 1*/ +/* Define to 1 if you have the `ftruncate64' function. */ +/* #define H5_HAVE_FTRUNCATE64 1 */ + +/* Define if the compiler understands the __FUNCTION__ keyword */ +/* #define H5_HAVE_FUNCTION 1 */ /* Define to 1 if you have the `GetConsoleScreenBufferInfo' function. */ /* #undef H5_HAVE_GETCONSOLESCREENBUFFERINFO */ @@ -119,10 +154,10 @@ #define H5_HAVE_GETHOSTNAME 1 /* Define to 1 if you have the `getpwuid' function. */ -/*#define H5_HAVE_GETPWUID 1*/ +/* #define H5_HAVE_GETPWUID 1 */ /* Define to 1 if you have the `getrusage' function. */ -/*EIP #define H5_HAVE_GETRUSAGE 1*/ +/* #define H5_HAVE_GETRUSAGE 1 */ /* Define to 1 if you have the `gettextinfo' function. */ /* #undef H5_HAVE_GETTEXTINFO */ @@ -167,32 +202,32 @@ /* Define to 1 if you have the `mpi' library (-lmpi). */ /* #undef H5_HAVE_LIBMPI */ +/* Define to 1 if you have the `mpich' library (-lmpich). */ +/* #undef H5_HAVE_LIBMPICH */ + /* Define to 1 if you have the `mpio' library (-lmpio). */ /* #undef H5_HAVE_LIBMPIO */ /* Define to 1 if you have the `nsl' library (-lnsl). */ /* #undef H5_HAVE_LIBNSL */ -/* Define to 1 if you have the `pdb' library (-lpdb). */ -/* #undef H5_HAVE_LIBPDB */ - /* Define to 1 if you have the `pthread' library (-lpthread). */ /* #undef H5_HAVE_LIBPTHREAD */ -/* Define to 1 if you have the `silo' library (-lsilo). */ -/* #undef H5_HAVE_LIBSILO */ +/* Define to 1 if you have the `socket' library (-lsocket). */ +/* #undef H5_HAVE_LIBSOCKET */ /* Define to 1 if you have the `sz' library (-lsz). */ /* #undef H5_HAVE_LIBSZ */ /* Define to 1 if you have the `z' library (-lz). */ -/* #undefine H5_HAVE_LIBZ*/ +/* #define H5_HAVE_LIBZ 1 */ /* Define to 1 if you have the `longjmp' function. */ #define H5_HAVE_LONGJMP 1 /* Define to 1 if you have the `lseek64' function. */ -/*#define H5_HAVE_LSEEK64 1*/ +/* #define H5_HAVE_LSEEK64 1 */ /* Define to 1 if you have the <memory.h> header file. */ #define H5_HAVE_MEMORY_H 1 @@ -203,27 +238,27 @@ /* Define to 1 if you have the <mpe.h> header file. */ /* #undef H5_HAVE_MPE_H */ +/* Define if MPI_File_get_size works correctly */ +/* #undef H5_HAVE_MPI_GET_SIZE */ + /* Define if `MPI_Comm_c2f' and `MPI_Comm_f2c' exists */ /* #undef H5_HAVE_MPI_MULTI_LANG_Comm */ /* Define if `MPI_Info_c2f' and `MPI_Info_f2c' exists */ /* #undef H5_HAVE_MPI_MULTI_LANG_Info */ -/* Define to 1 if you have the <netinet/tcp.h> header file. */ -#define H5_HAVE_NETINET_TCP_H 1 - /* Define if we have parallel support */ /* #undef H5_HAVE_PARALLEL */ -/* Define to 1 if you have the <pdb.h> header file. */ -/* #undef H5_HAVE_PDB_H */ - /* Define to 1 if you have the <pthread.h> header file. */ /* #undef H5_HAVE_PTHREAD_H */ /* Define to 1 if you have the `random' function. */ #define H5_HAVE_RANDOM 1 +/* Define to 1 if you have the `rand_r' function. */ +/* #define H5_HAVE_RAND_R 1 */ + /* Define to 1 if you have the <setjmp.h> header file. */ #define H5_HAVE_SETJMP_H 1 @@ -233,26 +268,29 @@ /* Define to 1 if you have the `sigaction' function. */ #define H5_HAVE_SIGACTION 1 +/* Define to 1 if you have the `siglongjmp' function. */ +#define H5_HAVE_SIGLONGJMP 1 + /* Define to 1 if you have the `signal' function. */ #define H5_HAVE_SIGNAL 1 /* Define to 1 if you have the `snprintf' function. */ #define H5_HAVE_SNPRINTF 1 -/* Define if `socklen_t' is defined */ -#define H5_HAVE_SOCKLEN_T 1 - /* Define to 1 if you have the `srandom' function. */ #define H5_HAVE_SRANDOM 1 +/* Define to 1 if you have the `stat64' function. */ +/* #define H5_HAVE_STAT64 1 */ + /* Define if `struct stat' has the `st_blocks' field */ -/* #undef H5_HAVE_STAT_ST_BLOCKS */ +/* #define H5_HAVE_STAT_ST_BLOCKS 1 */ /* Define to 1 if you have the <stddef.h> header file. */ #define H5_HAVE_STDDEF_H 1 /* Define to 1 if you have the <stdint.h> header file. */ -/*EIP #define H5_HAVE_STDINT_H 1 */ +/* #define H5_HAVE_STDINT_H 1 */ /* Define to 1 if you have the <stdlib.h> header file. */ #define H5_HAVE_STDLIB_H 1 @@ -260,9 +298,6 @@ /* Define to 1 if you have the `strdup' function. */ #define H5_HAVE_STRDUP 1 -/* Define if the stream virtual file driver should be compiled */ -/*#define H5_HAVE_STREAM 1*/ - /* Define to 1 if you have the <strings.h> header file. */ #define H5_HAVE_STRINGS_H 1 @@ -284,9 +319,6 @@ /* Define to 1 if you have the `system' function. */ #define H5_HAVE_SYSTEM 1 -/* Define to 1 if you have the <sys/filio.h> header file. */ -/* #undef H5_HAVE_SYS_FILIO_H */ - /* Define to 1 if you have the <sys/fpu.h> header file. */ /* #undef H5_HAVE_SYS_FPU_H */ @@ -324,14 +356,17 @@ /* #undef H5_HAVE_THREADSAFE */ /* Define if `timezone' is a global variable */ -/* #undef H5_HAVE_TIMEZONE */ #define H5_HAVE_TIMEZONE 1 + /* Define if the ioctl TIOCGETD is defined */ #define H5_HAVE_TIOCGETD 1 /* Define if the ioctl TIOGWINSZ is defined */ #define H5_HAVE_TIOCGWINSZ 1 +/* Define to 1 if you have the `tmpfile' function. */ +#define H5_HAVE_TMPFILE 1 + /* Define if `tm_gmtoff' is a member of `struct tm' */ #define H5_HAVE_TM_GMTOFF 1 @@ -347,17 +382,20 @@ #define H5_HAVE_UNISTD_H 1 /* Define to 1 if you have the `vasprintf' function. */ -/*#undefine H5_HAVE_VASPRINTF*/ +/* #define H5_HAVE_VASPRINTF 1 */ /* Define to 1 if you have the `vsnprintf' function. */ #define H5_HAVE_VSNPRINTF 1 /* Define to 1 if you have the `waitpid' function. */ -/*#undefine H5_HAVE_WAITPID */ +#define H5_HAVE_WAITPID 1 /* Define if your system has OpenVMS path name. This macro is added by hand. */ #define H5_HAVE_VMS_PATH 1 +/* Define if your system has window style path name. */ +/* #undef H5_HAVE_WINDOW_PATH */ + /* Define to 1 if you have the <winsock.h> header file. */ /* #undef H5_HAVE_WINSOCK_H */ @@ -373,9 +411,45 @@ /* Define if `__tm_gmtoff' is a member of `struct tm' */ /* #undef H5_HAVE___TM_GMTOFF */ +/* Define if your system can't handle converting floating-point values to long + long. */ +/* #define H5_HW_FP_TO_LLONG_NOT_WORKS 1 */ + +/* Define if HDF5's high-level library headers should be included in hdf5.h */ +#define H5_INCLUDE_HL 1 + +/* Define if your system can accurately convert from integers to long double + values. */ +#define H5_INTEGER_TO_LDOUBLE_ACCURATE 1 + +/* Define if your system can convert long double to integers accurately. */ +#define H5_LDOUBLE_TO_INTEGER_ACCURATE 1 + +/* Define if your system can convert from long double to integer values. */ +#define H5_LDOUBLE_TO_INTEGER_WORKS 1 + +/* Define if your system can convert long double to (unsigned) long long + values correctly. */ +#define H5_LDOUBLE_TO_LLONG_ACCURATE 1 + +/* Define if your system can convert long double to unsigned int values + correctly. */ +#define H5_LDOUBLE_TO_UINT_ACCURATE 1 + /* Define if your system can compile long long to floating-point casts. */ #define H5_LLONG_TO_FP_CAST_WORKS 1 +/* Define if your system can convert (unsigned) long long to long double + values correctly. */ +#define H5_LLONG_TO_LDOUBLE_CORRECT 1 + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#define H5_LT_OBJDIR ".libs/" + +/* Define if the metadata trace file code is to be compiled in */ +/* #undef H5_METADATA_TRACE_FILE */ + /* Define if your system can handle complicated MPI derived datatype correctly. */ /* #undef H5_MPI_COMPLEX_DERIVED_DATATYPE_WORKS */ @@ -384,11 +458,17 @@ 2GB. */ /* #undef H5_MPI_FILE_SET_SIZE_BIG */ +/* Define if your system can handle special collective IO properly. */ +/* #undef H5_MPI_SPECIAL_COLLECTIVE_IO_WORKS */ + /* Define if we can violate pointer alignment restrictions */ -/* #undef H5_NO_ALIGNMENT_RESTRICTIONS */ +#define H5_NO_ALIGNMENT_RESTRICTIONS 1 + +/* Define if deprecated public API symbols are disabled */ +/* #undef H5_NO_DEPRECATED_SYMBOLS */ /* Define if shared writing must be disabled (CodeWarrior only) */ -#define H5_NO_SHARED_WRITING +#define H5_NO_SHARED_WRITING 1 /* Name of package */ #define H5_PACKAGE "hdf5" @@ -411,135 +491,122 @@ /* Width for printf() for type `long long' or `__int64', use `ll' */ #define H5_PRINTF_LL_WIDTH "ll" -/* The size of a `char', as computed by sizeof. */ +/* The size of `char', as computed by sizeof. */ #define H5_SIZEOF_CHAR 1 -/* The size of a `double', as computed by sizeof. */ +/* The size of `double', as computed by sizeof. */ #define H5_SIZEOF_DOUBLE 8 -/* The size of a `float', as computed by sizeof. */ +/* The size of `float', as computed by sizeof. */ #define H5_SIZEOF_FLOAT 4 -/* The size of a `int', as computed by sizeof. */ +/* The size of `int', as computed by sizeof. */ #define H5_SIZEOF_INT 4 -/* The size of a `int16_t', as computed by sizeof. */ +/* The size of `int16_t', as computed by sizeof. */ #define H5_SIZEOF_INT16_T 2 -/* The size of a `int32_t', as computed by sizeof. */ +/* The size of `int32_t', as computed by sizeof. */ #define H5_SIZEOF_INT32_T 4 -/* The size of a `int64_t', as computed by sizeof. */ +/* The size of `int64_t', as computed by sizeof. */ #define H5_SIZEOF_INT64_T 8 -/* The size of a `int8_t', as computed by sizeof. */ +/* The size of `int8_t', as computed by sizeof. */ #define H5_SIZEOF_INT8_T 1 -/* The size of a `int_fast16_t', as computed by sizeof. */ -/*#define H5_SIZEOF_INT_FAST16_T 4 */ +/* The size of `int_fast16_t', as computed by sizeof. */ +/* #define H5_SIZEOF_INT_FAST16_T 4 */ -/* The size of a `int_fast32_t', as computed by sizeof. */ -/*#define H5_SIZEOF_INT_FAST32_T 4*/ +/* The size of `int_fast32_t', as computed by sizeof. */ +/* #define H5_SIZEOF_INT_FAST32_T 4 */ -/* The size of a `int_fast64_t', as computed by sizeof. */ -/*#define H5_SIZEOF_INT_FAST64_T 8*/ +/* The size of `int_fast64_t', as computed by sizeof. */ +/* #define H5_SIZEOF_INT_FAST64_T 8 */ -/* The size of a `int_fast8_t', as computed by sizeof. */ -/*#define H5_SIZEOF_INT_FAST8_T 1*/ +/* The size of `int_fast8_t', as computed by sizeof. */ +/* #define H5_SIZEOF_INT_FAST8_T 1 */ -/* The size of a `int_least16_t', as computed by sizeof. */ -/*#define H5_SIZEOF_INT_LEAST16_T 2*/ +/* The size of `int_least16_t', as computed by sizeof. */ +/* #define H5_SIZEOF_INT_LEAST16_T 2 */ -/* The size of a `int_least32_t', as computed by sizeof. */ -/*#define H5_SIZEOF_INT_LEAST32_T 4*/ +/* The size of `int_least32_t', as computed by sizeof. */ +/* #define H5_SIZEOF_INT_LEAST32_T 4 */ -/* The size of a `int_least64_t', as computed by sizeof. */ -/*#define H5_SIZEOF_INT_LEAST64_T 8*/ +/* The size of `int_least64_t', as computed by sizeof. */ +/* #define H5_SIZEOF_INT_LEAST64_T 8 */ -/* The size of a `int_least8_t', as computed by sizeof. */ -/*#define H5_SIZEOF_INT_LEAST8_T 1*/ +/* The size of `int_least8_t', as computed by sizeof. */ +/* #define H5_SIZEOF_INT_LEAST8_T 1 */ -/* The size of a `long', as computed by sizeof. */ +/* The size of `long', as computed by sizeof. */ #define H5_SIZEOF_LONG 4 -/* The size of a `long double', as computed by sizeof. */ +/* The size of `long double', as computed by sizeof. */ #define H5_SIZEOF_LONG_DOUBLE 16 -/* The size of a `long long', as computed by sizeof. */ +/* The size of `long long', as computed by sizeof. */ #define H5_SIZEOF_LONG_LONG 8 -/* The size of a `off_t', as computed by sizeof. */ -#define H5_SIZEOF_OFF_T 4 +/* The size of `off64_t', as computed by sizeof. */ +/* #define H5_SIZEOF_OFF64_T 8 */ + +/* The size of `off_t', as computed by sizeof. */ +#define H5_SIZEOF_OFF_T 8 -/* The size of a `short', as computed by sizeof. */ +/* The size of `short', as computed by sizeof. */ #define H5_SIZEOF_SHORT 2 -/* The size of a `size_t', as computed by sizeof. */ +/* The size of `size_t', as computed by sizeof. */ #define H5_SIZEOF_SIZE_T 4 -/* The size of a `ssize_t', as computed by sizeof. */ +/* The size of `ssize_t', as computed by sizeof. */ #define H5_SIZEOF_SSIZE_T 4 -/* The size of a `uint16_t', as computed by sizeof. */ +/* The size of `uint16_t', as computed by sizeof. */ #define H5_SIZEOF_UINT16_T 2 -/* The size of a `uint32_t', as computed by sizeof. */ -#define H5_SIZEOF_UINT32_T 4 +/* The size of `uint32_t', as computed by sizeof. */ +#define H5_SIZEOF_UINT32_T 4 -/* The size of a `uint64_t', as computed by sizeof. */ +/* The size of `uint64_t', as computed by sizeof. */ #define H5_SIZEOF_UINT64_T 8 -/* The size of a `uint8_t', as computed by sizeof. */ +/* The size of `uint8_t', as computed by sizeof. */ #define H5_SIZEOF_UINT8_T 1 -/* The size of a `uint_fast16_t', as computed by sizeof. */ -/*#define H5_SIZEOF_UINT_FAST16_T 4*/ +/* The size of `uint_fast16_t', as computed by sizeof. */ +/* #define H5_SIZEOF_UINT_FAST16_T 4 */ -/* The size of a `uint_fast32_t', as computed by sizeof. */ -/*#define H5_SIZEOF_UINT_FAST32_T 4*/ +/* The size of `uint_fast32_t', as computed by sizeof. */ +/* #define H5_SIZEOF_UINT_FAST32_T 4 */ -/* The size of a `uint_fast64_t', as computed by sizeof. */ -/*#define H5_SIZEOF_UINT_FAST64_T 8 */ +/* The size of `uint_fast64_t', as computed by sizeof. */ +/* #define H5_SIZEOF_UINT_FAST64_T 8 */ -/* The size of a `uint_fast8_t', as computed by sizeof. */ -/*#define H5_SIZEOF_UINT_FAST8_T 1*/ +/* The size of `uint_fast8_t', as computed by sizeof. */ +/* #define H5_SIZEOF_UINT_FAST8_T 1 */ -/* The size of a `uint_least16_t', as computed by sizeof. */ -/*#define H5_SIZEOF_UINT_LEAST16_T 2 */ +/* The size of `uint_least16_t', as computed by sizeof. */ +/* #define H5_SIZEOF_UINT_LEAST16_T 2 */ -/* The size of a `uint_least32_t', as computed by sizeof. */ -/*#define H5_SIZEOF_UINT_LEAST32_T 4*/ +/* The size of `uint_least32_t', as computed by sizeof. */ +/* #define H5_SIZEOF_UINT_LEAST32_T 4 */ -/* The size of a `uint_least64_t', as computed by sizeof. */ -/*#define H5_SIZEOF_UINT_LEAST64_T 8 */ +/* The size of `uint_least64_t', as computed by sizeof. */ +/* #define H5_SIZEOF_UINT_LEAST64_T 8 */ -/* The size of a `uint_least8_t', as computed by sizeof. */ -/*#define H5_SIZEOF_UINT_LEAST8_T 1*/ +/* The size of `uint_least8_t', as computed by sizeof. */ +/* #define H5_SIZEOF_UINT_LEAST8_T 1 */ -/* The size of a `__int64', as computed by sizeof. */ +/* The size of `__int64', as computed by sizeof. */ #define H5_SIZEOF___INT64 0 /* Define to 1 if you have the ANSI C header files. */ #define H5_STDC_HEADERS 1 -/* Define if your system can accurately convert from integers to long double - values. */ -#define H5_INTEGER_TO_LDOUBLE_ACCURATE 1 - -/* Define if your system can convert long double to integers accurately. */ -#define H5_LDOUBLE_TO_INTEGER_ACCURATE 1 - -/* Define if your system can accurately convert from long double to integer - values. */ -#define H5_LDOUBLE_TO_INTEGER_WORKS 1 - -/* Define if your system can convert long double to unsigned int values - correctly. */ -#define H5_LDOUBLE_TO_UINT_ACCURATE 1 - -/* Define if your system can accurately convert unsigned (long) long values to - floating-point values. */ -#define H5_ULONG_TO_FP_BOTTOM_BIT_WORKS 1 +/* Define if strict file format checks are enabled */ +/* #define H5_STRICT_FORMAT_CHECKS 1 */ /* Define if your system supports pthread_attr_setscope(&attribute, PTHREAD_SCOPE_SYSTEM) call. */ @@ -559,6 +626,18 @@ correct precision. */ #define H5_ULLONG_TO_LDOUBLE_PRECISION 1 +/* Define if your system can accurately convert unsigned (long) long values to + floating-point values. */ +#define H5_ULONG_TO_FP_BOTTOM_BIT_ACCURATE 1 + +/* Define using v1.6 public API symbols by default */ +/* #define H5_USE_16_API_DEFAULT 1 */ + +/* Define if a memory checking tool will be used on the library, to cause + library to be very picky about memory operations and also disable the + internal free list manager code. */ +/* #undef H5_USING_MEMCHECKER */ + /* Version number of package */ #define H5_VERSION "1.9.29" @@ -566,6 +645,12 @@ don't fit into size allowed */ #define H5_VSNPRINTF_WORKS 1 +/* Data accuracy is prefered to speed during data conversions */ +#define H5_WANT_DATA_ACCURACY 1 + +/* Check exception handling functions during data conversions */ +#define H5_WANT_DCONV_EXCEPTION 1 + /* Define to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel and VAX). */ /* #undef H5_WORDS_BIGENDIAN */ @@ -579,7 +664,7 @@ /* #undef H5_inline */ #endif -/* Define to `long' if <sys/types.h> does not define. */ +/* Define to `long int' if <sys/types.h> does not define. */ /* #undef H5_off_t */ /* Define to `unsigned long' if <sys/types.h> does not define. */ @@ -589,6 +674,3 @@ /* #undef H5_ssize_t */ #define H5_HAVE_FILE_VERSIONS 1 #define H5_CANNOT_OPEN_TWICE 1 -#define H5_WANT_DATA_ACCURACY 1 -#define H5_WANT_DCONV_EXCEPTION 1 -#define H5_DEFAULT_VFD H5FD_SEC2 diff --git a/vms/src/make.com b/vms/src/make.com index abcaf1e..3dcecf1 100644 --- a/vms/src/make.com +++ b/vms/src/make.com @@ -2,11 +2,6 @@ $!# $!# 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 files COPYING and Copyright.html. COPYING can be found at the root -$!# of the source code distribution tree; Copyright.html can be found at the $!# root level of an installed copy of the electronic HDF5 document set and $!# is linked from the top-level documents page. It can also be found at $!# http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have @@ -16,7 +11,12 @@ $! Makefile for VMS systems. $! $! Make HDF5 library $! -$! ccopt = "/float=ieee_float/define=H5_VMS" +$! The next two lines should be uncommented only when building by hand in the +$! current directory. Use build.com in the vms directory to build +$! the distribution. Make sure that location of the zlib library is correct. +$! +$! define zlib_dir sys$sysusers:[pourmal.zlib-1_2_3] +$! ccopt = "/float=ieee_float/define=(_LARGEFILE,H5_VMS)/include=zlib_dir" $ ccc := cc 'ccopt $ ccc h5detect.c $ link h5detect @@ -29,39 +29,34 @@ $ type sys$input Creating HDF5 library $! $ cobj= "H5, H5checksum, H5dbg, H5system, H5timer, H5trace,"+- - "H5A, H5Abtree2, H5Adense, H5Adeprec, H5Aint, H5Atest, H5AC, H5B, H5B2, H5B2cache,"+- - "H5Bcache, H5B2dbg, H5B2test, H5B2int, H5B2stat, H5C, H5CS,"+- - "H5D, H5Dcontig, H5Dcompact, H5Ddbg, H5Ddeprec,"+- - "H5Defl, H5Dio, H5Dint, H5Distore, H5Dfill, H5Doh, H5Dmpio, H5Dselect, H5Dtest ,"+- - "H5E, H5Edeprec, H5Eint, H5F, H5Fdbg, H5Fmount, H5Fsfile, H5Fsuper, H5Ftest, H5FD, H5FDcore,"+- - "H5FDfamily, H5FDlog, H5FDmpi, H5FDmpio,"+- - "H5FDmpiposix, H5FDmulti, H5FDsec2, H5FDspace, H5FDstdio,"+- - "H5FDdirect, H5FL, H5FO, H5Ffake,"+- - "H5FS, H5FScache, H5FSdbg, H5FSsection,"+- - "H5G, H5Gcompact, H5Gdeprec, H5Gent, H5Gint, H5Glink, H5Gloc, H5Gname, H5Gnode, H5Gstab,"+- - "H5Gdense, H5Gbtree2,"+- - "H5Gobj, H5Goh, H5Gtest, H5Gtraverse,"+- - "H5HF, H5HFbtree2, H5HFcache, H5HFdbg, H5HFman, H5HFtest, H5HFstat,"+- - "H5HFdblock, H5HFdtable, H5HFhuge, H5HFhdr, H5HFiblock,"+- - "H5HFiter, H5HFsection, H5HFspace, H5HFtiny,"+- - "H5HG, H5HGdbg, H5HL, H5HLdbg, H5HP, H5I, H5MF, H5MM,"+- - "H5MP, H5MPtest,H5L, H5Lexternal, H5O, H5Oalloc, H5Oainfo, H5Oattr, H5Oattribute,"+- - "H5Obogus, H5Obtreek, H5Odrvinfo, H5Ocache,"+- - "H5Ocont, H5Ocopy, H5Odbg, H5Odtype, H5Oefl, H5Ofill, H5Oginfo, H5Olayout,"+- - "H5Olinfo, H5Olink, H5Omessage, H5Oshmesg, H5Omtime" -$ cobj1= "H5Oname, H5Onull, H5Opline, H5Orefcount, H5Osdspace, H5Oshared, H5Ostab, H5Otest, H5Ounknown,"+- - "H5P, H5Pint, H5Pacpl, H5Pdeprec, H5Pdcpl, H5Pdxpl, H5Pfapl, H5Pfcpl, H5Pfmpl, H5Pgcpl, H5Plapl,"+- - "H5Pocpl, H5Pocpypl, H5Ptest, H5Pstrcpl, H5Plcpl,"+- - "H5R, H5Rdeprec, H5RC,"+- - "H5RS, H5S, H5Sall, H5Sdbg, H5Shyper, H5Smpio, H5Snone, H5Spoint,"+- - "H5Sselect, H5Stest,"+- - "H5SL, H5SM, H5SMbtree2, H5SMcache, H5SMtest," +- - "H5ST, H5T, H5Tarray, H5Tbit, H5Tcommit,"+- - "H5Tcompound, H5Tconv, H5Tcset, H5Tdeprec, H5Tenum, H5Tfields, H5Tfixed,"+- - "H5Tfloat, H5Tinit, H5Tnative, H5Tdbg, H5Toffset, H5Toh, H5Topaque, H5Torder,"+- - "H5Tpad, H5Tprecis, H5Tstrpad, H5Tvisit, H5Tvlen, H5TS, H5V, H5WB, H5Z,"+- - "H5Zdeflate, H5Zfletcher32, H5Znbit, H5Zshuffle, H5Zszip,"+- - "H5Zscaleoffset, H5Ztrans" + "H5Abtree2, H5A, H5AC, H5Adense, H5Adeprec, H5Aint, H5Atest, H5B2, H5B2cache,"+- + "H5B2dbg, H5B2int, H5B2stat, H5B2test, H5B, H5Bcache, H5Bdbg, H5C, H5CS,"+- + "H5Dbtree, H5D, H5Dchunk, H5Dcompact, H5Dcontig, H5Ddbg, H5Ddeprec,"+- + "H5Defl, H5Dfill, H5Dint, H5Dio, H5Dmpio, H5Doh, H5Dscatgath, H5Dselect, H5Dtest,"+- + "H5EA, H5EAcache, H5EAdbg, H5EAdblkpage, H5EAdblock, H5EAhdr, H5EAiblock, H5EAint,"+- + "H5EAsblock, H5EAstat, H5EAtest, H5E, H5Edeprec, H5Eint,"+- + "H5Faccum, H5F, H5Fdbg, H5FD, H5FDcore, H5FDdirect, H5FDfamily, H5FDint, H5FDlog, H5FDmpi,"+- + "H5FDmpio, H5FDmpiposix, H5FDmulti, H5FDsec2, H5FDspace, H5FDstdio, H5FDwindows,"+- + "H5Ffake, H5Fio, H5FL, H5Fmount, H5Fmpi, H5FO, H5Fquery, H5FS, H5FScache, H5FSdbg, H5Fsfile,"+- + "H5FSsection, H5FSstat, H5FStest, H5Fsuper, H5Ftest,"+- + "H5Gbtree2, H5G, H5Gcache, H5Gcompact, H5Gdense, H5Gdeprec, H5Gent, H5Gint, H5Glink, H5Gloc,"+- + "H5Gname, H5Gnode, H5Gobj, H5Goh, H5Gstab, H5Gtest, H5Gtraverse,"+- + "H5HFbtree2, H5HF, H5HFcache, H5HFdbg, H5HFdblock, H5HFdtable, H5HFhdr, H5HFhuge, H5HFiblock,"+- + "H5HFiter, H5HFman, H5HFsection, H5HFspace, H5HFstat, H5HFtest, H5HFtiny,"+- + "H5HG, H5HGcache, H5HGdbg, H5HL, H5HLcache, H5HLdbg, H5HP, H5I, H5L, H5Lexternal" +$ cobj1= "H5MFaggr, H5MF, H5MFdbg, H5MFsection, H5MM,"+- + "H5MP, H5MPtest, H5Oainfo, H5Oalloc, H5Oattr, H5Oattribute, H5Obogus, H5Obtreek,"+- + "H5O, H5Ocache, H5Ocont, H5Ocopy, H5Odbg, H5Odrvinfo, H5Odtype, H5Oefl, H5Ofill, H5Oginfo,"+- + "H5Olayout, H5Olinfo, H5Olink, H5Omessage, H5Omtime, H5Oname, H5Onull, H5Opline, H5Orefcount,"+- + "H5Osdspace, H5Oshared, H5Oshmesg, H5Ostab, H5Otest, H5Ounknown,"+- + "H5Pacpl, H5P, H5Pdapl, H5Pdcpl, H5Pdeprec, H5Pdxpl, H5Pfapl, H5Pfcpl, H5Pfmpl, H5Pgcpl, H5Pint,"+- + "H5Plapl, H5Plcpl, H5Pocpl, H5Pocpypl, H5Pstrcpl, H5Ptest,"+- + "H5R, H5RC, H5Rdeprec, H5RS, H5Sall, H5S, H5Sdbg, H5Shyper, H5SL, H5SMbtree2, H5SM, H5SMcache,"+- + "H5Smpio, H5SMtest, H5Snone, H5Spoint, H5Sselect, H5ST, H5Stest,"+- + "H5Tarray, H5Tbit, H5T, H5Tcommit, H5Tcompound, H5Tconv, H5Tcset, H5Tdbg, H5Tdeprec, H5Tenum,"+- + "H5Tfields, H5Tfixed, H5Tfloat, H5Tinit, H5Tnative, H5Toffset, H5Toh, H5Topaque, H5Torder,"+- + "H5Tpad, H5Tprecis, H5TS, H5Tstrpad, H5Tvisit, H5Tvlen, H5V, H5WB, H5Z,"+- + "H5Zdeflate, H5Zfletcher32, H5Znbit, H5Zscaleoffset, H5Zshuffle, H5Zszip, H5Ztrans" $! $ ccc 'cobj $ ccc 'cobj1 diff --git a/vms/test/check.com b/vms/test/check.com index 888cb41..de1ef3c 100644 --- a/vms/test/check.com +++ b/vms/test/check.com @@ -24,195 +24,221 @@ $ type sys$input ------- Running testhdf5 ------- $ run testhdf5 $ type sys$input - -$ type sys$input -------- Running lheap ------- -$ run lheap -$ type sys$input - -$! type sys$input -$!------- Running fheap ------- -$! run fheap -$! type sys$input $ type sys$input -------- Running ohdr ------- -$ run ohdr +------- Running app_ref ------- +$ run app_ref $ type sys$input - + $ type sys$input -------- Running stab ------- -$ run stab +------- Running big ------- +$ run big $ type sys$input - + $ type sys$input -------- Running gheap ------- -$ run gheap +------- Running bittests ------- +$ run bittests $ type sys$input - + $ type sys$input ------- Running btree2 ------- $ run btree2 $ type sys$input - + +$ type sys$input +------- Running cache_api ------- +$ run cache_api +$ type sys$input + $ type sys$input -------- Running cache ------- +------- Running cache ------- $ run cache $ type sys$input - + $ type sys$input -------- Running cache_api ------- -$ run cache_api +------- Running cache_common ------- +$ run cache_common $ type sys$input - + $ type sys$input -------- Running pool ------- -$ run pool +------- Running chunk_info ------- +$ run chunk_info $ type sys$input - + $ type sys$input -------- Running hyperslab ------- -$ run hyperslab +------- Running cmpd_dset ------- +$ run cmpd_dset $ type sys$input - + $ type sys$input -------- Running istore ------- -$ run istore +------- Running cross_read ------- +$ run cross_read $ type sys$input - + $ type sys$input -------- Running bittest ------- -$ run bittests +------- Running dangle ------- +$ run dangle $ type sys$input - + +$ type sys$input +------- Running dsets ------- +$ run dsets +$ type sys$input + $ type sys$input ------- Running dt_arith ------- $ run dt_arith $ type sys$input - + +$ type sys$input +------- Running dtransform ------- +$ run dtransform +$ type sys$input + $ type sys$input ------- Running dtypes ------- $ run dtypes $ type sys$input - + $ type sys$input -------- Running dsets ------- -$ run dsets +------- Running earray ------- +$ run earray $ type sys$input - + $ type sys$input -------- Running cmpd_dset ------- -$ run cmpd_dset +------- Running enum ------- +$ run enum $ type sys$input - + $ type sys$input ------- Running extend ------- $ run extend $ type sys$input - + $ type sys$input ------- Running external ------- $ run external $ type sys$input - + $ type sys$input -------- Running objcopy ------- -$ run objcopy +------- Running fheap ------- +$ run fheap $ type sys$input - + $ type sys$input -------- Running links ------- -$ run links +------- Running fillval ------- +$ run fillval $ type sys$input - + $ type sys$input -------- Running unlink ------- -$ run unlink +------- Running flush1 ------- +$ run flush1 $ type sys$input - + $ type sys$input -------- Running big ------- -$ run big +------- Running flush2 ------- +$ run flush2 $ type sys$input - -$! type sys$input -!------- Running mtime ------- -$! run mtime -$! type sys$input - + $ type sys$input -------- Running fillval ------- -$ run fillval +------- Running freespace ------- +$ run freespace $ type sys$input - + $ type sys$input -------- Running fillval ------- -$ run fillval +------- Running getname ------- +$ run getname $ type sys$input - + $ type sys$input -------- Running mount ------- -$ run mount +------- Running gheap ------- +$ run gheap $ type sys$input - + $ type sys$input -------- Running flush1 ------- -$ run flush1 +------- Running hyperslab ------- +$ run hyperslab $ type sys$input - + $ type sys$input -------- Running flush2 ------- -$ run flush2 +------- Running istore ------- +$ run istore $ type sys$input - + $ type sys$input -------- Running enum ------- -$ run enum +------- Running lheap ------- +$ run lheap $ type sys$input - + $ type sys$input -------- Running set_extent ------- -$ run set_extent +------- Running links ------- +$ run links $ type sys$input - + $ type sys$input -------- Running ttsafe ------- -$ run ttsafe +------- Running mf ------- +$ run mf $ type sys$input - + $ type sys$input -------- Running getname ------- -$ run getname +------- Running mount ------- +$ run mount $ type sys$input - + $ type sys$input -------- Running vfd ------- -$ run vfd +------- Running mtime ------- +$ run mtime $ type sys$input - + $ type sys$input ------- Running ntypes ------- $ run ntypes $ type sys$input - + $ type sys$input -------- Running dangle ------- -$ run dangle +------- Running objcopy ------- +$ run objcopy $ type sys$input - + $ type sys$input -------- Running dtransform ------- -$ run dtransform +------- Running ohdr ------- +$ run ohdr $ type sys$input - + +$ type sys$input +------- Running pool ------- +$ run pool +$ type sys$input + $ type sys$input ------- Running reserved ------- $ run reserved $ type sys$input - + $ type sys$input -------- Running cross_read ------- -$ run cross_read +------- Running set_extent ------- +$ run set_extent +$ type sys$input + +$ type sys$input +------- Running space_overflow ------- +$ run space_overflow +$ type sys$input + +$ type sys$input +------- Running stab ------- +$ run stab +$ type sys$input + +$ type sys$input +------- Running unlink ------- +$ run unlink +$ type sys$input + $ type sys$input +------- Running vfd ------- +$ run vfd +$ type sys$input + ------- Testing completed ------- $ exit diff --git a/vms/test/make.com b/vms/test/make.com index 4a55f1e..998b6f8 100644 --- a/vms/test/make.com +++ b/vms/test/make.com @@ -16,62 +16,47 @@ $! Makefile for VMS systems. $! $! Make HDF5 library tests $! -$! ccopt = "/float=ieee_float/define=H5_VMS" -$ +$! The next two lines should be uncommented only when building by hand in the +$! current directory. Use build.com in the vms directory to build +$! the distribution. Make sure that location of the zlib library is correct. +$! define zlib_dir sys$sysusers:[pourmal.zlib-1_2_3] +$! ccopt = "/float=ieee_float/define=(_LARGEFILE,H5_VMS)/include=zlib_dir" +$! $ ccc := cc 'ccopt /include=([-.src]) $ type sys$input Creating testhdf5 -$ -$ cobj= "h5test.c, testframe.c, testhdf5.c, tarray.c, tattr.c, tconfig.c, "+- - "tchecksum.c,"+- - "tfile.c, tgenprop.c, th5o.c, th5s.c, tcoords.c, theap.c, tid.c, titerate.c,"+- - "tmeta.c, tmisc.c, ttime.c, trefer.c, trefstr.c,"+- - "tselect.c, tsohm.c, tskiplist.c, ttst.c, tunicode.c, tvltypes.c,"+- - "tvlstr.c, cache_common.c" +$! +$ cobj= "h5test.c, testframe.c, testhdf5.c, tarray.c, tattr.c, tchecksum.c, tconfig.c,"+- + "tcoords.c, tfile.c, tgenprop.c, th5o.c, th5s.c, theap.c, tid.c,"+- + "titerate.c, tmeta.c, tmisc.c, trefer.c, trefstr.c, tselect.c, tskiplist.c,"+- + "tsohm.c, ttime.c, ttst.c, tunicode.c, tvlstr.c, tvltypes.c, cache_common.c" $! $ ccc 'cobj $ library/create/replace []libh5test h5test, testframe, cache_common $ type sys$input Creating libh5test $ link testhdf5,tarray,tattr,tchecksum,tconfig, - - tfile,tgenprop,th5o,th5s,tcoords,theap,tid,titerate, - - tmeta,tmisc,ttime,trefer,trefstr, - - tselect,tsohm,tskiplist,ttst,tunicode,tvltypes, - - tvlstr, - + tcoords,tfile,tgenprop,th5o,th5s,theap,tid,titerate, - + tmeta,tmisc,trefer,trefstr, - + tselect,tskiplist,tsohm,ttime,ttst,tunicode,tvlstr,tvltypes, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $ -$! $ type sys$input - Creating lheap test -$ -$ ccc lheap -$ link lheap, - + Creating app_ref test +$ ccc app_ref +$ link app_ref, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input - Creating fheap test -$ -$ ccc fheap -$ link fheap, - - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib -$! -$ type sys$input - Creating ohdr test -$ ccc ohdr - -$ link ohdr, - - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib -$! -$ type sys$input - Creating stab test -$ ccc stab -$ link stab, - + Creating big test +$ ccc big +$ link big, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input - Creating gheap test -$ ccc gheap -$ link gheap, - + Creating bittests test +$ ccc bittests +$ link bittests, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input @@ -79,7 +64,12 @@ $ type sys$input $ ccc btree2 $ link btree2, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib - +$! +$ type sys$input + Creating cache_api test +$ ccc cache_api +$ link cache_api, - + libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input Creating cache test @@ -88,33 +78,39 @@ $ link cache, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input - Creating cache_api test -$ ccc cache_api -$ link cache_api, - + Creating cache_common test +$ ccc cache_common +$ link cache_common, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input - Creating pool test -$ ccc pool -$ link pool, - + Creating chunk_info test +$ ccc chunk_info +$ link chunk_info, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input - Creating hyperslab test -$ ccc hyperslab -$ link hyperslab, - + Creating cmpd_dset test +$ ccc cmpd_dset +$ link cmpd_dset, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input - Creating istore test -$ ccc istore -$ link istore, - + Creating cross_read test +$ ccc cross_read +$ link cross_read, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input - Creating bittests test -$ ccc bittests -$ link bittests, - + Creating dangle test +$ ccc dangle +$ link dangle, - + libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib +$! +$ type sys$input + Creating dsets tests +$ ccc dsets +$ link dsets, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input @@ -124,21 +120,39 @@ $ link dt_arith, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input + Creating dtransform test +$ ccc dtransform +$ link dtransform, - + libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib +$! +$ type sys$input Creating dtypes test $ ccc dtypes $ link dtypes, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input - Creating dsets tests -$ ccc dsets -$ link dsets, - + Creating earray test +$ ccc earray +$ link earray, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input - Creating cmpd_dset test -$ ccc cmpd_dset -$ link cmpd_dset, - + Creating enum test +$ ccc enum +$ link enum, - + libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib +$! +$ type sys$input + Creating err_compat test +$ ccc err_compat +$ link err_compat, - + libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib +$! +$ type sys$input + Creating error_test test +$ ccc error_test +$ link error_test, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input @@ -154,87 +168,87 @@ $ link external, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input - Creating objcopy test -$ ccc objcopy -$ link objcopy, - + Creating fheap test +$ ccc fheap +$ link fheap, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input - Creating links test -$ ccc links -$ link links, - + Creating fillval test +$ ccc fillval +$ link fillval, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input - Creating unlink test -$ ccc unlink -$ link unlink, - + Creating flush1 test +$ ccc flush1 +$ link flush1, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input - Creating big test -$ ccc big -$ link big, - + Creating flush2 test +$ ccc flush2 +$ link flush2, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input - Creating mtime test -$ ccc mtime -$ link mtime, - + Creating freespace test +$ ccc freespace +$ link freespace, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input - Creating fillval test -$ ccc fillval -$ link fillval, - + Creating getname test +$ ccc getname +$ link getname, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input - Creating mount test -$ ccc mount -$ link mount, - + Creating gheap test +$ ccc gheap +$ link gheap, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input - Creating flush1 test -$ ccc flush1 -$ link flush1, - + Creating hyperslab test +$ ccc hyperslab +$ link hyperslab, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input - Creating flush2 test -$ ccc flush2 -$ link flush2, - + Creating istore test +$ ccc istore +$ link istore, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input - Creating enum test -$ ccc enum -$ link enum, - + Creating lheap test +$ ccc lheap +$ link lheap, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input - Creating set_extent test -$ ccc set_extent -$ link set_extent, - + Creating links test +$ ccc links +$ link links, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input - Creating ttsafe test -$ ccc ttsafe -$ link ttsafe, - + Creating mf test +$ ccc mf +$ link mf, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input - Creating getname test -$ ccc getname -$ link getname, - + Creating mount test +$ ccc mount +$ link mount, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input - Creating vfd test -$ ccc vfd -$ link vfd, - + Creating mtime test +$ ccc mtime +$ link mtime, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input @@ -244,15 +258,21 @@ $ link ntypes, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input - Creating dangle test -$ ccc dangle -$ link dangle, - + Creating objcopy test +$ ccc objcopy +$ link objcopy, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input - Creating dtransform test -$ ccc dtransform -$ link dtransform, - + Creating ohdr test +$ ccc ohdr +$ link ohdr, - + libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib +$! +$ type sys$input + Creating pool test +$ ccc pool +$ link pool, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input @@ -262,9 +282,33 @@ $ link reserved, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input - Creating cross_read test -$ ccc cross_read -$ link cross_read, - + Creating set_extent test +$ ccc set_extent +$ link set_extent, - + libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib +$! +$ type sys$input + Creating space_overflow test +$ ccc space_overflow +$ link space_overflow, - + libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib +$! +$ type sys$input + Creating stab test +$ ccc stab +$ link stab, - + libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib +$! +$ type sys$input + Creating unlink test +$ ccc unlink +$ link unlink, - + libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib +$! +$ type sys$input + Creating vfd test +$ ccc vfd +$ link vfd, - libh5test.olb/lib,[-.src]hdf5.olb/lib,zlib_dir:libz.olb/lib $! $ type sys$input |