summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMohamad Chaarawi <chaarawi@hdfgroup.org>2012-03-07 14:21:12 (GMT)
committerMohamad Chaarawi <chaarawi@hdfgroup.org>2012-03-07 14:21:12 (GMT)
commita318d2846c5e6f5cef635c8aa1e54d004aa33ff7 (patch)
tree13e44b533da59e542effa39603c831c73b359a85 /src
parentd7147ff0eca5df777e2d9371aca7d1d98cbe45b4 (diff)
downloadhdf5-a318d2846c5e6f5cef635c8aa1e54d004aa33ff7.zip
hdf5-a318d2846c5e6f5cef635c8aa1e54d004aa33ff7.tar.gz
hdf5-a318d2846c5e6f5cef635c8aa1e54d004aa33ff7.tar.bz2
[svn-r22032] - move all HDF5 library access for H5F routines to the native layer, higher layer only handle ids
- create a high level user id to return to users to hold vol id and object id - all H5 callbacks implemented except for get_object_count/ids - some bug fixes, test suite fails for now pending update to user ids of other objects
Diffstat (limited to 'src')
-rw-r--r--src/H5F.c474
-rw-r--r--src/H5Fefc.c29
-rw-r--r--src/H5Fpkg.h2
-rw-r--r--src/H5Fprivate.h1
-rw-r--r--src/H5Ftest.c39
-rw-r--r--src/H5G.c17
-rw-r--r--src/H5Gloc.c14
-rw-r--r--src/H5I.c229
-rw-r--r--src/H5Iprivate.h10
-rw-r--r--src/H5Ipublic.h1
-rw-r--r--src/H5L.c34
-rw-r--r--src/H5O.c2
-rw-r--r--src/H5VL.c257
-rw-r--r--src/H5VLnative.c455
-rw-r--r--src/H5VLprivate.h4
-rw-r--r--src/H5VLpublic.h113
16 files changed, 1086 insertions, 595 deletions
diff --git a/src/H5F.c b/src/H5F.c
index cce9a5d..c81b034 100644
--- a/src/H5F.c
+++ b/src/H5F.c
@@ -36,6 +36,9 @@
#include "H5SMprivate.h" /* Shared Object Header Messages */
#include "H5Tprivate.h" /* Datatypes */
+/* Declare a free list to manage the H5I_t struct */
+H5FL_DEFINE_STATIC(H5I_t);
+
/* Struct only used by functions H5F_get_objects and H5F_get_objects_cb */
typedef struct H5F_olist_t {
H5I_type_t obj_type; /* Type of object to look for */
@@ -183,24 +186,15 @@ H5F_term_interface(void)
*-------------------------------------------------------------------------
*/
hid_t
-H5Fget_create_plist(hid_t file_id)
+H5Fget_create_plist(hid_t uid)
{
- H5F_t *file; /* File info */
- H5P_genplist_t *plist; /* Property list */
hid_t ret_value; /* Return value */
FUNC_ENTER_API(H5Fget_create_plist, FAIL)
- H5TRACE1("i", "i", file_id);
-
- /* check args */
- if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
- if(NULL == (plist = (H5P_genplist_t *)H5I_object(file->shared->fcpl_id)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
+ H5TRACE1("i", "i", uid);
- /* Create the property list object to return */
- if((ret_value = H5P_copy_plist(plist, TRUE)) < 0)
- HGOTO_ERROR(H5E_INTERNAL, H5E_CANTINIT, FAIL, "unable to copy file creation properties")
+ if(H5VL_get(uid, H5F_GET_FCPL, &ret_value, 0, NULL) < 0)
+ HGOTO_ERROR(H5E_INTERNAL, H5E_CANTGET, FAIL, "unable to get file creation properties")
done:
FUNC_LEAVE_API(ret_value)
@@ -229,21 +223,15 @@ done:
*-------------------------------------------------------------------------
*/
hid_t
-H5Fget_access_plist(hid_t file_id)
+H5Fget_access_plist(hid_t uid)
{
- H5F_t *f; /* File info */
hid_t ret_value; /* Return value */
FUNC_ENTER_API(H5Fget_access_plist, FAIL)
- H5TRACE1("i", "i", file_id);
+ H5TRACE1("i", "i", uid);
- /* Check args */
- if(NULL == (f = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
-
- /* Retrieve the file's access property list */
- if((ret_value = H5F_get_access_plist(f, TRUE)) < 0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get file access property list")
+ if(H5VL_get(uid, H5F_GET_FAPL, &ret_value, 0, NULL) < 0)
+ HGOTO_ERROR(H5E_INTERNAL, H5E_CANTGET, FAIL, "unable to get file creation properties")
done:
FUNC_LEAVE_API(ret_value)
@@ -335,12 +323,13 @@ H5F_get_access_plist(H5F_t *f, hbool_t app_ref)
HGOTO_ERROR(H5E_FILE, H5E_CANTINC, FAIL, "unable to increment ref count on VFL driver")
if(H5P_set(new_plist, H5F_ACS_FILE_DRV_ID_NAME, &(f->shared->lf->driver_id)) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set file driver ID")
-
+#if 0
/* Increment the reference count on the VOL ID and insert it into the property list */
if(H5I_inc_ref(f->vol_id, FALSE) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTINC, FAIL, "unable to increment ref count on VOL")
if(H5P_set(new_plist, H5F_ACS_VOL_ID_NAME, &(f->vol_id)) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set file VOL ID")
+#endif
/* Set the driver "info" in the property list */
driver_info = H5FD_fapl_get(f->shared->lf);
@@ -384,15 +373,27 @@ done:
*-------------------------------------------------------------------------
*/
ssize_t
-H5Fget_obj_count(hid_t file_id, unsigned types)
+H5Fget_obj_count(hid_t uid, unsigned types)
{
H5F_t *f = NULL; /* File to query */
- ssize_t ret_value; /* Return value */
+ H5I_t *uid_info; /* user id structure */
+ hid_t id;
+ ssize_t ret_value; /* Return value */
FUNC_ENTER_API(H5Fget_obj_count, FAIL)
- H5TRACE2("Zs", "iIu", file_id, types);
+ H5TRACE2("Zs", "iIu", uid, types);
- if(file_id != (hid_t)H5F_OBJ_ALL && (NULL == (f = (H5F_t *)H5I_object_verify(file_id, H5I_FILE))))
+ if (H5I_UID == H5I_get_type(uid)) {
+ if(NULL == (uid_info = (H5I_t *)H5I_object(uid)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ id = uid_info->obj_id;
+ }
+ else {
+ id = uid;
+ }
+
+ if(id != (hid_t)H5F_OBJ_ALL &&
+ (NULL == (f = (H5F_t *)H5I_object_verify(id, H5I_FILE))))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file id")
if(0 == (types & H5F_OBJ_ALL))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not an object type")
@@ -457,15 +458,27 @@ H5F_get_obj_count(const H5F_t *f, unsigned types, hbool_t app_ref)
*-------------------------------------------------------------------------
*/
ssize_t
-H5Fget_obj_ids(hid_t file_id, unsigned types, size_t max_objs, hid_t *oid_list)
+H5Fget_obj_ids(hid_t uid, unsigned types, size_t max_objs, hid_t *oid_list)
{
- H5F_t *f = NULL; /* File to query */
- ssize_t ret_value; /* Return value */
+ H5F_t *f = NULL; /* File to query */
+ H5I_t *uid_info; /* user id structure */
+ hid_t id;
+ ssize_t ret_value; /* Return value */
FUNC_ENTER_API(H5Fget_obj_ids, FAIL)
- H5TRACE4("Zs", "iIuz*i", file_id, types, max_objs, oid_list);
+ H5TRACE4("Zs", "iIuz*i", uid, types, max_objs, oid_list);
+
+ if (H5I_UID == H5I_get_type(uid)) {
+ if(NULL == (uid_info = (H5I_t *)H5I_object(uid)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ id = uid_info->obj_id;
+ }
+ else {
+ id = uid;
+ }
- if(file_id != (hid_t)H5F_OBJ_ALL && (NULL == (f = (H5F_t *)H5I_object_verify(file_id, H5I_FILE))))
+ if(id != (hid_t)H5F_OBJ_ALL &&
+ (NULL == (f = (H5F_t *)H5I_object_verify(id, H5I_FILE))))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file id")
if(0 == (types & H5F_OBJ_ALL))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not an object type")
@@ -474,6 +487,8 @@ H5Fget_obj_ids(hid_t file_id, unsigned types, size_t max_objs, hid_t *oid_list)
/* H5F_get_objects doesn't fail */
ret_value = (ssize_t)H5F_get_obj_ids(f, types, max_objs, oid_list, TRUE);
+ if (H5I_replace_with_uids (oid_list, ret_value) <= 0)
+ HGOTO_ERROR(H5E_ATOM, H5E_CANTGET, FAIL, "can't get IDs")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Fget_obj_ids() */
@@ -623,9 +638,9 @@ H5F_get_objects_cb(void *obj_ptr, hid_t obj_id, void *key)
/* Count file IDs */
if(olist->obj_type == H5I_FILE) {
if((olist->file_info.local &&
- (!olist->file_info.ptr.file || (olist->file_info.ptr.file && (H5F_t*)obj_ptr == olist->file_info.ptr.file) ))
- || (!olist->file_info.local &&
- ( !olist->file_info.ptr.shared || (olist->file_info.ptr.shared && ((H5F_t*)obj_ptr)->shared == olist->file_info.ptr.shared) ))) {
+ (!olist->file_info.ptr.file || (olist->file_info.ptr.file && (H5F_t*)obj_ptr == olist->file_info.ptr.file) ))
+ || (!olist->file_info.local &&
+ ( !olist->file_info.ptr.shared || (olist->file_info.ptr.shared && ((H5F_t*)obj_ptr)->shared == olist->file_info.ptr.shared) ))) {
/* Add the object's ID to the ID list, if appropriate */
if(olist->obj_id_list) {
olist->obj_id_list[olist->list_index] = obj_id;
@@ -674,6 +689,7 @@ H5F_get_objects_cb(void *obj_ptr, hid_t obj_id, void *key)
case H5I_REFERENCE:
case H5I_VFL:
case H5I_VOL:
+ case H5I_UID:
case H5I_GENPROP_CLS:
case H5I_GENPROP_LST:
case H5I_ERROR_CLASS:
@@ -731,25 +747,19 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5Fget_vfd_handle(hid_t file_id, hid_t fapl, void **file_handle)
+H5Fget_vfd_handle(hid_t uid, hid_t fapl, void **file_handle)
{
- H5F_t *file; /* File to query */
- herr_t ret_value = SUCCEED; /* Return value */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(H5Fget_vfd_handle, FAIL)
- H5TRACE3("e", "ii**x", file_id, fapl, file_handle);
+ H5TRACE3("e", "ii**x", uid, fapl, file_handle);
/* Check args */
if(!file_handle)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file handle pointer")
- /* Get the file */
- if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file id")
-
- /* Retrieve the VFD handle for the file */
- if(H5F_get_vfd_handle(file, fapl, file_handle) < 0)
- HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't retrieve VFD handle")
+ if((ret_value = H5VL_get(uid, H5F_GET_VFD_HANDLE, &fapl, 1, file_handle)) < 0)
+ HGOTO_ERROR(H5E_INTERNAL, H5E_CANTGET, FAIL, "unable to get file handle")
done:
FUNC_LEAVE_API(ret_value)
@@ -1547,104 +1557,13 @@ done:
herr_t
H5Fflush(hid_t object_id, H5F_scope_t scope)
{
- H5F_t *f = NULL; /* File to flush */
- H5O_loc_t *oloc = NULL; /* Object location for ID */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(H5Fflush, FAIL)
H5TRACE2("e", "iFs", object_id, scope);
- switch(H5I_get_type(object_id)) {
- case H5I_FILE:
- if(NULL == (f = (H5F_t *)H5I_object(object_id)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid file identifier")
- break;
-
- case H5I_GROUP:
- {
- H5G_t *grp;
-
- if(NULL == (grp = (H5G_t *)H5I_object(object_id)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid group identifier")
- oloc = H5G_oloc(grp);
- }
- break;
-
- case H5I_DATATYPE:
- {
- H5T_t *type;
-
- if(NULL == (type = (H5T_t *)H5I_object(object_id)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid type identifier")
- oloc = H5T_oloc(type);
- }
- break;
-
- case H5I_DATASET:
- {
- H5D_t *dset;
-
- if(NULL == (dset = (H5D_t *)H5I_object(object_id)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid dataset identifier")
- oloc = H5D_oloc(dset);
- }
- break;
-
- case H5I_ATTR:
- {
- H5A_t *attr;
-
- if(NULL == (attr = (H5A_t *)H5I_object(object_id)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid attribute identifier")
- oloc = H5A_oloc(attr);
- }
- break;
-
- case H5I_UNINIT:
- case H5I_BADID:
- case H5I_DATASPACE:
- case H5I_REFERENCE:
- case H5I_VFL:
- case H5I_VOL:
- case H5I_GENPROP_CLS:
- case H5I_GENPROP_LST:
- case H5I_ERROR_CLASS:
- case H5I_ERROR_MSG:
- case H5I_ERROR_STACK:
- case H5I_NTYPES:
- default:
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file or file object")
- } /* end switch */
-
- if(!f) {
- if(!oloc)
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "object is not assocated with a file")
- f = oloc->file;
- } /* end if */
- if(!f)
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "object is not associated with a file")
-
- /* Flush the file */
- /*
- * Nothing to do if the file is read only. This determination is
- * made at the shared open(2) flags level, implying that opening a
- * file twice, once for read-only and once for read-write, and then
- * calling H5Fflush() with the read-only handle, still causes data
- * to be flushed.
- */
- if(H5F_ACC_RDWR & H5F_INTENT(f)) {
- /* Flush other files, depending on scope */
- if(H5F_SCOPE_GLOBAL == scope) {
- /* Call the flush routine for mounted file hierarchies */
- if(H5F_flush_mounts(f, H5AC_dxpl_id) < 0)
- HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush mounted file hierarchy")
- } /* end if */
- else {
- /* Call the flush routine, for this file */
- if(H5F_flush(f, H5AC_dxpl_id, FALSE) < 0)
- HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush file's cached information")
- } /* end else */
- } /* end if */
+ if((ret_value = H5VL_flush(object_id, scope)) < 0)
+ HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush file")
done:
FUNC_LEAVE_API(ret_value)
@@ -1990,15 +1909,24 @@ done:
*-------------------------------------------------------------------------
*/
hid_t
-H5Freopen(hid_t file_id)
+H5Freopen(hid_t uid)
{
H5F_t *old_file = NULL;
H5F_t *new_file = NULL;
- hid_t ret_value;
+ H5I_t *uid_info, *new_uid_info;
+ hid_t file_id, new_file_id, ret_value;
FUNC_ENTER_API(H5Freopen, FAIL)
H5TRACE1("i", "i", file_id);
+ /* Get the file */
+ if(H5I_UID != H5I_get_type(uid))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a user ID")
+ if(NULL == (uid_info = (H5I_t *)H5I_object(uid)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+
+ file_id = uid_info->obj_id;
+
/* Check arguments */
if(NULL == (old_file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
@@ -2007,11 +1935,6 @@ H5Freopen(hid_t file_id)
if(NULL == (new_file = H5F_new(old_file->shared, H5P_FILE_CREATE_DEFAULT, H5P_FILE_ACCESS_DEFAULT, NULL)))
HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to reopen file")
- /* assign the vol id to this file and increment the ref count on it */
- new_file->vol_id = old_file->vol_id;
- if(H5I_inc_ref(new_file->vol_id, FALSE) < 0)
- HGOTO_ERROR(H5E_FILE, H5E_CANTINC, FAIL, "unable to increment ref count on VOL")
-
/* Keep old file's read/write intent in new file */
new_file->intent = old_file->intent;
@@ -2019,11 +1942,21 @@ H5Freopen(hid_t file_id)
new_file->open_name = H5MM_xstrdup(old_file->open_name);
new_file->actual_name = H5MM_xstrdup(old_file->actual_name);
- if((ret_value = H5I_register(H5I_FILE, new_file, TRUE)) < 0)
+ if((new_file_id = H5I_register(H5I_FILE, new_file, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize file handle")
/* Keep this ID in file object structure */
- new_file->file_id = ret_value;
+ new_file->file_id = new_file_id;
+
+#if 1
+ if(NULL == (new_uid_info = H5FL_MALLOC(H5I_t)))
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+ new_uid_info->obj_id = new_file_id;
+ new_uid_info->vol_id = uid_info->vol_id;
+
+ if((ret_value = H5I_register(H5I_UID, new_uid_info, TRUE)) < 0)
+ HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize file handle")
+#endif
done:
if(ret_value < 0 && new_file)
@@ -2048,30 +1981,18 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5Fget_intent(hid_t file_id, unsigned *intent_flags)
+H5Fget_intent(hid_t uid, unsigned *intent_flags)
{
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(H5Fget_intent, FAIL)
- H5TRACE2("e", "i*Iu", file_id, intent_flags);
+ H5TRACE2("e", "i*Iu", uid, intent_flags);
/* If no intent flags were passed in, exit quietly */
if(intent_flags) {
- H5F_t * file; /* Pointer to file structure */
-
- /* Get the internal file structure */
- if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
-
- /* HDF5 uses some flags internally that users don't know about.
- * Simplify things for them so that they only get either H5F_ACC_RDWR
- * or H5F_ACC_RDONLY.
- */
- if(H5F_INTENT(file) & H5F_ACC_RDWR)
- *intent_flags = H5F_ACC_RDWR;
- else
- *intent_flags = H5F_ACC_RDONLY;
- } /* end if */
+ if((ret_value = H5VL_get(uid, H5F_GET_INTENT, (void *)intent_flags, 0, NULL)) < 0)
+ HGOTO_ERROR(H5E_INTERNAL, H5E_CANTGET, FAIL, "unable to get file intent")
+ }
done:
FUNC_LEAVE_API(ret_value)
@@ -2467,24 +2388,15 @@ H5F_addr_decode(const H5F_t *f, const uint8_t **pp/*in,out*/, haddr_t *addr_p/*o
*-------------------------------------------------------------------------
*/
hssize_t
-H5Fget_freespace(hid_t file_id)
+H5Fget_freespace(hid_t uid)
{
- H5F_t *file; /* File object for file ID */
- hsize_t tot_space; /* Amount of free space in the file */
hssize_t ret_value; /* Return value */
FUNC_ENTER_API(H5Fget_freespace, FAIL)
- H5TRACE1("Hs", "i", file_id);
+ H5TRACE1("Hs", "i", uid);
- /* Check args */
- if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
-
- /* Go get the actual amount of free space in the file */
- if(H5MF_get_freespace(file, H5AC_ind_dxpl_id, &tot_space, NULL) < 0)
- HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to check free space for file")
-
- ret_value = (hssize_t)tot_space;
+ if(H5VL_get(uid, H5F_GET_FREE_SPACE, &ret_value, 0, NULL) < 0)
+ HGOTO_ERROR(H5E_INTERNAL, H5E_CANTGET, FAIL, "unable to get file free space")
done:
FUNC_LEAVE_API(ret_value)
@@ -2510,24 +2422,15 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5Fget_filesize(hid_t file_id, hsize_t *size)
+H5Fget_filesize(hid_t uid, hsize_t *size)
{
- H5F_t *file; /* File object for file ID */
- haddr_t eof; /* End of file address */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(H5Fget_filesize, FAIL)
- H5TRACE2("e", "i*h", file_id, size);
-
- /* Check args */
- if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
+ H5TRACE2("e", "i*h", uid, size);
- /* Go get the actual file size */
- if(HADDR_UNDEF == (eof = H5FDget_eof(file->shared->lf)))
- HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to get file size")
-
- *size = (hsize_t)eof;
+ if((ret_value = H5VL_get(uid, H5F_GET_SIZE, (void *)size, 0, NULL)) < 0)
+ HGOTO_ERROR(H5E_INTERNAL, H5E_CANTGET, FAIL, "unable to get file size")
done:
FUNC_LEAVE_API(ret_value)
@@ -2553,23 +2456,19 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5Fget_mdc_config(hid_t file_id, H5AC_cache_config_t *config_ptr)
+H5Fget_mdc_config(hid_t uid, H5AC_cache_config_t *config_ptr)
{
- H5F_t *file; /* File object for file ID */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(H5Fget_mdc_config, FAIL)
- H5TRACE2("e", "i*x", file_id, config_ptr);
+ H5TRACE2("e", "i*x", uid, config_ptr);
- /* Check args */
- if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
+ /* check args */
if((NULL == config_ptr) || (config_ptr->version != H5AC__CURR_CACHE_CONFIG_VERSION))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Bad config_ptr")
- /* Go get the resize configuration */
- if(H5AC_get_cache_auto_resize_config(file->shared->cache, config_ptr) < 0)
- HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_get_cache_auto_resize_config() failed.")
+ if((ret_value = H5VL_get(uid, H5F_GET_MDC_CONF, (void *)config_ptr, 0, NULL)) < 0)
+ HGOTO_ERROR(H5E_INTERNAL, H5E_CANTGET, FAIL, "unable to get mdc config")
done:
FUNC_LEAVE_API(ret_value)
@@ -2592,16 +2491,22 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5Fset_mdc_config(hid_t file_id, H5AC_cache_config_t *config_ptr)
+H5Fset_mdc_config(hid_t uid, H5AC_cache_config_t *config_ptr)
{
H5F_t *file; /* File object for file ID */
+ H5I_t *uid_info; /* user id structure */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(H5Fset_mdc_config, FAIL)
- H5TRACE2("e", "i*x", file_id, config_ptr);
+ H5TRACE2("e", "i*x", uid, config_ptr);
+
+ if(H5I_UID != H5I_get_type(uid))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a user ID")
+ if(NULL == (uid_info = (H5I_t *)H5I_object(uid)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
/* Check args */
- if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
+ if(NULL == (file = (H5F_t *)H5I_object_verify(uid_info->obj_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
/* set the resize configuration */
@@ -2630,24 +2535,18 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5Fget_mdc_hit_rate(hid_t file_id, double *hit_rate_ptr)
+H5Fget_mdc_hit_rate(hid_t uid, double *hit_rate_ptr)
{
- H5F_t *file; /* File object for file ID */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(H5Fget_mdc_hit_rate, FAIL)
- H5TRACE2("e", "i*d", file_id, hit_rate_ptr);
-
- /* Check args */
- if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
+ H5TRACE2("e", "i*d", uid, hit_rate_ptr);
if(NULL == hit_rate_ptr)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "NULL hit rate pointer")
- /* Go get the current hit rate */
- if(H5AC_get_cache_hit_rate(file->shared->cache, hit_rate_ptr) < 0)
- HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_get_cache_hit_rate() failed.")
+ if((ret_value = H5VL_get(uid, H5F_GET_MDC_HR, (void *)hit_rate_ptr, 0, NULL)) < 0)
+ HGOTO_ERROR(H5E_INTERNAL, H5E_CANTGET, FAIL, "unable to get MDC hit rate")
done:
FUNC_LEAVE_API(ret_value)
@@ -2672,28 +2571,21 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5Fget_mdc_size(hid_t file_id, size_t *max_size_ptr, size_t *min_clean_size_ptr,
+H5Fget_mdc_size(hid_t uid, size_t *max_size_ptr, size_t *min_clean_size_ptr,
size_t *cur_size_ptr, int *cur_num_entries_ptr)
{
- H5F_t *file; /* File object for file ID */
- int32_t cur_num_entries;
+ void *argv[3];
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(H5Fget_mdc_size, FAIL)
- H5TRACE5("e", "i*z*z*z*Is", file_id, max_size_ptr, min_clean_size_ptr,
+ H5TRACE5("e", "i*z*z*z*Is", uid, max_size_ptr, min_clean_size_ptr,
cur_size_ptr, cur_num_entries_ptr);
- /* Check args */
- if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
-
- /* Go get the size data */
- if(H5AC_get_cache_size(file->shared->cache, max_size_ptr,
- min_clean_size_ptr, cur_size_ptr, &cur_num_entries) < 0)
- HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_get_cache_size() failed.")
-
- if(cur_num_entries_ptr != NULL)
- *cur_num_entries_ptr = (int)cur_num_entries;
+ argv[0] = (void *)max_size_ptr;
+ argv[1] = (void *)min_clean_size_ptr;
+ argv[2] = (void *)cur_size_ptr;
+ if((ret_value = H5VL_get(uid, H5F_GET_MDC_SIZE, (void *)cur_num_entries_ptr, 3, argv)) < 0)
+ HGOTO_ERROR(H5E_INTERNAL, H5E_CANTGET, FAIL, "unable to get MDC hit rate")
done:
FUNC_LEAVE_API(ret_value)
@@ -2721,16 +2613,22 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5Freset_mdc_hit_rate_stats(hid_t file_id)
+H5Freset_mdc_hit_rate_stats(hid_t uid)
{
H5F_t *file; /* File object for file ID */
+ H5I_t *uid_info; /* user id structure */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(H5Freset_mdc_hit_rate_stats, FAIL)
- H5TRACE1("e", "i", file_id);
+ H5TRACE1("e", "i", uid);
+
+ if(H5I_UID != H5I_get_type(uid))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a user ID")
+ if(NULL == (uid_info = (H5I_t *)H5I_object(uid)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
/* Check args */
- if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
+ if(NULL == (file = (H5F_t *)H5I_object_verify(uid_info->obj_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
/* Reset the hit rate statistic */
@@ -2765,42 +2663,18 @@ done:
*-------------------------------------------------------------------------
*/
ssize_t
-H5Fget_name(hid_t obj_id, char *name/*out*/, size_t size)
+H5Fget_name(hid_t uid, char *name/*out*/, size_t size)
{
- H5F_t *f; /* Top file in mount hierarchy */
- size_t len;
+ void *argv[2]; /* arguments to the VOL callback */
ssize_t ret_value;
FUNC_ENTER_API (H5Fget_name, FAIL)
- H5TRACE3("Zs", "ixz", obj_id, name, size);
-
- /* For file IDs, get the file object directly */
- /* (This prevents the H5G_loc() call from returning the file pointer for
- * the top file in a mount hierarchy)
- */
- if(H5I_get_type(obj_id) == H5I_FILE ) {
- if(NULL == (f = (H5F_t *)H5I_object(obj_id)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
- } /* end if */
- else {
- H5G_loc_t loc; /* Object location */
+ H5TRACE3("Zs", "ixz", uid, name, size);
- /* Get symbol table entry */
- if(H5G_loc(obj_id, &loc) < 0)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a valid object ID")
- f = loc.oloc->file;
- } /* end else */
-
- len = HDstrlen(H5F_OPEN_NAME(f));
-
- if(name) {
- HDstrncpy(name, H5F_OPEN_NAME(f), MIN(len + 1,size));
- if(len >= size)
- name[size-1]='\0';
- } /* end if */
-
- /* Set return value */
- ret_value = (ssize_t)len;
+ argv[0] = &ret_value;
+ argv[1] = &size;
+ if(H5VL_get(uid, H5F_GET_NAME, (void *)name, 2, argv) < 0)
+ HGOTO_ERROR(H5E_INTERNAL, H5E_CANTGET, FAIL, "unable to get file name")
done:
FUNC_LEAVE_API(ret_value)
@@ -2825,57 +2699,19 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5Fget_info2(hid_t obj_id, H5F_info2_t *finfo)
+H5Fget_info2(hid_t uid, H5F_info2_t *finfo)
{
- H5F_t *f; /* Top file in mount hierarchy */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(H5Fget_info2, FAIL)
- H5TRACE2("e", "i*x", obj_id, finfo);
+ H5TRACE2("e", "i*x", uid, finfo);
/* Check args */
if(!finfo)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no info struct")
- /* For file IDs, get the file object directly */
- /* (This prevents the H5G_loc() call from returning the file pointer for
- * the top file in a mount hierarchy)
- */
- if(H5I_get_type(obj_id) == H5I_FILE ) {
- if(NULL == (f = (H5F_t *)H5I_object(obj_id)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
- } /* end if */
- else {
- H5G_loc_t loc; /* Object location */
-
- /* Get symbol table entry */
- if(H5G_loc(obj_id, &loc) < 0)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a valid object ID")
- f = loc.oloc->file;
- } /* end else */
- HDassert(f->shared);
-
- /* Reset file info struct */
- HDmemset(finfo, 0, sizeof(*finfo));
-
- /* Get the size of the superblock and any superblock extensions */
- if(H5F_super_size(f, H5AC_ind_dxpl_id, &finfo->super.super_size, &finfo->super.super_ext_size) < 0)
- HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "Unable to retrieve superblock sizes")
-
- /* Get the size of any persistent free space */
- if(H5MF_get_freespace(f, H5AC_ind_dxpl_id, &finfo->free.tot_space, &finfo->free.meta_size) < 0)
- HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "Unable to retrieve free space information")
-
- /* Check for SOHM info */
- if(H5F_addr_defined(f->shared->sohm_addr))
- if(H5SM_ih_size(f, H5AC_ind_dxpl_id, &finfo->sohm.hdr_size, &finfo->sohm.msgs_info) < 0)
- HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "Unable to retrieve SOHM index & heap storage info")
-
- /* Set version # fields */
- finfo->super.version = f->shared->sblock->super_vers;
- finfo->sohm.version = f->shared->sohm_vers;
- finfo->free.version = HDF5_FREESPACE_VERSION;
-
+ if((ret_value = H5VL_get(uid, H5F_GET_INFO, (void *)finfo, 0, NULL)) < 0)
+ HGOTO_ERROR(H5E_INTERNAL, H5E_CANTGET, FAIL, "unable to get file info")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Fget_info2() */
@@ -2897,25 +2733,25 @@ done:
*-------------------------------------------------------------------------
*/
ssize_t
-H5Fget_free_sections(hid_t file_id, H5F_mem_t type, size_t nsects,
+H5Fget_free_sections(hid_t uid, H5F_mem_t type, size_t nsects,
H5F_sect_info_t *sect_info/*out*/)
{
- H5F_t *file; /* Top file in mount hierarchy */
+ void *argv[3];
ssize_t ret_value; /* Return value */
FUNC_ENTER_API(H5Fget_free_sections, FAIL)
- H5TRACE4("Zs", "iFmzx", file_id, type, nsects, sect_info);
+ H5TRACE4("Zs", "iFmzx", uid, type, nsects, sect_info);
/* Check args */
- if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
if(sect_info && nsects == 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "nsects must be > 0")
- /* Go get the free-space section information in the file */
- if((ret_value = H5MF_get_free_sections(file, H5AC_ind_dxpl_id, type, nsects, sect_info)) < 0)
- HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to check free space for file")
+ argv[0] = &ret_value;
+ argv[1] = &type;
+ argv[2] = &nsects;
+ if(H5VL_get(uid, H5F_GET_FREE_SECTIONS, (void *)sect_info, 3, argv) < 0)
+ HGOTO_ERROR(H5E_INTERNAL, H5E_CANTGET, FAIL, "unable to get file info")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Fget_free_sections() */
@@ -2936,16 +2772,22 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5Fclear_elink_file_cache(hid_t file_id)
+H5Fclear_elink_file_cache(hid_t uid)
{
H5F_t *file; /* File */
+ H5I_t *uid_info; /* user id structure */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(H5Fclear_elink_file_cache, FAIL)
- H5TRACE1("e", "i", file_id);
+ H5TRACE1("e", "i", uid);
/* Check args */
- if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
+ if(H5I_UID != H5I_get_type(uid))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a user ID")
+ if(NULL == (uid_info = (H5I_t *)H5I_object(uid)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+
+ if(NULL == (file = (H5F_t *)H5I_object_verify(uid_info->obj_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
/* Release the EFC */
diff --git a/src/H5Fefc.c b/src/H5Fefc.c
index f8330db..3bebad5 100644
--- a/src/H5Fefc.c
+++ b/src/H5Fefc.c
@@ -148,9 +148,6 @@ H5F_efc_open(H5F_t *parent, const char *name, unsigned flags, hid_t fcpl_id,
H5F_efc_t *efc = NULL; /* External file cache for parent file */
H5F_efc_ent_t *ent = NULL; /* Entry for target file in efc */
hbool_t open_file = FALSE; /* Whether ent->file needs to be closed in case of error */
- H5P_genplist_t *plist ; /* Property list pointer */
- hid_t vol_id = -1; /* VOL ID */
- H5VL_class_t *vol_plugin; /* VOL for file */
H5F_t *ret_value = NULL; /* Return value */
FUNC_ENTER_NOAPI_NOINIT(H5F_efc_open)
@@ -160,6 +157,7 @@ H5F_efc_open(H5F_t *parent, const char *name, unsigned flags, hid_t fcpl_id,
HDassert(parent->shared);
HDassert(name);
+#if 0
/* get the VOL info from the fapl */
if(NULL == (plist = (H5P_genplist_t *)H5I_object(fapl_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list")
@@ -167,6 +165,7 @@ H5F_efc_open(H5F_t *parent, const char *name, unsigned flags, hid_t fcpl_id,
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get vol plugin ID")
if(NULL == (vol_plugin = (H5VL_class_t *)H5I_object(vol_id)))
HGOTO_ERROR(H5E_VOL, H5E_BADVALUE, NULL, "invalid vol plugin ID in file access property list")
+#endif
/* Get external file cache */
efc = parent->shared->efc;
@@ -175,12 +174,12 @@ H5F_efc_open(H5F_t *parent, const char *name, unsigned flags, hid_t fcpl_id,
* support this so clients do not have to make 2 different calls depending
* on the state of the efc. */
if(!efc) {
-#if 0
+#if 1
if(NULL == (ret_value = H5F_open(name, flags, fcpl_id, fapl_id,
dxpl_id)))
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "can't open file")
#endif
-#if 1
+#if 0
/* check if the corresponding VOL open callback exists */
if(NULL == vol_plugin->file_cls.open)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, NULL, "vol plugin has no `file open' method")
@@ -261,12 +260,12 @@ H5F_efc_open(H5F_t *parent, const char *name, unsigned flags, hid_t fcpl_id,
} /* end if */
else {
/* Cannot cache file, just open file and return */
-#if 0
+#if 1
if(NULL == (ret_value = H5F_open(name, flags, fcpl_id, fapl_id,
dxpl_id)))
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "can't open file")
#endif
-#if 1
+#if 0
/* check if the corresponding VOL open callback exists */
if(NULL == vol_plugin->file_cls.open)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, NULL, "vol plugin has no `file open' method")
@@ -294,13 +293,13 @@ H5F_efc_open(H5F_t *parent, const char *name, unsigned flags, hid_t fcpl_id,
/* Build new entry */
if(NULL == (ent->name = H5MM_strdup(name)))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
-#if 0
+#if 1
/* Open the file */
if(NULL == (ent->file = H5F_open(name, flags, fcpl_id, fapl_id,
dxpl_id)))
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "can't open file")
#endif
-#if 1
+#if 0
/* check if the corresponding VOL open callback exists */
if(NULL == vol_plugin->file_cls.open)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, NULL, "vol plugin has no `file open' method")
@@ -356,9 +355,6 @@ done:
if(ent) {
if(open_file) {
ent->file->nopen_objs--;
- /* Decrement ref count on VOL ID */
- if(H5I_dec_ref(ent->file->vol_id) < 0)
- HDONE_ERROR(H5E_VOL, H5E_CANTDEC, NULL, "can't close plugin ID")
if(H5F_try_close(ent->file) < 0)
HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, NULL, "can't close external file")
} /* end if */
@@ -408,9 +404,6 @@ H5F_efc_close(H5F_t *parent, H5F_t *file)
* on the state of the efc. */
if(!efc) {
file->nopen_objs--;
- /* Decrement ref count on VOL ID */
- if(H5I_dec_ref(file->vol_id) < 0)
- HGOTO_ERROR(H5E_VOL, H5E_CANTDEC, FAIL, "can't close plugin ID")
if(H5F_try_close(file) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close external file")
@@ -425,9 +418,6 @@ H5F_efc_close(H5F_t *parent, H5F_t *file)
for(ent = efc->LRU_head; ent && ent->file != file; ent = ent->LRU_next);
if(!ent) {
file->nopen_objs--;
- /* Decrement ref count on VOL ID */
- if(H5I_dec_ref(file->vol_id) < 0)
- HGOTO_ERROR(H5E_VOL, H5E_CANTDEC, FAIL, "can't close plugin ID")
if(H5F_try_close(file) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close external file")
} /* end if */
@@ -636,9 +626,6 @@ H5F_efc_remove_ent(H5F_efc_t *efc, H5F_efc_ent_t *ent)
* However we must still manipulate the nopen_objs field to prevent the file
* from being closed out from under us. */
ent->file->nopen_objs--;
- /* Decrement ref count on VOL ID */
- if(H5I_dec_ref(ent->file->vol_id) < 0)
- HGOTO_ERROR(H5E_VOL, H5E_CANTDEC, FAIL, "can't close plugin ID")
if(H5F_try_close(ent->file) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close external file")
ent->file = NULL;
diff --git a/src/H5Fpkg.h b/src/H5Fpkg.h
index bb6cc4e..5c6223b 100644
--- a/src/H5Fpkg.h
+++ b/src/H5Fpkg.h
@@ -274,7 +274,7 @@ struct H5F_t {
hbool_t closing; /* File is in the process of being closed */
struct H5F_t *parent; /* Parent file that this file is mounted to */
unsigned nmounts; /* Number of children mounted to this file */
- hid_t vol_id; /* id of the vol plugin used to open the file */
+ //hid_t vol_id; /* id of the vol plugin used to open the file */
//H5VL_class_t vol_cls; /* class of the VOL plugin */
};
diff --git a/src/H5Fprivate.h b/src/H5Fprivate.h
index 776f349..70f73c6 100644
--- a/src/H5Fprivate.h
+++ b/src/H5Fprivate.h
@@ -40,7 +40,6 @@ typedef struct H5F_file_t H5F_file_t;
/* Block aggregation structure */
typedef struct H5F_blk_aggr_t H5F_blk_aggr_t;
-
/*
* Encode and decode macros for file meta-data.
* Currently, all file meta-data is little-endian.
diff --git a/src/H5Ftest.c b/src/H5Ftest.c
index e2ee606..b9a651b 100644
--- a/src/H5Ftest.c
+++ b/src/H5Ftest.c
@@ -96,14 +96,25 @@
*-------------------------------------------------------------------------
*/
herr_t
-H5F_get_sohm_mesg_count_test(hid_t file_id, unsigned type_id,
+H5F_get_sohm_mesg_count_test(hid_t uid, unsigned type_id,
size_t *mesg_count)
{
H5F_t *file; /* File info */
+ H5I_t *uid_info;
+ hid_t file_id;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI_NOINIT(H5F_get_sohm_mesg_count_test)
+ if (H5I_UID == H5I_get_type(uid)) {
+ if(NULL == (uid_info = (H5I_t *)H5I_object(uid)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ file_id = uid_info->obj_id;
+ }
+ else {
+ file_id = uid;
+ }
+
/* Check arguments */
if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
@@ -134,13 +145,24 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5F_check_cached_stab_test(hid_t file_id)
+H5F_check_cached_stab_test(hid_t uid)
{
H5F_t *file; /* File info */
+ H5I_t *uid_info;
+ hid_t file_id;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI_NOINIT(H5F_check_cached_stab_test)
+ if (H5I_UID == H5I_get_type(uid)) {
+ if(NULL == (uid_info = (H5I_t *)H5I_object(uid)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ file_id = uid_info->obj_id;
+ }
+ else {
+ file_id = uid;
+ }
+
/* Check arguments */
if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
@@ -168,13 +190,24 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5F_get_maxaddr_test(hid_t file_id, haddr_t *maxaddr)
+H5F_get_maxaddr_test(hid_t uid, haddr_t *maxaddr)
{
H5F_t *file; /* File info */
+ H5I_t *uid_info;
+ hid_t file_id;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI_NOINIT(H5F_get_maxaddr_test)
+ if (H5I_UID == H5I_get_type(uid)) {
+ if(NULL == (uid_info = (H5I_t *)H5I_object(uid)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ file_id = uid_info->obj_id;
+ }
+ else {
+ file_id = uid;
+ }
+
/* Check arguments */
if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
diff --git a/src/H5G.c b/src/H5G.c
index 2cbca65..f8ce355 100644
--- a/src/H5G.c
+++ b/src/H5G.c
@@ -580,17 +580,30 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5Gget_info(hid_t grp_id, H5G_info_t *grp_info)
+H5Gget_info(hid_t uid, H5G_info_t *grp_info)
{
H5I_type_t id_type; /* Type of ID */
H5G_loc_t loc; /* Location of group */
+ H5I_t *uid_info; /* user id structure */
+ hid_t grp_id;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(H5Gget_info, FAIL)
H5TRACE2("e", "i*x", grp_id, grp_info);
/* Check args */
- id_type = H5I_get_type(grp_id);
+ id_type = H5I_get_type(uid);
+
+ if (H5I_UID == id_type) {
+ if(NULL == (uid_info = (H5I_t *)H5I_object(uid)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ grp_id = uid_info->obj_id;
+ id_type = H5I_get_type(grp_id);
+ }
+ else {
+ grp_id = uid;
+ }
+
if(!(H5I_GROUP == id_type || H5I_FILE == id_type))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid argument")
if(!grp_info)
diff --git a/src/H5Gloc.c b/src/H5Gloc.c
index 23db587..627ee3c 100644
--- a/src/H5Gloc.c
+++ b/src/H5Gloc.c
@@ -157,13 +157,24 @@ static herr_t H5G_loc_get_comment_cb(H5G_loc_t *grp_loc, const char *name,
*-------------------------------------------------------------------------
*/
herr_t
-H5G_loc(hid_t loc_id, H5G_loc_t *loc)
+H5G_loc(hid_t id, H5G_loc_t *loc)
{
+ H5I_t *uid_info; /* user id structure */
+ hid_t loc_id;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(H5G_loc, FAIL)
+ if (H5I_UID == H5I_get_type(id)) {
+ if(NULL == (uid_info = (H5I_t *)H5I_object(id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ loc_id = uid_info->obj_id;
+ }
+ else {
+ loc_id = id;
+ }
switch(H5I_get_type(loc_id)) {
+ case H5I_UID:
case H5I_FILE:
{
H5F_t *f;
@@ -248,6 +259,7 @@ H5G_loc(hid_t loc_id, H5G_loc_t *loc)
case H5I_UNINIT:
case H5I_BADID:
case H5I_VFL:
+ case H5I_VOL:
case H5I_NTYPES:
default:
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object ID")
diff --git a/src/H5I.c b/src/H5I.c
index 8e024ff..e1bb54c 100644
--- a/src/H5I.c
+++ b/src/H5I.c
@@ -147,8 +147,14 @@ DESCRIPTION
static herr_t
H5I_init_interface(void)
{
- FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5I_init_interface)
+ herr_t ret_value = SUCCEED; /* Return value */
+ FUNC_ENTER_NOAPI_NOINIT(H5I_init_interface)
+
+ if(H5I_register_type(H5I_UID, (size_t)H5I_UID_HASHSIZE, 0, (H5I_free_t)NULL)<H5I_UID)
+ HGOTO_ERROR(H5E_ATOM, H5E_CANTINIT, FAIL, "unable to initialize interface")
+
+done:
FUNC_LEAVE_NOAPI(SUCCEED)
} /* end H5I_init_interface() */
@@ -972,12 +978,27 @@ done:
*-------------------------------------------------------------------------
*/
void *
-H5Iobject_verify(hid_t id, H5I_type_t id_type)
+H5Iobject_verify(hid_t uid, H5I_type_t id_type)
{
+ H5I_t *uid_info; /* user id structure */
+ hid_t id;
void * ret_value; /* Return value */
FUNC_ENTER_API(H5Iobject_verify, NULL)
+ /* Check arguments */
+ if(uid < 0)
+ HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "invalid ID")
+
+ if (H5I_UID == H5I_get_type(uid)) {
+ if(NULL == (uid_info = (H5I_t *)H5I_object(uid)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ id = uid_info->obj_id;
+ }
+ else {
+ id = uid;
+ }
+
if(H5I_IS_LIB_TYPE(id_type))
HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, NULL, "cannot call public function on library type")
@@ -1077,13 +1098,28 @@ done:
*-------------------------------------------------------------------------
*/
H5I_type_t
-H5Iget_type(hid_t id)
+H5Iget_type(hid_t uid)
{
+ H5I_t *uid_info; /* user id structure */
+ hid_t id;
H5I_type_t ret_value = H5I_BADID; /* Return value */
FUNC_ENTER_API(H5Iget_type, H5I_BADID)
H5TRACE1("It", "i", id);
+ /* Check arguments */
+ if(uid < 0)
+ HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "invalid ID")
+
+ if (H5I_UID == H5I_get_type(uid)) {
+ if(NULL == (uid_info = (H5I_t *)H5I_object(uid)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ id = uid_info->obj_id;
+ }
+ else {
+ id = uid;
+ }
+
ret_value = H5I_get_type(id);
if(ret_value <= H5I_BADID || ret_value >= H5I_next_type || NULL == H5I_object(id))
@@ -1112,12 +1148,27 @@ done:
*-------------------------------------------------------------------------
*/
void *
-H5Iremove_verify(hid_t id, H5I_type_t id_type)
+H5Iremove_verify(hid_t uid, H5I_type_t id_type)
{
+ H5I_t *uid_info; /* user id structure */
+ hid_t id;
void * ret_value; /* Return value */
FUNC_ENTER_API(H5Iremove_verify, NULL)
+ /* Check arguments */
+ if(uid < 0)
+ HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "invalid ID")
+
+ if (H5I_UID == H5I_get_type(uid)) {
+ if(NULL == (uid_info = (H5I_t *)H5I_object(uid)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ id = uid_info->obj_id;
+ }
+ else {
+ id = uid;
+ }
+
if(H5I_IS_LIB_TYPE(id_type))
HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, NULL, "cannot call public function on library type")
@@ -1251,12 +1302,27 @@ done:
*-------------------------------------------------------------------------
*/
int
-H5Idec_ref(hid_t id)
+H5Idec_ref(hid_t uid)
{
+ H5I_t *uid_info; /* user id structure */
+ hid_t id;
int ret_value; /* Return value */
FUNC_ENTER_API(H5Idec_ref, FAIL)
- H5TRACE1("Is", "i", id);
+ H5TRACE1("Is", "i", uid);
+
+ /* Check arguments */
+ if(uid < 0)
+ HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "invalid ID")
+
+ if (H5I_UID == H5I_get_type(uid)) {
+ if(NULL == (uid_info = (H5I_t *)H5I_object(uid)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ id = uid_info->obj_id;
+ }
+ else {
+ id = uid;
+ }
/* Check arguments */
if(id < 0)
@@ -1454,14 +1520,29 @@ done:
*-------------------------------------------------------------------------
*/
int
-H5Iinc_ref(hid_t id)
+H5Iinc_ref(hid_t uid)
{
+ H5I_t *uid_info; /* user id structure */
+ hid_t id;
int ret_value; /* Return value */
FUNC_ENTER_API(H5Iinc_ref, FAIL)
H5TRACE1("Is", "i", id);
/* Check arguments */
+ if(uid < 0)
+ HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "invalid ID")
+
+ if (H5I_UID == H5I_get_type(uid)) {
+ if(NULL == (uid_info = (H5I_t *)H5I_object(uid)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ id = uid_info->obj_id;
+ }
+ else {
+ id = uid;
+ }
+
+ /* Check arguments */
if(id < 0)
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "invalid ID")
@@ -1546,12 +1627,27 @@ done:
*-------------------------------------------------------------------------
*/
int
-H5Iget_ref(hid_t id)
+H5Iget_ref(hid_t uid)
{
+ H5I_t *uid_info; /* user id structure */
+ hid_t id;
int ret_value; /* Return value */
FUNC_ENTER_API(H5Iget_ref, FAIL)
- H5TRACE1("Is", "i", id);
+ H5TRACE1("Is", "i", uid);
+
+ /* Check arguments */
+ if(uid < 0)
+ HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "invalid ID")
+
+ if (H5I_UID == H5I_get_type(uid)) {
+ if(NULL == (uid_info = (H5I_t *)H5I_object(uid)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ id = uid_info->obj_id;
+ }
+ else {
+ id = uid;
+ }
/* Check arguments */
if(id < 0)
@@ -1883,13 +1979,30 @@ done:
*-------------------------------------------------------------------------
*/
htri_t
-H5Iis_valid(hid_t id)
+H5Iis_valid(hid_t uid)
{
H5I_id_info_t *id_ptr; /* ptr to the ID */
+ H5I_t *uid_info; /* user id structure */
+ hid_t id;
htri_t ret_value = TRUE; /* Return value */
FUNC_ENTER_API(H5Iis_valid, FAIL)
- H5TRACE1("t", "i", id);
+ H5TRACE1("t", "i", uid);
+
+ id = uid;
+ /*
+ if (H5I_UID == H5I_get_type(uid)) {
+ if(NULL == (uid_info = (H5I_t *)H5I_object(uid)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ id = uid_info->obj_id;
+ }
+ else {
+ id = uid;
+ }
+
+ if(id < 0)
+ HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "invalid ID")
+ */
/* Find the ID */
if (NULL == (id_ptr = H5I_find_id(id)))
@@ -1983,7 +2096,9 @@ H5I_search(H5I_type_t type, H5I_search_func_t func, void *key, hbool_t app_ref)
/* Check arguments */
if(type <= H5I_BADID || type >= H5I_next_type)
HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, NULL, "invalid type number")
+
type_ptr = H5I_id_type_list_g[type];
+
if(type_ptr == NULL || type_ptr->count <= 0)
HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, NULL, "invalid type")
@@ -2138,16 +2253,37 @@ done:
*-------------------------------------------------------------------------
*/
hid_t
-H5Iget_file_id(hid_t obj_id)
+H5Iget_file_id(hid_t uid)
{
+ H5I_t *uid_info; /* user id structure */
+ hid_t id;
hid_t ret_value; /* Return value */
FUNC_ENTER_API(H5Iget_file_id, FAIL)
- H5TRACE1("i", "i", obj_id);
+ H5TRACE1("i", "i", uid);
+
+ /* Check arguments */
+ if(uid < 0)
+ HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "invalid ID")
+
+ if (H5I_UID == H5I_get_type(uid)) {
+ if(NULL == (uid_info = (H5I_t *)H5I_object(uid)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ id = uid_info->obj_id;
+ }
+ else {
+ id = uid;
+ }
- if((ret_value = H5I_get_file_id(obj_id, TRUE)) < 0)
+ if((ret_value = H5I_get_file_id(id, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTGET, FAIL, "can't retrieve file ID")
+ if (H5I_replace_with_uids (&ret_value, 1) <= 0)
+ HGOTO_ERROR(H5E_ATOM, H5E_CANTGET, FAIL, "can't retrieve file ID")
+ /* Increment reference count on atom. */
+ if(H5I_inc_ref(ret_value, TRUE) < 0)
+ HGOTO_ERROR(H5E_ATOM, H5E_CANTSET, FAIL, "incrementing file ID failed")
+
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Iget_file_id() */
@@ -2203,6 +2339,71 @@ done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5I_get_file_id() */
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5I_replace_with_uids
+ *
+ * Purpose: change the ids used by the HDF5 libraries to the UIDs that
+ * are provided to the user
+ *
+ * Return: How many IDs were replaced.
+ *
+ * Programmer: Mohamad Chaarawi
+ * Feb 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5I_replace_with_uids(hid_t *oid_list, ssize_t num_ids)
+{
+ ssize_t j;
+ int ret_value = 0; /* Return value */
+
+ FUNC_ENTER_NOAPI(H5I_replace_with_uids, FAIL)
+
+ for (j=0 ; j<num_ids ; j++) {
+ H5I_id_type_t *type_ptr; /*ptr to the type */
+ hbool_t replaced = FALSE;
+
+ if (H5I_FILE != H5I_get_type(oid_list[j]))
+ continue;
+
+ type_ptr = H5I_id_type_list_g[H5I_UID];
+
+ if(type_ptr == NULL || type_ptr->count <= 0)
+ HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "invalid type")
+
+ /* Only iterate through hash table if there are IDs in group */
+ if(type_ptr->ids > 0) {
+ H5I_id_info_t *id_ptr; /*ptr to the new ID */
+ H5I_t *uid_info; /* user id structure */
+ unsigned i; /*counter */
+
+ /* Start at the beginning of the array */
+ for(i = 0; i < type_ptr->hash_size; i++) {
+ id_ptr = type_ptr->id_list[i];
+ while(id_ptr) {
+ if(NULL == (uid_info = (H5I_t *)H5I_object(id_ptr->id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ if (uid_info->obj_id == oid_list[j]) {
+ oid_list[j] = id_ptr->id;
+ ret_value ++;
+ replaced = TRUE;
+ break;
+ }
+ id_ptr = id_ptr->next;
+ } /* end while */
+ if (replaced)
+ break;
+ } /* end for */
+ } /* end if */
+ }
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5I_replace_with_uids() */
+
/*-------------------------------------------------------------------------
* Function: H5I_debug
diff --git a/src/H5Iprivate.h b/src/H5Iprivate.h
index 0695860..6ffc3c9 100644
--- a/src/H5Iprivate.h
+++ b/src/H5Iprivate.h
@@ -27,6 +27,7 @@
/* Private headers needed by this file */
#include "H5private.h"
+#include "H5FLprivate.h" /* Free Lists */
/* Macro to determine if a H5I_type_t is a "library type" */
#define H5I_IS_LIB_TYPE( type ) (type > 0 && type < H5I_NTYPES)
@@ -44,12 +45,19 @@
#define H5I_REFID_HASHSIZE 64
#define H5I_VFL_HASHSIZE 64
#define H5I_VOL_HASHSIZE 64
+#define H5I_UID_HASHSIZE 64
#define H5I_GENPROPCLS_HASHSIZE 64
#define H5I_GENPROPOBJ_HASHSIZE 128
#define H5I_ERRCLS_HASHSIZE 64
#define H5I_ERRMSG_HASHSIZE 64
#define H5I_ERRSTK_HASHSIZE 64
+/* type of the ID passed to users */
+typedef struct H5I_t {
+ hid_t vol_id; /* ID for VOL plugin */
+ hid_t obj_id; /* actual id for object */
+} H5I_t;
+
/* Private Functions in H5I.c */
H5_DLL H5I_type_t H5I_register_type(H5I_type_t type_id, size_t hash_size, unsigned reserved, H5I_free_t free_func);
H5_DLL int H5I_nmembers(H5I_type_t type);
@@ -72,6 +80,6 @@ H5_DLL int H5I_dec_app_ref_always_close(hid_t id);
H5_DLL int H5I_inc_type_ref(H5I_type_t type);
H5_DLL herr_t H5I_dec_type_ref(H5I_type_t type);
H5_DLL int H5I_get_type_ref(H5I_type_t type);
-
+H5_DLL herr_t H5I_replace_with_uids(hid_t *oid_list, ssize_t num_ids);
#endif /* _H5Iprivate_H */
diff --git a/src/H5Ipublic.h b/src/H5Ipublic.h
index 672e608..d1a36b9 100644
--- a/src/H5Ipublic.h
+++ b/src/H5Ipublic.h
@@ -45,6 +45,7 @@ typedef enum H5I_type_t {
H5I_REFERENCE, /*type ID for Reference objects */
H5I_VFL, /*type ID for virtual file layer */
H5I_VOL, /*type ID for virtual object layer */
+ H5I_UID, /*type ID for upper level user ID objects */
H5I_GENPROP_CLS, /*type ID for generic property list classes */
H5I_GENPROP_LST, /*type ID for generic property lists */
H5I_ERROR_CLASS, /*type ID for error classes */
diff --git a/src/H5L.c b/src/H5L.c
index 17b7598..38bec7c 100644
--- a/src/H5L.c
+++ b/src/H5L.c
@@ -1148,20 +1148,33 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5Literate(hid_t grp_id, H5_index_t idx_type, H5_iter_order_t order,
+H5Literate(hid_t uid, H5_index_t idx_type, H5_iter_order_t order,
hsize_t *idx_p, H5L_iterate_t op, void *op_data)
{
H5I_type_t id_type; /* Type of ID */
H5G_link_iterate_t lnk_op; /* Link operator */
hsize_t last_lnk; /* Index of last object looked at */
hsize_t idx; /* Internal location to hold index */
+ H5I_t *uid_info; /* user id structure */
+ hid_t grp_id;
herr_t ret_value; /* Return value */
FUNC_ENTER_API(H5Literate, FAIL)
H5TRACE6("e", "iIiIo*hx*x", grp_id, idx_type, order, idx_p, op, op_data);
/* Check arguments */
- id_type = H5I_get_type(grp_id);
+ id_type = H5I_get_type(uid);
+
+ if (H5I_UID == id_type) {
+ if(NULL == (uid_info = (H5I_t *)H5I_object(uid)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ grp_id = uid_info->obj_id;
+ id_type = H5I_get_type(grp_id);
+ }
+ else {
+ grp_id = uid;
+ }
+
if(!(H5I_GROUP == id_type || H5I_FILE == id_type))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid argument")
if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
@@ -1293,17 +1306,30 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5Lvisit(hid_t grp_id, H5_index_t idx_type, H5_iter_order_t order,
+H5Lvisit(hid_t uid, H5_index_t idx_type, H5_iter_order_t order,
H5L_iterate_t op, void *op_data)
{
H5I_type_t id_type; /* Type of ID */
+ H5I_t *uid_info; /* user id structure */
+ hid_t grp_id;
herr_t ret_value; /* Return value */
FUNC_ENTER_API(H5Lvisit, FAIL)
H5TRACE5("e", "iIiIox*x", grp_id, idx_type, order, op, op_data);
+ id_type = H5I_get_type(uid);
+
+ if (H5I_UID == id_type) {
+ if(NULL == (uid_info = (H5I_t *)H5I_object(uid)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+ grp_id = uid_info->obj_id;
+ id_type = H5I_get_type(grp_id);
+ }
+ else {
+ grp_id = uid;
+ }
+
/* Check args */
- id_type = H5I_get_type(grp_id);
if(!(H5I_GROUP == id_type || H5I_FILE == id_type))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid argument")
if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
diff --git a/src/H5O.c b/src/H5O.c
index e1df6b4..9995297 100644
--- a/src/H5O.c
+++ b/src/H5O.c
@@ -1070,6 +1070,7 @@ H5Oclose(hid_t object_id)
case H5I_REFERENCE:
case H5I_VFL:
case H5I_VOL:
+ case H5I_UID:
case H5I_GENPROP_CLS:
case H5I_GENPROP_LST:
case H5I_ERROR_CLASS:
@@ -2475,6 +2476,7 @@ H5O_get_loc(hid_t object_id)
case H5I_REFERENCE:
case H5I_VFL:
case H5I_VOL:
+ case H5I_UID:
case H5I_GENPROP_CLS:
case H5I_GENPROP_LST:
case H5I_ERROR_CLASS:
diff --git a/src/H5VL.c b/src/H5VL.c
index 953f3f0..ab537c2 100644
--- a/src/H5VL.c
+++ b/src/H5VL.c
@@ -27,7 +27,6 @@
/* Module Setup */
/****************/
-#define H5F_PACKAGE /*suppress error about including H5Fpkg */
#define H5VL_PACKAGE /*suppress error about including H5FDpkg */
/* Interface initialization */
@@ -41,11 +40,13 @@
#include "H5Eprivate.h" /* Error handling */
#include "H5VLpkg.h" /* VOL package header */
#include "H5VLprivate.h" /* VOL */
-#include "H5Fpkg.h" /* File access */
#include "H5Iprivate.h" /* IDs */
#include "H5MMprivate.h" /* Memory management */
#include "H5Pprivate.h" /* Property lists */
+/* Declare a free list to manage the H5I_t struct */
+H5FL_DEFINE_STATIC(H5I_t);
+
/********************/
/* Local Prototypes */
/********************/
@@ -361,42 +362,6 @@ done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_get_class() */
-#if 0 /* MSC not needed */
-
-/*-------------------------------------------------------------------------
- * Function: H5VL_sb_size
- *
- * Purpose: Obtains the number of bytes required to store the vol plugin
- * file access data in the HDF5 superblock.
- *
- * Return: Success: Number of bytes required.
- *
- * Failure: 0 if an error occurs or if the vol plugin has no
- * data to store in the superblock.
- *
- * Programmer: Mohamad Chaarawi
- * January, 2012
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-hsize_t
-H5VL_sb_size(H5F_t *file)
-{
- hsize_t ret_value=0;
-
- FUNC_ENTER_NOAPI(H5VL_sb_size, 0)
-
- assert(file && file->cls);
-
- if(file->cls->sb_size)
- ret_value = (file->cls->sb_size)(file);
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-}
-#endif
/*-------------------------------------------------------------------------
* Function: H5VL_fapl_open
@@ -544,37 +509,6 @@ done:
/*-------------------------------------------------------------------------
- * Function: H5VLdec_file_vol_ref
- *
- * Purpose: Utility function to decrement the VOL ID ref count on the
- * file structure.
- *
- * Return: Success: Non-negative
- *
- * Failure: Negative
- *
- * Programmer: Mohamad Chaarawi
- * February, 2012
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5VL_dec_file_vol_ref(H5F_t *f)
-{
- herr_t ret_value = SUCCEED; /* Return value */
-
- FUNC_ENTER_NOAPI_NOINIT(H5VL_dec_file_vol_ref)
-
- if(H5I_dec_ref(f->vol_id) < 0)
- HGOTO_ERROR(H5E_VOL, H5E_CANTDEC, FAIL, "unable to dec_file_vol_ref vol plugin")
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5VLdec_file_vol_ref() */
-
-
-
-/*-------------------------------------------------------------------------
* Function: H5VL_open
*
* Purpose: Private version of H5VLopen()
@@ -592,9 +526,10 @@ hid_t
H5VL_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id, hid_t dxpl_id)
{
H5VL_class_t *vol_plugin; /* VOL for file */
- H5F_t *new_file = NULL; /* file struct */
+ H5I_t *uid_info; /* user id structure */
+ H5P_genplist_t *plist; /* Property list pointer */
hid_t plugin_id = -1; /* VOL ID */
- H5P_genplist_t *plist; /* Property list pointer */
+ hid_t file_id;
hid_t ret_value; /* Return value */
FUNC_ENTER_NOAPI(H5VL_open, FAIL)
@@ -611,30 +546,19 @@ H5VL_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id, hid_t
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(NULL == (new_file = (vol_plugin->file_cls.open)(name, flags, fcpl_id, fapl_id, dxpl_id)))
+ if((file_id = (vol_plugin->file_cls.open)(name, flags, fcpl_id, fapl_id, dxpl_id)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "open failed")
- /*
- * Fill in public fields. We must increment the reference count on the
- * vol plugin ID to prevent it from being freed while this file is open.
- */
- new_file->vol_id = plugin_id;
- //new_file->vol_cls = vol_plugin;
- if(H5I_inc_ref(new_file->vol_id, FALSE) < 0)
- HGOTO_ERROR(H5E_VOL, H5E_CANTINC, FAIL, "unable to increment ref count on VOL plugin")
-
- /* Get an atom for the file */
- if((ret_value = H5I_register(H5I_FILE, new_file, TRUE)) < 0)
- HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize file handle")
-
- /* Keep this ID in file object structure */
- new_file->file_id = ret_value;
+ /* Create a new id that points to a struct that holds the file id and the VOL id */
+ /* Allocate new id structure */
+ if(NULL == (uid_info = H5FL_MALLOC(H5I_t)))
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+ uid_info->obj_id = file_id;
+ uid_info->vol_id = plugin_id;
+ if((ret_value = H5I_register(H5I_UID, uid_info, TRUE)) < 0)
+ HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize file handle")
done:
- /* MSC try_close should be VL_close */
- if(ret_value < 0 && new_file && H5F_try_close(new_file) < 0)
- HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "problems closing file")
-
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_open() */
@@ -657,9 +581,10 @@ hid_t
H5VL_create(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id)
{
H5VL_class_t *vol_plugin; /* VOL for file */
- H5F_t *new_file = NULL; /* file struct */
+ H5I_t *uid_info; /* user id structure */
+ H5P_genplist_t *plist; /* Property list pointer */
hid_t plugin_id = -1; /* VOL ID */
- H5P_genplist_t *plist ; /* Property list pointer */
+ hid_t file_id;
hid_t ret_value; /* Return value */
FUNC_ENTER_NOAPI(H5VL_create, FAIL)
@@ -677,25 +602,20 @@ H5VL_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(NULL == (new_file = (vol_plugin->file_cls.create)(name, flags, fcpl_id, fapl_id)))
+ if((file_id = (vol_plugin->file_cls.create)(name, flags, fcpl_id, fapl_id)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "create failed")
- new_file->vol_id = plugin_id;
- //new_file->vol_cls = vol_plugin;
- if(H5I_inc_ref(new_file->vol_id, FALSE) < 0)
- HGOTO_ERROR(H5E_VOL, H5E_CANTINC, FAIL, "unable to increment ref count on VOL plugin")
+ /* Create a new id that points to a struct that holds the file id and the VOL id */
+ /* Allocate new id structure */
+ if(NULL == (uid_info = H5FL_MALLOC(H5I_t)))
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+ uid_info->obj_id = file_id;
+ uid_info->vol_id = plugin_id;
- /* Get an atom for the file */
- if((ret_value = H5I_register(H5I_FILE, new_file, TRUE)) < 0)
- HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize file")
-
- /* Keep this ID in file object structure */
- new_file->file_id = ret_value;
+ if((ret_value = H5I_register(H5I_UID, uid_info, TRUE)) < 0)
+ HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize file handle")
done:
- if(ret_value < 0 && new_file)
- if(H5VL_close(new_file->file_id) < 0)
- HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "problems closing file")
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_create() */
@@ -705,9 +625,9 @@ done:
*
* Purpose: Private version of H5VLclose()
*
- * Return: Success: Pointer to a new file struct
+ * Return: Success: Non Negative
*
- * Failure: FAIL
+ * Failure: Negative
*
* Programmer: Mohamad Chaarawi
* January, 2012
@@ -715,36 +635,123 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5VL_close(hid_t file_id)
+H5VL_close(hid_t uid)
{
- H5VL_class_t *vol_plugin ; /* VOL for file */
- H5F_t *f = NULL;
- herr_t ret_value = SUCCEED;
+ H5VL_class_t *vol_plugin; /* VOL for file */
+ H5I_t *uid_info; /* user id structure */
+ herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(H5VL_close, FAIL)
/* Check/fix arguments. */
- if(H5I_FILE != H5I_get_type(file_id))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file ID")
+ if(H5I_UID != H5I_get_type(uid))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a user ID")
- /* get the file struct */
- if(NULL == (f = (H5F_t *)H5I_object(file_id)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid file identifier")
+ /* get the ID struct */
+ if(NULL == (uid_info = (H5I_t *)H5I_object(uid)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
/* get VOL plugin info */
- if(NULL == (vol_plugin = (H5VL_class_t *)H5I_object(f->vol_id)))
+ if(NULL == (vol_plugin = (H5VL_class_t *)H5I_object(uid_info->vol_id)))
HGOTO_ERROR(H5E_VOL, H5E_BADVALUE, FAIL, "invalid vol plugin ID in file")
- //printf ("VL_CLOSE VOL REF COUNT: %d\n",H5I_get_ref (f->vol_id, FALSE));
- /* Decrement ref count on VOL ID
- if(H5I_dec_ref(f->vol_id) < 0)
- HGOTO_ERROR(H5E_VOL, H5E_CANTDEC, FAIL, "can't close plugin ID")
- */
if(NULL == vol_plugin->file_cls.close)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `file close' method")
- if((vol_plugin->file_cls.close)(f) < 0)
+ if((ret_value = (vol_plugin->file_cls.close)(uid_info->obj_id)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTCLOSEFILE, FAIL, "close failed")
+ 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_close() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5VL_flush
+ *
+ * Purpose: Private version of H5VLflush()
+ *
+ * Return: Success: Pointer to a new file struct
+ *
+ * Failure: FAIL
+ *
+ * Programmer: Mohamad Chaarawi
+ * February, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5VL_flush(hid_t uid, H5F_scope_t scope)
+{
+ H5VL_class_t *vol_plugin; /* VOL for file */
+ H5I_t *uid_info; /* user id structure */
+ herr_t ret_value = SUCCEED;
+
+ FUNC_ENTER_NOAPI(H5VL_flush, FAIL)
+
+ /* Check/fix arguments. */
+ if(H5I_UID != H5I_get_type(uid))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a user ID")
+
+ /* get the ID struct */
+ if(NULL == (uid_info = (H5I_t *)H5I_object(uid)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+
+ /* get VOL plugin info */
+ if(NULL == (vol_plugin = (H5VL_class_t *)H5I_object(uid_info->vol_id)))
+ HGOTO_ERROR(H5E_VOL, H5E_BADVALUE, FAIL, "invalid vol plugin ID in file")
+
+ if(NULL == vol_plugin->file_cls.flush)
+ HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `file flush' method")
+ if((ret_value = (vol_plugin->file_cls.flush)(uid_info->obj_id, scope)) < 0)
+ HGOTO_ERROR(H5E_VOL, H5E_CANTFLUSH, FAIL, "flush failed")
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5VL_flush() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5VL_get
+ *
+ * Purpose: Private version of H5VLget()
+ *
+ * Return: Success: non negative
+ *
+ * Failure: negative
+ *
+ * Programmer: Mohamad Chaarawi
+ * February, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5VL_get(hid_t uid, H5VL_file_get_t get_type, void *data, int argc, void **argv)
+{
+ H5VL_class_t *vol_plugin; /* VOL for file */
+ H5I_t *uid_info; /* user id structure */
+ herr_t ret_value = SUCCEED;
+
+ FUNC_ENTER_NOAPI(H5VL_get, FAIL)
+
+ /* Check/fix arguments. */
+ if(H5I_UID != H5I_get_type(uid))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a user ID")
+
+ /* get the ID struct */
+ if(NULL == (uid_info = (H5I_t *)H5I_object(uid)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid user identifier")
+
+ /* get VOL plugin info */
+ if(NULL == (vol_plugin = (H5VL_class_t *)H5I_object(uid_info->vol_id)))
+ HGOTO_ERROR(H5E_VOL, H5E_BADVALUE, FAIL, "invalid vol plugin ID in file")
+
+ if(NULL == vol_plugin->file_cls.get)
+ HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol plugin has no `file get' method")
+ if((ret_value = (vol_plugin->file_cls.get)(uid_info->obj_id, get_type, data, argc, argv)) < 0)
+ HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "get failed")
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5VL_get() */
diff --git a/src/H5VLnative.c b/src/H5VLnative.c
index 1a4582e..5468e0d 100644
--- a/src/H5VLnative.c
+++ b/src/H5VLnative.c
@@ -36,16 +36,22 @@
#include "H5Iprivate.h" /* IDs */
#include "H5MMprivate.h" /* Memory management */
#include "H5Pprivate.h" /* Property lists */
+#include "H5Dprivate.h" /* Datasets */
+#include "H5Aprivate.h" /* Attributes */
+#include "H5MFprivate.h" /* File memory management */
+#include "H5SMprivate.h" /* Shared Object Header Messages */
/* The driver identification number, initialized at runtime */
static hid_t H5VL_NATIVE_g = 0;
/* Prototypes */
-static H5F_t *H5VL_native_open(const char *name, unsigned flags, hid_t fcpl_id,
+static hid_t H5VL_native_open(const char *name, unsigned flags, hid_t fcpl_id,
hid_t fapl_id, hid_t dxpl_id);
-static herr_t H5VL_native_close(H5F_t *f);
-static H5F_t *H5VL_native_create(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id);
+static herr_t H5VL_native_close(hid_t fid);
+static hid_t H5VL_native_create(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id);
+static herr_t H5VL_native_flush(hid_t fid, H5F_scope_t scope);
+static herr_t H5VL_native_get(hid_t file_id, H5VL_file_get_t get_type, void *data, int argc, void **argv);
static herr_t H5VL_native_term(void);
static const H5VL_class_t H5VL_native_g = {
@@ -55,58 +61,44 @@ static const H5VL_class_t H5VL_native_g = {
NULL, /*fapl_get */
NULL, /*fapl_copy */
NULL, /*fapl_free */
- { /* general_cls */
- NULL, /* open */
- NULL, /* create */
- NULL, /* exists */
- NULL /* close */
- },
{ /* file_cls */
H5VL_native_open, /* open */
H5VL_native_close, /* close */
H5VL_native_create, /* create */
- NULL, /* flush */
- NULL, /* is_hdf5 */
- NULL, /* mount */
- NULL, /* unmount */
- NULL /* reopen */
+ H5VL_native_flush, /* flush */
+ H5VL_native_get /* get */
},
{ /* dataset_cls */
+ NULL, /* open */
+ NULL, /* close */
+ NULL, /* create */
NULL, /* read */
NULL, /* write */
- NULL, /* set_extent */
+ NULL /* set_extent */
},
{ /* attribute_cls */
- NULL, /* create_by_name */
+ NULL, /* open */
+ NULL, /* close */
+ NULL, /* create */
NULL, /* delete */
- NULL, /* delete_by_idx */
- NULL, /* delete_by_name */
- NULL, /* open_by_idx */
- NULL, /* open_by_name */
- NULL, /* open_idx */
NULL, /* read */
- NULL, /* write */
- NULL /* rename */
+ NULL /* write */
},
{ /* datatype_cls */
- NULL, /* commit */
+ NULL /* open */
},
{ /* link_cls */
NULL, /* create */
NULL, /* delete */
NULL, /* move */
- NULL, /* copy */
- NULL, /* delete_by_idx */
- NULL, /* create_external */
- NULL /* create_ud */
+ NULL /* copy */
},
{ /* object_cls */
- NULL, /* set_comment */
- NULL, /* open_by_addr */
- NULL, /* open_by_idx */
- NULL, /* copy */
- NULL, /* incr_refcount */
- NULL /* decr_refcount */
+ NULL, /* create */
+ NULL, /* open */
+ NULL, /* close */
+ NULL, /* move */
+ NULL /* copy */
}
};
@@ -234,19 +226,36 @@ done:
*
*-------------------------------------------------------------------------
*/
-static H5F_t *
+static hid_t
H5VL_native_open(const char *name, unsigned flags, hid_t fcpl_id,
hid_t fapl_id, hid_t dxpl_id)
{
- H5F_t *ret_value = NULL; /* file struct */
+ H5F_t *new_file; /* file struct */
+ hid_t ret_value;
FUNC_ENTER_NOAPI_NOINIT(H5VL_native_open)
/* Open the file */
- if(NULL == (ret_value= H5F_open(name, flags, fcpl_id, fapl_id, dxpl_id)))
- HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to open file")
+ if(NULL == (new_file = H5F_open(name, flags, fcpl_id, fapl_id, dxpl_id)))
+ HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to open file")
+
+ /* Get an atom for the file */
+ if((ret_value = H5I_register(H5I_FILE, new_file, TRUE)) < 0)
+ HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize file handle")
+
+ /* Keep this ID in file object structure */
+ new_file->file_id = ret_value;
+
+#if 0
+ new_file->vol_id = plugin_id;
+ if(H5I_inc_ref(new_file->vol_id, FALSE) < 0)
+ HGOTO_ERROR(H5E_VOL, H5E_CANTINC, FAIL, "unable to increment ref count on VOL plugin")
+#endif
done:
+ if(ret_value < 0 && new_file && H5F_try_close(new_file) < 0)
+ HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "problems closing file")
+
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_native_open() */
@@ -264,18 +273,29 @@ done:
*
*-------------------------------------------------------------------------
*/
-static H5F_t *
+static hid_t
H5VL_native_create(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id)
{
- H5F_t *ret_value = NULL;
+ H5F_t *new_file; /* file struct */
+ hid_t ret_value;
FUNC_ENTER_NOAPI_NOINIT(H5VL_native_create)
/* Create the file */
- if(NULL == (ret_value = H5F_open(name, flags, fcpl_id, fapl_id, H5AC_dxpl_id)))
- HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to create file")
+ if(NULL == (new_file = H5F_open(name, flags, fcpl_id, fapl_id, H5AC_dxpl_id)))
+ HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to create file")
+
+ /* Get an atom for the file */
+ if((ret_value = H5I_register(H5I_FILE, new_file, TRUE)) < 0)
+ HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to atomize file handle")
+
+ /* Keep this ID in file object structure */
+ new_file->file_id = ret_value;
done:
+ if(ret_value < 0 && new_file && H5F_try_close(new_file) < 0)
+ HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "problems closing file")
+
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_native_create() */
@@ -294,13 +314,22 @@ done:
*-------------------------------------------------------------------------
*/
static herr_t
-H5VL_native_close(H5F_t *f)
+H5VL_native_close(hid_t file_id)
{
int nref;
+ H5F_t *f;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI_NOINIT(H5VL_native_close)
+ /* Check/fix arguments. */
+ if(H5I_FILE != H5I_get_type(file_id))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file ID")
+
+ /* get the file struct */
+ if(NULL == (f = (H5F_t *)H5I_object(file_id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid file identifier")
+
/* Flush file if this is the last reference to this id and we have write
* intent, unless it will be flushed by the "shared" file being closed.
* This is only necessary to replicate previous behaviour, and could be
@@ -317,9 +346,347 @@ H5VL_native_close(H5F_t *f)
* Decrement reference count on atom. When it reaches zero the file will
* be closed.
*/
- if(H5I_dec_app_ref(f->file_id) < 0)
+ if(H5I_dec_ref(f->file_id) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTCLOSEFILE, FAIL, "decrementing file ID failed")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_native_close() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5VL_native_flush
+ *
+ * Purpose: Flushs a native HDF5 file.
+ *
+ * Return: Success: 0
+ * Failure: -1, file not flushed.
+ *
+ * Programmer: Mohamad Chaarawi
+ * February, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5VL_native_flush(hid_t object_id, H5F_scope_t scope)
+{
+ H5F_t *f = NULL; /* File to flush */
+ H5O_loc_t *oloc = NULL; /* Object location for ID */
+ herr_t ret_value = SUCCEED; /* Return value */
+
+ FUNC_ENTER_NOAPI_NOINIT(H5VL_native_flush)
+
+ switch(H5I_get_type(object_id)) {
+ case H5I_FILE:
+ if(NULL == (f = (H5F_t *)H5I_object(object_id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid file identifier")
+ break;
+
+ case H5I_GROUP:
+ {
+ H5G_t *grp;
+
+ if(NULL == (grp = (H5G_t *)H5I_object(object_id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid group identifier")
+ oloc = H5G_oloc(grp);
+ }
+ break;
+
+ case H5I_DATATYPE:
+ {
+ H5T_t *type;
+
+ if(NULL == (type = (H5T_t *)H5I_object(object_id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid type identifier")
+ oloc = H5T_oloc(type);
+ }
+ break;
+
+ case H5I_DATASET:
+ {
+ H5D_t *dset;
+
+ if(NULL == (dset = (H5D_t *)H5I_object(object_id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid dataset identifier")
+ oloc = H5D_oloc(dset);
+ }
+ break;
+
+ case H5I_ATTR:
+ {
+ H5A_t *attr;
+
+ if(NULL == (attr = (H5A_t *)H5I_object(object_id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid attribute identifier")
+ oloc = H5A_oloc(attr);
+ }
+ break;
+
+ case H5I_UNINIT:
+ case H5I_BADID:
+ case H5I_DATASPACE:
+ case H5I_REFERENCE:
+ case H5I_VFL:
+ case H5I_VOL:
+ case H5I_UID:
+ case H5I_GENPROP_CLS:
+ case H5I_GENPROP_LST:
+ case H5I_ERROR_CLASS:
+ case H5I_ERROR_MSG:
+ case H5I_ERROR_STACK:
+ case H5I_NTYPES:
+ default:
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file or file object")
+ } /* end switch */
+
+ if(!f) {
+ if(!oloc)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "object is not assocated with a file")
+ f = oloc->file;
+ } /* end if */
+ if(!f)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "object is not associated with a file")
+
+ /* Flush the file */
+ /*
+ * Nothing to do if the file is read only. This determination is
+ * made at the shared open(2) flags level, implying that opening a
+ * file twice, once for read-only and once for read-write, and then
+ * calling H5Fflush() with the read-only handle, still causes data
+ * to be flushed.
+ */
+ if(H5F_ACC_RDWR & H5F_INTENT(f)) {
+ /* Flush other files, depending on scope */
+ if(H5F_SCOPE_GLOBAL == scope) {
+ /* Call the flush routine for mounted file hierarchies */
+ if(H5F_flush_mounts(f, H5AC_dxpl_id) < 0)
+ HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush mounted file hierarchy")
+ } /* end if */
+ else {
+ /* Call the flush routine, for this file */
+ if(H5F_flush(f, H5AC_dxpl_id, FALSE) < 0)
+ HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush file's cached information")
+ } /* end else */
+ } /* end if */
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5VL_native_flush() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5VL_native_get
+ *
+ * Purpose: Gets certain data about a file
+ *
+ * Return: Success: 0
+ * Failure: -1
+ *
+ * Programmer: Mohamad Chaarawi
+ * February, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5VL_native_get(hid_t obj_id, H5VL_file_get_t get_type, void *data, int argc, void **argv)
+{
+ H5F_t *f = NULL; /* File struct */
+ herr_t ret_value = SUCCEED; /* Return value */
+
+ FUNC_ENTER_NOAPI_NOINIT(H5VL_native_get)
+
+ /* Check/fix arguments. */
+ if(H5I_get_type(obj_id) == H5I_FILE ) {
+ if(NULL == (f = (H5F_t *)H5I_object(obj_id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
+ } /* end if */
+ else {
+ H5G_loc_t loc; /* Object location */
+ /* Get symbol table entry */
+ if(H5G_loc(obj_id, &loc) < 0)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a valid object ID")
+ f = loc.oloc->file;
+ } /* end else */
+
+ switch (get_type) {
+ /* H5Fget_access_plist */
+ case H5F_GET_FAPL:
+ {
+ hid_t plist_id;
+
+ /* Retrieve the file's access property list */
+ if((plist_id = H5F_get_access_plist(f, TRUE)) < 0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get file access property list")
+ *((hid_t *)data) = plist_id;
+ break;
+ }
+ /* H5Fget_create_plist */
+ case H5F_GET_FCPL:
+ {
+ H5P_genplist_t *plist; /* Property list */
+ hid_t plist_id;
+
+ if(NULL == (plist = (H5P_genplist_t *)H5I_object(f->shared->fcpl_id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
+
+ /* Create the property list object to return */
+ if((plist_id = H5P_copy_plist(plist, TRUE)) < 0)
+ HGOTO_ERROR(H5E_INTERNAL, H5E_CANTINIT, FAIL, "unable to copy file creation properties")
+ *((hid_t *)data) = plist_id;
+ break;
+ }
+ /* H5Fget_filesize */
+ case H5F_GET_SIZE:
+ {
+ haddr_t eof; /* End of file address */
+
+ /* Go get the actual file size */
+ if(HADDR_UNDEF == (eof = H5FDget_eof(f->shared->lf)))
+ HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to get file size")
+ *((hsize_t *)data) = (hsize_t)eof;
+ break;
+ }
+ /* H5Fget_freespace */
+ case H5F_GET_FREE_SPACE:
+ {
+ hsize_t tot_space; /* Amount of free space in the file */
+
+ /* Go get the actual amount of free space in the file */
+ if(H5MF_get_freespace(f, H5AC_ind_dxpl_id, &tot_space, NULL) < 0)
+ HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to check free space for file")
+ *((hssize_t *)data) = (hssize_t)tot_space;
+ break;
+ }
+ case H5F_GET_FREE_SECTIONS:
+ {
+ /* Go get the free-space section information in the file */
+ if((*((ssize_t *)argv[0]) = H5MF_get_free_sections(f, H5AC_ind_dxpl_id,
+ *((H5F_mem_t *)argv[1]),
+ *((size_t *)argv[2]),
+ (H5F_sect_info_t *)data)) < 0)
+ HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to check free space for file")
+ break;
+ }
+ /* H5Fget_info2 */
+ case H5F_GET_INFO:
+ {
+ H5F_info2_t *finfo = (H5F_info2_t *)data;
+ /* For file IDs, get the file object directly */
+ /* (This prevents the H5G_loc() call from returning the file pointer for
+ * the top file in a mount hierarchy)
+ */
+ HDassert(f->shared);
+
+ /* Reset file info struct */
+ HDmemset(finfo, 0, sizeof(*finfo));
+
+ /* Get the size of the superblock and any superblock extensions */
+ if(H5F_super_size(f, H5AC_ind_dxpl_id, &finfo->super.super_size,
+ &finfo->super.super_ext_size) < 0)
+ HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "Unable to retrieve superblock sizes")
+
+ /* Get the size of any persistent free space */
+ if(H5MF_get_freespace(f, H5AC_ind_dxpl_id, &finfo->free.tot_space,
+ &finfo->free.meta_size) < 0)
+ HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "Unable to retrieve free space information")
+
+ /* Check for SOHM info */
+ if(H5F_addr_defined(f->shared->sohm_addr))
+ if(H5SM_ih_size(f, H5AC_ind_dxpl_id, &finfo->sohm.hdr_size, &finfo->sohm.msgs_info) < 0)
+ HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "Unable to retrieve SOHM index & heap storage info")
+
+ /* Set version # fields */
+ finfo->super.version = f->shared->sblock->super_vers;
+ finfo->sohm.version = f->shared->sohm_vers;
+ finfo->free.version = HDF5_FREESPACE_VERSION;
+ break;
+ }
+ /* H5Fget_intent */
+ case H5F_GET_INTENT:
+ {
+ /* HDF5 uses some flags internally that users don't know about.
+ * Simplify things for them so that they only get either H5F_ACC_RDWR
+ * or H5F_ACC_RDONLY.
+ */
+ if(H5F_INTENT(f) & H5F_ACC_RDWR)
+ *((unsigned *)data) = H5F_ACC_RDWR;
+ else
+ *((unsigned *)data) = H5F_ACC_RDONLY;
+ break;
+ }
+ /* H5Fget_name */
+ case H5F_GET_NAME:
+ {
+ size_t len, size = *((size_t *)argv[1]);
+ ssize_t ret = *((ssize_t *)argv[1]);
+ char *name = (char *)data;
+
+ len = HDstrlen(H5F_OPEN_NAME(f));
+
+ if(name) {
+ HDstrncpy(name, H5F_OPEN_NAME(f), MIN(len + 1,size));
+ if(len >= size)
+ name[size-1]='\0';
+ } /* end if */
+
+ /* Set the return value for the API call */
+ ret = (ssize_t)len;
+ break;
+ }
+ /* H5Fget_ */
+ case H5F_GET_OBJ_COUNT:
+ {
+ break;
+ }
+ /* H5Fget_create_plist */
+ case H5F_GET_OBJ_IDS:
+ {
+ break;
+ }
+ /* H5Fget_vfd_handle */
+ case H5F_GET_VFD_HANDLE:
+ {
+ hid_t fapl;
+
+ fapl = *((hid_t *)data);
+ /* Retrieve the VFD handle for the file */
+ if(H5F_get_vfd_handle(f, fapl, argv) < 0)
+ HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't retrieve VFD handle")
+ break;
+ }
+ /* H5Fget_mdc_config */
+ case H5F_GET_MDC_CONF:
+ {
+ /* Go get the resize configuration */
+ if(H5AC_get_cache_auto_resize_config(f->shared->cache, (H5AC_cache_config_t *)data) < 0)
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_get_cache_auto_resize_config() failed.")
+ break;
+ }
+ /* H5Fget_mdc_hit_rate */
+ case H5F_GET_MDC_HR:
+ {
+ /* Go get the current hit rate */
+ if(H5AC_get_cache_hit_rate(f->shared->cache, (double *)data) < 0)
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_get_cache_hit_rate() failed.")
+ break;
+ }
+ /* H5Fget_mdc_size */
+ case H5F_GET_MDC_SIZE:
+ {
+ int32_t cur_num_entries;
+
+ /* Go get the size data */
+ if(H5AC_get_cache_size(f->shared->cache, (size_t *)argv[0], (size_t *)argv[1],
+ (size_t *)argv[2], &cur_num_entries) < 0)
+ HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_get_cache_size() failed.")
+
+ if(data != NULL)
+ *((int *)data) = (int)cur_num_entries;
+ break;
+ }
+ default:
+ HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "can't get this type of information")
+ }
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+}
diff --git a/src/H5VLprivate.h b/src/H5VLprivate.h
index 6d4c37c..e465bb8 100644
--- a/src/H5VLprivate.h
+++ b/src/H5VLprivate.h
@@ -30,6 +30,7 @@
/* Library Private Typedefs */
/****************************/
+
/*****************************/
/* Library Private Variables */
/*****************************/
@@ -50,9 +51,10 @@ H5_DLL hid_t H5VL_open(const char *name, unsigned flags, hid_t fcpl_id,
hid_t fapl_id, hid_t dxpl_id);
H5_DLL hid_t H5VL_create(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id);
H5_DLL herr_t H5VL_close(hid_t file_id);
+H5_DLL herr_t H5VL_flush(hid_t file_id, H5F_scope_t scope);
+H5_DLL herr_t H5VL_get(hid_t uid, H5VL_file_get_t get_type, void *data, int argc, void **argv);
H5_DLL herr_t H5VL_fapl_open(struct H5P_genplist_t *plist, hid_t vol_id, const void *vol_info);
H5_DLL herr_t H5VL_fapl_copy(hid_t vol_id, const void *fapl, void **copied_fapl);
H5_DLL herr_t H5VL_fapl_close(hid_t vol_id, void *fapl);
-H5_DLL herr_t H5VL_dec_file_vol_ref(H5F_t *f);
#endif /* !_H5VLprivate_H */
diff --git a/src/H5VLpublic.h b/src/H5VLpublic.h
index bf77239..9a800fe 100644
--- a/src/H5VLpublic.h
+++ b/src/H5VLpublic.h
@@ -24,92 +24,85 @@
#include "H5Fpublic.h"
#include "H5Lpublic.h"
-#define H5VL_VOL_DEFAULT 0 /* Default VOL plugin value */
+/* types for all file get API routines */
+typedef enum H5VL_file_get_t {
+ H5F_GET_FAPL = 0, /*file access property list */
+ H5F_GET_FCPL = 1, /*file creation property list */
+ H5F_GET_SIZE = 2, /*file size */
+ H5F_GET_FREE_SPACE = 3, /*file freespace */
+ H5F_GET_INFO = 4, /*file info */
+ H5F_GET_INTENT = 5, /*file intent */
+ H5F_GET_NAME = 6, /*file name */
+ H5F_GET_OBJ_COUNT = 7, /*object count in file */
+ H5F_GET_OBJ_IDS = 8, /*object ids in file */
+ H5F_GET_VFD_HANDLE = 9, /*file VFD handle */
+ H5F_GET_MDC_CONF = 10, /*file metadata cache configuration */
+ H5F_GET_MDC_HR = 11, /*file metadata cache hit rate */
+ H5F_GET_MDC_SIZE = 12, /*file metadata cache size */
+ H5F_GET_FREE_SECTIONS = 13 /*file free selections */
+} H5VL_file_get_t;
-/* general routines common to all HDF5 objects */
-typedef struct H5VL_general_class_t {
- hid_t (*open) (hid_t obj_id, const char * object_name, hid_t plist_id);
- hid_t (*create) (hid_t obj_id, const char *object_name, hid_t type_id, size_t size_hint, hid_t space_id,
- hid_t plist_id1, hid_t plist_id2, hid_t plist_id3);
- htri_t (*exists) (hid_t id, const char *obj_name, const char *name, hid_t lapl_id);
- herr_t (*close) (hid_t obj_id);
-} H5VL_general_class_t;
+#define H5VL_VOL_DEFAULT 0 /* Default VOL plugin value */
/* H5F routines */
typedef struct H5VL_file_class_t {
- H5F_t *(*open) (const char *name, unsigned flags, hid_t fcpl_id,
- hid_t fapl_id, hid_t dxpl_id);
- herr_t (*close) (H5F_t *file);
- H5F_t *(*create) (const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id);
- herr_t (*flush) (hid_t object_id, H5F_scope_t scope);
- htri_t (*is_hdf5) (const char *name);
- herr_t (*mount) (hid_t loc_id, const char *name, hid_t child_id, hid_t plist_id);
- herr_t (*unmount) (hid_t loc_id, const char *name);
- hid_t (*reopen) (hid_t file_id);
+ hid_t (*open) (const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id, hid_t dxpl_id);
+ herr_t (*close) (hid_t file_id);
+ hid_t (*create)(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id);
+ herr_t (*flush) (hid_t file_id, H5F_scope_t scope);
+ herr_t (*get) (hid_t file_id, H5VL_file_get_t get_type, void *data, int argc, void **argv);
} H5VL_file_class_t;
/* H5D routines */
typedef struct H5VL_dataset_class_t {
- herr_t (*read) (hid_t dataset_id, hid_t mem_type_id, hid_t mem_space_id, hid_t file_space_id,
- hid_t xfer_plist_id, void * buf );
- herr_t (*write) (hid_t dataset_id, hid_t mem_type_id, hid_t mem_space_id, hid_t file_space_id,
+ hid_t (*open) (hid_t loc_id, const char *name, hid_t dapl_id);
+ herr_t (*close) (hid_t dataset_id);
+ hid_t (*create)(hid_t loc_id, const char *name, hid_t dtype_id, hid_t space_id,
+ hid_t lcpl_id, hid_t dcpl_id, hid_t dapl_id);
+ herr_t (*read) (hid_t dataset_id, hid_t mem_type_id, hid_t mem_space_id, hid_t file_space_id,
+ hid_t xfer_plist_id, void * buf);
+ herr_t (*write) (hid_t dataset_id, hid_t mem_type_id, hid_t mem_space_id, hid_t file_space_id,
hid_t xfer_plist_id, const void * buf );
- herr_t (*set_extent) (hid_t dset_id, const hsize_t size[] );
+ herr_t (*extend)(hid_t dset_id, const hsize_t size[] );
} H5VL_dataset_class_t;
/* H5A routines */
typedef struct H5VL_attribute_class_t {
- hid_t (*create_by_name) (hid_t loc_id, const char *obj_name, const char *attr_name, hid_t type_id,
- hid_t space_id, hid_t acpl_id, hid_t aapl_id, hid_t lapl_id);
- herr_t (*delete) (hid_t loc_id, const char *attr_name);
- herr_t (*delete_by_idx) (hid_t loc_id, const char *obj_name, H5_index_t idx_type,
- H5_iter_order_t order, hsize_t n, hid_t lapl_id );
- herr_t (*delete_by_name) (hid_t loc_id, const char *obj_name, const char *attr_name, hid_t lapl_id);
- hid_t (*open_by_idx) (hid_t loc_id, const char *obj_name, H5_index_t idx_type, H5_iter_order_t order,
- hsize_t n, hid_t aapl_id, hid_t lapl_id );
- hid_t (*open_by_name) (hid_t loc_id, const char *obj_name, const char *attr_name,
- hid_t aapl_id, hid_t lapl_id );
- hid_t (*open_idx) (hid_t loc_id, unsigned int idx );
- herr_t (*read) (hid_t attr_id, hid_t mem_type_id, void *buf );
- herr_t (*write) (hid_t attr_id, hid_t mem_type_id, const void *buf );
- herr_t (*rename) (hid_t loc_id, const char *obj_name, const char *old_attr_name,
- const char *new_attr_name, hid_t lapl_id);
+ hid_t (*open) (hid_t obj_id, const char *attr_name, hid_t aapl_id);
+ herr_t (*close) (hid_t attr_id);
+ hid_t (*create)( hid_t loc_id, const char *attr_name, hid_t type_id, hid_t space_id,
+ hid_t acpl_id, hid_t aapl_id);
+ herr_t (*delete)(hid_t loc_id, const char *attr_name );
+ herr_t (*read) (hid_t attr_id, hid_t mem_type_id, void *buf );
+ herr_t (*write) (hid_t attr_id, hid_t mem_type_id,
+ const void *buf );
} H5VL_attribute_class_t;
/* H5T routines*/
typedef struct H5VL_datatype_class_t {
- hid_t (*commit) (hid_t loc_id, const char *name, hid_t type_id,
- hid_t lcpl_id, hid_t tcpl_id, hid_t tapl_id);
+ hid_t (*open) (hid_t loc_id, const char * name, hid_t tapl_id);
}H5VL_datatype_class_t;
/* H5L routines */
typedef struct H5VL_link_class_t {
- herr_t (*create) (hid_t obj_id, const char *name, hid_t loc_id, const char *link_name,
+ herr_t (*create) (hid_t obj_id, const char *name, hid_t loc_id, const char *link_name,
hid_t lcpl_id, hid_t lapl_id);
herr_t (*delete) (hid_t loc_id, const char *name, hid_t lapl_id);
- herr_t (*move) (hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, const char *dest_name,
- hid_t lcpl, hid_t lapl);
- herr_t (*copy) (hid_t src_loc_id, const char *src_name, hid_t dest_loc_id, const char *dest_name,
- hid_t lcpl_id, hid_t lapl_id);
- herr_t (*delete_by_idx) (hid_t loc_id, const char *group_name, H5_index_t index_field,
- H5_iter_order_t order, hsize_t n, hid_t lapl_id);
- herr_t (*create_external) (const char *target_file_name, const char *target_obj_name,
- hid_t link_loc_id, const char *link_name, hid_t lcpl_id, hid_t lapl_id);
- herr_t (*create_ud) (hid_t link_loc_id, const char *link_name, H5L_type_t link_type,
- const char *udata, size_t udata_size, hid_t lcpl_id, hid_t lapl_id);
-
+ herr_t (*move) (hid_t src_loc_id, const char *src_name, hid_t dst_loc_id,
+ const char *dest_name, hid_t lcpl, hid_t lapl);
+ herr_t (*copy) (hid_t src_loc_id, const char *src_name, hid_t dest_loc_id,
+ const char *dest_name, hid_t lcpl_id, hid_t lapl_id);
} H5VL_link_class_t;
/* H5O routines */
typedef struct H5VL_object_class_t {
- herr_t (*set_comment) (hid_t object_id, const char *name, const char *comment, hid_t lapl_id);
- hid_t (*open_by_addr) (hid_t loc_id, haddr_t addr );
- hid_t (*open_by_idx) (hid_t loc_id, const char *group_name, H5_index_t index_type,
- H5_iter_order_t order, hsize_t n, hid_t lapl_id );
- herr_t (*copy) (hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, const char *dst_name,
- hid_t ocpypl_id, hid_t lcpl_id );
- herr_t (*incr_refcount) (hid_t object_id );
- herr_t (*decr_refcount) (hid_t object_id );
+ hid_t (*create)(hid_t loc_id, const char *name, hid_t lcpl_id, hid_t gcpl_id, hid_t gapl_id);
+ hid_t (*open) (hid_t loc_id, const char *name, hid_t lapl_id);
+ herr_t (*close) (hid_t obj_id);
+ herr_t (*move) (hid_t src_loc_id, const char *src_name, hid_t dst_loc_id,
+ const char *dest_name, hid_t lcpl, hid_t lapl);
+ herr_t (*copy) (hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, const char *dst_name,
+ hid_t ocpypl_id, hid_t lcpl_id );
} H5VL_object_class_t;
/* Class information for each VOL driver */
@@ -120,7 +113,6 @@ typedef struct H5VL_class_t {
void * (*fapl_get)(H5F_t *file);
void * (*fapl_copy)(const void *fapl);
herr_t (*fapl_free)(void *fapl);
- H5VL_general_class_t general_cls;
H5VL_file_class_t file_cls;
H5VL_dataset_class_t dataset_cls;
H5VL_attribute_class_t attribute_cls;
@@ -129,7 +121,6 @@ typedef struct H5VL_class_t {
H5VL_object_class_t object_cls;
} H5VL_class_t;
-
/* Function prototypes */
H5_DLL hid_t H5VLregister(const H5VL_class_t *cls);
H5_DLL herr_t H5VLunregister(hid_t driver_id);