diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2005-08-10 20:28:32 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2005-08-10 20:28:32 (GMT) |
commit | 0e1b41d0fd1521784128e8637b5afa8371d2779d (patch) | |
tree | 8c17410110f52e6c5b77e49d41a8c1af00a8e3da /src | |
parent | a8fbde5d18ea0b8e0567649571e527e9f04ab5c7 (diff) | |
download | hdf5-0e1b41d0fd1521784128e8637b5afa8371d2779d.zip hdf5-0e1b41d0fd1521784128e8637b5afa8371d2779d.tar.gz hdf5-0e1b41d0fd1521784128e8637b5afa8371d2779d.tar.bz2 |
[svn-r11229] Purpose:
Big fix
Description:
A group opened by dereferencing a object reference would not work for
H5Giterate(), due to the local heap & B-tree information not being cached.
Solution:
Get the local heap & B-tree info & point to that structure instead of
the group entry for the group.
Platforms tested:
FreeBSD 4.11 (sleipnir)
Too minor to require h5committest
Diffstat (limited to 'src')
-rw-r--r-- | src/H5G.c | 9 | ||||
-rw-r--r-- | src/H5Gnode.c | 6 | ||||
-rw-r--r-- | src/H5Gpkg.h | 2 |
3 files changed, 11 insertions, 6 deletions
@@ -468,6 +468,7 @@ herr_t H5Giterate(hid_t loc_id, const char *name, int *idx_p, H5G_iterate_t op, void *op_data) { + H5O_stab_t stab_mesg; /*info about B-tree */ int idx; H5G_bt_ud2_t udata; H5G_t *grp = NULL; @@ -498,9 +499,13 @@ H5Giterate(hid_t loc_id, const char *name, int *idx_p, HGOTO_ERROR (H5E_ATOM, H5E_BADATOM, FAIL, "bad group atom"); } + /* Get the B-tree info */ + if (NULL==H5O_read (&(grp->ent), H5O_STAB_ID, 0, &stab_mesg, H5AC_dxpl_id)) + HGOTO_ERROR (H5E_SYM, H5E_NOTFOUND, FAIL, "unable to determine local heap address") + /* Build udata to pass through H5B_iterate() to H5G_node_iterate() */ udata.skip = idx; - udata.ent = &(grp->ent); + udata.stab = &stab_mesg; udata.op = op; udata.op_data = op_data; @@ -509,7 +514,7 @@ H5Giterate(hid_t loc_id, const char *name, int *idx_p, /* Iterate over the group members */ if ((ret_value = H5B_iterate (H5G_fileof(grp), H5AC_dxpl_id, H5B_SNODE, - H5G_node_iterate, udata.ent->cache.stab.btree_addr, &udata))<0) + H5G_node_iterate, stab_mesg.btree_addr, &udata))<0) HERROR (H5E_SYM, H5E_CANTNEXT, "iteration operator failed"); H5I_dec_ref (udata.group_id); /*also closes 'grp'*/ diff --git a/src/H5Gnode.c b/src/H5Gnode.c index dfa607e..4c08b9c 100644 --- a/src/H5Gnode.c +++ b/src/H5Gnode.c @@ -1533,7 +1533,7 @@ H5G_node_iterate (H5F_t *f, hid_t dxpl_id, const void UNUSED *_lt_key, haddr_t a if (bt_udata->skip>0) { --bt_udata->skip; } else { - if (NULL == (heap = H5HL_protect(f, dxpl_id, bt_udata->ent->cache.stab.heap_addr))) + if (NULL == (heap = H5HL_protect(f, dxpl_id, bt_udata->stab->heap_addr))) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, H5B_ITER_ERROR, "unable to protect symbol name"); name = H5HL_offset_into(f, heap, name_off[i]); @@ -1548,7 +1548,7 @@ H5G_node_iterate (H5F_t *f, hid_t dxpl_id, const void UNUSED *_lt_key, haddr_t a } HDstrcpy (s, name); - if (H5HL_unprotect(f, dxpl_id, heap, bt_udata->ent->cache.stab.heap_addr, H5AC__NO_FLAGS_SET) < 0) + if (H5HL_unprotect(f, dxpl_id, heap, bt_udata->stab->heap_addr, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_SYM, H5E_PROTECT, H5B_ITER_ERROR, "unable to unprotect symbol name"); heap=NULL; name=NULL; @@ -1565,7 +1565,7 @@ H5G_node_iterate (H5F_t *f, hid_t dxpl_id, const void UNUSED *_lt_key, haddr_t a HERROR (H5E_SYM, H5E_CANTNEXT, "iteration operator failed"); done: - if (heap && H5HL_unprotect(f, dxpl_id, heap, bt_udata->ent->cache.stab.heap_addr, H5AC__NO_FLAGS_SET) < 0) + if (heap && H5HL_unprotect(f, dxpl_id, heap, bt_udata->stab->heap_addr, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_SYM, H5E_PROTECT, H5B_ITER_ERROR, "unable to unprotect symbol name"); if (sn && H5AC_unprotect(f, dxpl_id, H5AC_SNODE, addr, sn, H5AC__NO_FLAGS_SET) != SUCCEED) diff --git a/src/H5Gpkg.h b/src/H5Gpkg.h index f970b2d..9b299ed 100644 --- a/src/H5Gpkg.h +++ b/src/H5Gpkg.h @@ -98,7 +98,7 @@ typedef struct H5G_bt_ud1_t { typedef struct H5G_bt_ud2_t { /* downward */ hid_t group_id; /*group id to pass to iteration operator */ - H5G_entry_t *ent; /*the entry to which group_id points */ + H5O_stab_t *stab; /*the cached symbol table info to which group_id points */ H5G_iterate_t op; /*iteration operator */ void *op_data; /*user-defined operator data */ int skip; /*initial entries to skip */ |