summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMohamad Chaarawi <chaarawi@hdfgroup.org>2012-07-11 21:08:58 (GMT)
committerMohamad Chaarawi <chaarawi@hdfgroup.org>2012-07-11 21:08:58 (GMT)
commitf8f9dac38a70f525248c3684e612edf1fa31c18a (patch)
tree78a4bedad56a15a08bb463a4ef5d55d5eb47558c /src
parent0cce1dbca5e3fc11456d6e61d82f992ae85fe6b2 (diff)
downloadhdf5-f8f9dac38a70f525248c3684e612edf1fa31c18a.zip
hdf5-f8f9dac38a70f525248c3684e612edf1fa31c18a.tar.gz
hdf5-f8f9dac38a70f525248c3684e612edf1fa31c18a.tar.bz2
[svn-r22558] add fapl copy & free callbacks to the VOL class as they are needed for VOL info property.
Diffstat (limited to 'src')
-rw-r--r--src/H5VLint.c73
-rw-r--r--src/H5VLnative.c3
-rw-r--r--src/H5VLprivate.h3
-rw-r--r--src/H5VLpublic.h3
4 files changed, 74 insertions, 8 deletions
diff --git a/src/H5VLint.c b/src/H5VLint.c
index efc685b..5b427c2 100644
--- a/src/H5VLint.c
+++ b/src/H5VLint.c
@@ -178,30 +178,80 @@ done:
* Programmer: Mohamad Chaarawi
* January, 2012
*
- * Modifications:
- *
*-------------------------------------------------------------------------
*/
herr_t
H5VL_fapl_open(H5P_genplist_t *plist, H5VL_class_t *vol_cls, const void *vol_info)
{
- herr_t ret_value = SUCCEED; /* Return value */
+ void *copied_vol_info = NULL; /* Temporary VOL driver info */
+ herr_t ret_value = SUCCEED; /* Return value */
- FUNC_ENTER_NOAPI(FAIL)
+ FUNC_ENTER_NOAPI_NOINIT
+
+ if(H5VL_fapl_copy(vol_cls, vol_info, &copied_vol_info) < 0)
+ HGOTO_ERROR(H5E_FILE, H5E_CANTCOPY, FAIL, "can't copy VFL driver info")
/* Set the vol properties for the list */
if(H5P_set(plist, H5F_ACS_VOL_NAME, &vol_cls) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "can't set vol ID")
- /* Set the vol properties for the list */
- if(H5P_set(plist, H5F_ACS_VOL_INFO_NAME, &vol_info) < 0)
+ if(H5P_set(plist, H5F_ACS_VOL_INFO_NAME, &copied_vol_info) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "can't set vol info")
+ copied_vol_info = NULL;
done:
+ if(ret_value < 0)
+ if(copied_vol_info && H5VL_fapl_close(vol_cls, copied_vol_info) < 0)
+ HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEOBJ, FAIL, "can't close copy of driver info")
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_fapl_open() */
/*-------------------------------------------------------------------------
+ * Function: H5VL_fapl_copy
+ *
+ * Purpose: copies plugin specific info to the fapl
+ *
+ * Return: Success: non-negative
+ * Failure: negative
+ *
+ * Programmer: Mohamad Chaarawi
+ * July, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5VL_fapl_copy(H5VL_class_t *vol_cls, const void *vol_info, void **copied_info)
+{
+ void *new_info = NULL;
+ herr_t ret_value = SUCCEED; /* Return value */
+
+ FUNC_ENTER_NOAPI_NOINIT
+
+ /* Copy old pl, if one exists */
+ if(vol_info) {
+ /* Allow the driver to copy or do it ourselves */
+ if(vol_cls->fapl_copy) {
+ new_info = (vol_cls->fapl_copy)(vol_info);
+ if(NULL == new_info)
+ HGOTO_ERROR(H5E_VOL, H5E_NOSPACE, FAIL, "property list copy failed")
+ }
+ else if(vol_cls->fapl_size > 0) {
+ if(NULL == (new_info = H5MM_malloc(vol_cls->fapl_size)))
+ HGOTO_ERROR(H5E_VOL, H5E_NOSPACE, FAIL, "property list allocation failed")
+ HDmemcpy(new_info, vol_info, vol_cls->fapl_size);
+ } else
+ HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "no way to copy plugin property list")
+ } /* end if */
+
+ /* Set copied value */
+ *copied_info = new_info;
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5VL_fapl_copy() */
+
+
+/*-------------------------------------------------------------------------
* Function: H5VL_fapl_close
*
* Purpose: Closes a vol for a property list
@@ -217,12 +267,21 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5VL_fapl_close(H5VL_class_t UNUSED *vol_cls, const void UNUSED *vol_info)
+H5VL_fapl_close(H5VL_class_t *vol_cls, void *vol_info)
{
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
+ if(NULL != vol_cls) {
+ /* Allow driver to free or do it ourselves */
+ if(vol_info && vol_cls->fapl_free) {
+ if((vol_cls->fapl_free)(vol_info) < 0)
+ HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "plugin free request failed")
+ } /* end if */
+ else
+ H5MM_xfree(vol_info);
+ }
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_fapl_close() */
diff --git a/src/H5VLnative.c b/src/H5VLnative.c
index de0ad06..3f77d84 100644
--- a/src/H5VLnative.c
+++ b/src/H5VLnative.c
@@ -132,6 +132,9 @@ static H5VL_class_t H5VL_native_g = {
"native", /* name */
NULL, /* initialize */
NULL, /* terminate */
+ 0, /* fapl_size */
+ NULL, /* fapl_copy */
+ NULL, /* fapl_free */
{ /* attribute_cls */
H5VL_native_attr_create, /* create */
H5VL_native_attr_open, /* open */
diff --git a/src/H5VLprivate.h b/src/H5VLprivate.h
index ee86cd5..c2c88f8 100644
--- a/src/H5VLprivate.h
+++ b/src/H5VLprivate.h
@@ -108,7 +108,8 @@ H5_DLL herr_t H5VL_object_optional(void *obj, H5VL_loc_params_t loc_params, H5VL
H5_DLL herr_t H5VL_object_close(void *obj, H5VL_loc_params_t loc_params, H5VL_t *vol_plugin, hid_t req);
H5_DLL herr_t H5VL_fapl_open(struct H5P_genplist_t *plist, H5VL_class_t *vol_cls, const void *vol_info);
-H5_DLL herr_t H5VL_fapl_close(H5VL_class_t *vol_cls, const void *vol_info);
+H5_DLL herr_t H5VL_fapl_copy(H5VL_class_t *vol_cls, const void *vol_info, void **copied_info);
+H5_DLL herr_t H5VL_fapl_close(H5VL_class_t *vol_cls, void *vol_info);
H5_DLL herr_t H5F_close_file(void *file, H5VL_t *vol_plugin);
H5_DLL herr_t H5A_close_attr(void *attr, H5VL_t *vol_plugin);
diff --git a/src/H5VLpublic.h b/src/H5VLpublic.h
index 35fee4d..add9ee0 100644
--- a/src/H5VLpublic.h
+++ b/src/H5VLpublic.h
@@ -288,6 +288,9 @@ typedef struct H5VL_class_t {
const char *name;
herr_t (*initialize)(void);
herr_t (*terminate)(void);
+ size_t fapl_size;
+ void * (*fapl_copy)(const void *info);
+ herr_t (*fapl_free)(void *info);
H5VL_attr_class_t attr_cls;
H5VL_datatype_class_t datatype_cls;
H5VL_dataset_class_t dataset_cls;