diff options
Diffstat (limited to 'src/H5VL.c')
-rw-r--r-- | src/H5VL.c | 1188 |
1 files changed, 360 insertions, 828 deletions
@@ -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() */ |