From f8f9dac38a70f525248c3684e612edf1fa31c18a Mon Sep 17 00:00:00 2001 From: Mohamad Chaarawi Date: Wed, 11 Jul 2012 16:08:58 -0500 Subject: [svn-r22558] add fapl copy & free callbacks to the VOL class as they are needed for VOL info property. --- src/H5VLint.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++------ src/H5VLnative.c | 3 +++ src/H5VLprivate.h | 3 ++- src/H5VLpublic.h | 3 +++ 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; -- cgit v0.12