diff options
author | Neil Fortner <nfortne2@hdfgroup.org> | 2011-10-13 23:10:50 (GMT) |
---|---|---|
committer | Neil Fortner <nfortne2@hdfgroup.org> | 2011-10-13 23:10:50 (GMT) |
commit | 56960ac85c40c3b08989ff776d2a69c6e79a6f09 (patch) | |
tree | bc1aeb7b0a4e8f9ee1d731524d904022b4f1e2d7 /src/H5Aint.c | |
parent | 1406da6362e460a6dc5a3882ec0f62dca159b9a5 (diff) | |
download | hdf5-56960ac85c40c3b08989ff776d2a69c6e79a6f09.zip hdf5-56960ac85c40c3b08989ff776d2a69c6e79a6f09.tar.gz hdf5-56960ac85c40c3b08989ff776d2a69c6e79a6f09.tar.bz2 |
[svn-r21556] Purpose: Fix bug in H5Ocopy
Description:
H5Ocopy could get confused when copying a named datatype containing an
attribute which used that named datatype as its datatype. This happened
because H5Ocopy would recurse into the attribute's datatype before the object
the attribute was in was fully copied (i.e. before the "post-copy" pass).
Modified H5Ocopy to avoid recursing before the post-copy step in this case.
Required many changes, including to how non-committed shared messages are
copied.
Tested: jam, koala, heiwa (h5committest); durandal
Diffstat (limited to 'src/H5Aint.c')
-rw-r--r-- | src/H5Aint.c | 186 |
1 files changed, 54 insertions, 132 deletions
diff --git a/src/H5Aint.c b/src/H5Aint.c index db9508e..b66c9b3 100644 --- a/src/H5Aint.c +++ b/src/H5Aint.c @@ -859,37 +859,14 @@ H5A_attr_copy_file(const H5A_t *attr_src, H5F_t *file_dst, hbool_t *recompute_si 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, - NULL, NULL) < 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(!H5T_committed(attr_src->shared->dt)) { /* 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 */ + } /* end if */ /* Copy the dataspace for the attribute. Make sure the maximal dimension is also copied. * Otherwise the comparison in the test may complain about it. SLU 2011/4/12 */ @@ -902,13 +879,13 @@ H5A_attr_copy_file(const H5A_t *attr_src, H5F_t *file_dst, hbool_t *recompute_si 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) + /* Use try_share_virtual and move try_share to post copy? -NAF */ + if(H5SM_try_share(file_dst, dxpl_id, NULL, FALSE, 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) + if(H5SM_try_share(file_dst, dxpl_id, NULL, FALSE, 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 @@ -1077,20 +1054,47 @@ done: *------------------------------------------------------------------------- */ herr_t -H5A_attr_post_copy_file(const H5O_loc_t *src_oloc, const H5A_t UNUSED *attr_src, +H5A_attr_post_copy_file(const H5O_loc_t *src_oloc, const H5A_t *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; + H5F_t *file_src, *file_dst; herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT(H5A_attr_post_copy_file) /* check args */ + HDassert(src_oloc); + HDassert(dst_oloc); HDassert(attr_dst); + HDassert(attr_src); + + file_src = src_oloc->file; + file_dst = dst_oloc->file; + + HDassert(file_src); HDassert(file_dst); + if(H5T_committed(attr_src->shared->dt)) { + H5O_loc_t *src_oloc_dt; /* Pointer to source datatype's object location */ + H5O_loc_t *dst_oloc_dt; /* Pointer to dest. datatype's object location */ + + /* Get group entries for source & destination */ + src_oloc_dt = H5T_oloc(attr_src->shared->dt); + HDassert(src_oloc_dt); + dst_oloc_dt = H5T_oloc(attr_dst->shared->dt); + HDassert(dst_oloc_dt); + + /* Reset object location for new object */ + H5O_loc_reset(dst_oloc_dt); + dst_oloc_dt->file = file_dst; + + /* Copy the shared object from source to destination */ + if(H5O_copy_header_map(src_oloc_dt, dst_oloc_dt, dxpl_id, cpy_info, FALSE, NULL, NULL) < 0) + HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to copy object") + + /* Update shared message info from named datatype info */ + H5T_update_shared(attr_dst->shared->dt); + } /* end if */ /* Only need to fix reference attribute with real data being copied to * another file. @@ -1124,7 +1128,7 @@ done: /*------------------------------------------------------------------------- - * Function: H5A_dense_copy_file_cb + * Function: H5A_dense_post_copy_file_cb * * Purpose: Callback routine for copying a dense attribute from SRC to DST. * @@ -1138,13 +1142,13 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5A_dense_copy_file_cb(const H5A_t *attr_src, void *_udata) +H5A_dense_post_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) + FUNC_ENTER_NOAPI_NOINIT(H5A_dense_post_copy_file_cb) /* check arguments */ HDassert(attr_src); @@ -1157,6 +1161,10 @@ H5A_dense_copy_file_cb(const H5A_t *attr_src, void *_udata) udata->recompute_size, udata->cpy_info, udata->dxpl_id))) HGOTO_ERROR(H5E_ATTR, H5E_CANTCOPY, H5_ITER_ERROR, "can't copy attribute") + if(H5A_attr_post_copy_file(udata->oloc_src, attr_src, 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") + /* 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") @@ -1176,105 +1184,20 @@ done: HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close destination attribute") 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. + * Purpose: Copy all dense attributes from SRC to DST. * * Return: Success: Non-negative * Failure: Negative * * Programmer: Peter Cao * xcao@hdfgroup.org - * July 25, 2007 + * July 20, 2007 * *------------------------------------------------------------------------- */ @@ -1283,21 +1206,19 @@ H5A_dense_post_copy_file_all(const H5O_loc_t *src_oloc, const H5O_ainfo_t *ainfo 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 */ + H5A_attr_iter_op_t attr_op; /* Attribute operator */ + hbool_t recompute_size = FALSE; /* recompute the size */ + 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.ainfo = ainfo_dst; /* Destination dense information */ + udata.file = dst_oloc->file; /* 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 */ udata.oloc_src = src_oloc; @@ -1306,11 +1227,12 @@ H5A_dense_post_copy_file_all(const H5O_loc_t *src_oloc, const H5O_ainfo_t *ainfo 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, + + if(H5A_dense_iterate(src_oloc->file, 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_post_copy_file_all */ |