summaryrefslogtreecommitdiffstats
path: root/src/H5Ocopy.c
diff options
context:
space:
mode:
authorNeil Fortner <nfortne2@hdfgroup.org>2011-10-14 00:03:09 (GMT)
committerNeil Fortner <nfortne2@hdfgroup.org>2011-10-14 00:03:09 (GMT)
commit363988bd77243b36c6324734b3a985c4fe07f650 (patch)
treefb23cc6accc028589d934362d56fad83a7e3b947 /src/H5Ocopy.c
parent682a4f2b5d383d6abf6741a4a5a573f1c67e668e (diff)
downloadhdf5-363988bd77243b36c6324734b3a985c4fe07f650.zip
hdf5-363988bd77243b36c6324734b3a985c4fe07f650.tar.gz
hdf5-363988bd77243b36c6324734b3a985c4fe07f650.tar.bz2
[svn-r21557] Port r21556 to 1.8 branch
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/H5Ocopy.c')
-rw-r--r--src/H5Ocopy.c12
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 */