summaryrefslogtreecommitdiffstats
path: root/src/H5L.c
diff options
context:
space:
mode:
authorMohamad Chaarawi <chaarawi@hdfgroup.org>2012-04-10 16:30:13 (GMT)
committerMohamad Chaarawi <chaarawi@hdfgroup.org>2012-04-10 16:30:13 (GMT)
commit8c20b495d070d9571e41b51c6eefe11708dde35d (patch)
tree420a2a7030f558018af8a90fc8944b328c5f8333 /src/H5L.c
parent0dbc51127e4b4bc2f3ada3b0958cc9dc2607c541 (diff)
downloadhdf5-8c20b495d070d9571e41b51c6eefe11708dde35d.zip
hdf5-8c20b495d070d9571e41b51c6eefe11708dde35d.tar.gz
hdf5-8c20b495d070d9571e41b51c6eefe11708dde35d.tar.bz2
[svn-r22272] provide the wrapped ids to iterate/visit routines
somehow stable version
Diffstat (limited to 'src/H5L.c')
-rw-r--r--src/H5L.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/H5L.c b/src/H5L.c
index 32e0c41..fd86258 100644
--- a/src/H5L.c
+++ b/src/H5L.c
@@ -1154,8 +1154,6 @@ H5Literate(hid_t id, H5_index_t idx_type, H5_iter_order_t order,
H5G_link_iterate_t lnk_op; /* Link operator */
hsize_t last_lnk; /* Index of last object looked at */
hsize_t idx; /* Internal location to hold index */
- H5VL_id_wrapper_t *id_wrapper; /* user id structure */
- hid_t grp_id;
herr_t ret_value; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -1696,6 +1694,7 @@ H5L_link_cb(H5G_loc_t *grp_loc/*in*/, const char *name, const H5O_link_t UNUSED
H5G_loc_t temp_loc; /* For UD callback */
hbool_t temp_loc_init = FALSE; /* Temporary location for UD callback (temp_loc) has been initialized */
hbool_t obj_created = FALSE; /* Whether an object was created (through a hard link) */
+ H5VL_id_wrapper_t *id_wrapper; /* wrapper for the group ID */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI_NOINIT
@@ -1790,6 +1789,16 @@ H5L_link_cb(H5G_loc_t *grp_loc/*in*/, const char *name, const H5O_link_t UNUSED
if((grp_id = H5I_register(H5I_GROUP, grp, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register ID for group")
+ /* MSC - Create a new id that points to a struct that holds the group id and the VOL plugin */
+ /* Allocate new id structure */
+ if(NULL == (id_wrapper = (H5VL_id_wrapper_t *)H5MM_malloc(sizeof(H5VL_id_wrapper_t))))
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+ id_wrapper->obj_id = grp_id;
+ id_wrapper->vol_plugin = H5F_get_vol_cls(grp_loc->oloc->file);
+
+ if((grp_id = H5I_register(H5I_GROUP_PUBLIC, id_wrapper, TRUE)) < 0)
+ HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize group handle")
+
/* Make callback */
if((link_class->create_func)(name, grp_id, udata->lnk->u.ud.udata, udata->lnk->u.ud.size, H5P_DEFAULT) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CALLBACK, FAIL, "link creation callback failed")
@@ -1813,7 +1822,7 @@ done:
/* Close the location given to the user callback if it was created */
if(grp_id >= 0) {
- if(H5I_dec_app_ref(grp_id) < 0)
+ if(H5I_dec_app_ref(id_wrapper->obj_id) < 0 && H5I_dec_app_ref(grp_id) < 0)
HDONE_ERROR(H5E_ATOM, H5E_CANTRELEASE, FAIL, "unable to close atom from UD callback")
} /* end if */
else if(grp != NULL) {