From 3736cc2a1d41f96d740079cc8201f761961b582a Mon Sep 17 00:00:00 2001 From: Mohamad Chaarawi Date: Tue, 12 Jun 2012 10:55:55 -0500 Subject: [svn-r22456] change all usage of lookup/free VOL callback in H5G,O,A and use the loc_param struct instead. update the native implementation --- src/H5A.c | 160 +++++++++++++++++++++++++++++++---------- src/H5Aprivate.h | 4 ++ src/H5G.c | 44 ++++++------ src/H5O.c | 57 ++++++--------- src/H5R.c | 3 +- src/H5Rdeprec.c | 3 +- src/H5VLint.c | 17 +++-- src/H5VLnative.c | 208 +++++++++++++++++++++++++++++++++++++++++++----------- src/H5VLprivate.h | 4 +- src/H5VLpublic.h | 9 +-- 10 files changed, 355 insertions(+), 154 deletions(-) diff --git a/src/H5A.c b/src/H5A.c index a41340b..1f254eb 100644 --- a/src/H5A.c +++ b/src/H5A.c @@ -316,7 +316,7 @@ H5Acreate_by_name(hid_t loc_id, const char *obj_name, const char *attr_name, loc_params.type = H5VL_OBJECT_LOOKUP_BY_NAME; loc_params.loc_data.loc_by_name.name = obj_name; - loc_params.loc_data.loc_by_name.lapl_id = lapl_id; + loc_params.loc_data.loc_by_name.plist_id = lapl_id; /* Get the plist structure */ if(NULL == (plist = (H5P_genplist_t *)H5I_object(acpl_id))) @@ -600,7 +600,7 @@ H5Aopen_by_name(hid_t loc_id, const char *obj_name, const char *attr_name, loc_params.type = H5VL_OBJECT_LOOKUP_BY_NAME; loc_params.loc_data.loc_by_name.name = obj_name; - loc_params.loc_data.loc_by_name.lapl_id = lapl_id; + loc_params.loc_data.loc_by_name.plist_id = lapl_id; /* Open the attribute through the VOL */ if((ret_value = H5VL_attr_open(loc_id, loc_params, attr_name, aapl_id, H5_REQUEST_NULL)) < 0) @@ -1662,7 +1662,7 @@ H5Aget_info_by_name(hid_t loc_id, const char *obj_name, const char *attr_name, loc_params.type = H5VL_OBJECT_LOOKUP_BY_NAME; loc_params.loc_data.loc_by_name.name = obj_name; - loc_params.loc_data.loc_by_name.lapl_id = lapl_id; + loc_params.loc_data.loc_by_name.plist_id = lapl_id; /* Open the attribute through the VOL */ if((attr_id = H5VL_attr_open(loc_id, loc_params, attr_name, H5P_DEFAULT, H5_REQUEST_NULL)) < 0) @@ -1807,7 +1807,6 @@ done: herr_t H5Arename(hid_t loc_id, const char *old_name, const char *new_name) { - H5G_loc_t loc; /* Object location */ herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_API(FAIL) @@ -1879,7 +1878,7 @@ H5Arename_by_name(hid_t loc_id, const char *obj_name, const char *old_attr_name, loc_params.type = H5VL_OBJECT_LOOKUP_BY_NAME; loc_params.loc_data.loc_by_name.name = obj_name; - loc_params.loc_data.loc_by_name.lapl_id = lapl_id; + loc_params.loc_data.loc_by_name.plist_id = lapl_id; /* get the attribute info through the VOL */ if(H5VL_object_misc(loc_id, H5VL_ATTR_RENAME, H5_REQUEST_NULL, loc_params, old_attr_name, new_attr_name) < 0) @@ -2046,9 +2045,10 @@ H5Aiterate_by_name(hid_t loc_id, const char *obj_name, H5_index_t idx_type, loc_params.type = H5VL_OBJECT_LOOKUP_BY_NAME; loc_params.loc_data.loc_by_name.name = obj_name; + loc_params.loc_data.loc_by_name.plist_id = lapl_id; /* Open the object through the VOL */ - if((obj_loc_id = H5VL_object_open(loc_id, loc_params, lapl_id, H5_REQUEST_NULL)) < 0) + if((obj_loc_id = H5VL_object_open(loc_id, loc_params, H5_REQUEST_NULL)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to open object") /* Build attribute operator info */ @@ -2092,6 +2092,7 @@ done: herr_t H5Adelete(hid_t loc_id, const char *name) { + H5VL_loc_params_t loc_params; herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_API(FAIL) @@ -2103,8 +2104,11 @@ H5Adelete(hid_t loc_id, const char *name) if(!name || !*name) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name") + loc_params.type = H5VL_OBJECT_LOOKUP_BY_ID; + loc_params.loc_data.loc_by_id.id = loc_id; + /* Open the attribute through the VOL */ - if(H5VL_attr_remove(loc_id, NULL, name, H5_REQUEST_NULL) < 0) + if(H5VL_attr_remove(loc_id, loc_params, name, H5_REQUEST_NULL) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete attribute") done: @@ -2132,7 +2136,7 @@ herr_t H5Adelete_by_name(hid_t loc_id, const char *obj_name, const char *attr_name, hid_t lapl_id) { - void *location = NULL; + H5VL_loc_params_t loc_params; herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_API(FAIL) @@ -2151,20 +2155,15 @@ H5Adelete_by_name(hid_t loc_id, const char *obj_name, const char *attr_name, if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS)) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID") - /* Get the token for the Object location through the VOL */ - if(H5VL_object_lookup (loc_id, H5VL_OBJECT_LOOKUP_BY_NAME, &location, H5_REQUEST_NULL, obj_name, lapl_id) < 0) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to locate object") + loc_params.type = H5VL_OBJECT_LOOKUP_BY_NAME; + loc_params.loc_data.loc_by_name.name = obj_name; + loc_params.loc_data.loc_by_name.plist_id = lapl_id; /* Open the attribute through the VOL */ - if(H5VL_attr_remove(loc_id, location, attr_name, H5_REQUEST_NULL) < 0) + if(H5VL_attr_remove(loc_id, loc_params, attr_name, H5_REQUEST_NULL) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete attribute") done: - if(NULL != location) { - /* free the location token through the VOL */ - if(H5VL_object_free_loc (loc_id, location, H5_REQUEST_NULL) < 0) - HGOTO_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "unable to free location token") - } FUNC_LEAVE_API(ret_value) } /* H5Adelete_by_name() */ @@ -2197,7 +2196,7 @@ herr_t H5Adelete_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type, H5_iter_order_t order, hsize_t n, hid_t lapl_id) { - void *location = NULL; + H5VL_loc_params_t loc_params; herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_API(FAIL) @@ -2218,26 +2217,65 @@ H5Adelete_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type, if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS)) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID") - /* Get the token for the Object location through the VOL */ - if(H5VL_object_lookup(loc_id, H5VL_OBJECT_LOOKUP_BY_NAME, &location, H5_REQUEST_NULL, obj_name, lapl_id) < 0) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to locate object") + loc_params.type = H5VL_OBJECT_LOOKUP_BY_NAME; + loc_params.loc_data.loc_by_name.name = obj_name; + loc_params.loc_data.loc_by_name.plist_id = lapl_id; /* get the attribute info through the VOL */ - if(H5VL_object_misc(loc_id, H5VL_ATTR_DELETE_BY_IDX, H5_REQUEST_NULL, location, idx_type, order, n) < 0) + if(H5VL_object_misc(loc_id, H5VL_ATTR_DELETE_BY_IDX, H5_REQUEST_NULL, loc_params, + idx_type, order, n) < 0) HGOTO_ERROR(H5E_INTERNAL, H5E_CANTGET, FAIL, "unable to get attribute info") done: - if(NULL != location) { - /* free the location token through the VOL */ - if(H5VL_object_free_loc (loc_id, location, H5_REQUEST_NULL) < 0) - HGOTO_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "unable to free location token") - } FUNC_LEAVE_API(ret_value) } /* H5Adelete_by_idx() */ /*-------------------------------------------------------------------------- NAME + H5A_delete_by_idx + PURPOSE + private version of H5Adelete_by_idx + RETURNS + Non-negative on success/Negative on failure +--------------------------------------------------------------------------*/ +herr_t +H5A_delete_by_idx(H5G_loc_t loc, const char *obj_name, H5_index_t idx_type, + H5_iter_order_t order, hsize_t n, hid_t lapl_id) +{ + H5G_loc_t obj_loc; /* Location used to open group */ + H5G_name_t obj_path; /* Opened object group hier. path */ + H5O_loc_t obj_oloc; /* Opened object object location */ + hbool_t loc_found = FALSE; /* Entry at 'obj_name' found */ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT + + /* Set up opened group location to fill in */ + obj_loc.oloc = &obj_oloc; + obj_loc.path = &obj_path; + H5G_loc_reset(&obj_loc); + + /* Find the object's location */ + if(H5G_loc_find(&loc, obj_name, &obj_loc/*out*/, lapl_id, H5AC_dxpl_id) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "object not found") + loc_found = TRUE; + + /* Delete the attribute from the location */ + if(H5O_attr_remove_by_idx(obj_loc.oloc, idx_type, order, n, H5AC_dxpl_id) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete attribute") + +done: + /* Release resources */ + if(loc_found && H5G_loc_free(&obj_loc) < 0) + HDONE_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't free location") + + FUNC_LEAVE_NOAPI(ret_value) +} /* H5A_delete_by_idx() */ + + +/*-------------------------------------------------------------------------- + NAME H5Aclose PURPOSE Close an attribute ID @@ -2550,6 +2588,7 @@ done: htri_t H5Aexists(hid_t obj_id, const char *attr_name) { + H5VL_loc_params_t loc_params; htri_t ret_value; /* Return value */ FUNC_ENTER_API(FAIL) @@ -2561,8 +2600,11 @@ H5Aexists(hid_t obj_id, const char *attr_name) if(!attr_name || !*attr_name) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no attribute name") + loc_params.type = H5VL_OBJECT_LOOKUP_BY_ID; + loc_params.loc_data.loc_by_id.id = obj_id; + /* get the attribute info through the VOL */ - if(H5VL_attr_get(obj_id, H5VL_ATTR_EXISTS, H5_REQUEST_NULL, attr_name, NULL, &ret_value) < 0) + if(H5VL_attr_get(obj_id, H5VL_ATTR_EXISTS, H5_REQUEST_NULL, attr_name, loc_params, &ret_value) < 0) HGOTO_ERROR(H5E_INTERNAL, H5E_CANTGET, FAIL, "unable to get attribute info") done: @@ -2587,7 +2629,7 @@ htri_t H5Aexists_by_name(hid_t loc_id, const char *obj_name, const char *attr_name, hid_t lapl_id) { - void *location = NULL; + H5VL_loc_params_t loc_params; htri_t ret_value; /* Return value */ FUNC_ENTER_API(FAIL) @@ -2606,20 +2648,62 @@ H5Aexists_by_name(hid_t loc_id, const char *obj_name, const char *attr_name, if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS)) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID") - /* Get the token for the Object location through the VOL */ - if(H5VL_object_lookup(loc_id, H5VL_OBJECT_LOOKUP_BY_NAME, &location, H5_REQUEST_NULL, obj_name, lapl_id) < 0) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to locate object") + loc_params.type = H5VL_OBJECT_LOOKUP_BY_NAME; + loc_params.loc_data.loc_by_name.name = obj_name; + loc_params.loc_data.loc_by_name.plist_id = lapl_id; /* get the attribute info through the VOL */ - if(H5VL_attr_get(loc_id, H5VL_ATTR_EXISTS, H5_REQUEST_NULL, attr_name, location, &ret_value) < 0) + if(H5VL_attr_get(loc_id, H5VL_ATTR_EXISTS, H5_REQUEST_NULL, attr_name, loc_params, &ret_value) < 0) HGOTO_ERROR(H5E_INTERNAL, H5E_CANTGET, FAIL, "unable to get attribute info") done: - if(NULL != location) { - /* free the location token through the VOL */ - if(H5VL_object_free_loc (loc_id, location, H5_REQUEST_NULL) < 0) - HGOTO_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "unable to free location token") - } FUNC_LEAVE_API(ret_value) } /* H5Aexists_by_name() */ + +/*------------------------------------------------------------------------- + * Function: H5A_exists_by_name + * + * Purpose: Private version of H5Aexists_by_name + * + * Return: Success: TRUE/FALSE + * Failure: Negative + * + * Programmer: Quincey Koziol + * Thursday, November 1, 2007 + * + *------------------------------------------------------------------------- + */ +htri_t +H5A_exists_by_name(H5G_loc_t loc, const char *obj_name, const char *attr_name, + hid_t lapl_id) +{ + H5G_loc_t obj_loc; /* Location used to open group */ + H5G_name_t obj_path; /* Opened object group hier. path */ + H5O_loc_t obj_oloc; /* Opened object object location */ + hbool_t loc_found = FALSE; /* Entry at 'obj_name' found */ + htri_t ret_value; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT + + /* Set up opened group location to fill in */ + obj_loc.oloc = &obj_oloc; + obj_loc.path = &obj_path; + H5G_loc_reset(&obj_loc); + + /* Find the object's location */ + if(H5G_loc_find(&loc, obj_name, &obj_loc/*out*/, lapl_id, H5AC_ind_dxpl_id) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "object not found") + loc_found = TRUE; + + /* Check if the attribute exists */ + if((ret_value = H5O_attr_exists(obj_loc.oloc, attr_name, H5AC_ind_dxpl_id)) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "unable to determine if attribute exists") + +done: + /* Release resources */ + if(loc_found && H5G_loc_free(&obj_loc) < 0) + HDONE_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't free location") + + FUNC_LEAVE_NOAPI(ret_value) +} /* H5A_exists_by_name() */ diff --git a/src/H5Aprivate.h b/src/H5Aprivate.h index 9e2cbb2..fa774fa 100644 --- a/src/H5Aprivate.h +++ b/src/H5Aprivate.h @@ -84,5 +84,9 @@ H5_DLL herr_t H5O_attr_iterate(hid_t loc_id, hid_t dxpl_id, H5_index_t idx_type, const H5A_attr_iter_op_t *op, void *op_data); H5_DLL herr_t H5A_rename_by_name(H5G_loc_t loc, const char *obj_name, const char *old_attr_name, const char *new_attr_name, hid_t lapl_id); +H5_DLL herr_t H5A_delete_by_idx(H5G_loc_t loc, const char *obj_name, H5_index_t idx_type, + H5_iter_order_t order, hsize_t n, hid_t lapl_id); +H5_DLL htri_t H5A_exists_by_name(H5G_loc_t loc, const char *obj_name, const char *attr_name, + hid_t lapl_id); #endif /* _H5Aprivate_H */ diff --git a/src/H5G.c b/src/H5G.c index 00e142a..5544e41 100644 --- a/src/H5G.c +++ b/src/H5G.c @@ -470,6 +470,7 @@ herr_t H5Gget_info(hid_t loc_id, H5G_info_t *grp_info) { H5I_type_t id_type; /* Type of ID */ + H5VL_loc_params_t loc_params; herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_API(FAIL) @@ -482,8 +483,11 @@ H5Gget_info(hid_t loc_id, H5G_info_t *grp_info) if(!grp_info) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no info struct") + loc_params.type = H5VL_OBJECT_LOOKUP_BY_ID; + loc_params.loc_data.loc_by_id.id = loc_id; + /* Get the group info through the VOL using the location token */ - if((ret_value = H5VL_group_get(loc_id, H5VL_GROUP_GET_INFO, H5_REQUEST_NULL, grp_info, NULL)) < 0) + if((ret_value = H5VL_group_get(loc_id, H5VL_GROUP_GET_INFO, H5_REQUEST_NULL, grp_info, loc_params)) < 0) HGOTO_ERROR(H5E_INTERNAL, H5E_CANTGET, FAIL, "unable to get group info") done: @@ -508,8 +512,7 @@ herr_t H5Gget_info_by_name(hid_t loc_id, const char *name, H5G_info_t *grp_info, hid_t lapl_id) { - void *location = NULL; /* a pointer to VOL specific token that indicates - the location of the object */ + H5VL_loc_params_t loc_params; herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_API(FAIL) @@ -526,20 +529,16 @@ H5Gget_info_by_name(hid_t loc_id, const char *name, H5G_info_t *grp_info, if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS)) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID") - /* Get the token for the Object location through the VOL */ - if(H5VL_object_lookup (loc_id, H5VL_OBJECT_LOOKUP_BY_NAME, &location, H5_REQUEST_NULL, name, lapl_id) < 0) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to locate object") + loc_params.type = H5VL_OBJECT_LOOKUP_BY_NAME; + loc_params.loc_data.loc_by_name.name = name; + loc_params.loc_data.loc_by_name.plist_id = lapl_id; /* Get the group info through the VOL using the location token */ - if((ret_value = H5VL_group_get(loc_id, H5VL_GROUP_GET_INFO, H5_REQUEST_NULL, grp_info, location)) < 0) + if((ret_value = H5VL_group_get(loc_id, H5VL_GROUP_GET_INFO, H5_REQUEST_NULL, + grp_info, loc_params)) < 0) HGOTO_ERROR(H5E_INTERNAL, H5E_CANTGET, FAIL, "unable to get group info") done: - if (NULL != location) { - /* free the location token through the VOL */ - if(H5VL_object_free_loc (loc_id, location, H5_REQUEST_NULL) < 0) - HGOTO_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "unable to free location token") - } FUNC_LEAVE_API(ret_value) } /* end H5Gget_info_by_name() */ @@ -562,8 +561,7 @@ herr_t H5Gget_info_by_idx(hid_t loc_id, const char *group_name, H5_index_t idx_type, H5_iter_order_t order, hsize_t n, H5G_info_t *grp_info, hid_t lapl_id) { - void *location = NULL; /* a pointer to VOL specific token that indicates - the location of the object */ + H5VL_loc_params_t loc_params; herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_API(FAIL) @@ -585,21 +583,19 @@ H5Gget_info_by_idx(hid_t loc_id, const char *group_name, H5_index_t idx_type, if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS)) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID") - /* Get the token for the Object location through the VOL */ - if(H5VL_object_lookup(loc_id, H5VL_OBJECT_LOOKUP_BY_IDX, &location, H5_REQUEST_NULL, group_name, - idx_type, order, n, lapl_id) < 0) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to locate object") + loc_params.type = H5VL_OBJECT_LOOKUP_BY_IDX; + loc_params.loc_data.loc_by_idx.name = group_name; + loc_params.loc_data.loc_by_idx.idx_type = idx_type; + loc_params.loc_data.loc_by_idx.order = order; + loc_params.loc_data.loc_by_idx.n = n; + loc_params.loc_data.loc_by_idx.plist_id = lapl_id; /* Get the group info through the VOL using the location token */ - if((ret_value = H5VL_group_get(loc_id, H5VL_GROUP_GET_INFO, H5_REQUEST_NULL, grp_info, location)) < 0) + if((ret_value = H5VL_group_get(loc_id, H5VL_GROUP_GET_INFO, H5_REQUEST_NULL, + grp_info, loc_params)) < 0) HGOTO_ERROR(H5E_INTERNAL, H5E_CANTGET, FAIL, "unable to get group info") done: - if (NULL != location) { - /* free the location token through the VOL */ - if(H5VL_object_free_loc (loc_id, location, H5_REQUEST_NULL) < 0) - HGOTO_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "unable to free location token") - } FUNC_LEAVE_API(ret_value) } /* end H5Gget_info_by_idx() */ diff --git a/src/H5O.c b/src/H5O.c index 4df3970..305bb79 100644 --- a/src/H5O.c +++ b/src/H5O.c @@ -238,9 +238,10 @@ H5Oopen(hid_t loc_id, const char *name, hid_t lapl_id) loc_params.type = H5VL_OBJECT_LOOKUP_BY_NAME; loc_params.loc_data.loc_by_name.name = name; + loc_params.loc_data.loc_by_name.plist_id = lapl_id; /* Open the object through the VOL */ - if((ret_value = H5VL_object_open(loc_id, loc_params, lapl_id, H5_REQUEST_NULL)) < 0) + if((ret_value = H5VL_object_open(loc_id, loc_params, H5_REQUEST_NULL)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to open object") done: @@ -299,9 +300,10 @@ H5Oopen_by_idx(hid_t loc_id, const char *group_name, H5_index_t idx_type, loc_params.loc_data.loc_by_idx.idx_type = idx_type; loc_params.loc_data.loc_by_idx.order = order; loc_params.loc_data.loc_by_idx.n = n; + loc_params.loc_data.loc_by_idx.plist_id = lapl_id; /* Open the object through the VOL */ - if((ret_value = H5VL_object_open(loc_id, loc_params, lapl_id, H5_REQUEST_NULL)) < 0) + if((ret_value = H5VL_object_open(loc_id, loc_params, H5_REQUEST_NULL)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to open object") done: @@ -347,7 +349,6 @@ done: hid_t H5Oopen_by_addr(hid_t loc_id, haddr_t addr) { - hid_t lapl_id = H5P_LINK_ACCESS_DEFAULT; /* lapl to use to open this object */ H5VL_loc_params_t loc_params; hid_t ret_value = FAIL; @@ -358,7 +359,7 @@ H5Oopen_by_addr(hid_t loc_id, haddr_t addr) loc_params.loc_data.loc_by_addr.addr = addr; /* Open the object through the VOL */ - if((ret_value = H5VL_object_open(loc_id, loc_params, lapl_id, H5_REQUEST_NULL)) < 0) + if((ret_value = H5VL_object_open(loc_id, loc_params, H5_REQUEST_NULL)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to open object") done: @@ -564,8 +565,7 @@ done: herr_t H5Oget_info(hid_t loc_id, H5O_info_t *oinfo) { - void *location = NULL; /* a pointer to VOL specific token that indicates - the location of the object */ + H5VL_loc_params_t loc_params; herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_API(FAIL) @@ -575,15 +575,14 @@ H5Oget_info(hid_t loc_id, H5O_info_t *oinfo) if(!oinfo) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no info struct") + loc_params.type = H5VL_OBJECT_LOOKUP_BY_ID; + loc_params.loc_data.loc_by_id.id = loc_id; + /* Get the group info through the VOL using the location token */ - if((ret_value = H5VL_object_get(loc_id, H5VL_OBJECT_GET_INFO, H5_REQUEST_NULL, oinfo, NULL)) < 0) + if((ret_value = H5VL_object_get(loc_id, H5VL_OBJECT_GET_INFO, H5_REQUEST_NULL, oinfo, loc_params)) < 0) HGOTO_ERROR(H5E_INTERNAL, H5E_CANTGET, FAIL, "unable to get group info") done: - if (NULL != location) { - free (location); - location = NULL; - } FUNC_LEAVE_API(ret_value) } /* end H5Oget_info() */ @@ -604,8 +603,7 @@ done: herr_t H5Oget_info_by_name(hid_t loc_id, const char *name, H5O_info_t *oinfo, hid_t lapl_id) { - void *location = NULL; /* a pointer to VOL specific token that indicates - the location of the object */ + H5VL_loc_params_t loc_params; herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_API(FAIL) @@ -622,20 +620,15 @@ H5Oget_info_by_name(hid_t loc_id, const char *name, H5O_info_t *oinfo, hid_t lap if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS)) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID") - /* Get the token for the Object location through the VOL */ - if(H5VL_object_lookup (loc_id, H5VL_OBJECT_LOOKUP_BY_NAME, &location, H5_REQUEST_NULL, name, lapl_id) < 0) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to locate object") + loc_params.type = H5VL_OBJECT_LOOKUP_BY_NAME; + loc_params.loc_data.loc_by_name.name = name; + loc_params.loc_data.loc_by_name.plist_id = lapl_id; /* Get the group info through the VOL using the location token */ - if((ret_value = H5VL_object_get(loc_id, H5VL_OBJECT_GET_INFO, H5_REQUEST_NULL, oinfo, location)) < 0) + if((ret_value = H5VL_object_get(loc_id, H5VL_OBJECT_GET_INFO, H5_REQUEST_NULL, oinfo, loc_params)) < 0) HGOTO_ERROR(H5E_INTERNAL, H5E_CANTGET, FAIL, "unable to get group info") done: - if (NULL != location) { - /* free the location token through the VOL */ - if(H5VL_object_free_loc (loc_id, location, H5_REQUEST_NULL) < 0) - HGOTO_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "unable to free location token") - } FUNC_LEAVE_API(ret_value) } /* end H5Oget_info_by_name() */ @@ -658,8 +651,7 @@ herr_t H5Oget_info_by_idx(hid_t loc_id, const char *group_name, H5_index_t idx_type, H5_iter_order_t order, hsize_t n, H5O_info_t *oinfo, hid_t lapl_id) { - void *location = NULL; /* a pointer to VOL specific token that indicates - the location of the object */ + H5VL_loc_params_t loc_params; herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_API(FAIL) @@ -681,21 +673,18 @@ H5Oget_info_by_idx(hid_t loc_id, const char *group_name, H5_index_t idx_type, if(TRUE != H5P_isa_class(lapl_id, H5P_LINK_ACCESS)) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID") - /* Get the token for the Object location through the VOL */ - if(H5VL_object_lookup(loc_id, H5VL_OBJECT_LOOKUP_BY_IDX, &location, H5_REQUEST_NULL, group_name, - idx_type, order, n, lapl_id) < 0) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to locate object") + loc_params.type = H5VL_OBJECT_LOOKUP_BY_IDX; + loc_params.loc_data.loc_by_idx.name = group_name; + loc_params.loc_data.loc_by_idx.idx_type = idx_type; + loc_params.loc_data.loc_by_idx.order = order; + loc_params.loc_data.loc_by_idx.n = n; + loc_params.loc_data.loc_by_idx.plist_id = lapl_id; /* Get the group info through the VOL using the location token */ - if((ret_value = H5VL_object_get(loc_id, H5VL_OBJECT_GET_INFO, H5_REQUEST_NULL, oinfo, location)) < 0) + if((ret_value = H5VL_object_get(loc_id, H5VL_OBJECT_GET_INFO, H5_REQUEST_NULL, oinfo, loc_params)) < 0) HGOTO_ERROR(H5E_INTERNAL, H5E_CANTGET, FAIL, "unable to get group info") done: - if (NULL != location) { - /* free the location token through the VOL */ - if(H5VL_object_free_loc (loc_id, location, H5_REQUEST_NULL) < 0) - HGOTO_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "unable to free location token") - } FUNC_LEAVE_API(ret_value) } /* end H5Oget_info_by_idx() */ diff --git a/src/H5R.c b/src/H5R.c index 4ce37da..87edbea 100644 --- a/src/H5R.c +++ b/src/H5R.c @@ -528,9 +528,10 @@ H5Rdereference2(hid_t obj_id, hid_t oapl_id, H5R_type_t ref_type, const void *_r loc_params.type = H5VL_OBJECT_LOOKUP_BY_REF; loc_params.loc_data.loc_by_ref.ref_type = ref_type; loc_params.loc_data.loc_by_ref._ref = _ref; + loc_params.loc_data.loc_by_ref.plist_id = oapl_id; /* Open the object through the VOL */ - if((ret_value = H5VL_object_open(obj_id, loc_params, oapl_id, H5_REQUEST_NULL)) < 0) + if((ret_value = H5VL_object_open(obj_id, loc_params, H5_REQUEST_NULL)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to open object") #if 0 diff --git a/src/H5Rdeprec.c b/src/H5Rdeprec.c index a595c90..6a8febb 100644 --- a/src/H5Rdeprec.c +++ b/src/H5Rdeprec.c @@ -197,9 +197,10 @@ H5Rdereference1(hid_t obj_id, H5R_type_t ref_type, const void *_ref) loc_params.type = H5VL_OBJECT_LOOKUP_BY_REF; loc_params.loc_data.loc_by_ref.ref_type = ref_type; loc_params.loc_data.loc_by_ref._ref = _ref; + loc_params.loc_data.loc_by_ref.plist_id = H5P_DATASET_ACCESS_DEFAULT; /* Open the object through the VOL */ - if((ret_value = H5VL_object_open(obj_id, loc_params, H5P_DATASET_ACCESS_DEFAULT, H5_REQUEST_NULL)) < 0) + if((ret_value = H5VL_object_open(obj_id, loc_params, H5_REQUEST_NULL)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to open object") done: diff --git a/src/H5VLint.c b/src/H5VLint.c index 6371ef3..94346b8 100644 --- a/src/H5VLint.c +++ b/src/H5VLint.c @@ -513,7 +513,7 @@ done: *------------------------------------------------------------------------- */ herr_t -H5VL_attr_remove(hid_t id, void *location, const char *attr_name, hid_t req) +H5VL_attr_remove(hid_t id, H5VL_loc_params_t loc_params, const char *attr_name, hid_t req) { H5VL_class_t *vol_plugin; /* VOL structure attached to id */ herr_t ret_value = SUCCEED; @@ -523,7 +523,7 @@ H5VL_attr_remove(hid_t id, void *location, const char *attr_name, hid_t req) if (NULL == (vol_plugin = (H5VL_class_t *)H5I_get_aux (id))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "ID does not contain VOL information") - if((ret_value = (vol_plugin->attr_cls.remove)(id, location, attr_name, req)) < 0) + if((ret_value = (vol_plugin->attr_cls.remove)(id, loc_params, attr_name, req)) < 0) HGOTO_ERROR(H5E_VOL, H5E_CANTDELETE, FAIL, "remove failed") done: @@ -645,9 +645,10 @@ H5VL_datatype_open(hid_t id, const char *name, hid_t tapl_id, hid_t req) loc_params.type = H5VL_OBJECT_LOOKUP_BY_NAME; loc_params.loc_data.loc_by_name.name = name; + loc_params.loc_data.loc_by_name.plist_id = tapl_id; /* Open the object class */ - if((ret_value = H5VL_object_open(id, loc_params, tapl_id, H5_REQUEST_NULL)) < 0) + if((ret_value = H5VL_object_open(id, loc_params, H5_REQUEST_NULL)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to open object") } else { @@ -774,9 +775,10 @@ H5VL_dataset_open(hid_t id, const char *name, hid_t dapl_id, hid_t req) loc_params.type = H5VL_OBJECT_LOOKUP_BY_NAME; loc_params.loc_data.loc_by_name.name = name; + loc_params.loc_data.loc_by_name.plist_id = dapl_id; /* Open the object class */ - if((ret_value = H5VL_object_open(id, loc_params, dapl_id, H5_REQUEST_NULL)) < 0) + if((ret_value = H5VL_object_open(id, loc_params, H5_REQUEST_NULL)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to open object") } else { @@ -1357,9 +1359,10 @@ H5VL_group_open(hid_t id, const char *name, hid_t gapl_id, hid_t req) loc_params.type = H5VL_OBJECT_LOOKUP_BY_NAME; loc_params.loc_data.loc_by_name.name = name; + loc_params.loc_data.loc_by_name.plist_id = gapl_id; /* Open the object class */ - if((ret_value = H5VL_object_open(id, loc_params, gapl_id, H5_REQUEST_NULL)) < 0) + if((ret_value = H5VL_object_open(id, loc_params, H5_REQUEST_NULL)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to open object") } else { @@ -1687,7 +1690,7 @@ done: *------------------------------------------------------------------------- */ hid_t -H5VL_object_open(hid_t id, H5VL_loc_params_t params, hid_t lapl_id, hid_t req) +H5VL_object_open(hid_t id, H5VL_loc_params_t params, hid_t req) { H5VL_class_t *vol_plugin; /* VOL structure attached to id */ hid_t ret_value; /* Return value */ @@ -1702,7 +1705,7 @@ H5VL_object_open(hid_t id, H5VL_loc_params_t params, hid_t lapl_id, hid_t req) HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `object open' method") /* call the corresponding VOL open callback */ - if((ret_value = (vol_plugin->object_cls.open)(id, params, lapl_id, req)) < 0) + if((ret_value = (vol_plugin->object_cls.open)(id, params, req)) < 0) HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "open failed") /* attach VOL information to the ID */ diff --git a/src/H5VLnative.c b/src/H5VLnative.c index db9c0ab..05c2fb4 100644 --- a/src/H5VLnative.c +++ b/src/H5VLnative.c @@ -69,7 +69,7 @@ static hid_t H5VL_native_attr_open(hid_t loc_id, H5VL_loc_params_t loc_params, c static herr_t H5VL_native_attr_read(hid_t attr_id, hid_t dtype_id, void *buf, hid_t req); static herr_t H5VL_native_attr_write(hid_t attr_id, hid_t dtype_id, const void *buf, hid_t req); static herr_t H5VL_native_attr_get(hid_t id, H5VL_attr_get_t get_type, hid_t req, va_list arguments); -static herr_t H5VL_native_attr_remove(hid_t loc_id, void *location, const char *attr_name, hid_t req); +static herr_t H5VL_native_attr_remove(hid_t loc_id, H5VL_loc_params_t loc_params, const char *attr_name, hid_t req); static herr_t H5VL_native_attr_close(hid_t attr_id, hid_t req); static herr_t H5VL_native_datatype_commit(hid_t loc_id, const char *name, hid_t type_id, @@ -109,7 +109,7 @@ static herr_t H5VL_native_link_iterate(hid_t loc_id, const char *name, hbool_t r static herr_t H5VL_native_link_get(hid_t loc_id, H5VL_link_get_t get_type, hid_t req, va_list arguments); static herr_t H5VL_native_link_remove(hid_t loc_id, const char *name, void *udata, hid_t lapl_id, hid_t req); -static hid_t H5VL_native_object_open(hid_t loc_id, H5VL_loc_params_t params, hid_t lapl_id, hid_t req); +static hid_t H5VL_native_object_open(hid_t loc_id, H5VL_loc_params_t params, hid_t req); static herr_t H5VL_native_object_copy(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, const char *dst_name, hid_t ocpypl_id, hid_t lcpl_id, hid_t req); static herr_t H5VL_native_object_visit(hid_t loc_id, const char *obj_name, H5_index_t idx_type, @@ -356,7 +356,7 @@ H5VL_native_attr_create(hid_t loc_id, const char *attr_name, hid_t acpl_id, hid_ /* Find the object's location */ if(H5G_loc_find(&loc, loc_params.loc_data.loc_by_name.name, &obj_loc/*out*/, - loc_params.loc_data.loc_by_name.lapl_id, H5AC_ind_dxpl_id) < 0) + loc_params.loc_data.loc_by_name.plist_id, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "object not found") loc_found = TRUE; @@ -413,14 +413,9 @@ H5VL_native_attr_open(hid_t loc_id, H5VL_loc_params_t loc_params, const char *at HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to initialize attribute") } else if(loc_params.type == H5VL_OBJECT_LOOKUP_BY_NAME) { /* H5Aopen_by_name */ - H5G_loc_t obj_loc; /* Location used to open group */ - H5G_name_t obj_path; /* Opened object group hier. path */ - H5O_loc_t obj_oloc; /* Opened object object location */ - hbool_t loc_found = FALSE; /* Entry at 'obj_name' found */ - /* Open the attribute on the object header */ if(NULL == (attr = H5A_open_by_name(&loc, loc_params.loc_data.loc_by_name.name, attr_name, - loc_params.loc_data.loc_by_name.lapl_id, H5AC_ind_dxpl_id))) + loc_params.loc_data.loc_by_name.plist_id, H5AC_ind_dxpl_id))) HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "can't open attribute") } else { @@ -538,24 +533,27 @@ H5VL_native_attr_get(hid_t id, H5VL_attr_get_t get_type, hid_t UNUSED req, va_li case H5VL_ATTR_EXISTS: { char *name = va_arg (arguments, char *); - void *location = va_arg (arguments, void *); + H5VL_loc_params_t loc_params = va_arg (arguments, H5VL_loc_params_t); htri_t *ret = va_arg (arguments, htri_t *); H5G_loc_t loc; if(H5G_loc(id, &loc) < 0) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") - if(NULL == location) { /* H5Aexists */ + if(loc_params.type == H5VL_OBJECT_LOOKUP_BY_ID) { /* H5Aexists */ /* Check if the attribute exists */ if((*ret = H5O_attr_exists(loc.oloc, name, H5AC_ind_dxpl_id)) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "unable to determine if attribute exists") } - else { - H5G_loc_t *obj_loc = (H5G_loc_t *)location; + else if(loc_params.type == H5VL_OBJECT_LOOKUP_BY_NAME) { /* H5Aopen_by_name */ /* Check if the attribute exists */ - if((*ret = H5O_attr_exists(obj_loc->oloc, name, H5AC_ind_dxpl_id)) < 0) + if((*ret = H5A_exists_by_name(loc, loc_params.loc_data.loc_by_name.name, + name, loc_params.loc_data.loc_by_name.plist_id)) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "unable to determine if attribute exists") } + else { + HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "unknown parameters") + } break; } /* H5Aget_space */ @@ -664,29 +662,52 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5VL_native_attr_remove(hid_t loc_id, void *location, const char *attr_name, hid_t UNUSED req) +H5VL_native_attr_remove(hid_t loc_id, H5VL_loc_params_t loc_params, const char *attr_name, + hid_t UNUSED req) { H5G_loc_t loc; /* Object location */ - herr_t ret_value = SUCCEED; /* Return value */ + H5G_loc_t obj_loc; /* Location used to open group */ + hbool_t loc_found = FALSE; /* Entry at 'obj_name' found */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI_NOINIT if(H5G_loc(loc_id, &loc) < 0) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") - if(NULL == location) { /* H5Adelete */ + if(loc_params.type == H5VL_OBJECT_LOOKUP_BY_ID) { /* H5Adelete */ /* Delete the attribute from the location */ if(H5O_attr_remove(loc.oloc, attr_name, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete attribute") } - else { /* H5Adelete_by_name */ - H5G_loc_t *obj_loc = (H5G_loc_t *)location; + else if (loc_params.type == H5VL_OBJECT_LOOKUP_BY_NAME) { /* H5Adelete_by_name */ + H5G_name_t obj_path; /* Opened object group hier. path */ + H5O_loc_t obj_oloc; /* Opened object object location */ + + /* Set up opened group location to fill in */ + obj_loc.oloc = &obj_oloc; + obj_loc.path = &obj_path; + H5G_loc_reset(&obj_loc); + + /* Find the object's location */ + if(H5G_loc_find(&loc, loc_params.loc_data.loc_by_name.name, &obj_loc/*out*/, + loc_params.loc_data.loc_by_name.plist_id, H5AC_ind_dxpl_id) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "object not found") + loc_found = TRUE; /* Delete the attribute from the location */ - if(H5O_attr_remove(obj_loc->oloc, attr_name, H5AC_dxpl_id) < 0) + if(H5O_attr_remove(obj_loc.oloc, attr_name, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete attribute") } + else { + HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "unknown attribute remove parameters") + } + done: + /* Release resources */ + if(loc_found && H5G_loc_free(&obj_loc) < 0) + HDONE_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't free location") + FUNC_LEAVE_NOAPI(ret_value) } /* end H5VL_native_attr_remove() */ @@ -2176,21 +2197,73 @@ H5VL_native_group_get(hid_t obj_id, H5VL_group_get_t get_type, hid_t UNUSED req, case H5VL_GROUP_GET_INFO: { H5G_info_t *grp_info = va_arg (arguments, H5G_info_t *); - H5G_loc_t *obj_loc = va_arg (arguments, H5G_loc_t *); + H5VL_loc_params_t loc_params = va_arg (arguments, H5VL_loc_params_t); H5G_loc_t loc; if(H5G_loc(obj_id, &loc) < 0) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") - if (NULL == obj_loc) { + if(loc_params.type == H5VL_OBJECT_LOOKUP_BY_ID) { /* H5Gget_info */ /* Retrieve the group's information */ if(H5G__obj_info(loc.oloc, grp_info, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve group info") } - else { + else if (loc_params.type == H5VL_OBJECT_LOOKUP_BY_NAME) { /* H5Gget_info_by_name */ + H5G_loc_t grp_loc; /* Location used to open group */ + H5G_name_t grp_path; /* Opened object group hier. path */ + H5O_loc_t grp_oloc; /* Opened object object location */ + + /* Set up opened group location to fill in */ + grp_loc.oloc = &grp_oloc; + grp_loc.path = &grp_path; + H5G_loc_reset(&grp_loc); + + /* Find the group object */ + if(H5G_loc_find(&loc, loc_params.loc_data.loc_by_name.name, &grp_loc/*out*/, + loc_params.loc_data.loc_by_name.plist_id, H5AC_ind_dxpl_id) < 0) + HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "group not found") + /* Retrieve the group's information */ - if(H5G__obj_info(obj_loc->oloc, grp_info, H5AC_ind_dxpl_id) < 0) + if(H5G__obj_info(grp_loc.oloc, grp_info/*out*/, H5AC_ind_dxpl_id) < 0) { + H5G_loc_free(&grp_loc); HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve group info") + } + + /* Release the object location */ + if(H5G_loc_free(&grp_loc) < 0) + HDONE_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "can't free location") + } + else if (loc_params.type == H5VL_OBJECT_LOOKUP_BY_IDX) { /* H5Gget_info_by_idx */ + H5G_loc_t grp_loc; /* Location used to open group */ + H5G_name_t grp_path; /* Opened object group hier. path */ + H5O_loc_t grp_oloc; /* Opened object object location */ + + /* Set up opened group location to fill in */ + grp_loc.oloc = &grp_oloc; + grp_loc.path = &grp_path; + H5G_loc_reset(&grp_loc); + + /* Find the object's location, according to the order in the index */ + if(H5G_loc_find_by_idx(&loc, loc_params.loc_data.loc_by_idx.name, + loc_params.loc_data.loc_by_idx.idx_type, + loc_params.loc_data.loc_by_idx.order, + loc_params.loc_data.loc_by_idx.n, &grp_loc/*out*/, + loc_params.loc_data.loc_by_idx.plist_id, + H5AC_ind_dxpl_id) < 0) + HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "group not found") + + /* Retrieve the group's information */ + if(H5G__obj_info(grp_loc.oloc, grp_info/*out*/, H5AC_ind_dxpl_id) < 0) { + H5G_loc_free(&grp_loc); + HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve group info") + } + + /* Release the object location */ + if(H5G_loc_free(&grp_loc) < 0) + HDONE_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "can't free location") + } + else { + HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "unknown get info parameters") } break; } @@ -2619,7 +2692,7 @@ done: *------------------------------------------------------------------------- */ static hid_t -H5VL_native_object_open(hid_t loc_id, H5VL_loc_params_t params, hid_t lapl_id, hid_t UNUSED req) +H5VL_native_object_open(hid_t loc_id, H5VL_loc_params_t params, hid_t UNUSED req) { H5G_loc_t loc; H5G_loc_t obj_loc; /* Location used to open group */ @@ -2637,8 +2710,8 @@ H5VL_native_object_open(hid_t loc_id, H5VL_loc_params_t params, hid_t lapl_id, h case H5VL_OBJECT_LOOKUP_BY_NAME: { /* Open the object */ - if((ret_value = H5O_open_name(&loc, params.loc_data.loc_by_name.name, lapl_id, - TRUE)) < 0) + if((ret_value = H5O_open_name(&loc, params.loc_data.loc_by_name.name, + params.loc_data.loc_by_name.plist_id, TRUE)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open object") break; } @@ -2653,12 +2726,14 @@ H5VL_native_object_open(hid_t loc_id, H5VL_loc_params_t params, hid_t lapl_id, h if(H5G_loc_find_by_idx(&loc, params.loc_data.loc_by_idx.name, params.loc_data.loc_by_idx.idx_type, params.loc_data.loc_by_idx.order, params.loc_data.loc_by_idx.n, - &obj_loc/*out*/, lapl_id, H5AC_dxpl_id) < 0) + &obj_loc/*out*/, params.loc_data.loc_by_idx.plist_id, + H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "group not found") loc_found = TRUE; /* Open the object */ - if((ret_value = H5O_open_by_loc(&obj_loc, lapl_id, H5AC_dxpl_id, TRUE)) < 0) + if((ret_value = H5O_open_by_loc(&obj_loc, params.loc_data.loc_by_name.plist_id, + H5AC_dxpl_id, TRUE)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open object") break; } @@ -2676,7 +2751,8 @@ H5VL_native_object_open(hid_t loc_id, H5VL_loc_params_t params, hid_t lapl_id, h H5G_name_reset(obj_loc.path); /* objects opened through this routine don't have a path name */ /* Open the object */ - if((ret_value = H5O_open_by_loc(&obj_loc, lapl_id, H5AC_dxpl_id, TRUE)) < 0) + if((ret_value = H5O_open_by_loc(&obj_loc, H5P_LINK_ACCESS_DEFAULT, + H5AC_dxpl_id, TRUE)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open object") break; } @@ -2688,7 +2764,8 @@ H5VL_native_object_open(hid_t loc_id, H5VL_loc_params_t params, hid_t lapl_id, h file = loc.oloc->file; /* Create reference */ - if((ret_value = H5R_dereference(file, lapl_id, H5AC_dxpl_id, + if((ret_value = H5R_dereference(file, params.loc_data.loc_by_ref.plist_id, + H5AC_dxpl_id, params.loc_data.loc_by_ref.ref_type, params.loc_data.loc_by_ref._ref, TRUE)) < 0) @@ -2981,14 +3058,22 @@ H5VL_native_object_misc(hid_t loc_id, H5VL_object_misc_t misc_type, hid_t UNUSED /* H5Adelete_by_idx */ case H5VL_ATTR_DELETE_BY_IDX: { - H5G_loc_t *obj_loc = va_arg (arguments, H5G_loc_t *); + H5VL_loc_params_t loc_params = va_arg (arguments, H5VL_loc_params_t); H5_index_t idx_type = va_arg (arguments, H5_index_t); H5_iter_order_t order = va_arg (arguments, H5_iter_order_t); hsize_t n = va_arg (arguments, hsize_t); + H5G_loc_t loc; /* Object location */ + + HDassert(loc_params.type == H5VL_OBJECT_LOOKUP_BY_NAME); + + if(H5G_loc(loc_id, &loc) < 0) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") + + /* Call attribute delete routine */ + if(H5A_delete_by_idx(loc, loc_params.loc_data.loc_by_name.name, idx_type, + order, n, loc_params.loc_data.loc_by_name.plist_id) < 0) + HGOTO_ERROR(H5E_ATTR, H5E_CANTRENAME, FAIL, "can't delete attribute") - /* Delete the attribute from the location */ - if(H5O_attr_remove_by_idx(obj_loc->oloc, idx_type, order, n, H5AC_dxpl_id) < 0) - HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete attribute") break; } /* H5Aopen_by_idx */ @@ -3034,7 +3119,7 @@ H5VL_native_object_misc(hid_t loc_id, H5VL_object_misc_t misc_type, hid_t UNUSED else if(loc_params.type == H5VL_OBJECT_LOOKUP_BY_NAME) { /* H5Arename_by_name */ /* Call attribute rename routine */ if(H5A_rename_by_name(loc, loc_params.loc_data.loc_by_name.name, old_name, - new_name, loc_params.loc_data.loc_by_name.lapl_id) < 0) + new_name, loc_params.loc_data.loc_by_name.plist_id) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTRENAME, FAIL, "can't rename attribute") } else { @@ -3177,15 +3262,52 @@ H5VL_native_object_get(hid_t id, H5VL_object_get_t get_type, hid_t UNUSED req, v case H5VL_OBJECT_GET_INFO: { H5O_info_t *obj_info = va_arg (arguments, H5O_info_t *); - H5G_loc_t *obj_loc = va_arg (arguments, H5G_loc_t *); + H5VL_loc_params_t loc_params = va_arg (arguments, H5VL_loc_params_t); - if(NULL == obj_loc) { - obj_loc = &loc; + if(loc_params.type == H5VL_OBJECT_LOOKUP_BY_ID) { /* H5Oget_info */ + /* Retrieve the object's information */ + if(H5G_loc_info(&loc, ".", TRUE, obj_info, H5P_LINK_ACCESS_DEFAULT, + H5AC_ind_dxpl_id) < 0) + HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found") + } + else if (loc_params.type == H5VL_OBJECT_LOOKUP_BY_NAME) { /* H5Oget_info_by_name */ + /* Retrieve the object's information */ + if(H5G_loc_info(&loc, loc_params.loc_data.loc_by_name.name, TRUE, obj_info, + loc_params.loc_data.loc_by_name.plist_id, H5AC_ind_dxpl_id) < 0) + HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found") + } + else if (loc_params.type == H5VL_OBJECT_LOOKUP_BY_IDX) { /* H5Oget_info_by_idx */ + H5G_loc_t obj_loc; /* Location used to open group */ + H5G_name_t obj_path; /* Opened object group hier. path */ + H5O_loc_t obj_oloc; /* Opened object object location */ + + /* Set up opened group location to fill in */ + obj_loc.oloc = &obj_oloc; + obj_loc.path = &obj_path; + H5G_loc_reset(&obj_loc); + + /* Find the object's location, according to the order in the index */ + if(H5G_loc_find_by_idx(&loc, loc_params.loc_data.loc_by_idx.name, + loc_params.loc_data.loc_by_idx.idx_type, + loc_params.loc_data.loc_by_idx.order, + loc_params.loc_data.loc_by_idx.n, &obj_loc/*out*/, + loc_params.loc_data.loc_by_idx.plist_id, + H5AC_ind_dxpl_id) < 0) + HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "group not found") + + /* Retrieve the object's information */ + if(H5O_get_info(obj_loc.oloc, H5AC_ind_dxpl_id, TRUE, obj_info) < 0) { + H5G_loc_free(&obj_loc); + HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve object info") + } + + /* Release the object location */ + if(H5G_loc_free(&obj_loc) < 0) + HDONE_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "can't free location") + } + else { + HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "unknown get info parameters") } - - /* Retrieve the object's information */ - if(H5O_get_info(obj_loc->oloc, H5AC_ind_dxpl_id, TRUE, obj_info) < 0) - HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve object info") break; } /* H5Oget_comment / H5Oget_comment_by_name */ diff --git a/src/H5VLprivate.h b/src/H5VLprivate.h index eeb4b3c..f3d2f46 100644 --- a/src/H5VLprivate.h +++ b/src/H5VLprivate.h @@ -54,7 +54,7 @@ H5_DLL hid_t H5VL_attr_open(hid_t loc_id, H5VL_loc_params_t loc_params, const ch H5_DLL herr_t H5VL_attr_read(hid_t attr_id, hid_t dtype_id, void *buf, hid_t req); H5_DLL herr_t H5VL_attr_write(hid_t attr_id, hid_t dtype_id, const void *buf, hid_t req); H5_DLL herr_t H5VL_attr_get(hid_t id, H5VL_attr_get_t get_type, hid_t req, ...); -H5_DLL herr_t H5VL_attr_remove(hid_t loc_id, void *location, const char *attr_name, hid_t req); +H5_DLL herr_t H5VL_attr_remove(hid_t loc_id, H5VL_loc_params_t loc_params, const char *attr_name, hid_t req); H5_DLL herr_t H5VL_attr_close(hid_t attr_id, hid_t req); H5_DLL hid_t H5VL_dataset_create(hid_t uid, const char *name, hid_t dcpl_id, hid_t dapl_id, hid_t req); @@ -92,7 +92,7 @@ H5_DLL herr_t H5VL_link_iterate(hid_t loc_id, const char *name, hbool_t recursiv H5_DLL herr_t H5VL_link_get(hid_t loc_id, H5VL_link_get_t get_type, hid_t req, ...); H5_DLL herr_t H5VL_link_remove(hid_t loc_id, const char *name, void *udata, hid_t lapl_id, hid_t req); -H5_DLL hid_t H5VL_object_open(hid_t loc_id, H5VL_loc_params_t params, hid_t lapl_id, hid_t req); +H5_DLL hid_t H5VL_object_open(hid_t loc_id, H5VL_loc_params_t params, hid_t req); H5_DLL herr_t H5VL_object_copy(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, const char *dst_name, hid_t ocpypl_id, hid_t lcpl_id, hid_t req); H5_DLL herr_t H5VL_object_visit(hid_t loc_id, const char *obj_name, H5_index_t idx_type, diff --git a/src/H5VLpublic.h b/src/H5VLpublic.h index 4e433e5..2746dfc 100644 --- a/src/H5VLpublic.h +++ b/src/H5VLpublic.h @@ -165,7 +165,7 @@ struct H5VL_loc_by_id { struct H5VL_loc_by_name { const char *name; - hid_t lapl_id; + hid_t plist_id; }; struct H5VL_loc_by_idx { @@ -173,7 +173,7 @@ struct H5VL_loc_by_idx { H5_index_t idx_type; H5_iter_order_t order; hsize_t n; - hid_t lapl_id; + hid_t plist_id; }; struct H5VL_loc_by_addr { @@ -183,6 +183,7 @@ struct H5VL_loc_by_addr { struct H5VL_loc_by_ref { H5R_type_t ref_type; const void *_ref; + hid_t plist_id; }; /* Structure to hold parameters for object location */ @@ -206,7 +207,7 @@ typedef struct H5VL_attr_class_t { herr_t (*read) (hid_t attr_id, hid_t mem_type_id, void *buf, hid_t req); herr_t (*write) (hid_t attr_id, hid_t mem_type_id, const void *buf, hid_t req); herr_t (*get) (hid_t loc_id, H5VL_attr_get_t get_type, hid_t req, va_list arguments); - herr_t (*remove)(hid_t loc_id, void *location, const char *attr_name, hid_t req); + herr_t (*remove)(hid_t loc_id, H5VL_loc_params_t loc_params, const char *attr_name, hid_t req); herr_t (*close) (hid_t attr_id, hid_t req); } H5VL_attr_class_t; @@ -265,7 +266,7 @@ typedef struct H5VL_link_class_t { /* H5O routines */ typedef struct H5VL_object_class_t { - hid_t (*open) (hid_t id, H5VL_loc_params_t params, hid_t lapl_id, hid_t req); + hid_t (*open) (hid_t id, H5VL_loc_params_t params, hid_t req); herr_t (*copy) (hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, const char *dst_name, hid_t ocpypl_id, hid_t lcpl_id, hid_t req); herr_t (*visit) (hid_t loc_id, const char *obj_name, H5_index_t idx_type, H5_iter_order_t order, -- cgit v0.12