summaryrefslogtreecommitdiffstats
path: root/src/H5VLint.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5VLint.c')
-rw-r--r--src/H5VLint.c73
1 files changed, 66 insertions, 7 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() */