diff options
Diffstat (limited to 'src/H5Ocopy.c')
-rw-r--r-- | src/H5Ocopy.c | 59 |
1 files changed, 30 insertions, 29 deletions
diff --git a/src/H5Ocopy.c b/src/H5Ocopy.c index 71d4c0a..ebb1303 100644 --- a/src/H5Ocopy.c +++ b/src/H5Ocopy.c @@ -253,10 +253,8 @@ H5Ocopy(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to copy object") done: - if(loc_found) { - if(H5G_loc_free(&src_loc) < 0) - HDONE_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "can't free location") - } + if(loc_found && H5G_loc_free(&src_loc) < 0) + HDONE_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "can't free location") if(obj_open) H5O_close(&src_oloc); @@ -301,12 +299,11 @@ H5O_copy_header_real(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out */, const H5O_msg_class_t *copy_type; /* Type of message to use for copying */ const H5O_obj_class_t *obj_class = NULL; /* Type of object we are copying */ void *udata = NULL; /* User data for passing to message callbacks */ - size_t dst_oh_size; /* Total size of the destination OH */ + uint64_t dst_oh_size; /* Total size of the destination OH */ size_t dst_oh_null; /* Size of the null message to add to destination OH */ unsigned dst_oh_gap; /* Size of the gap in chunk #0 of destination OH */ uint8_t *current_pos; /* Current position in destination image */ size_t msghdr_size; - hbool_t shared; /* Whether copy_file callback created a shared message */ herr_t ret_value = SUCCEED; FUNC_ENTER_NOAPI_NOINIT(H5O_copy_header_real) @@ -399,7 +396,7 @@ H5O_copy_header_real(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out */, if(copy_type->pre_copy_file) { /* Decode the message if necessary. */ - H5O_LOAD_NATIVE(oloc_src->file, dxpl_id, mesg_src, FAIL) + H5O_LOAD_NATIVE(oloc_src->file, dxpl_id, oh_src, mesg_src, FAIL) /* Perform "pre copy" operation on message */ if((copy_type->pre_copy_file)(oloc_src->file, mesg_src->native, &(deleted[mesgno]), cpy_info, udata) < 0) @@ -466,39 +463,43 @@ H5O_copy_header_real(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out */, /* copy this message into destination file */ if(copy_type->copy_file) { - hbool_t recompute_size = FALSE; /* Whether to recompute the destination message's size */ + htri_t is_shared; /* Whether message is shared */ + hbool_t recompute_size; /* Whether copy_file callback created a shared message */ /* Decode the message if necessary. */ - H5O_LOAD_NATIVE(oloc_src->file, dxpl_id, mesg_src, FAIL) + H5O_LOAD_NATIVE(oloc_src->file, dxpl_id, oh_src, mesg_src, FAIL) /* Copy the source message */ + recompute_size = FALSE; if((mesg_dst->native = H5O_msg_copy_file(copy_type, - oloc_src->file, mesg_src->native, oloc_dst->file, dxpl_id, - &shared, cpy_info, udata)) == NULL) + oloc_src->file, mesg_src->native, oloc_dst->file, + &recompute_size, cpy_info, udata, dxpl_id)) == NULL) HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to copy object header message") + /* Check if new message is shared */ + if((is_shared = H5O_msg_is_shared(copy_type->id, mesg_dst->native)) < 0) + HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to query message's shared status") + /* In being copied, the message may have become shared or stopped - * being shared. If its sharing status has changed, recalculate - * its size and set/unset its sharing flag. + * being shared, set/unset its sharing flag. */ - if(shared == TRUE && !(mesg_dst->flags & H5O_MSG_FLAG_SHARED)) { - /* Set shared flag */ + if(is_shared && !(mesg_dst->flags & H5O_MSG_FLAG_SHARED)) { mesg_dst->flags |= H5O_MSG_FLAG_SHARED; - /* Recompute shared message size (mesg_dst->native is really - * shared) - */ - recompute_size = TRUE; + /* Recompute message size (mesg_dst->native is really shared) */ + recompute_size = TRUE; } /* end if */ - else if(shared == FALSE && (mesg_dst->flags & H5O_MSG_FLAG_SHARED)) { - /* Unset shared flag */ + else if(!is_shared && (mesg_dst->flags & H5O_MSG_FLAG_SHARED)) { mesg_dst->flags &= ~H5O_MSG_FLAG_SHARED; - /* Recompute native message size (msg_dest->native is no longer - * shared) - */ + /* Recompute message size (msg_dest->native is no longer shared) */ recompute_size = TRUE; - } /* end else */ + } /* end if */ + + /* Recompute message's size */ + /* (its sharing status or one of its components (for attributes) + * could have changed) + */ if(recompute_size) mesg_dst->raw_size = H5O_ALIGN_OH(oh_dst, H5O_msg_raw_size(oloc_dst->file, mesg_dst->type->id, FALSE, mesg_dst->native)); @@ -569,12 +570,12 @@ H5O_copy_header_real(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out */, addr_new = oh_dst->chunk[0].addr; /* Create memory image for the new chunk */ - if(NULL == (oh_dst->chunk[0].image = H5FL_BLK_MALLOC(chunk_image, dst_oh_size))) + if(NULL == (oh_dst->chunk[0].image = H5FL_BLK_MALLOC(chunk_image, (size_t)dst_oh_size))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed") /* Set dest. chunk information */ oh_dst->chunk[0].dirty = TRUE; - oh_dst->chunk[0].size = dst_oh_size; + oh_dst->chunk[0].size = (size_t)dst_oh_size; oh_dst->chunk[0].gap = dst_oh_gap; /* Set up raw pointers and copy messages that didn't need special @@ -582,7 +583,7 @@ H5O_copy_header_real(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out */, * allocated. */ HDassert(H5O_SIZEOF_MSGHDR_OH(oh_src) == H5O_SIZEOF_MSGHDR_OH(oh_dst)); - msghdr_size = H5O_SIZEOF_MSGHDR_OH(oh_src); + msghdr_size = H5O_SIZEOF_MSGHDR_OH(oh_dst); current_pos = oh_dst->chunk[0].image; @@ -646,7 +647,7 @@ H5O_copy_header_real(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out */, } /* end if */ /* Make sure we filled the chunk, except for room at the end for a checksum */ - HDassert(current_pos + dst_oh_gap + dst_oh_null + H5O_SIZEOF_CHKSUM_OH(oh_dst) == dst_oh_size + oh_dst->chunk[0].image); + HDassert(current_pos + dst_oh_gap + dst_oh_null + H5O_SIZEOF_CHKSUM_OH(oh_dst) == (size_t)dst_oh_size + oh_dst->chunk[0].image); /* Set the dest. object location to the first chunk address */ HDassert(H5F_addr_defined(addr_new)); |