summaryrefslogtreecommitdiffstats
path: root/src/H5VL.c
diff options
context:
space:
mode:
authorMohamad Chaarawi <chaarawi@hdfgroup.org>2012-05-23 16:59:53 (GMT)
committerMohamad Chaarawi <chaarawi@hdfgroup.org>2012-05-23 16:59:53 (GMT)
commit7d289e8a697aba2f537a62d3b6352e357b3bd83b (patch)
treef8ee2ad40254c1a19f0512cca1eabdb06801c17c /src/H5VL.c
parent1440f1cd87522330ed5bff30d546cacc05adf18e (diff)
downloadhdf5-7d289e8a697aba2f537a62d3b6352e357b3bd83b.zip
hdf5-7d289e8a697aba2f537a62d3b6352e357b3bd83b.tar.gz
hdf5-7d289e8a697aba2f537a62d3b6352e357b3bd83b.tar.bz2
[svn-r22395] remove the high level ID implementation that wraps the actual ID, and
store the VOL plugin in an auxilary structure in the ID pointer.
Diffstat (limited to 'src/H5VL.c')
-rw-r--r--src/H5VL.c1188
1 files changed, 360 insertions, 828 deletions
diff --git a/src/H5VL.c b/src/H5VL.c
index ab675df..09f895e 100644
--- a/src/H5VL.c
+++ b/src/H5VL.c
@@ -52,7 +52,6 @@
/* Local Prototypes */
/********************/
static herr_t H5VL_free_cls(H5VL_class_t *cls);
-static herr_t H5VL_free_id_wrapper(H5VL_id_wrapper_t *id_struct);
/*-------------------------------------------------------------------------
@@ -108,22 +107,6 @@ H5VL_init_interface(void)
if(H5I_register_type(H5I_VOL, (size_t)H5I_VOL_HASHSIZE, 0, (H5I_free_t)H5VL_free_cls)<H5I_FILE)
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "unable to initialize interface")
- /* Register high level file user id */
- if(H5I_register_type(H5I_FILE_PUBLIC, (size_t)H5I_FILE_PUBLIC_HASHSIZE, 0, (H5I_free_t)H5VL_free_id_wrapper)<H5I_FILE)
- HGOTO_ERROR(H5E_ATOM, H5E_CANTINIT, FAIL, "unable to initialize interface")
- /* Register high level group user id */
- if(H5I_register_type(H5I_GROUP_PUBLIC, (size_t)H5I_GROUP_PUBLIC_HASHSIZE, 0, (H5I_free_t)H5VL_free_id_wrapper)<H5I_FILE)
- HGOTO_ERROR(H5E_ATOM, H5E_CANTINIT, FAIL, "unable to initialize interface")
- /* Register high level dataset user id */
- if(H5I_register_type(H5I_DATASET_PUBLIC, (size_t)H5I_DATASET_PUBLIC_HASHSIZE, 0, (H5I_free_t)H5VL_free_id_wrapper)<H5I_FILE)
- HGOTO_ERROR(H5E_ATOM, H5E_CANTINIT, FAIL, "unable to initialize interface")
- /* Register high level attribute user id */
- if(H5I_register_type(H5I_ATTR_PUBLIC, (size_t)H5I_ATTR_PUBLIC_HASHSIZE, 0, (H5I_free_t)H5VL_free_id_wrapper)<H5I_FILE)
- HGOTO_ERROR(H5E_ATOM, H5E_CANTINIT, FAIL, "unable to initialize interface")
- /* Register high level datatype user id */
- if(H5I_register_type(H5I_DATATYPE_PUBLIC, (size_t)H5I_DATATYPE_PUBLIC_HASHSIZE, 0, (H5I_free_t)H5VL_free_id_wrapper)<H5I_FILE)
- HGOTO_ERROR(H5E_ATOM, H5E_CANTINIT, FAIL, "unable to initialize interface")
-
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_init_interface() */
@@ -152,7 +135,7 @@ done:
int
H5VL_term_interface(void)
{
- int n = 0, n1 = 0, n2 = 0, n3 = 0, n4 = 0, n5 = 0, n6 = 0;
+ int n = 0, n1 = 0;
hbool_t term = TRUE;
FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -165,47 +148,12 @@ H5VL_term_interface(void)
H5I_dec_type_ref(H5I_VOL);
}
- if((n2=H5I_nmembers(H5I_FILE_PUBLIC))!=0) {
- H5I_clear_type(H5I_FILE_PUBLIC, TRUE, FALSE);
- term = FALSE;
- } else {
- H5I_dec_type_ref(H5I_FILE_PUBLIC);
- }
-
- if((n3=H5I_nmembers(H5I_DATASET_PUBLIC))!=0) {
- H5I_clear_type(H5I_DATASET_PUBLIC, FALSE, FALSE);
- term = FALSE;
- } else {
- H5I_dec_type_ref(H5I_DATASET_PUBLIC);
- }
-
- if((n4=H5I_nmembers(H5I_DATATYPE_PUBLIC))!=0) {
- H5I_clear_type(H5I_DATATYPE_PUBLIC, FALSE, FALSE);
- term = FALSE;
- } else {
- H5I_dec_type_ref(H5I_DATATYPE_PUBLIC);
- }
-
- if((n5=H5I_nmembers(H5I_GROUP_PUBLIC))!=0) {
- H5I_clear_type(H5I_GROUP_PUBLIC, FALSE, FALSE);
- term = FALSE;
- } else {
- H5I_dec_type_ref(H5I_GROUP_PUBLIC);
- }
-
- if((n6=H5I_nmembers(H5I_ATTR_PUBLIC))!=0) {
- H5I_clear_type(H5I_ATTR_PUBLIC, FALSE, FALSE);
- term = FALSE;
- } else {
- H5I_dec_type_ref(H5I_ATTR_PUBLIC);
- }
-
if (term) {
H5_interface_initialize_g = 0;
n = 1;
}
else {
- n = n1 + n2 + n3 + n4 + n5 + n6;
+ n = n1;
}
}
@@ -252,54 +200,6 @@ done:
/*-------------------------------------------------------------------------
- * Function: H5VL_free_id_wrapper
- *
- * Purpose: Frees the structure of a user level ID
- *
- * Return: Success: Non-negative
- *
- * Failure: Negative
- *
- * Programmer: Mohamad Chaarawi
- * March, 2012
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-H5VL_free_id_wrapper(H5VL_id_wrapper_t *id_struct)
-{
- int ref_count;
- herr_t ret_value = SUCCEED;
-
- FUNC_ENTER_NOAPI_NOINIT
-
- /* Sanity check */
- HDassert(id_struct);
-
- /* If we are freeing the id wrapper, then we need to call the free
- callback on the object ID in this wrapper, so just keep
- decrementing the ref count on the object id till it gets to 0
- and calls its free function */
- ref_count = H5I_get_ref(id_struct->obj_id, TRUE);
- while (ref_count > 0) {
- if((ref_count = H5I_dec_app_ref(id_struct->obj_id)) < 0)
- HGOTO_ERROR(H5E_SYM, H5E_CANTDEC, FAIL, "can't free")
- }
-
- /* decrement the number of reference on the VOL plugin */
- id_struct->vol_plugin->nrefs --;
-
- /* free the ID wrapper */
- H5MM_xfree(id_struct);
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5VL_free_id_wrapper() */
-
-
-/*-------------------------------------------------------------------------
* Function: H5VLregister
*
* Purpose: Registers a new vol plugin as a member of the virtual object
@@ -539,12 +439,41 @@ done:
/*-------------------------------------------------------------------------
+ * Function: H5VL_close
+ *
+ * Purpose: decrements the ref count on the number of references
+ * outstanding for a VOL plugin
+ *
+ * Return: Non-negative on success/Negative on failure
+ *
+ * Programmer: Mohamad Chaarawi
+ * May, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5VL_close(H5VL_class_t *vol_plugin)
+{
+ herr_t ret_value = SUCCEED;
+
+ FUNC_ENTER_NOAPI(FAIL)
+
+ vol_plugin->nrefs--;
+
+ if(0 == vol_plugin->nrefs)
+ H5MM_xfree(vol_plugin);
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5VL_close() */
+
+
+/*-------------------------------------------------------------------------
* Function: H5VL_attr_create
*
* Purpose: Creates an attribute through the VOL
*
- * Return: Success: User ID of the new attr. This ID is of type
- * H5I_ATTR_PUBLIC which contains the VOL plugin and the actual attr ID
+ * Return: Success: User ID of the new attr.
*
* Failure: FAIL
*
@@ -554,44 +483,28 @@ done:
*-------------------------------------------------------------------------
*/
hid_t
-H5VL_attr_create(hid_t uid, const char *name, hid_t acpl_id, hid_t aapl_id, hid_t req)
+H5VL_attr_create(hid_t id, const char *name, hid_t acpl_id, hid_t aapl_id, hid_t req)
{
- H5VL_id_wrapper_t *id_wrapper1; /* user id structure of the location where the attr will be created */
- H5VL_id_wrapper_t *id_wrapper2; /* user id structure of new created attr*/
- H5I_type_t id_type;
- hid_t loc_id; /* actual attr ID */
- hid_t ret_value; /* Return value */
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
+ hid_t ret_value; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
- id_type = H5I_get_type(uid);
- /* Check id */
- if(H5I_FILE_PUBLIC != id_type && H5I_GROUP_PUBLIC != id_type &&
- H5I_DATASET_PUBLIC != id_type && H5I_DATATYPE_PUBLIC != id_type)
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a user ID")
-
- /* get the ID struct */
- if(NULL == (id_wrapper1 = (H5VL_id_wrapper_t *)H5I_object(uid)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ if (NULL == (vol_plugin = (H5VL_class_t *)H5I_get_aux (id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "ID does not contain VOL information")
/* check if the corresponding VOL create callback exists */
- if(NULL == id_wrapper1->vol_plugin->attr_cls.create)
+ if(NULL == vol_plugin->attr_cls.create)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `attr create' method")
/* call the corresponding VOL create callback */
- if((loc_id = (id_wrapper1->vol_plugin->attr_cls.create)
- (id_wrapper1->obj_id, name, acpl_id, aapl_id, req)) < 0)
+ if((ret_value = (vol_plugin->attr_cls.create) (id, name, acpl_id, aapl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "create failed")
- /* Create a new id that points to a struct that holds the attr id and the VOL plugin */
- /* Allocate new id structure */
- if(NULL == (id_wrapper2 = (H5VL_id_wrapper_t *)H5MM_malloc(sizeof(H5VL_id_wrapper_t))))
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
- id_wrapper2->obj_id = loc_id;
- id_wrapper2->vol_plugin = id_wrapper1->vol_plugin;
-
- if((ret_value = H5I_register(H5I_ATTR_PUBLIC, id_wrapper2, TRUE)) < 0)
- HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize attr handle")
+ /* attach VOL information to the ID */
+ if (H5I_register_aux(ret_value, vol_plugin, (H5I_free_t)H5VL_close) < 0)
+ HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "can't attach vol info to ID")
+ vol_plugin->nrefs++;
done:
FUNC_LEAVE_NOAPI(ret_value)
@@ -603,8 +516,7 @@ done:
*
* Purpose: Opens an attribute through the VOL
*
- * Return: Success: User ID of the new attr. This ID is of type
- * H5I_ATTR_PUBLIC which contains the VOL plugin and the actual attr ID
+ * Return: Success: User ID of the new attr.
*
* Failure: FAIL
*
@@ -614,46 +526,29 @@ done:
*-------------------------------------------------------------------------
*/
hid_t
-H5VL_attr_open(hid_t loc_id, void *location, const char *name, hid_t aapl_id, hid_t req)
+H5VL_attr_open(hid_t id, void *location, const char *name, hid_t aapl_id, hid_t req)
{
- H5VL_id_wrapper_t *id_wrapper1; /* user id structure of the location where the attr will be opend */
- H5VL_id_wrapper_t *id_wrapper2; /* user id structure of new opend attr*/
- H5I_type_t id_type;
- hid_t attr_id; /* actual attr ID */
- hid_t ret_value; /* Return value */
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
+ hid_t ret_value; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
- id_type = H5I_get_type(loc_id);
- /* Check id */
- if(H5I_FILE_PUBLIC != id_type && H5I_GROUP_PUBLIC != id_type &&
- H5I_DATASET_PUBLIC != id_type && H5I_DATATYPE_PUBLIC != id_type &&
- H5I_ATTR_PUBLIC != id_type)
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a user ID")
-
- /* get the ID struct */
- if(NULL == (id_wrapper1 = (H5VL_id_wrapper_t *)H5I_object(loc_id)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ if (NULL == (vol_plugin = (H5VL_class_t *)H5I_get_aux (id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "ID does not contain VOL information")
/* check if the type specific corresponding VOL open callback exists */
- if(NULL == id_wrapper1->vol_plugin->attr_cls.open) {
+ if(NULL == vol_plugin->attr_cls.open) {
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `attr open' method")
}
/* call the corresponding VOL open callback */
- if((attr_id = (id_wrapper1->vol_plugin->attr_cls.open)
- (id_wrapper1->obj_id, location, name, aapl_id, req)) < 0)
+ if((ret_value = (vol_plugin->attr_cls.open) (id, location, name, aapl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "open failed")
- /* Create a new id that points to a struct that holds the attr id and the VOL plugin */
- /* Allocate new id structure */
- if(NULL == (id_wrapper2 = (H5VL_id_wrapper_t *)H5MM_malloc(sizeof(H5VL_id_wrapper_t))))
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
- id_wrapper2->obj_id = attr_id;
- id_wrapper2->vol_plugin = id_wrapper1->vol_plugin;
-
- if((ret_value = H5I_register(H5I_ATTR_PUBLIC, id_wrapper2, TRUE)) < 0)
- HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize attr handle")
+ /* attach VOL information to the ID */
+ if (H5I_register_aux(ret_value, vol_plugin, (H5I_free_t)H5VL_close) < 0)
+ HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "can't attach vol info to ID")
+ vol_plugin->nrefs++;
done:
FUNC_LEAVE_NOAPI(ret_value)
@@ -674,25 +569,19 @@ done:
*
*-------------------------------------------------------------------------
*/
-herr_t H5VL_attr_read(hid_t uid, hid_t mem_type_id, void *buf, hid_t req)
+herr_t H5VL_attr_read(hid_t id, hid_t mem_type_id, void *buf, hid_t req)
{
- H5VL_id_wrapper_t *id_wrapper; /* user id structure */
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
- /* Check/fix arguments. */
- if(H5I_ATTR_PUBLIC != H5I_get_type(uid))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a user ID")
-
- /* get the ID struct */
- if(NULL == (id_wrapper = (H5VL_id_wrapper_t *)H5I_object(uid)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ 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(NULL == id_wrapper->vol_plugin->attr_cls.read)
+ if(NULL == vol_plugin->attr_cls.read)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `attr read' method")
- if((ret_value = (id_wrapper->vol_plugin->attr_cls.read)
- (id_wrapper->obj_id, mem_type_id, buf, req)) < 0)
+ if((ret_value = (vol_plugin->attr_cls.read)(id, mem_type_id, buf, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTRELEASE, FAIL, "read failed")
done:
@@ -714,25 +603,19 @@ done:
*
*-------------------------------------------------------------------------
*/
-herr_t H5VL_attr_write(hid_t uid, hid_t mem_type_id, const void *buf, hid_t req)
+herr_t H5VL_attr_write(hid_t id, hid_t mem_type_id, const void *buf, hid_t req)
{
- H5VL_id_wrapper_t *id_wrapper; /* user id structure */
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
- /* Check/fix arguments. */
- if(H5I_ATTR_PUBLIC != H5I_get_type(uid))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a user ID")
+ if (NULL == (vol_plugin = (H5VL_class_t *)H5I_get_aux (id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "ID does not contain VOL information")
- /* get the ID struct */
- if(NULL == (id_wrapper = (H5VL_id_wrapper_t *)H5I_object(uid)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
-
- if(NULL == id_wrapper->vol_plugin->attr_cls.write)
+ if(NULL == vol_plugin->attr_cls.write)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `attr write' method")
- if((ret_value = (id_wrapper->vol_plugin->attr_cls.write)
- (id_wrapper->obj_id, mem_type_id, buf, req)) < 0)
+ if((ret_value = (vol_plugin->attr_cls.write)(id, mem_type_id, buf, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTRELEASE, FAIL, "write failed")
done:
@@ -755,56 +638,41 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5VL_attr_get(hid_t uid, H5VL_attr_get_t get_type, hid_t req, ...)
+H5VL_attr_get(hid_t id, H5VL_attr_get_t get_type, hid_t req, ...)
{
- H5VL_id_wrapper_t *id_wrapper; /* user id structure */
va_list arguments; /* argument list passed from the API call */
- H5I_type_t id_type; /* Type of ID */
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
- id_type = H5I_get_type(uid);
- /* Check id */
- if(H5I_FILE_PUBLIC != id_type && H5I_GROUP_PUBLIC != id_type &&
- H5I_DATASET_PUBLIC != id_type && H5I_DATATYPE_PUBLIC != id_type &&
- H5I_ATTR_PUBLIC != id_type)
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a user ID")
-
- /* get the ID struct */
- if(NULL == (id_wrapper = (H5VL_id_wrapper_t *)H5I_object(uid)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ 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(NULL == id_wrapper->vol_plugin->attr_cls.get)
+ if(NULL == vol_plugin->attr_cls.get)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `attr get' method")
va_start (arguments, req);
- if((ret_value = (id_wrapper->vol_plugin->attr_cls.get)(id_wrapper->obj_id, get_type, req,
- arguments)) < 0)
+ if((ret_value = (vol_plugin->attr_cls.get)(id, get_type, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "get failed")
va_end (arguments);
- /* if the get_type is a named datatype, create a wrapper for it */
+ /* if the get_type is a named datatype, attach the vol info to it */
if(H5VL_ATTR_GET_TYPE == get_type) {
- H5VL_id_wrapper_t *temp_id_wrapper; /* user id structure */
- hid_t *ret_id;
+ hid_t *ret_id;
va_start (arguments, req);
ret_id = va_arg (arguments, hid_t *);
- if(H5T_committed((H5T_t *)H5I_object_verify(*ret_id, H5I_DATATYPE))) {
- /* Create a new id that points to a struct that holds the attr id and the VOL plugin */
- /* Allocate new id structure */
- if(NULL == (temp_id_wrapper = (H5VL_id_wrapper_t *)H5MM_malloc(sizeof(H5VL_id_wrapper_t))))
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
- temp_id_wrapper->obj_id = *ret_id;
- temp_id_wrapper->vol_plugin = id_wrapper->vol_plugin;
-
- if((*ret_id = H5I_register(H5I_DATATYPE_PUBLIC, temp_id_wrapper, TRUE)) < 0)
- HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize attr handle")
+ if(H5Tcommitted(*ret_id)) {
+ /* attach VOL information to the ID */
+ if (H5I_register_aux(*ret_id, vol_plugin, (H5I_free_t)H5VL_close) < 0)
+ HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "can't attach vol info to ID")
+ vol_plugin->nrefs++;
}
va_end (arguments);
}
+
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_attr_get() */
@@ -825,24 +693,22 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5VL_attr_remove(hid_t loc_id, void *location, const char *attr_name, hid_t req)
+H5VL_attr_remove(hid_t id, void *location, const char *attr_name, hid_t req)
{
- H5VL_id_wrapper_t *id_wrapper; /* user id structure */
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
- /* get the ID struct */
- if(NULL == (id_wrapper = (H5VL_id_wrapper_t *)H5I_object(loc_id)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ 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 = (id_wrapper->vol_plugin->attr_cls.remove)
- (id_wrapper->obj_id, location, attr_name, req)) < 0)
+ if((ret_value = (vol_plugin->attr_cls.remove)(id, location, attr_name, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTDELETE, FAIL, "remove failed")
done:
FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5VL_attr_close() */
+} /* end H5VL_attr_remove() */
/*-------------------------------------------------------------------------
@@ -860,34 +726,25 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5VL_attr_close(hid_t uid, hid_t req)
+H5VL_attr_close(hid_t id, hid_t req)
{
- H5VL_id_wrapper_t *id_wrapper; /* user id structure */
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
- /* Check/fix arguments. */
- if(H5I_ATTR_PUBLIC != H5I_get_type(uid))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a user ID")
-
- /* get the ID struct */
- if(NULL == (id_wrapper = (H5VL_id_wrapper_t *)H5I_object(uid)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ 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 the VOL class does not implement a specific attr close
callback, try the generic object close */
- if(NULL == id_wrapper->vol_plugin->attr_cls.close){
- if(H5VL_object_close(uid, req) < 0)
+ if(NULL == vol_plugin->attr_cls.close){
+ if(H5VL_object_close(id, req) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "unable to close object")
}
else {
- if((ret_value = (id_wrapper->vol_plugin->attr_cls.close)(id_wrapper->obj_id, req)) < 0)
+ if((ret_value = (vol_plugin->attr_cls.close)(id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTRELEASE, FAIL, "close failed")
-
- id_wrapper->vol_plugin->nrefs--;
- if(H5I_dec_app_ref(uid) < 0)
- HGOTO_ERROR(H5E_VOL, H5E_CANTDEC, FAIL, "unable to decrement ref count on user ID")
}
done:
FUNC_LEAVE_NOAPI(ret_value)
@@ -909,42 +766,29 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5VL_datatype_commit(hid_t uid, const char *name, hid_t type_id, hid_t lcpl_id,
+H5VL_datatype_commit(hid_t id, const char *name, hid_t type_id, hid_t lcpl_id,
hid_t tcpl_id, hid_t tapl_id, hid_t req)
{
- H5VL_id_wrapper_t *id_wrapper1; /* wrapper object of the location where the datatype will be commitd */
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
- /* get the ID struct */
- if(NULL == (id_wrapper1 = (H5VL_id_wrapper_t *)H5I_object(uid)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ if (NULL == (vol_plugin = (H5VL_class_t *)H5I_get_aux(id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "ID does not contain VOL information")
/* check if the corresponding VOL commit callback exists */
- if(NULL == id_wrapper1->vol_plugin->datatype_cls.commit)
+ if(NULL == vol_plugin->datatype_cls.commit)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `datatype commit' method")
/* call the corresponding VOL commit callback */
- if((ret_value = (id_wrapper1->vol_plugin->datatype_cls.commit)
- (id_wrapper1->obj_id, name, type_id, lcpl_id, tcpl_id, tapl_id, req)) < 0)
+ if((ret_value = (vol_plugin->datatype_cls.commit)
+ (id, name, type_id, lcpl_id, tcpl_id, tapl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "commit failed")
-#if 0
- /* Create a new id that points to a struct that holds the datatype id and the VOL plugin */
- /* Allocate new id structure */
- if(NULL == (id_wrapper2 = (H5VL_id_wrapper_t *)H5MM_malloc(sizeof(H5VL_id_wrapper_t))))
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
-
- if((id_wrapper2->obj_id = H5I_register(H5I_DATATYPE, H5I_object(type_id), TRUE)) < 0)
- HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize datatype handle")
- id_wrapper2->vol_plugin = id_wrapper1->vol_plugin;
-
- H5I_register_cb(type_id, H5VL_get_wrapper_struct, id_wrapper2);
- //H5I_subst(type_id, id_wrapper2);
- //H5I_remove_verify(type_id, H5I_DATATYPE);
-
-#endif
+ if (H5I_register_aux(type_id, vol_plugin, (H5I_free_t)H5VL_close) < 0)
+ HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "can't attach vol info to ID")
+ vol_plugin->nrefs++;
done:
FUNC_LEAVE_NOAPI(ret_value)
@@ -956,8 +800,7 @@ done:
*
* Purpose: Opens a named datatype through the VOL
*
- * Return: Success: User ID of the datatype. This ID is of type
- * H5I_DATATYPE_PUBLIC which contains the VOL plugin and the actual datatype ID
+ * Return: Success: User ID of the datatype.
*
* Failure: FAIL
*
@@ -967,53 +810,43 @@ done:
*-------------------------------------------------------------------------
*/
hid_t
-H5VL_datatype_open(hid_t loc_id, const char *name, hid_t tapl_id, hid_t req)
+H5VL_datatype_open(hid_t id, const char *name, hid_t tapl_id, hid_t req)
{
- H5VL_id_wrapper_t *id_wrapper1; /* user id structure of the location where the datatype will be opend */
- H5VL_id_wrapper_t *id_wrapper2; /* user id structure of new opend datatype*/
- hid_t datatype_id; /* actual datatype ID */
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
hid_t ret_value; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
- /* get the ID struct */
- if(NULL == (id_wrapper1 = (H5VL_id_wrapper_t *)H5I_object(loc_id)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
-
+ if (NULL == (vol_plugin = (H5VL_class_t *)H5I_get_aux(id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "ID does not contain VOL information")
/* check if the type specific corresponding VOL open callback exists */
- if(NULL == id_wrapper1->vol_plugin->datatype_cls.open) {
+ if(NULL == vol_plugin->datatype_cls.open) {
void *location = NULL; /* a pointer to VOL specific token that indicates
the location of the object */
/* Get the token for the Object location through the VOL */
- if(H5VL_object_lookup (loc_id, H5VL_OBJECT_LOOKUP_BY_NAME, req, &location, name, tapl_id) < 0)
+ if(H5VL_object_lookup (id, H5VL_OBJECT_LOOKUP_BY_NAME, req, &location, name, tapl_id) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to locate object")
/* Open the object through the VOL */
- if((ret_value = H5VL_object_open_by_loc(loc_id, location, tapl_id, req)) < 0)
+ if((ret_value = H5VL_object_open_by_loc(id, location, tapl_id, req)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to open object")
if (NULL != location) {
/* free the location token through the VOL */
- if(H5VL_object_free_loc (loc_id, location, H5_REQUEST_NULL) < 0)
+ if(H5VL_object_free_loc (id, location, H5_REQUEST_NULL) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "unable to free location token")
}
}
else {
/* call the corresponding VOL open callback */
- if((datatype_id = (id_wrapper1->vol_plugin->datatype_cls.open)
- (id_wrapper1->obj_id, name, tapl_id, req)) < 0)
+ if((ret_value = (vol_plugin->datatype_cls.open)(id, name, tapl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "open failed")
- /* Create a new id that points to a struct that holds the datatype id and the VOL plugin */
- /* Allocate new id structure */
- if(NULL == (id_wrapper2 = (H5VL_id_wrapper_t *)H5MM_malloc(sizeof(H5VL_id_wrapper_t))))
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
- id_wrapper2->obj_id = datatype_id;
- id_wrapper2->vol_plugin = id_wrapper1->vol_plugin;
-
- if((ret_value = H5I_register(H5I_DATATYPE_PUBLIC, id_wrapper2, TRUE)) < 0)
- HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize datatype handle")
+ /* attach VOL information to the ID */
+ if (H5I_register_aux(ret_value, vol_plugin, (H5I_free_t)H5VL_close) < 0)
+ HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "can't attach vol info to ID")
+ vol_plugin->nrefs++;
}
done:
FUNC_LEAVE_NOAPI(ret_value)
@@ -1034,23 +867,22 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5VL_datatype_close(hid_t uid, hid_t req)
+H5VL_datatype_close(hid_t id, hid_t req)
{
- H5VL_id_wrapper_t *id_wrapper; /* wrapper object of the datatype to be closed */
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
- /* get the ID struct */
- if(NULL == (id_wrapper = (H5VL_id_wrapper_t *)H5I_object(uid)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ if (NULL == (vol_plugin = (H5VL_class_t *)H5I_get_aux(id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "ID does not contain VOL information")
/* check if the corresponding VOL close callback exists */
- if(NULL == id_wrapper->vol_plugin->datatype_cls.close)
+ if(NULL == vol_plugin->datatype_cls.close)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `datatype close' method")
/* call the corresponding VOL close callback */
- if((ret_value = (id_wrapper->vol_plugin->datatype_cls.close)(id_wrapper->obj_id, req)) < 0)
+ if((ret_value = (vol_plugin->datatype_cls.close)(id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTRELEASE, FAIL, "close failed")
done:
@@ -1063,8 +895,7 @@ done:
*
* Purpose: Creates a dataset through the VOL
*
- * Return: Success: User ID of the new dataset. This ID is of type
- * H5I_DATASET_PUBLIC which contains the VOL plugin and the actual dataset ID
+ * Return: Success: User ID of the new dataset.
*
* Failure: FAIL
*
@@ -1074,59 +905,28 @@ done:
*-------------------------------------------------------------------------
*/
hid_t
-H5VL_dataset_create(hid_t uid, const char *name, hid_t dcpl_id, hid_t dapl_id, hid_t req)
+H5VL_dataset_create(hid_t id, const char *name, hid_t dcpl_id, hid_t dapl_id, hid_t req)
{
- H5VL_id_wrapper_t *id_wrapper1; /* user id structure of the location where the dataset will be created */
- H5VL_id_wrapper_t *id_wrapper2; /* user id structure of new created dataset*/
- hid_t dataset_id; /* actual dataset ID */
- hid_t ret_value; /* Return value */
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
+ hid_t ret_value; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
- /* unwrap the datatype id if it is a named datatype */
- {
- H5VL_id_wrapper_t *id_wrapper;
- hid_t type_id;
- H5P_genplist_t *plist;
- /* Get the plist structure */
- if(NULL == (plist = (H5P_genplist_t *)H5I_object(dcpl_id)))
- HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
-
- /* get creation properties */
- if(H5P_get(plist, H5D_CRT_TYPE_ID_NAME, &type_id) < 0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get property value for datatype id")
-
- if(H5I_DATATYPE_PUBLIC == H5I_get_type(type_id)) {
- /* get the ID struct */
- if(NULL == (id_wrapper = (H5VL_id_wrapper_t *)H5I_object(type_id)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
-
- if(H5P_set(plist, H5D_CRT_TYPE_ID_NAME, &(id_wrapper->obj_id)) < 0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't set property value for datatype id")
- }
- }
- /* get the ID struct */
- if(NULL == (id_wrapper1 = (H5VL_id_wrapper_t *)H5I_object(uid)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ if (NULL == (vol_plugin = (H5VL_class_t *)H5I_get_aux(id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "ID does not contain VOL information")
/* check if the corresponding VOL create callback exists */
- if(NULL == id_wrapper1->vol_plugin->dataset_cls.create)
+ if(NULL == vol_plugin->dataset_cls.create)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `dataset create' method")
/* call the corresponding VOL create callback */
- if((dataset_id = (id_wrapper1->vol_plugin->dataset_cls.create)
- (id_wrapper1->obj_id, name, dcpl_id, dapl_id, req)) < 0)
+ if((ret_value = (vol_plugin->dataset_cls.create)(id, name, dcpl_id, dapl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "create failed")
- /* Create a new id that points to a struct that holds the dataset id and the VOL plugin */
- /* Allocate new id structure */
- if(NULL == (id_wrapper2 = (H5VL_id_wrapper_t *)H5MM_malloc(sizeof(H5VL_id_wrapper_t))))
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
- id_wrapper2->obj_id = dataset_id;
- id_wrapper2->vol_plugin = id_wrapper1->vol_plugin;
-
- if((ret_value = H5I_register(H5I_DATASET_PUBLIC, id_wrapper2, TRUE)) < 0)
- HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize dataset handle")
+ /* attach VOL information to the ID */
+ if (H5I_register_aux(ret_value, vol_plugin, (H5I_free_t)H5VL_close) < 0)
+ HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "can't attach vol info to ID")
+ vol_plugin->nrefs++;
done:
FUNC_LEAVE_NOAPI(ret_value)
@@ -1138,8 +938,7 @@ done:
*
* Purpose: Opens a dataset through the VOL
*
- * Return: Success: User ID of the new dataset. This ID is of type
- * H5I_DATASET_PUBLIC which contains the VOL plugin and the actual dataset ID
+ * Return: Success: User ID of the new dataset.
*
* Failure: FAIL
*
@@ -1149,53 +948,44 @@ done:
*-------------------------------------------------------------------------
*/
hid_t
-H5VL_dataset_open(hid_t loc_id, const char *name, hid_t dapl_id, hid_t req)
+H5VL_dataset_open(hid_t id, const char *name, hid_t dapl_id, hid_t req)
{
- H5VL_id_wrapper_t *id_wrapper1; /* user id structure of the location where the dataset will be opend */
- H5VL_id_wrapper_t *id_wrapper2; /* user id structure of new opend dataset*/
- hid_t dataset_id; /* actual dataset ID */
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
hid_t ret_value; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
- /* get the ID struct */
- if(NULL == (id_wrapper1 = (H5VL_id_wrapper_t *)H5I_object(loc_id)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ if (NULL == (vol_plugin = (H5VL_class_t *)H5I_get_aux(id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "ID does not contain VOL information")
/* check if the type specific corresponding VOL open callback exists */
- if(NULL == id_wrapper1->vol_plugin->dataset_cls.open) {
+ if(NULL == vol_plugin->dataset_cls.open) {
void *location = NULL; /* a pointer to VOL specific token that indicates
the location of the object */
/* Get the token for the Object location through the VOL */
- if(H5VL_object_lookup (loc_id, H5VL_OBJECT_LOOKUP_BY_NAME, req, &location, name, dapl_id) < 0)
+ if(H5VL_object_lookup (id, H5VL_OBJECT_LOOKUP_BY_NAME, req, &location, name, dapl_id) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to locate object")
/* Open the object through the VOL */
- if((ret_value = H5VL_object_open_by_loc(loc_id, location, dapl_id, req)) < 0)
+ if((ret_value = H5VL_object_open_by_loc(id, location, dapl_id, req)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to open object")
if (NULL != location) {
/* free the location token through the VOL */
- if(H5VL_object_free_loc (loc_id, location, H5_REQUEST_NULL) < 0)
+ if(H5VL_object_free_loc (id, location, H5_REQUEST_NULL) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "unable to free location token")
}
}
else {
/* call the corresponding VOL open callback */
- if((dataset_id = (id_wrapper1->vol_plugin->dataset_cls.open)
- (id_wrapper1->obj_id, name, dapl_id, req)) < 0)
+ if((ret_value = (vol_plugin->dataset_cls.open)(id, name, dapl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "open failed")
- /* Create a new id that points to a struct that holds the dataset id and the VOL plugin */
- /* Allocate new id structure */
- if(NULL == (id_wrapper2 = (H5VL_id_wrapper_t *)H5MM_malloc(sizeof(H5VL_id_wrapper_t))))
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
- id_wrapper2->obj_id = dataset_id;
- id_wrapper2->vol_plugin = id_wrapper1->vol_plugin;
-
- if((ret_value = H5I_register(H5I_DATASET_PUBLIC, id_wrapper2, TRUE)) < 0)
- HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize dataset handle")
+ /* attach VOL information to the ID */
+ if (H5I_register_aux(ret_value, vol_plugin, (H5I_free_t)H5VL_close) < 0)
+ HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "can't attach vol info to ID")
+ vol_plugin->nrefs++;
}
done:
FUNC_LEAVE_NOAPI(ret_value)
@@ -1216,26 +1006,22 @@ done:
*
*-------------------------------------------------------------------------
*/
-herr_t H5VL_dataset_read(hid_t uid, hid_t mem_type_id, hid_t mem_space_id,
+herr_t H5VL_dataset_read(hid_t id, hid_t mem_type_id, hid_t mem_space_id,
hid_t file_space_id, hid_t plist_id, void *buf, hid_t req)
{
- H5VL_id_wrapper_t *id_wrapper; /* user id structure */
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
- /* Check/fix arguments. */
- if(H5I_DATASET_PUBLIC != H5I_get_type(uid))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a user ID")
-
- /* get the ID struct */
- if(NULL == (id_wrapper = (H5VL_id_wrapper_t *)H5I_object(uid)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ 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(NULL == id_wrapper->vol_plugin->dataset_cls.read)
+ if(NULL == vol_plugin->dataset_cls.read)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `dataset read' method")
- if((ret_value = (id_wrapper->vol_plugin->dataset_cls.read)
- (id_wrapper->obj_id, mem_type_id, mem_space_id, file_space_id, plist_id, buf, req)) < 0)
+
+ if((ret_value = (vol_plugin->dataset_cls.read)
+ (id, mem_type_id, mem_space_id, file_space_id, plist_id, buf, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_READERROR, FAIL, "read failed")
done:
@@ -1257,26 +1043,22 @@ done:
*
*-------------------------------------------------------------------------
*/
-herr_t H5VL_dataset_write(hid_t uid, hid_t mem_type_id, hid_t mem_space_id,
+herr_t H5VL_dataset_write(hid_t id, hid_t mem_type_id, hid_t mem_space_id,
hid_t file_space_id, hid_t plist_id, const void *buf, hid_t req)
{
- H5VL_id_wrapper_t *id_wrapper; /* user id structure */
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
- /* Check/fix arguments. */
- if(H5I_DATASET_PUBLIC != H5I_get_type(uid))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a user ID")
-
- /* get the ID struct */
- if(NULL == (id_wrapper = (H5VL_id_wrapper_t *)H5I_object(uid)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ 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(NULL == id_wrapper->vol_plugin->dataset_cls.write)
+ if(NULL == vol_plugin->dataset_cls.write)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `dataset write' method")
- if((ret_value = (id_wrapper->vol_plugin->dataset_cls.write)
- (id_wrapper->obj_id, mem_type_id, mem_space_id, file_space_id, plist_id, buf, req)) < 0)
+
+ if((ret_value = (vol_plugin->dataset_cls.write)
+ (id, mem_type_id, mem_space_id, file_space_id, plist_id, buf, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_WRITEERROR, FAIL, "write failed")
done:
@@ -1298,24 +1080,20 @@ done:
*
*-------------------------------------------------------------------------
*/
-herr_t H5VL_dataset_set_extent(hid_t uid, const hsize_t size[], hid_t req)
+herr_t H5VL_dataset_set_extent(hid_t id, const hsize_t size[], hid_t req)
{
- H5VL_id_wrapper_t *id_wrapper; /* user id structure */
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
- /* Check/fix arguments. */
- if(H5I_DATASET_PUBLIC != H5I_get_type(uid))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset ID")
-
- /* get the ID struct */
- if(NULL == (id_wrapper = (H5VL_id_wrapper_t *)H5I_object(uid)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ 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(NULL == id_wrapper->vol_plugin->dataset_cls.set_extent)
+ if(NULL == vol_plugin->dataset_cls.set_extent)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `dataset set_extent' method")
- if((ret_value = (id_wrapper->vol_plugin->dataset_cls.set_extent)(id_wrapper->obj_id, size, req)) < 0)
+
+ if((ret_value = (vol_plugin->dataset_cls.set_extent)(id, size, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "set_extent failed")
done:
@@ -1338,49 +1116,37 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5VL_dataset_get(hid_t uid, H5VL_dataset_get_t get_type, hid_t req, ...)
+H5VL_dataset_get(hid_t id, H5VL_dataset_get_t get_type, hid_t req, ...)
{
- H5VL_id_wrapper_t *id_wrapper; /* user id structure */
va_list arguments; /* argument list passed from the API call */
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
- /* Check id */
- if(H5I_DATASET_PUBLIC != H5I_get_type(uid))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a user ID")
+ if (NULL == (vol_plugin = (H5VL_class_t *)H5I_get_aux(id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "ID does not contain VOL information")
- /* get the ID struct */
- if(NULL == (id_wrapper = (H5VL_id_wrapper_t *)H5I_object(uid)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
-
- if(NULL == id_wrapper->vol_plugin->dataset_cls.get)
+ if(NULL == vol_plugin->dataset_cls.get)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `dataset get' method")
va_start (arguments, req);
- if((ret_value = (id_wrapper->vol_plugin->dataset_cls.get)(id_wrapper->obj_id, get_type, req,
- arguments)) < 0)
+ if((ret_value = (vol_plugin->dataset_cls.get)(id, get_type, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "get failed")
va_end (arguments);
/* if the get_type is a named datatype, create a wrapper for it */
if(H5VL_DATASET_GET_TYPE == get_type) {
- H5VL_id_wrapper_t *temp_id_wrapper; /* user id structure */
- hid_t *ret_id;
+ hid_t *ret_id;
va_start (arguments, req);
ret_id = va_arg (arguments, hid_t *);
- if(H5T_committed((H5T_t *)H5I_object_verify(*ret_id, H5I_DATATYPE))) {
- /* Create a new id that points to a struct that holds the attr id and the VOL plugin */
- /* Allocate new id structure */
- if(NULL == (temp_id_wrapper = (H5VL_id_wrapper_t *)H5MM_malloc(sizeof(H5VL_id_wrapper_t))))
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
- temp_id_wrapper->obj_id = *ret_id;
- temp_id_wrapper->vol_plugin = id_wrapper->vol_plugin;
-
- if((*ret_id = H5I_register(H5I_DATATYPE_PUBLIC, temp_id_wrapper, TRUE)) < 0)
- HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize attr handle")
+ if(H5Tcommitted(*ret_id)) {
+ /* attach VOL information to the ID */
+ if (H5I_register_aux(*ret_id, vol_plugin, (H5I_free_t)H5VL_close) < 0)
+ HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "can't attach vol info to ID")
+ vol_plugin->nrefs++;
}
va_end (arguments);
}
@@ -1405,34 +1171,25 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5VL_dataset_close(hid_t uid, hid_t req)
+H5VL_dataset_close(hid_t id, hid_t req)
{
- H5VL_id_wrapper_t *id_wrapper; /* user id structure */
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
- /* Check/fix arguments. */
- if(H5I_DATASET_PUBLIC != H5I_get_type(uid))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a user ID")
-
- /* get the ID struct */
- if(NULL == (id_wrapper = (H5VL_id_wrapper_t *)H5I_object(uid)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ 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 the VOL class does not implement a specific dataset close
callback, try the generic object close */
- if(NULL == id_wrapper->vol_plugin->dataset_cls.close){
- if(H5VL_object_close(uid, req) < 0)
+ if(NULL == vol_plugin->dataset_cls.close){
+ if(H5VL_object_close(id, req) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "unable to close object")
}
else {
- if((ret_value = (id_wrapper->vol_plugin->dataset_cls.close)(id_wrapper->obj_id, req)) < 0)
+ if((ret_value = (vol_plugin->dataset_cls.close)(id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTRELEASE, FAIL, "close failed")
-
- id_wrapper->vol_plugin->nrefs--;
- if(H5I_dec_app_ref(uid) < 0)
- HGOTO_ERROR(H5E_VOL, H5E_CANTDEC, FAIL, "unable to decrement ref count on user ID")
}
done:
FUNC_LEAVE_NOAPI(ret_value)
@@ -1444,8 +1201,7 @@ done:
*
* Purpose: Opens a file through the VOL.
*
- * Return: Success: User ID of the new file. This ID is of type
- * H5I_FILE_PUBLIC which contains the VOL id and the actual file ID
+ * Return: Success: User ID of the new file.
*
* Failure: FAIL
*
@@ -1457,11 +1213,9 @@ done:
hid_t
H5VL_file_open(const char *name, unsigned flags, hid_t fapl_id, hid_t req)
{
- H5VL_class_t *vol_plugin; /* VOL for file */
- H5VL_id_wrapper_t *id_wrapper; /* user id structure */
- H5P_genplist_t *plist; /* Property list pointer */
- hid_t file_id;
- hid_t ret_value; /* Return value */
+ H5P_genplist_t *plist; /* Property list pointer */
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
+ hid_t ret_value; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
@@ -1475,19 +1229,14 @@ H5VL_file_open(const char *name, unsigned flags, hid_t fapl_id, hid_t req)
if(NULL == vol_plugin->file_cls.open)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `file open' method")
/* call the corresponding VOL open callback */
- if((file_id = (vol_plugin->file_cls.open)(name, flags, fapl_id, req)) < 0)
+ if((ret_value = (vol_plugin->file_cls.open)(name, flags, fapl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "open failed")
- /* Create a new id that points to a struct that holds the file 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 = file_id;
- id_wrapper->vol_plugin = vol_plugin;
- vol_plugin->nrefs ++;
+ /* attach VOL information to the ID */
+ if (H5I_register_aux(ret_value, vol_plugin, (H5I_free_t)H5VL_close) < 0)
+ HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "can't attach vol info to ID")
+ vol_plugin->nrefs++;
- if((ret_value = H5I_register(H5I_FILE_PUBLIC, id_wrapper, TRUE)) < 0)
- HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize file handle")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_file_open() */
@@ -1498,8 +1247,7 @@ done:
*
* Purpose: Creates a file through the VOL
*
- * Return: Success: User ID of the new file. This ID is of type
- * H5I_FILE_PUBLIC which contains the VOL id and the actual file ID
+ * Return: Success: User ID of the new file.
*
* Failure: FAIL
*
@@ -1511,10 +1259,8 @@ done:
hid_t
H5VL_file_create(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id, hid_t req)
{
- H5VL_class_t *vol_plugin; /* VOL for file */
- H5VL_id_wrapper_t *id_wrapper; /* user id structure */
- H5P_genplist_t *plist; /* Property list pointer */
- hid_t file_id;
+ H5P_genplist_t *plist; /* Property list pointer */
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
hid_t ret_value; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
@@ -1529,19 +1275,13 @@ H5VL_file_create(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id,
if(NULL == vol_plugin->file_cls.create)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `file create' method")
/* call the corresponding VOL create callback */
- if((file_id = (vol_plugin->file_cls.create)(name, flags, fcpl_id, fapl_id, req)) < 0)
+ if((ret_value = (vol_plugin->file_cls.create)(name, flags, fcpl_id, fapl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "create failed")
- /* Create a new id that points to a struct that holds the file id and the VOL id */
- /* 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 = file_id;
- id_wrapper->vol_plugin = vol_plugin;
- vol_plugin->nrefs ++;
-
- if((ret_value = H5I_register(H5I_FILE_PUBLIC, id_wrapper, TRUE)) < 0)
- HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize file handle")
+ /* attach VOL information to the ID */
+ if (H5I_register_aux(ret_value, vol_plugin, (H5I_free_t)H5VL_close) < 0)
+ HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "can't attach vol info to ID")
+ vol_plugin->nrefs++;
done:
FUNC_LEAVE_NOAPI(ret_value)
@@ -1563,24 +1303,19 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5VL_file_flush(hid_t uid, H5F_scope_t scope, hid_t req)
+H5VL_file_flush(hid_t id, H5F_scope_t scope, hid_t req)
{
- H5VL_id_wrapper_t *id_wrapper; /* user id structure */
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
- /* Check/fix arguments. */
- if(H5I_FILE_PUBLIC != H5I_get_type(uid))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a user ID")
+ if (NULL == (vol_plugin = (H5VL_class_t *)H5I_get_aux(id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "ID does not contain VOL information")
- /* get the ID struct */
- if(NULL == (id_wrapper = (H5VL_id_wrapper_t *)H5I_object(uid)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
-
- if(NULL == id_wrapper->vol_plugin->file_cls.flush)
+ if(NULL == vol_plugin->file_cls.flush)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `file flush' method")
- if((ret_value = (id_wrapper->vol_plugin->file_cls.flush)(id_wrapper->obj_id, scope, req)) < 0)
+ if((ret_value = (vol_plugin->file_cls.flush)(id, scope, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTFLUSH, FAIL, "flush failed")
done:
@@ -1603,32 +1338,22 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5VL_file_get(hid_t uid, H5VL_file_get_t get_type, hid_t req, ...)
+H5VL_file_get(hid_t id, H5VL_file_get_t get_type, hid_t req, ...)
{
- H5VL_id_wrapper_t *id_wrapper; /* user id structure */
va_list arguments; /* argument list passed from the API call */
- H5I_type_t id_type; /* Type of ID */
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
- id_type = H5I_get_type(uid);
- /* Check/fix arguments. */
- if (H5I_FILE_PUBLIC != id_type && H5I_GROUP_PUBLIC != id_type &&
- H5I_DATATYPE_PUBLIC != id_type && H5I_DATASET_PUBLIC != id_type &&
- H5I_ATTR_PUBLIC != id_type)
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a user ID")
-
- /* get the ID struct */
- if(NULL == (id_wrapper = (H5VL_id_wrapper_t *)H5I_object(uid)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ 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(NULL == id_wrapper->vol_plugin->file_cls.get)
+ if(NULL == vol_plugin->file_cls.get)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `file get' method")
va_start(arguments, req);
- if((ret_value = (id_wrapper->vol_plugin->file_cls.get)(id_wrapper->obj_id, get_type, req,
- arguments)) < 0)
+ if((ret_value = (vol_plugin->file_cls.get)(id, get_type, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "get failed")
va_end(arguments);
@@ -1651,32 +1376,22 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5VL_file_generic(hid_t uid, H5VL_file_generic_t generic_type, hid_t req, ...)
+H5VL_file_generic(hid_t id, H5VL_file_generic_t generic_type, hid_t req, ...)
{
- H5VL_id_wrapper_t *id_wrapper; /* user id structure */
va_list arguments; /* argument list passed from the API call */
- H5I_type_t id_type;
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
- id_type = H5I_get_type(uid);
- /* Check id */
- if(H5I_FILE_PUBLIC != id_type && H5I_GROUP_PUBLIC != id_type &&
- H5I_DATASET_PUBLIC != id_type && H5I_DATATYPE_PUBLIC != id_type &&
- H5I_FILE_PUBLIC != id_type)
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a user ID")
+ if (NULL == (vol_plugin = (H5VL_class_t *)H5I_get_aux(id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "ID does not contain VOL information")
- /* get the ID struct */
- if(NULL == (id_wrapper = (H5VL_id_wrapper_t *)H5I_object(uid)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
-
- if(NULL == id_wrapper->vol_plugin->file_cls.generic)
+ if(NULL == vol_plugin->file_cls.generic)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `file generic' method")
va_start (arguments, req);
- if((ret_value = (id_wrapper->vol_plugin->file_cls.generic)(id_wrapper->obj_id, generic_type, req,
- arguments)) < 0)
+ if((ret_value = (vol_plugin->file_cls.generic)(id, generic_type, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "generic failed")
va_end (arguments);
@@ -1700,30 +1415,21 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5VL_file_close(hid_t uid, hid_t req)
+H5VL_file_close(hid_t id, hid_t req)
{
- H5VL_id_wrapper_t *id_wrapper; /* user id structure */
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
- /* Check/fix arguments. */
- if(H5I_FILE_PUBLIC != H5I_get_type(uid))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a user ID")
-
- /* get the ID struct */
- if(NULL == (id_wrapper = (H5VL_id_wrapper_t *)H5I_object(uid)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ 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(NULL == id_wrapper->vol_plugin->file_cls.close)
+ if(NULL == vol_plugin->file_cls.close)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `file close' method")
- if((ret_value = (id_wrapper->vol_plugin->file_cls.close)(id_wrapper->obj_id, req)) < 0)
+ if((ret_value = (vol_plugin->file_cls.close)(id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTCLOSEFILE, FAIL, "close failed")
- id_wrapper->vol_plugin->nrefs--;
- if(H5I_dec_app_ref(uid) < 0)
- HGOTO_ERROR(H5E_FILE, H5E_CANTINC, FAIL, "unable to decrement ref count on user ID")
-
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_file_close() */
@@ -1734,8 +1440,7 @@ done:
*
* Purpose: Creates a group through the VOL
*
- * Return: Success: User ID of the new group. This ID is of type
- * H5I_GROUP_PUBLIC which contains the VOL plugin and the actual group ID
+ * Return: Success: User ID of the new group.
*
* Failure: FAIL
*
@@ -1745,37 +1450,28 @@ done:
*-------------------------------------------------------------------------
*/
hid_t
-H5VL_group_create(hid_t uid, const char *name, hid_t gcpl_id, hid_t gapl_id, hid_t req)
+H5VL_group_create(hid_t id, const char *name, hid_t gcpl_id, hid_t gapl_id, hid_t req)
{
- H5VL_id_wrapper_t *id_wrapper1; /* user id structure of the location where the group will be created */
- H5VL_id_wrapper_t *id_wrapper2; /* user id structure of new created group*/
- hid_t group_id; /* actual group ID */
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
hid_t ret_value; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
- /* get the ID struct */
- if(NULL == (id_wrapper1 = (H5VL_id_wrapper_t *)H5I_object(uid)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ if (NULL == (vol_plugin = (H5VL_class_t *)H5I_get_aux(id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "ID does not contain VOL information")
/* check if the corresponding VOL create callback exists */
- if(NULL == id_wrapper1->vol_plugin->group_cls.create)
+ if(NULL == vol_plugin->group_cls.create)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `group create' method")
/* call the corresponding VOL create callback */
- if((group_id = (id_wrapper1->vol_plugin->group_cls.create)
- (id_wrapper1->obj_id, name, gcpl_id, gapl_id, req)) < 0)
+ if((ret_value = (vol_plugin->group_cls.create)(id, name, gcpl_id, gapl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "create failed")
- /* 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_wrapper2 = (H5VL_id_wrapper_t *)H5MM_malloc(sizeof(H5VL_id_wrapper_t))))
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
- id_wrapper2->obj_id = group_id;
- id_wrapper2->vol_plugin = id_wrapper1->vol_plugin;
-
- if((ret_value = H5I_register(H5I_GROUP_PUBLIC, id_wrapper2, TRUE)) < 0)
- HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize group handle")
+ /* attach VOL information to the ID */
+ if (H5I_register_aux(ret_value, vol_plugin, (H5I_free_t)H5VL_close) < 0)
+ HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "can't attach vol info to ID")
+ vol_plugin->nrefs++;
done:
FUNC_LEAVE_NOAPI(ret_value)
@@ -1787,8 +1483,7 @@ done:
*
* Purpose: Opens a group through the VOL
*
- * Return: Success: User ID of the new group. This ID is of type
- * H5I_GROUP_PUBLIC which contains the VOL plugin and the actual group ID
+ * Return: Success: User ID of the new group.
*
* Failure: FAIL
*
@@ -1798,53 +1493,44 @@ done:
*-------------------------------------------------------------------------
*/
hid_t
-H5VL_group_open(hid_t loc_id, const char *name, hid_t gapl_id, hid_t req)
+H5VL_group_open(hid_t id, const char *name, hid_t gapl_id, hid_t req)
{
- H5VL_id_wrapper_t *id_wrapper1; /* user id structure of the location where the group will be opend */
- H5VL_id_wrapper_t *id_wrapper2; /* user id structure of new opend group*/
- hid_t group_id; /* actual group ID */
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
hid_t ret_value; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
- /* get the ID struct */
- if(NULL == (id_wrapper1 = (H5VL_id_wrapper_t *)H5I_object(loc_id)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ if (NULL == (vol_plugin = (H5VL_class_t *)H5I_get_aux(id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "ID does not contain VOL information")
/* check if the type specific corresponding VOL open callback exists */
- if(NULL == id_wrapper1->vol_plugin->group_cls.open) {
+ if(NULL == vol_plugin->group_cls.open) {
void *location = NULL; /* a pointer to VOL specific token that indicates
the location of the object */
/* Get the token for the Object location through the VOL */
- if(H5VL_object_lookup (loc_id, H5VL_OBJECT_LOOKUP_BY_NAME, req, &location, name, gapl_id) < 0)
+ if(H5VL_object_lookup (id, H5VL_OBJECT_LOOKUP_BY_NAME, req, &location, name, gapl_id) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to locate object")
/* Open the object through the VOL */
- if((ret_value = H5VL_object_open_by_loc(loc_id, location, gapl_id, req)) < 0)
+ if((ret_value = H5VL_object_open_by_loc(id, location, gapl_id, req)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to open object")
if (NULL != location) {
/* free the location token through the VOL */
- if(H5VL_object_free_loc (loc_id, location, H5_REQUEST_NULL) < 0)
+ if(H5VL_object_free_loc (id, location, H5_REQUEST_NULL) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "unable to free location token")
}
}
else {
/* call the corresponding VOL open callback */
- if((group_id = (id_wrapper1->vol_plugin->group_cls.open)
- (id_wrapper1->obj_id, name, gapl_id, req)) < 0)
+ if((ret_value = (vol_plugin->group_cls.open)(id, name, gapl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "open failed")
- /* 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_wrapper2 = (H5VL_id_wrapper_t *)H5MM_malloc(sizeof(H5VL_id_wrapper_t))))
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
- id_wrapper2->obj_id = group_id;
- id_wrapper2->vol_plugin = id_wrapper1->vol_plugin;
-
- if((ret_value = H5I_register(H5I_GROUP_PUBLIC, id_wrapper2, TRUE)) < 0)
- HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize group handle")
+ /* attach VOL information to the ID */
+ if (H5I_register_aux(ret_value, vol_plugin, (H5I_free_t)H5VL_close) < 0)
+ HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "can't attach vol info to ID")
+ vol_plugin->nrefs++;
}
done:
FUNC_LEAVE_NOAPI(ret_value)
@@ -1866,30 +1552,22 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5VL_group_get(hid_t uid, H5VL_group_get_t get_type, hid_t req, ...)
+H5VL_group_get(hid_t id, H5VL_group_get_t get_type, hid_t req, ...)
{
- H5VL_id_wrapper_t *id_wrapper; /* user id structure */
va_list arguments; /* argument list passed from the API call */
- H5I_type_t id_type; /* Type of ID */
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
- id_type = H5I_get_type(uid);
- /* Check/fix arguments. */
- if(H5I_GROUP_PUBLIC != id_type && H5I_FILE_PUBLIC != id_type)
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a user ID")
+ if (NULL == (vol_plugin = (H5VL_class_t *)H5I_get_aux(id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "ID does not contain VOL information")
- /* get the ID struct */
- if(NULL == (id_wrapper = (H5VL_id_wrapper_t *)H5I_object(uid)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
-
- if(NULL == id_wrapper->vol_plugin->group_cls.get)
+ if(NULL == vol_plugin->group_cls.get)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `group get' method")
va_start (arguments, req);
- if((ret_value = (id_wrapper->vol_plugin->group_cls.get)
- (id_wrapper->obj_id, get_type, req, arguments)) < 0)
+ if((ret_value = (vol_plugin->group_cls.get)(id, get_type, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "get failed")
va_end (arguments);
@@ -1913,35 +1591,25 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5VL_group_close(hid_t uid, hid_t req)
+H5VL_group_close(hid_t id, hid_t req)
{
- H5VL_id_wrapper_t *id_wrapper; /* user id structure */
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
- /* Check/fix arguments. */
- if(H5I_GROUP_PUBLIC != H5I_get_type(uid))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a user ID")
-
- /* get the ID struct */
- if(NULL == (id_wrapper = (H5VL_id_wrapper_t *)H5I_object(uid)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ 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 the VOL class does not implement a specific group close
callback, try the generic object close */
- if(NULL == id_wrapper->vol_plugin->group_cls.close) {
- if(H5VL_object_close(uid, req) < 0)
+ if(NULL == vol_plugin->group_cls.close) {
+ if(H5VL_object_close(id, req) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "unable to close object")
}
else {
- if((ret_value = (id_wrapper->vol_plugin->group_cls.close)(id_wrapper->obj_id, req)) < 0)
+ if((ret_value = (vol_plugin->group_cls.close)(id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTRELEASE, FAIL, "close failed")
-
- id_wrapper->vol_plugin->nrefs--;
-
- if(H5I_dec_app_ref(uid) < 0)
- HGOTO_ERROR(H5E_VOL, H5E_CANTDEC, FAIL, "unable to decrement ref count on user ID")
}
done:
FUNC_LEAVE_NOAPI(ret_value)
@@ -1961,17 +1629,20 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5VL_link_create(H5VL_link_create_type_t create_type, hid_t loc_id, const char *new_name,
+H5VL_link_create(H5VL_link_create_type_t create_type, hid_t id, const char *new_name,
hid_t lcpl_id, hid_t lapl_id, hid_t req)
{
- H5VL_class_t *vol_plugin = NULL; /* VOL plugin */
- hid_t new_id; /* unwrapped IDs */
+ H5VL_class_t *vol_plugin = NULL; /* VOL structure attached to id */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
- /* unwrap the target high level ID if the creation call is H5Lcreate_hard */
- if(H5VL_LINK_CREATE_HARD == create_type) {
+ /* get VOL plugin */
+ if(H5L_SAME_LOC != id) {
+ if (NULL == (vol_plugin = (H5VL_class_t *)H5I_get_aux(id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "ID does not contain VOL information")
+ }
+ else if(H5VL_LINK_CREATE_HARD == create_type && NULL == vol_plugin) {
H5P_genplist_t *plist; /* Property list pointer */
hid_t cur_id;
@@ -1982,38 +1653,11 @@ H5VL_link_create(H5VL_link_create_type_t create_type, hid_t loc_id, const char *
if(H5P_get(plist, H5L_CRT_TARGET_ID_NAME, &cur_id) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get property value for current location id")
- /* Only one of the IDs can be H5L_SAME_LOC, and the other one must
- be of the wrapper type. Get the VOL plugin struct in case the
- link id is H5L_SAME_LOC*/
- if (H5L_SAME_LOC != cur_id && H5I_DATATYPE != H5I_get_type(cur_id)) {
- H5VL_id_wrapper_t *id_wrapper;
-
- /* get the ID struct */
- if(NULL == (id_wrapper = (H5VL_id_wrapper_t *)H5I_object(cur_id)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
-
- vol_plugin = id_wrapper->vol_plugin;
- if(H5P_set(plist, H5L_CRT_TARGET_ID_NAME, &(id_wrapper->obj_id)) < 0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get property value for current location id")
- }
- }
-
- /* unwrap the higher level user ids. */
- if(H5L_SAME_LOC != loc_id && H5I_DATATYPE != H5I_get_type(loc_id)) {
- H5VL_id_wrapper_t *id_wrapper;
-
- /* get the ID struct */
- if(NULL == (id_wrapper = (H5VL_id_wrapper_t *)H5I_object(loc_id)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
-
- /* set the vol plugin sturcture if it hasn't been done yet */
- if (NULL == vol_plugin)
- vol_plugin = id_wrapper->vol_plugin;
-
- new_id = id_wrapper->obj_id;
+ if (NULL == (vol_plugin = (H5VL_class_t *)H5I_get_aux(cur_id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "ID does not contain VOL information")
}
else {
- new_id = loc_id;
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "ID does not contain VOL information")
}
/* check if the corresponding VOL create callback exists */
@@ -2022,7 +1666,7 @@ H5VL_link_create(H5VL_link_create_type_t create_type, hid_t loc_id, const char *
/* call the corresponding VOL create callback */
if((ret_value = (vol_plugin->link_cls.create)
- (create_type, new_id, new_name, lcpl_id, lapl_id, req)) < 0)
+ (create_type, id, new_name, lcpl_id, lapl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "link create failed")
done:
@@ -2047,35 +1691,21 @@ H5_DLL herr_t H5VL_link_move(hid_t src_loc_id, const char *src_name, hid_t dst_l
hid_t lcpl_id, hid_t lapl_id, hid_t req)
{
H5VL_class_t *vol_plugin = NULL; /* VOL plugin */
- H5VL_id_wrapper_t *id_wrapper;
- hid_t new_src_id, new_dst_id; /* unwrapped IDs */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
/* unwrap the higher level user ids. */
if(H5L_SAME_LOC != src_loc_id) {
- /* get the ID struct */
- if(NULL == (id_wrapper = (H5VL_id_wrapper_t *)H5I_object(src_loc_id)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
-
- vol_plugin = id_wrapper->vol_plugin;
- new_src_id = id_wrapper->obj_id;
+ if (NULL == (vol_plugin = (H5VL_class_t *)H5I_get_aux(src_loc_id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "ID does not contain VOL information")
}
- else {
- new_src_id = src_loc_id;
- }
-
- if(H5L_SAME_LOC != dst_loc_id) {
- /* get the ID struct */
- if(NULL == (id_wrapper = (H5VL_id_wrapper_t *)H5I_object(dst_loc_id)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
- if(NULL == vol_plugin)
- vol_plugin = id_wrapper->vol_plugin;
- new_dst_id = id_wrapper->obj_id;
+ else if(H5L_SAME_LOC != dst_loc_id) {
+ if (NULL == (vol_plugin = (H5VL_class_t *)H5I_get_aux(dst_loc_id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "ID does not contain VOL information")
}
else {
- new_dst_id = dst_loc_id;
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "ID does not contain VOL information")
}
/* check if the corresponding VOL move callback exists */
@@ -2084,7 +1714,7 @@ H5_DLL herr_t H5VL_link_move(hid_t src_loc_id, const char *src_name, hid_t dst_l
/* call the corresponding VOL move callback */
if((ret_value = (vol_plugin->link_cls.move)
- (new_src_id, src_name, new_dst_id, dst_name, copy_flag, lcpl_id, lapl_id, req)) < 0)
+ (src_loc_id, src_name, dst_loc_id, dst_name, copy_flag, lcpl_id, lapl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "link move failed")
done:
@@ -2107,24 +1737,22 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5VL_link_get(hid_t uid, H5VL_link_get_t get_type, hid_t req, ...)
+H5VL_link_get(hid_t id, H5VL_link_get_t get_type, hid_t req, ...)
{
- H5VL_id_wrapper_t *id_wrapper; /* user id structure */
va_list arguments; /* argument list passed from the API call */
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
- /* get the ID struct */
- if(NULL == (id_wrapper = (H5VL_id_wrapper_t *)H5I_object(uid)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ 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(NULL == id_wrapper->vol_plugin->link_cls.get)
+ if(NULL == vol_plugin->link_cls.get)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `link get' method")
va_start (arguments, req);
- if((ret_value = (id_wrapper->vol_plugin->link_cls.get)
- (id_wrapper->obj_id, get_type, req, arguments)) < 0)
+ if((ret_value = (vol_plugin->link_cls.get)(id, get_type, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "get failed")
va_end (arguments);
@@ -2145,23 +1773,22 @@ done:
*
*-------------------------------------------------------------------------
*/
-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 herr_t H5VL_link_remove(hid_t id, const char *name, void *udata, hid_t lapl_id, hid_t req)
{
- H5VL_id_wrapper_t *id_wrapper;
- herr_t ret_value = SUCCEED; /* Return value */
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
- if(NULL == (id_wrapper = (H5VL_id_wrapper_t *)H5I_object(loc_id)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ if (NULL == (vol_plugin = (H5VL_class_t *)H5I_get_aux(id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "ID does not contain VOL information")
/* check if the corresponding VOL remove callback exists */
- if(NULL == id_wrapper->vol_plugin->link_cls.remove)
+ if(NULL == vol_plugin->link_cls.remove)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `link remove' method")
/* call the corresponding VOL remove callback */
- if((ret_value = (id_wrapper->vol_plugin->link_cls.remove)
- (id_wrapper->obj_id, name, udata, lapl_id, req)) < 0)
+ if((ret_value = (vol_plugin->link_cls.remove)(id, name, udata, lapl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "link remove failed")
done:
@@ -2174,8 +1801,7 @@ done:
*
* Purpose: Opens a object through the VOL
*
- * Return: Success: User ID of the new object. This ID is of type
- * H5I_OBJECT_PUBLIC which contains the VOL plugin and the actual object ID
+ * Return: Success: User ID of the new object.
*
* Failure: FAIL
*
@@ -2185,53 +1811,28 @@ done:
*-------------------------------------------------------------------------
*/
hid_t
-H5VL_object_open_by_loc(hid_t uid, void *obj_loc, hid_t lapl_id, hid_t req)
+H5VL_object_open_by_loc(hid_t id, void *obj_loc, hid_t lapl_id, hid_t req)
{
- H5VL_id_wrapper_t *id_wrapper1; /* user id structure of the location where the object will be opend */
- H5VL_id_wrapper_t *id_wrapper2; /* user id structure of new opend object*/
- H5I_type_t id_type;
- hid_t object_id; /* actual object ID */
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
hid_t ret_value; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
- /* get the ID struct */
- if(NULL == (id_wrapper1 = (H5VL_id_wrapper_t *)H5I_object(uid)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ if (NULL == (vol_plugin = (H5VL_class_t *)H5I_get_aux(id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "ID does not contain VOL information")
/* check if the corresponding VOL open callback exists */
- if(NULL == id_wrapper1->vol_plugin->object_cls.open)
+ if(NULL == vol_plugin->object_cls.open)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `object open' method")
/* call the corresponding VOL open callback */
- if((object_id = (id_wrapper1->vol_plugin->object_cls.open)
- (id_wrapper1->obj_id, obj_loc, lapl_id, req)) < 0)
+ if((ret_value = (vol_plugin->object_cls.open)(id, obj_loc, lapl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "open failed")
- /* Create a new id that points to a struct that holds the object id and the VOL plugin */
- /* Allocate new id structure */
- if(NULL == (id_wrapper2 = (H5VL_id_wrapper_t *)H5MM_malloc(sizeof(H5VL_id_wrapper_t))))
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
- id_wrapper2->obj_id = object_id;
- id_wrapper2->vol_plugin = id_wrapper1->vol_plugin;
-
- id_type = H5I_get_type(object_id);
-
- if (H5I_GROUP == id_type) {
- if((ret_value = H5I_register(H5I_GROUP_PUBLIC, id_wrapper2, TRUE)) < 0)
- HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize object handle")
- }
- else if (H5I_DATATYPE == id_type) {
- if((ret_value = H5I_register(H5I_DATATYPE_PUBLIC, id_wrapper2, TRUE)) < 0)
- HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize object handle")
- }
- else if (H5I_DATASET == id_type) {
- if((ret_value = H5I_register(H5I_DATASET_PUBLIC, id_wrapper2, TRUE)) < 0)
- HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize object handle")
- }
- else {
- ret_value = object_id;
- }
+ /* attach VOL information to the ID */
+ if (H5I_register_aux(ret_value, vol_plugin, (H5I_free_t)H5VL_close) < 0)
+ HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "can't attach vol info to ID")
+ vol_plugin->nrefs++;
done:
FUNC_LEAVE_NOAPI(ret_value)
@@ -2255,25 +1856,25 @@ 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)
{
- H5VL_id_wrapper_t *id_wrapper1; /* user id structure of the location where the object will be opend */
- H5VL_id_wrapper_t *id_wrapper2; /* user id structure of new opend object*/
+ H5VL_class_t *vol_plugin1; /* VOL structure attached to src id */
+ H5VL_class_t *vol_plugin2; /* VOL structure attached to dest id */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
- /* unwrap the IDs and return an error if they belong to different VOL plugins */
- if(NULL == (id_wrapper1 = (H5VL_id_wrapper_t *)H5I_object(src_loc_id)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
- if(NULL == (id_wrapper2 = (H5VL_id_wrapper_t *)H5I_object(dst_loc_id)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ if (NULL == (vol_plugin1 = (H5VL_class_t *)H5I_get_aux(src_loc_id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "ID does not contain VOL information")
+ if (NULL == (vol_plugin2 = (H5VL_class_t *)H5I_get_aux(dst_loc_id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "ID does not contain VOL information")
- if (id_wrapper1->vol_plugin != id_wrapper2->vol_plugin)
+ /* check if both objects are associated with the same VOL plugin */
+ if (vol_plugin1 != vol_plugin2)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "Objects are accessed through different VOL plugins and can't be copied")
- if(NULL == id_wrapper1->vol_plugin->object_cls.copy)
+ if(NULL == vol_plugin1->object_cls.copy)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `object copy' method")
- if((ret_value = (id_wrapper1->vol_plugin->object_cls.copy)
- (id_wrapper1->obj_id, src_name, id_wrapper2->obj_id, dst_name, ocpypl_id, lcpl_id, req)) < 0)
+ if((ret_value = (vol_plugin1->object_cls.copy)
+ (src_loc_id, src_name, dst_loc_id, dst_name, ocpypl_id, lcpl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTRELEASE, FAIL, "copy failed")
done:
@@ -2296,32 +1897,22 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5VL_object_lookup(hid_t uid, H5VL_object_lookup_t lookup_type, hid_t req, ...)
+H5VL_object_lookup(hid_t id, H5VL_object_lookup_t lookup_type, hid_t req, ...)
{
- H5VL_id_wrapper_t *id_wrapper; /* user id structure */
va_list arguments; /* argument list passed from the API call */
- H5I_type_t id_type;
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
- id_type = H5I_get_type(uid);
- /* Check id */
- if(H5I_FILE_PUBLIC != id_type && H5I_GROUP_PUBLIC != id_type &&
- H5I_DATASET_PUBLIC != id_type && H5I_DATATYPE_PUBLIC != id_type &&
- H5I_ATTR_PUBLIC != id_type)
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a user ID")
-
- /* lookup the ID struct */
- if(NULL == (id_wrapper = (H5VL_id_wrapper_t *)H5I_object(uid)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ 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(NULL == id_wrapper->vol_plugin->object_cls.lookup)
+ if(NULL == vol_plugin->object_cls.lookup)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `object lookup' method")
va_start (arguments, req);
- if((ret_value = (id_wrapper->vol_plugin->object_cls.lookup)(id_wrapper->obj_id, lookup_type, req,
- arguments)) < 0)
+ if((ret_value = (vol_plugin->object_cls.lookup)(id, lookup_type, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "lookup of object location failed")
va_end (arguments);
done:
@@ -2343,29 +1934,20 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5VL_object_free_loc(hid_t loc_id, void *location, hid_t req)
+H5VL_object_free_loc(hid_t id, void *location, hid_t req)
{
- H5VL_id_wrapper_t *id_wrapper; /* user id structure */
- H5I_type_t id_type;
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
- id_type = H5I_get_type(loc_id);
- /* Check id */
- if(H5I_FILE_PUBLIC != id_type && H5I_GROUP_PUBLIC != id_type &&
- H5I_DATASET_PUBLIC != id_type && H5I_DATATYPE_PUBLIC != id_type &&
- H5I_ATTR_PUBLIC != id_type)
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a user ID")
-
- /* unwrap the ID struct */
- if(NULL == (id_wrapper = (H5VL_id_wrapper_t *)H5I_object(loc_id)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ 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(NULL == id_wrapper->vol_plugin->object_cls.free_loc)
+ if(NULL == vol_plugin->object_cls.free_loc)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `object free_loc' method")
- if((ret_value = (id_wrapper->vol_plugin->object_cls.free_loc)(location, req)) < 0)
+ if((ret_value = (vol_plugin->object_cls.free_loc)(location, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTRELEASE, FAIL, "freeing location token of object location failed")
done:
@@ -2388,32 +1970,22 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5VL_object_get(hid_t uid, H5VL_object_get_t get_type, hid_t req, ...)
+H5VL_object_get(hid_t id, H5VL_object_get_t get_type, hid_t req, ...)
{
- H5VL_id_wrapper_t *id_wrapper; /* user id structure */
va_list arguments; /* argument list passed from the API call */
- H5I_type_t id_type;
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
- id_type = H5I_get_type(uid);
- /* Check id */
- if(H5I_GROUP_PUBLIC != id_type && H5I_DATASET_PUBLIC != id_type &&
- H5I_DATATYPE_PUBLIC != id_type && H5I_FILE_PUBLIC != id_type &&
- H5I_ATTR_PUBLIC != id_type)
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a user ID")
+ if (NULL == (vol_plugin = (H5VL_class_t *)H5I_get_aux(id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "ID does not contain VOL information")
- /* get the ID struct */
- if(NULL == (id_wrapper = (H5VL_id_wrapper_t *)H5I_object(uid)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
-
- if(NULL == id_wrapper->vol_plugin->object_cls.get)
+ if(NULL == vol_plugin->object_cls.get)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `object get' method")
va_start (arguments, req);
- if((ret_value = (id_wrapper->vol_plugin->object_cls.get)(id_wrapper->obj_id, get_type, req,
- arguments)) < 0)
+ if((ret_value = (vol_plugin->object_cls.get)(id, get_type, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "get failed")
va_end (arguments);
done:
@@ -2435,51 +2007,36 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5VL_object_generic(hid_t uid, H5VL_object_generic_t generic_type, hid_t req, ...)
+H5VL_object_generic(hid_t id, H5VL_object_generic_t generic_type, hid_t req, ...)
{
- H5VL_id_wrapper_t *id_wrapper; /* user id structure */
va_list arguments; /* argument list passed from the API call */
- H5I_type_t id_type;
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
- id_type = H5I_get_type(uid);
- /* Check id */
- if(H5I_FILE_PUBLIC != id_type && H5I_GROUP_PUBLIC != id_type &&
- H5I_DATASET_PUBLIC != id_type && H5I_DATATYPE_PUBLIC != id_type &&
- H5I_ATTR_PUBLIC != id_type)
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a user ID")
-
- /* get the ID struct */
- if(NULL == (id_wrapper = (H5VL_id_wrapper_t *)H5I_object(uid)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ 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(NULL == id_wrapper->vol_plugin->object_cls.generic)
+ if(NULL == vol_plugin->object_cls.generic)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `object generic' method")
va_start (arguments, req);
- if((ret_value = (id_wrapper->vol_plugin->object_cls.generic)(id_wrapper->obj_id, generic_type, req,
- arguments)) < 0)
+ if((ret_value = (vol_plugin->object_cls.generic)(id, generic_type, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "generic failed")
va_end (arguments);
if(H5VL_ATTR_OPEN_BY_IDX == generic_type) {
- H5VL_id_wrapper_t *temp_id_wrapper; /* user id structure */
hid_t *ret_id;
va_start (arguments, req);
ret_id = va_arg (arguments, hid_t *);
- /* Create a new id that points to a struct that holds the attr id and the VOL plugin */
- /* Allocate new id structure */
- if(NULL == (temp_id_wrapper = (H5VL_id_wrapper_t *)H5MM_malloc(sizeof(H5VL_id_wrapper_t))))
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
- temp_id_wrapper->obj_id = *ret_id;
- temp_id_wrapper->vol_plugin = id_wrapper->vol_plugin;
+ /* attach VOL information to the ID */
+ if (H5I_register_aux(*ret_id, vol_plugin, (H5I_free_t)H5VL_close) < 0)
+ HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "can't attach vol info to ID")
+ vol_plugin->nrefs++;
- if((*ret_id = H5I_register(H5I_ATTR_PUBLIC, temp_id_wrapper, TRUE)) < 0)
- HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize attr handle")
va_end (arguments);
}
done:
@@ -2502,46 +2059,21 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5VL_object_close(hid_t uid, hid_t req)
+H5VL_object_close(hid_t id, hid_t req)
{
- H5VL_id_wrapper_t *id_wrapper; /* user id structure */
- H5I_type_t id_type;
+ H5VL_class_t *vol_plugin; /* VOL structure attached to id */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
- id_type = H5I_get_type(uid);
-
- /* In case of a named datatype being closed with H5Oopen after an
- H5Tcommit, the id is still of type H5I_DATATYPE and not
- H5I_DATATYPE_PUBLIC. In that case we just fall back to the
- native implementation */
- if(H5I_DATATYPE == id_type) {
- if(H5I_object(uid) == NULL)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a valid object")
- if(H5I_dec_app_ref(uid) < 0)
- HGOTO_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "unable to close object")
- HGOTO_DONE(ret_value)
- }
-
- /* Check id */
- if(H5I_GROUP_PUBLIC != H5I_get_type(uid) && H5I_DATASET_PUBLIC != H5I_get_type(uid) &&
- H5I_DATATYPE_PUBLIC != H5I_get_type(uid))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a user ID")
+ if (NULL == (vol_plugin = (H5VL_class_t *)H5I_get_aux(id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "ID does not contain VOL information")
- /* get the ID struct */
- if(NULL == (id_wrapper = (H5VL_id_wrapper_t *)H5I_object(uid)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
-
- if(NULL == id_wrapper->vol_plugin->object_cls.close)
+ if(NULL == vol_plugin->object_cls.close)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `object close' method")
- if((ret_value = (id_wrapper->vol_plugin->object_cls.close)(id_wrapper->obj_id, req)) < 0)
+ if((ret_value = (vol_plugin->object_cls.close)(id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTRELEASE, FAIL, "close failed")
- id_wrapper->vol_plugin->nrefs--;
- if(H5I_dec_app_ref(uid) < 0)
- HGOTO_ERROR(H5E_VOL, H5E_CANTDEC, FAIL, "unable to decrement ref count on user ID")
-
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_object_close() */