diff options
Diffstat (limited to 'src/H5Ocopy.c')
-rw-r--r-- | src/H5Ocopy.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/src/H5Ocopy.c b/src/H5Ocopy.c index fcca34a..45ca431 100644 --- a/src/H5Ocopy.c +++ b/src/H5Ocopy.c @@ -688,6 +688,12 @@ H5O_copy_header_real(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out */, if(H5SL_insert(cpy_info->map_list, addr_map, &(addr_map->src_obj_pos)) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "can't insert object into skip list") + /* Insert destination object header in cache. Insert before post copy loop + * so anything that references this object header can find it. Insert + * pinned so we can continue using oh_dst. */ + if(H5AC_insert_entry(oloc_dst->file, dxpl_id, H5AC_OHDR, oloc_dst->addr, oh_dst, H5AC__PIN_ENTRY_FLAG) < 0) + HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "unable to cache object header") + /* "post copy" loop over messages, to fix up any messages which require a complete * object header for destination object */ @@ -738,9 +744,9 @@ H5O_copy_header_real(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out */, oh_dst->nlink += (unsigned)addr_map->inc_ref_count; } /* end if */ - /* Insert destination object header in cache */ - if(H5AC_insert_entry(oloc_dst->file, dxpl_id, H5AC_OHDR, oloc_dst->addr, oh_dst, H5AC__NO_FLAGS_SET) < 0) - HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "unable to cache object header") + /* Unpin oh_dst */ + if(H5AC_unpin_entry(oh_dst) < 0) + HGOTO_ERROR(H5E_OHDR, H5E_CANTPIN, FAIL, "can't unpin object header") oh_dst = NULL; /* Set obj_type and udata, if requested */ |