summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2005-08-10 20:28:32 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2005-08-10 20:28:32 (GMT)
commit0e1b41d0fd1521784128e8637b5afa8371d2779d (patch)
tree8c17410110f52e6c5b77e49d41a8c1af00a8e3da /src
parenta8fbde5d18ea0b8e0567649571e527e9f04ab5c7 (diff)
downloadhdf5-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.c9
-rw-r--r--src/H5Gnode.c6
-rw-r--r--src/H5Gpkg.h2
3 files changed, 11 insertions, 6 deletions
diff --git a/src/H5G.c b/src/H5G.c
index 1f04f61..c133e90 100644
--- a/src/H5G.c
+++ b/src/H5G.c
@@ -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 */