[svn-r7725] Purpose:

Code cleanup

Description:
    Refactored handlier of VFL drivers in file access and data transfer property
lists in order to simplify and unify the code dealing with them.

Platforms tested:
    FreeBSD 4.9 (sleipnir)
    too minor to require h5committest
This commit is contained in:
Quincey Koziol 2003-10-24 14:39:23 -05:00
parent 9d22c9e61a
commit d0be702428
5 changed files with 343 additions and 243 deletions

View File

@ -589,23 +589,15 @@ H5D_xfer_create(hid_t dxpl_id, void UNUSED *create_data)
/* Get the driver information */
if(H5P_get(plist, H5D_XFER_VFL_ID_NAME, &driver_id)<0)
HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve VFL driver ID")
HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "can't retrieve VFL driver ID")
if(H5P_get(plist, H5D_XFER_VFL_INFO_NAME, &driver_info)<0)
HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve VFL driver info")
HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "can't retrieve VFL driver info")
/* Check if we have a valid driver ID */
if(driver_id>0) {
/* Increment the reference count on the driver and copy the driver info */
if(H5I_inc_ref(driver_id)<0)
HGOTO_ERROR (H5E_DATASET, H5E_CANTINC, FAIL, "Can't increment VFL driver ID")
if(H5FD_dxpl_copy(driver_id, driver_info, &driver_info)<0)
HGOTO_ERROR (H5E_DATASET, H5E_CANTCOPY, FAIL, "Can't copy VFL driver")
/* Set the driver information for the new property list */
if(H5P_set(plist, H5D_XFER_VFL_ID_NAME, &driver_id)<0)
HGOTO_ERROR (H5E_PLIST, H5E_CANTSET, FAIL, "Can't set VFL driver ID")
if(H5P_set(plist, H5D_XFER_VFL_INFO_NAME, &driver_info)<0)
HGOTO_ERROR (H5E_PLIST, H5E_CANTSET, FAIL, "Can't set VFL driver info")
/* Set the driver for the property list */
if(H5FD_dxpl_open(plist, driver_id, driver_info)<0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set driver")
} /* end if */
done:
@ -633,15 +625,32 @@ done:
*/
/* ARGSUSED */
herr_t
H5D_xfer_copy(hid_t new_plist_id, hid_t UNUSED old_plist_id,
void *copy_data)
H5D_xfer_copy(hid_t new_dxpl_id, hid_t old_dxpl_id, void UNUSED *copy_data)
{
hid_t driver_id;
void* driver_info;
H5P_genplist_t *new_plist; /* New property list */
H5P_genplist_t *old_plist; /* Old property list */
herr_t ret_value=SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(H5D_xfer_copy, FAIL)
if(H5D_xfer_create(new_plist_id, copy_data) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't copy property list")
if(NULL == (new_plist = H5I_object(new_dxpl_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
if(NULL == (old_plist = H5I_object(old_dxpl_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
/* Get values from old property list */
if(H5P_get(old_plist, H5D_XFER_VFL_ID_NAME, &driver_id)<0)
HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "can't retrieve VFL driver ID")
if(H5P_get(old_plist, H5D_XFER_VFL_INFO_NAME, &driver_info)<0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get drver info")
if(driver_id > 0) {
/* Set the driver for the property list */
if(H5FD_dxpl_open(new_plist, driver_id, driver_info)<0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set driver")
} /* end if */
done:
FUNC_LEAVE_NOAPI(ret_value)
@ -688,10 +697,9 @@ H5D_xfer_close(hid_t dxpl_id, void UNUSED *close_data)
if(H5P_get(plist, H5D_XFER_VFL_INFO_NAME, &driver_info)<0)
HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve VFL driver info")
if(driver_id>0) {
if(H5FD_dxpl_free(driver_id, driver_info)<0)
HGOTO_ERROR (H5E_DATASET, H5E_CANTFREE, FAIL, "Can't free VFL driver")
if(H5I_dec_ref(driver_id)<0)
HGOTO_ERROR (H5E_DATASET, H5E_CANTFREE, FAIL, "Can't decrement VFL driver ID")
/* Close the driver for the property list */
if(H5FD_dxpl_close(driver_id, driver_info)<0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't reset driver")
} /* end if */
done:

129
src/H5F.c
View File

@ -537,79 +537,15 @@ H5F_acs_create(hid_t fapl_id, void UNUSED *copy_data)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get drver info")
if(driver_id > 0) {
/* Increment the reference count on driver and copy driver info */
if(H5I_inc_ref(driver_id)<0)
HGOTO_ERROR(H5E_FILE, H5E_CANTINC, FAIL, "unable to increment ref count on VFL driver")
driver_info = H5FD_fapl_copy(driver_id, driver_info);
/* Set the driver properties for the list */
if(H5P_set(plist, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set drver ID")
if(H5P_set(plist, H5F_ACS_FILE_DRV_INFO_NAME, &driver_info) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set drver info")
/* Set the driver for the property list */
if(H5FD_fapl_open(plist, driver_id, driver_info)<0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set driver")
} /* end if */
done:
FUNC_LEAVE_NOAPI(ret_value)
}
/*--------------------------------------------------------------------------
* Function: H5F_acs_close
*
* Purpose: Callback routine which is called whenever a file access
* property list is closed. This routine performs any generic
* cleanup needed on the properties.
*
* Return: Success: Non-negative
*
* Failure: Negative
*
* Programmer: Raymond Lu
* Tuesday, Oct 23, 2001
*
* Modifications:
*
*---------------------------------------------------------------------------
*/
/* ARGSUSED */
herr_t
H5F_acs_close(hid_t fapl_id, void UNUSED *close_data)
{
hid_t driver_id;
void *driver_info;
H5P_genplist_t *plist; /* Property list */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(H5F_acs_close, FAIL)
/* Check argument */
if(NULL == (plist = H5I_object(fapl_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
if(H5P_get(plist, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0)
HGOTO_DONE(FAIL) /* Can't return errors when library is shutting down */
if(H5P_get(plist, H5F_ACS_FILE_DRV_INFO_NAME, &driver_info) < 0)
HGOTO_DONE(FAIL) /* Can't return errors when library is shutting down */
if(driver_id > 0) {
/* Free memory for driver info and decrement reference count for driver */
if(H5FD_fapl_free(driver_id, driver_info)<0)
HGOTO_DONE(FAIL) /* Can't return errors when library is shutting down */
if(H5I_dec_ref(driver_id)<0)
HGOTO_DONE(FAIL) /* Can't return errors when library is shutting down */
driver_info = NULL;
driver_id = -1;
if(H5P_set(plist, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0)
HGOTO_DONE(FAIL) /* Can't return errors when library is shutting down */
if(H5P_set(plist, H5F_ACS_FILE_DRV_INFO_NAME, &driver_info) < 0)
HGOTO_DONE(FAIL) /* Can't return errors when library is shutting down */
}
done:
FUNC_LEAVE_NOAPI(ret_value)
}
/*--------------------------------------------------------------------------
* Function: H5F_acs_copy
@ -651,19 +587,64 @@ H5F_acs_copy(hid_t new_fapl_id, hid_t old_fapl_id, void UNUSED *copy_data)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get drver info")
if(driver_id > 0) {
if(H5I_inc_ref(driver_id)<0)
HGOTO_ERROR(H5E_FILE, H5E_CANTINC, FAIL, "unable to increment ref count on VFL driver")
driver_info = H5FD_fapl_copy(driver_id, driver_info);
if(H5P_set(new_plist, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set drver ID")
if(H5P_set(new_plist, H5F_ACS_FILE_DRV_INFO_NAME, &driver_info) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set drver info")
/* Set the driver for the property list */
if(H5FD_fapl_open(new_plist, driver_id, driver_info)<0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set driver")
} /* end if */
done:
FUNC_LEAVE_NOAPI(ret_value)
}
/*--------------------------------------------------------------------------
* Function: H5F_acs_close
*
* Purpose: Callback routine which is called whenever a file access
* property list is closed. This routine performs any generic
* cleanup needed on the properties.
*
* Return: Success: Non-negative
*
* Failure: Negative
*
* Programmer: Raymond Lu
* Tuesday, Oct 23, 2001
*
* Modifications:
*
*---------------------------------------------------------------------------
*/
/* ARGSUSED */
herr_t
H5F_acs_close(hid_t fapl_id, void UNUSED *close_data)
{
hid_t driver_id;
void *driver_info;
H5P_genplist_t *plist; /* Property list */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(H5F_acs_close, FAIL)
/* Check argument */
if(NULL == (plist = H5I_object(fapl_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
if(H5P_get(plist, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0)
HGOTO_DONE(FAIL) /* Can't return errors when library is shutting down */
if(H5P_get(plist, H5F_ACS_FILE_DRV_INFO_NAME, &driver_info) < 0)
HGOTO_DONE(FAIL) /* Can't return errors when library is shutting down */
if(driver_id > 0) {
/* Close the driver for the property list */
if(H5FD_fapl_close(driver_id, driver_info)<0)
HGOTO_DONE(FAIL) /* Can't return errors when library is shutting down */
}
done:
FUNC_LEAVE_NOAPI(ret_value)
}
#ifdef NOT_YET
/*-------------------------------------------------------------------------

View File

@ -51,6 +51,10 @@ static int interface_initialize_g = 0;
/* static prototypes */
static herr_t H5FD_init_interface(void);
static herr_t H5FD_pl_copy(void *(*copy_func)(const void *), size_t pl_size,
const void *old_pl, void **copied_pl);
static herr_t H5FD_pl_close(hid_t driver_id, herr_t (*free_func)(void *),
void *pl);
static herr_t H5FD_free_cls(H5FD_class_t *cls);
static haddr_t H5FD_alloc_from_free_list(H5FD_t *file, H5FD_mem_t type,
H5FD_mem_t mapped_type, hsize_t size);
@ -466,6 +470,92 @@ done:
FUNC_LEAVE_NOAPI(ret_value)
}
/*-------------------------------------------------------------------------
* Function: H5FD_pl_copy
*
* Purpose: Copies the driver-specific part of the a property list.
* This is common code, used by both the dataset transfer and
* file access property list routines.
*
* Return: Success: non-negative
*
* Failure: negative
*
* Programmer: Quincey Koziol
* Thursday, October 23, 2003
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
static herr_t
H5FD_pl_copy(void *(*copy_func)(const void *), size_t pl_size, const void *old_pl, void **copied_pl)
{
void *new_pl = NULL; /* Copy of property list */
herr_t ret_value=SUCCEED; /* Return value */
FUNC_ENTER_NOINIT(H5FD_pl_copy)
/* Copy old pl, if one exists */
if (old_pl) {
/* Allow the driver to copy or do it ourselves */
if (copy_func) {
new_pl = (copy_func)(old_pl);
} else if (pl_size>0) {
if((new_pl = H5MM_malloc(pl_size))==NULL)
HGOTO_ERROR(H5E_VFL, H5E_NOSPACE, FAIL, "property list allocation failed")
HDmemcpy(new_pl, old_pl, pl_size);
} else
HGOTO_ERROR(H5E_VFL, H5E_UNSUPPORTED, FAIL, "no way to copy driver property list")
} /* end if */
/* Set copied value */
*copied_pl=new_pl;
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5FD_pl_copy() */
/*-------------------------------------------------------------------------
* Function: H5FD_pl_close
*
* Purpose: Closes a driver for a property list
* This is common code, used by both the dataset transfer and
* file access property list routines.
*
* Return: Success: non-negative
* Failure: negative
*
* Programmer: Quincey Koziol
* Thursday, October 23, 2003
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
static herr_t
H5FD_pl_close(hid_t driver_id, herr_t (*free_func)(void *), void *pl)
{
herr_t ret_value=SUCCEED; /* Return value */
FUNC_ENTER_NOINIT(H5FD_pl_close)
/* Allow driver to free or do it ourselves */
if (pl && free_func) {
if ((free_func)(pl)<0)
HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "driver free request failed")
} else
H5MM_xfree(pl);
/* Decrement reference count for driver */
H5I_dec_ref(driver_id);
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5FD_pl_close() */
/*-------------------------------------------------------------------------
* Function: H5FD_fapl_get
@ -507,7 +597,48 @@ H5FD_fapl_get(H5FD_t *file)
done:
FUNC_LEAVE_NOAPI(ret_value)
}
} /* end H5FD_fapl_get() */
/*-------------------------------------------------------------------------
* Function: H5FD_fapl_open
*
* Purpose: Mark a driver as used by a file access property list
*
* Return: Success: non-negative
*
* Failure: negative
*
* Programmer: Quincey Koziol
* Thursday, October 23, 2003
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
herr_t
H5FD_fapl_open(H5P_genplist_t *plist, hid_t driver_id, void *driver_info)
{
void *copied_driver_info; /* Temporary VFL driver info */
herr_t ret_value=SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(H5FD_fapl_open, FAIL)
/* Increment the reference count on driver and copy driver info */
if(H5I_inc_ref(driver_id)<0)
HGOTO_ERROR(H5E_FILE, H5E_CANTINC, FAIL, "unable to increment ref count on VFL driver")
if(H5FD_fapl_copy(driver_id, driver_info, &copied_driver_info)<0)
HGOTO_ERROR (H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy VFL driver info")
/* Set the driver properties for the list */
if(H5P_set(plist, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set driver ID")
if(H5P_set(plist, H5F_ACS_FILE_DRV_INFO_NAME, &copied_driver_info) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set driver info")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5FD_fapl_open() */
/*-------------------------------------------------------------------------
@ -516,58 +647,6 @@ done:
* Purpose: Copies the driver-specific part of the file access property
* list.
*
* Return: Success: Pointer to new driver-specific file access
* properties.
*
* Failure: NULL, but also returns null with no error
* pushed onto the error stack if the OLD_FAPL
* is null.
*
* Programmer: Robb Matzke
* Tuesday, August 3, 1999
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
void *
H5FD_fapl_copy(hid_t driver_id, const void *old_fapl)
{
void *new_fapl = NULL;
H5FD_class_t *driver=NULL;
void *ret_value; /* Return value */
FUNC_ENTER_NOAPI(H5FD_fapl_copy, NULL)
/* Check args */
if (NULL==(driver=H5I_object(driver_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a driver ID")
if (!old_fapl)
HGOTO_DONE(NULL); /*but no error*/
/* Allow the driver to copy or do it ourselves */
if (driver->fapl_copy) {
new_fapl = (driver->fapl_copy)(old_fapl);
} else if (driver->fapl_size>0) {
if((new_fapl = H5MM_malloc(driver->fapl_size))==NULL)
HGOTO_ERROR(H5E_VFL, H5E_NOSPACE, NULL, "fapl allocation failed")
HDmemcpy(new_fapl, old_fapl, driver->fapl_size);
} else
HGOTO_ERROR(H5E_VFL, H5E_UNSUPPORTED, NULL, "no way to copy driver file access property list")
/* Set return value */
ret_value=new_fapl;
done:
FUNC_LEAVE_NOAPI(ret_value)
}
/*-------------------------------------------------------------------------
* Function: H5FD_fapl_free
*
* Purpose: Frees the driver-specific file access property list.
*
* Return: Success: non-negative
*
* Failure: negative
@ -580,29 +659,104 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
H5FD_fapl_free(hid_t driver_id, void *fapl)
H5FD_fapl_copy(hid_t driver_id, const void *old_fapl, void **copied_fapl)
{
H5FD_class_t *driver=NULL;
herr_t ret_value=SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(H5FD_fapl_free, FAIL)
herr_t ret_value=SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(H5FD_fapl_copy, FAIL)
/* Check args */
if (NULL==(driver=H5I_object(driver_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a driver ID")
/* Allow driver to free or do it ourselves */
if (fapl && driver->fapl_free) {
if ((driver->fapl_free)(fapl)<0)
HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "driver fapl_free request failed")
} else {
H5MM_xfree(fapl);
}
/* Copy the file access property list */
if(H5FD_pl_copy(driver->fapl_copy,driver->fapl_size,old_fapl,copied_fapl)<0)
HGOTO_ERROR(H5E_VFL, H5E_UNSUPPORTED, FAIL, "can't copy driver file access property list")
done:
FUNC_LEAVE_NOAPI(ret_value)
}
/*-------------------------------------------------------------------------
* Function: H5FD_fapl_close
*
* Purpose: Closes a driver for a dataset transfer property list
*
* Return: Success: non-negative
* Failure: negative
*
* Programmer: Robb Matzke
* Tuesday, August 3, 1999
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
herr_t
H5FD_fapl_close(hid_t driver_id, void *fapl)
{
H5FD_class_t *driver=NULL;
herr_t ret_value=SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(H5FD_fapl_close, FAIL)
/* Check args */
if(driver_id>0) {
if (NULL==(driver=H5I_object(driver_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a driver ID")
/* Close the driver for the property list */
if(H5FD_pl_close(driver_id,driver->fapl_free,fapl)<0)
HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "driver fapl_free request failed")
} /* end if */
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5FD_fapl_close() */
/*-------------------------------------------------------------------------
* Function: H5FD_dxpl_open
*
* Purpose: Mark a driver as used by a data transfer property list
*
* Return: Success: non-negative
*
* Failure: negative
*
* Programmer: Quincey Koziol
* Thursday, October 23, 2003
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
herr_t
H5FD_dxpl_open(H5P_genplist_t *plist, hid_t driver_id, void *driver_info)
{
void *copied_driver_info; /* Temporary VFL driver info */
herr_t ret_value=SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(H5FD_dxpl_open, FAIL)
/* Increment the reference count on the driver and copy the driver info */
if(H5I_inc_ref(driver_id)<0)
HGOTO_ERROR (H5E_DATASET, H5E_CANTINC, FAIL, "can't increment VFL driver ID")
if(H5FD_dxpl_copy(driver_id, driver_info, &copied_driver_info)<0)
HGOTO_ERROR (H5E_DATASET, H5E_CANTCOPY, FAIL, "can't copy VFL driver")
/* Set the driver information for the new property list */
if(H5P_set(plist, H5D_XFER_VFL_ID_NAME, &driver_id)<0)
HGOTO_ERROR (H5E_PLIST, H5E_CANTSET, FAIL, "can't set VFL driver ID")
if(H5P_set(plist, H5D_XFER_VFL_INFO_NAME, &copied_driver_info)<0)
HGOTO_ERROR (H5E_PLIST, H5E_CANTSET, FAIL, "can't set VFL driver info")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5FD_dxpl_open() */
/*-------------------------------------------------------------------------
* Function: H5FD_dxpl_copy
@ -610,12 +764,9 @@ done:
* Purpose: Copies the driver-specific part of the data transfer property
* list.
*
* Return: Success: Pointer to new driver-specific data transfer
* properties.
* Return: Success: non-negative
*
* Failure: NULL, but also returns null with no error
* pushed onto the error stack if the OLD_DXPL
* is null.
* Failure: negative
*
* Programmer: Robb Matzke
* Tuesday, August 3, 1999
@ -627,7 +778,6 @@ done:
herr_t
H5FD_dxpl_copy(hid_t driver_id, const void *old_dxpl, void **copied_dxpl)
{
void *new_dxpl = NULL;
H5FD_class_t *driver=NULL;
herr_t ret_value=SUCCEED; /* Return value */
@ -637,34 +787,21 @@ H5FD_dxpl_copy(hid_t driver_id, const void *old_dxpl, void **copied_dxpl)
if (NULL==(driver=H5I_object(driver_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a driver ID")
/* Copy old dxpl, if one exists */
if (old_dxpl) {
/* Allow the driver to copy or do it ourselves */
if (driver->dxpl_copy) {
new_dxpl = (driver->dxpl_copy)(old_dxpl);
} else if (driver->dxpl_size>0) {
new_dxpl = H5MM_malloc(driver->dxpl_size);
assert(new_dxpl);
HDmemcpy(new_dxpl, old_dxpl, driver->dxpl_size);
} else
HGOTO_ERROR(H5E_VFL, H5E_UNSUPPORTED, FAIL, "no way to copy driver file access property list")
} /* end if */
/* Set copied value */
*copied_dxpl=new_dxpl;
/* Copy the file access property list */
if(H5FD_pl_copy(driver->dxpl_copy,driver->dxpl_size,old_dxpl,copied_dxpl)<0)
HGOTO_ERROR(H5E_VFL, H5E_UNSUPPORTED, FAIL, "can't copy driver data transfer property list")
done:
FUNC_LEAVE_NOAPI(ret_value)
}
} /* end H5FD_dxpl_copy() */
/*-------------------------------------------------------------------------
* Function: H5FD_dxpl_free
* Function: H5FD_dxpl_close
*
* Purpose: Frees the driver-specific data transfer property list.
* Purpose: Closes a driver for a dataset transfer property list
*
* Return: Success: non-negative
*
* Failure: negative
*
* Programmer: Robb Matzke
@ -675,28 +812,26 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
H5FD_dxpl_free(hid_t driver_id, void *dxpl)
H5FD_dxpl_close(hid_t driver_id, void *dxpl)
{
H5FD_class_t *driver=NULL;
herr_t ret_value=SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(H5FD_dxpl_free, FAIL)
FUNC_ENTER_NOAPI(H5FD_dxpl_close, FAIL)
/* Check args */
if (NULL==(driver=H5I_object(driver_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a driver ID")
/* Allow driver to free or do it ourselves */
if (dxpl && driver->dxpl_free) {
if ((driver->dxpl_free)(dxpl)<0)
HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "driver dxpl_free request failed")
} else {
H5MM_xfree(dxpl);
}
if(driver_id>0) {
if (NULL==(driver=H5I_object(driver_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a driver ID")
/* Close the driver for the property list */
if(H5FD_pl_close(driver_id,driver->dxpl_free,dxpl)<0)
HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "driver fapl_free request failed")
} /* end if */
done:
FUNC_LEAVE_NOAPI(ret_value)
}
} /* end H5FD_dxpl_close() */
/*-------------------------------------------------------------------------

View File

@ -45,10 +45,12 @@ H5_DLL hsize_t H5FD_sb_size(H5FD_t *file);
H5_DLL herr_t H5FD_sb_encode(H5FD_t *file, char *name/*out*/, uint8_t *buf);
H5_DLL herr_t H5FD_sb_decode(H5FD_t *file, const char *name, const uint8_t *buf);
H5_DLL void *H5FD_fapl_get(H5FD_t *file);
H5_DLL void *H5FD_fapl_copy(hid_t driver_id, const void *fapl);
H5_DLL herr_t H5FD_fapl_free(hid_t driver_id, void *fapl);
H5_DLL herr_t H5FD_fapl_open(struct H5P_genplist_t *plist, hid_t driver_id, void *driver_info);
H5_DLL herr_t H5FD_fapl_copy(hid_t driver_id, const void *fapl, void **copied_fapl);
H5_DLL herr_t H5FD_fapl_close(hid_t driver_id, void *fapl);
H5_DLL herr_t H5FD_dxpl_open(struct H5P_genplist_t *plist, hid_t driver_id, void *driver_info);
H5_DLL herr_t H5FD_dxpl_copy(hid_t driver_id, const void *dxpl, void **copied_dxpl);
H5_DLL herr_t H5FD_dxpl_free(hid_t driver_id, void *dxpl);
H5_DLL herr_t H5FD_dxpl_close(hid_t driver_id, void *dxpl);
H5_DLL H5FD_t *H5FD_open(const char *name, unsigned flags, hid_t fapl_id,
haddr_t maxaddr);
H5_DLL herr_t H5FD_close(H5FD_t *file);

View File

@ -182,7 +182,6 @@ H5P_set_driver(H5P_genplist_t *plist, hid_t new_driver_id, const void *new_drive
{
hid_t driver_id; /* VFL driver ID */
void *driver_info; /* VFL driver info */
void *copied_driver_info; /* Temporary VFL driver info */
herr_t ret_value=SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(H5P_set_driver, FAIL);
@ -191,58 +190,33 @@ H5P_set_driver(H5P_genplist_t *plist, hid_t new_driver_id, const void *new_drive
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file driver ID");
if( TRUE == H5P_isa_class(plist->plist_id, H5P_FILE_ACCESS) ) {
/* Remove old driver */
/* Get the current driver information */
if(H5P_get(plist, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get driver ID");
if(H5P_get(plist, H5F_ACS_FILE_DRV_INFO_NAME, &driver_info) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET,FAIL,"can't get driver info");
assert(driver_id>=0);
H5FD_fapl_free(driver_id, driver_info);
H5I_dec_ref(driver_id);
/* Add new driver */
H5I_inc_ref(new_driver_id);
driver_id = new_driver_id;
driver_info = H5FD_fapl_copy(new_driver_id, new_driver_info);
if(H5P_set(plist, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set driver ID");
if(H5P_set(plist, H5F_ACS_FILE_DRV_INFO_NAME, &driver_info) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET,FAIL,"can't set driver info");
/* Close the driver for the property list */
if(H5FD_fapl_close(driver_id, driver_info)<0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't reset driver")
/* Set the driver for the property list */
if(H5FD_fapl_open(plist, new_driver_id, new_driver_info)<0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set driver")
} else if( TRUE == H5P_isa_class(plist->plist_id, H5P_DATASET_XFER) ) {
/* Get the current driver information */
if(H5P_get(plist, H5D_XFER_VFL_ID_NAME, &driver_id)<0)
HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve VFL driver ID");
HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "can't retrieve VFL driver ID");
if(H5P_get(plist, H5D_XFER_VFL_INFO_NAME, &driver_info)<0)
HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve VFL driver info");
HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "can't retrieve VFL driver info");
/* Remove old driver */
/* Close the driver for the property list */
if(H5FD_dxpl_close(driver_id, driver_info)<0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't reset driver")
/* Double-check value... */
assert(driver_id>=0);
/* Free any driver information stored */
H5FD_dxpl_free(driver_id, driver_info);
/* Decrement reference count for old driver */
H5I_dec_ref(driver_id);
/* Add new driver */
/* Increment reference count for new driver */
H5I_inc_ref(new_driver_id);
/* Make a copy of the driver information */
if(H5FD_dxpl_copy(new_driver_id, new_driver_info, &copied_driver_info)<0)
HGOTO_ERROR (H5E_DATASET, H5E_CANTCOPY, FAIL, "Can't copy VFL driver");
/* Set the driver info for the property list */
if(H5P_set(plist, H5D_XFER_VFL_ID_NAME, &new_driver_id)<0)
HGOTO_ERROR (H5E_PLIST, H5E_CANTSET, FAIL, "Can't set VFL driver ID");
if(H5P_set(plist, H5D_XFER_VFL_INFO_NAME, &copied_driver_info) < 0)
HGOTO_ERROR (H5E_PLIST, H5E_CANTSET, FAIL, "Can't set VFL driver info");
/* Set the driver for the property list */
if(H5FD_dxpl_open(plist, new_driver_id, new_driver_info)<0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set driver")
} else {
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access or data transfer property list");
}