summaryrefslogtreecommitdiffstats
path: root/src/H5P.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5P.c')
-rw-r--r--src/H5P.c1118
1 files changed, 258 insertions, 860 deletions
diff --git a/src/H5P.c b/src/H5P.c
index 2f52ad8..e4be6d8 100644
--- a/src/H5P.c
+++ b/src/H5P.c
@@ -18,13 +18,17 @@ static char RcsId[] = "@(#)$Revision$";
/* Private header files */
#include <H5private.h> /* Generic Functions */
-#include <H5Iprivate.h> /* IDs */
+#include <H5Iprivate.h> /* IDs */
#include <H5Bprivate.h> /* B-tree subclass names */
#include <H5Dprivate.h> /* Datasets */
#include <H5Eprivate.h> /* Error handling */
+#include <H5FDprivate.h> /* File drivers */
#include <H5MMprivate.h> /* Memory management */
#include <H5Pprivate.h> /* Property lists */
+/* Default file driver - see H5Pget_driver() */
+#include <H5FDsec2.h> /* Posix unbuffered I/O file driver */
+
#define PABLO_MASK H5P_mask
/* Is the interface initialized? */
@@ -181,7 +185,7 @@ H5Pcreate(H5P_class_t type)
HDmemcpy(plist, &H5D_create_dflt, sizeof(H5D_create_t));
break;
- case H5P_DATASET_XFER:
+ case H5P_DATA_XFER:
if (NULL==(plist = H5MM_malloc(sizeof(H5F_xfer_t)))) {
HRETURN_ERROR (H5E_RESOURCE, H5E_NOSPACE, FAIL,
"memory allocation failed");
@@ -249,19 +253,24 @@ H5P_create(H5P_class_t type, void *plist)
FUNC_LEAVE(ret_value);
}
-/*--------------------------------------------------------------------------
- NAME
- H5Pclose
- PURPOSE
- Release access to a property list object.
- USAGE
- herr_t H5Pclose(oid)
- hid_t oid; IN: property list object to release access to
- RETURNS
- Non-negative on success/Negative on failure
- DESCRIPTION
- This function releases access to a property list object
---------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------
+ * Function: H5Pclose
+ *
+ * Purpose: Release access to a property list object, PLIST_ID.
+ *
+ * Return: Success: non-negative
+ *
+ * Failure: negative
+ *
+ * Programmer: Unknown
+ *
+ * Modifications:
+ * Robb Matzke, 1999-08-03
+ * Attempting to close H5P_DEFAULT is no longer an error, but
+ * rather a no-op.
+ *-------------------------------------------------------------------------
+ */
herr_t
H5Pclose(hid_t plist_id)
{
@@ -272,10 +281,9 @@ H5Pclose(hid_t plist_id)
H5TRACE1("e","i",plist_id);
/* Check arguments */
- if (plist_id==H5P_DEFAULT)
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
- "unable to close predefined object");
- if ((type=H5P_get_class (plist_id))<0 || NULL==(plist=H5I_object (plist_id))) {
+ if (plist_id==H5P_DEFAULT) HRETURN(SUCCEED);
+ if ((type=H5P_get_class (plist_id))<0 ||
+ NULL==(plist=H5I_object (plist_id))) {
HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list");
}
@@ -303,13 +311,15 @@ H5Pclose(hid_t plist_id)
* Wednesday, February 18, 1998
*
* Modifications:
- *
+ * Robb Matzke, 1999-08-03
+ * Modified to work with the virtual file layer.
*-------------------------------------------------------------------------
*/
herr_t
H5P_close(H5P_class_t type, void *plist)
{
H5F_access_t *fa_list = (H5F_access_t*)plist;
+ H5F_xfer_t *dx_list = (H5F_xfer_t*)plist;
H5D_create_t *dc_list = (H5D_create_t*)plist;
FUNC_ENTER (H5P_close, FAIL);
@@ -320,33 +330,11 @@ H5P_close(H5P_class_t type, void *plist)
/* Some property lists may need to do special things */
switch (type) {
case H5P_FILE_ACCESS:
- switch (fa_list->driver) {
- case H5F_LOW_ERROR:
- case H5F_LOW_SEC2:
- case H5F_LOW_STDIO:
- case H5F_LOW_CORE:
- /* Nothing to do */
- break;
-
- case H5F_LOW_MPIO:
-#ifdef LATER
- /* Need to free the COMM and INFO objects too. */
-#endif
- break;
-
- case H5F_LOW_SPLIT:
- /* Free member info */
- fa_list->driver = H5F_LOW_ERROR; /*prevent cycles*/
- H5P_close (H5P_FILE_ACCESS, fa_list->u.split.meta_access);
- H5P_close (H5P_FILE_ACCESS, fa_list->u.split.raw_access);
- H5MM_xfree (fa_list->u.split.meta_ext);
- H5MM_xfree (fa_list->u.split.raw_ext);
- break;
-
- case H5F_LOW_FAMILY:
- /* Free member info */
- H5P_close (H5P_FILE_ACCESS, fa_list->u.fam.memb_access);
- break;
+ if (fa_list->driver_id>=0) {
+ H5FD_fapl_free(fa_list->driver_id, fa_list->driver_info);
+ H5I_dec_ref(fa_list->driver_id);
+ fa_list->driver_info = NULL;
+ fa_list->driver_id = -1;
}
break;
@@ -360,8 +348,13 @@ H5P_close(H5P_class_t type, void *plist)
H5O_reset(H5O_PLINE, &(dc_list->pline));
break;
- case H5P_DATASET_XFER:
- /*nothing to do*/
+ case H5P_DATA_XFER:
+ if (dx_list->driver_id>=0) {
+ H5FD_dxpl_free(dx_list->driver_id, dx_list->driver_info);
+ H5I_dec_ref(dx_list->driver_id);
+ dx_list->driver_info = NULL;
+ dx_list->driver_id = -1;
+ }
break;
case H5P_MOUNT:
@@ -1309,539 +1302,177 @@ H5Pget_external(hid_t plist_id, int idx, size_t name_size, char *name/*out*/,
/*-------------------------------------------------------------------------
- * Function: H5Pget_driver
+ * Function: H5Pset_driver
*
- * Purpose: Return the ID of the low-level file driver. PLIST_ID should
- * be a file access property list.
+ * Purpose: Set the file driver (DRIVER_ID) for a file access or data
+ * transfer property list (PLIST_ID) and supply an optional
+ * struct containing the driver-specific properites
+ * (DRIVER_INFO). The driver properties will be copied into the
+ * property list and the reference count on the driver will be
+ * incremented, allowing the caller to close the driver ID but
+ * still use the property list.
*
- * Return: Success: A low-level driver ID
+ * Return: Success: Non-negative
*
- * Failure: H5F_LOW_ERROR (a negative value)
- *
- * Programmer: Robb Matzke
- * Thursday, February 26, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-H5F_driver_t
-H5Pget_driver(hid_t plist_id)
-{
- H5F_access_t *plist = NULL;
-
- FUNC_ENTER (H5Pget_driver, H5F_LOW_ERROR);
- H5TRACE1("Fd","i",plist_id);
-
- /* Check arguments */
- if (H5P_FILE_ACCESS != H5P_get_class (plist_id) ||
- NULL == (plist = H5I_object (plist_id))) {
- HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, H5F_LOW_ERROR,
- "not a file access property list");
- }
-
- FUNC_LEAVE (plist->driver);
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: H5Pset_stdio
- *
- * Purpose: Set the low level file driver to use the functions declared
- * in the stdio.h file: fopen(), fseek() or fseek64(), fread(),
- * fwrite(), and fclose().
- *
- * Return: Non-negative on success/Negative on failure
+ * Failure: Negative
*
* Programmer: Robb Matzke
- * Thursday, February 19, 1998
+ * Tuesday, August 3, 1999
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
herr_t
-H5Pset_stdio(hid_t plist_id)
+H5Pset_driver(hid_t plist_id, hid_t driver_id, const void *driver_info)
{
- H5F_access_t *plist = NULL;
+ H5F_access_t *fapl=NULL;
+ H5F_xfer_t *dxpl=NULL;
- FUNC_ENTER (H5Pset_stdio, FAIL);
- H5TRACE1("e","i",plist_id);
-
- /* Check arguments */
- if (H5P_FILE_ACCESS != H5P_get_class(plist_id) ||
- NULL == (plist = H5I_object(plist_id))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
- "not a file access property list");
- }
+ FUNC_ENTER(H5Pset_driver, FAIL);
+ H5TRACE3("e","iix",plist_id,driver_id,driver_info);
- /* Set driver */
- plist->driver = H5F_LOW_STDIO;
-
- FUNC_LEAVE (SUCCEED);
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: H5Pget_stdio
- *
- * Purpose: If the file access property list is set to the stdio driver
- * then this function returns zero; otherwise it returns a
- * negative value. In the future, additional arguments may be
- * added to this function to match those added to H5Pset_stdio().
- *
- * Return: Non-negative on success/Negative on failure
- *
- * Programmer: Robb Matzke
- * Thursday, February 26, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5Pget_stdio(hid_t plist_id)
-{
- H5F_access_t *plist = NULL;
-
- FUNC_ENTER (H5Pget_stdio, FAIL);
- H5TRACE1("e","i",plist_id);
-
- /* Check arguments */
- if (H5P_FILE_ACCESS != H5P_get_class (plist_id) ||
- NULL == (plist = H5I_object (plist_id))) {
- HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL,
- "not a file access property list");
- }
- if (H5F_LOW_STDIO != plist->driver) {
- HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL,
- "the stdio driver is not set");
+ if (H5I_VFL!=H5I_get_type(driver_id) ||
+ NULL==H5I_object(driver_id)) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file driver ID");
}
- FUNC_LEAVE (SUCCEED);
-}
+ if (H5P_FILE_ACCESS==H5P_get_class(plist_id)) {
+ if (NULL==(fapl=H5I_object(plist_id))) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
+ "not a file access property list");
+ }
+
+ /* Remove old driver */
+ assert(fapl->driver_id>=0);
+ H5FD_fapl_free(fapl->driver_id, fapl->driver_info);
+
+ /* Add new driver */
+ H5I_inc_ref(driver_id);
+ fapl->driver_id = driver_id;
+ fapl->driver_info = H5FD_fapl_copy(driver_id, driver_info);
+
+ } else if (H5P_DATA_XFER==H5P_get_class(plist_id)) {
+ if (NULL==(dxpl=H5I_object(plist_id))) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
+ "not a file access property list");
+ }
-
-/*-------------------------------------------------------------------------
- * Function: H5Pset_sec2
- *
- * Purpose: Set the low-level file driver to use the functions declared
- * in the unistd.h file: open(), lseek() or lseek64(), read(),
- * write(), and close().
- *
- * Return: Non-negative on success/Negative on failure
- *
- * Programmer: Robb Matzke
- * Thursday, February 19, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5Pset_sec2(hid_t plist_id)
-{
- H5F_access_t *plist = NULL;
-
- FUNC_ENTER (H5Pset_sec2, FAIL);
- H5TRACE1("e","i",plist_id);
+ /* Remove old driver */
+ assert(dxpl->driver_id>=0);
+ H5FD_dxpl_free(dxpl->driver_id, dxpl->driver_info);
- /* Check arguments */
- if (H5P_FILE_ACCESS != H5P_get_class(plist_id) ||
- NULL == (plist = H5I_object(plist_id))) {
+ /* Add new driver */
+ H5I_inc_ref(driver_id);
+ dxpl->driver_id = driver_id;
+ dxpl->driver_info = H5FD_fapl_copy(driver_id, driver_info);
+
+ } else {
HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
- "not a file access property list");
+ "not a file access or data transfer property list");
}
- /* Set driver */
- plist->driver = H5F_LOW_SEC2;
-
- FUNC_LEAVE (SUCCEED);
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: H5Pget_sec2
- *
- * Purpose: If the file access property list is set to the sec2 driver
- * then this function returns zero; otherwise it returns a
- * negative value. In the future, additional arguments may be
- * added to this function to match those added to H5Pset_sec2().
- *
- * Return: Non-negative on success/Negative on failure
- *
- * Programmer: Robb Matzke
- * Thursday, February 26, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5Pget_sec2(hid_t plist_id)
-{
- H5F_access_t *plist = NULL;
-
- FUNC_ENTER (H5Pget_sec2, FAIL);
- H5TRACE1("e","i",plist_id);
-
- /* Check arguments */
- if (H5P_FILE_ACCESS != H5P_get_class (plist_id) ||
- NULL == (plist = H5I_object (plist_id))) {
- HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL,
- "not a file access property list");
- }
- if (H5F_LOW_SEC2 != plist->driver) {
- HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL,
- "the sec2 driver is not set");
- }
-
- FUNC_LEAVE (SUCCEED);
+ FUNC_LEAVE(SUCCEED);
}
/*-------------------------------------------------------------------------
- * Function: H5Pset_core
- *
- * Purpose: Set the low-level file driver to use malloc() and free().
- * This driver is restricted to temporary files which are not
- * larger than the amount of virtual memory available. The
- * INCREMENT argument determines the file block size and memory
- * will be allocated in multiples of INCREMENT bytes. A liberal
- * INCREMENT results in fewer calls to realloc() and probably
- * less memory fragmentation.
- *
- * Return: Non-negative on success/Negative on failure
- *
- * Programmer: Robb Matzke
- * Thursday, February 19, 1998
- *
- * Modifications:
+ * Function: H5Pget_driver
*
- *-------------------------------------------------------------------------
- */
-herr_t
-H5Pset_core(hid_t plist_id, size_t increment)
-{
- H5F_access_t *plist = NULL;
-
- FUNC_ENTER (H5Pset_core, FAIL);
- H5TRACE2("e","iz",plist_id,increment);
-
- /* Check arguments */
- if (H5P_FILE_ACCESS != H5P_get_class(plist_id) ||
- NULL == (plist = H5I_object(plist_id))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
- "not a file access property list");
- }
- if (increment<1) {
- HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL,
- "increment must be positive");
- }
-
- /* Set driver */
- plist->driver = H5F_LOW_CORE;
- plist->u.core.increment = increment;
-
- FUNC_LEAVE (SUCCEED);
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: H5Pget_core
+ * Purpose: Return the ID of the low-level file driver. PLIST_ID should
+ * be a file access property list or data transfer propert list.
*
- * Purpose: If the file access property list is set to the core driver
- * then this function returns zero; otherwise it returns a
- * negative value. On success, the block size is returned
- * through the INCREMENT argument if it isn't the null pointer.
- * In the future, additional arguments may be added to this
- * function to match those added to H5Pset_core().
+ * Return: Success: A low-level driver ID which is the same ID
+ * used when the driver was set for the property
+ * list. The driver ID is only valid as long as
+ * the file driver remains registered.
*
- * Return: Non-negative on success/Negative on failure
+ * Failure: Negative
*
* Programmer: Robb Matzke
* Thursday, February 26, 1998
*
* Modifications:
+ * Robb Matzke, 1999-08-03
+ * Rewritten to use the virtual file layer.
*
+ * Robb Matzke, 1999-08-05
+ * If the driver ID is -2 then substitute the current value of
+ * H5FD_SEC2.
*-------------------------------------------------------------------------
*/
-herr_t
-H5Pget_core(hid_t plist_id, size_t *increment/*out*/)
+hid_t
+H5Pget_driver(hid_t plist_id)
{
- H5F_access_t *plist = NULL;
-
- FUNC_ENTER (H5Pget_core, FAIL);
- H5TRACE2("e","ix",plist_id,increment);
+ H5F_access_t *fapl=NULL;
+ H5F_xfer_t *dxpl=NULL;
+ hid_t ret_value=-1;
- /* Check arguments */
- if (H5P_FILE_ACCESS != H5P_get_class (plist_id) ||
- NULL == (plist = H5I_object (plist_id))) {
- HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL,
- "not a file access property list");
- }
- if (H5F_LOW_CORE != plist->driver) {
- HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL,
- "the core driver is not set");
- }
-
- /* Return values */
- if (increment) {
- *increment = plist->u.core.increment;
- }
-
- FUNC_LEAVE (SUCCEED);
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: H5Pset_split
- *
- * Purpose: Set the low-level driver to split meta data from raw data,
- * storing meta data in one file and raw data in another file.
- *
- * Return: Non-negative on success/Negative on failure
- *
- * Programmer: Robb Matzke
- * Thursday, February 19, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5Pset_split(hid_t plist_id, const char *meta_ext, hid_t meta_plist_id,
- const char *raw_ext, hid_t raw_plist_id)
-{
- H5F_access_t *plist = NULL;
- H5F_access_t *meta_plist = &H5F_access_dflt;
- H5F_access_t *raw_plist = &H5F_access_dflt;
-
- FUNC_ENTER (H5Pset_split, FAIL);
- H5TRACE5("e","isisi",plist_id,meta_ext,meta_plist_id,raw_ext,raw_plist_id);
+ FUNC_ENTER (H5Pget_driver, FAIL);
+ H5TRACE1("i","i",plist_id);
- /* Check arguments */
- if (H5P_FILE_ACCESS != H5P_get_class(plist_id) ||
- NULL == (plist = H5I_object(plist_id))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
- "not a file access property list");
- }
- if (H5P_DEFAULT!=meta_plist_id &&
- (H5P_FILE_ACCESS != H5P_get_class(meta_plist_id) ||
- NULL == (meta_plist = H5I_object(meta_plist_id)))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
- "not a file access property list");
- }
- if (H5P_DEFAULT!=raw_plist_id &&
- (H5P_FILE_ACCESS != H5P_get_class(raw_plist_id) ||
- NULL == (raw_plist = H5I_object(raw_plist_id)))) {
+ if (H5P_FILE_ACCESS==H5P_get_class(plist_id) &&
+ (fapl=H5I_object(plist_id))) {
+ ret_value = fapl->driver_id;
+
+ } else if (H5P_DATA_XFER==H5P_get_class(plist_id) &&
+ (dxpl=H5I_object(plist_id))) {
+ ret_value = dxpl->driver_id;
+
+ } else {
HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
- "not a file access property list");
+ "not a file access or data transfer property list");
}
- /* Set driver */
- plist->driver = H5F_LOW_SPLIT;
- plist->u.split.meta_access = H5P_copy (H5P_FILE_ACCESS, meta_plist);
- plist->u.split.raw_access = H5P_copy (H5P_FILE_ACCESS, raw_plist);
- plist->u.split.meta_ext = H5MM_xstrdup (meta_ext);
- plist->u.split.raw_ext = H5MM_xstrdup (raw_ext);
-
- FUNC_LEAVE (SUCCEED);
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: H5Pget_split
- *
- * Purpose: If the file access property list is set to the sec2 driver
- * then this function returns zero; otherwise it returns a
- * negative value. On success, at most META_EXT_SIZE characters
- * are copied to the META_EXT buffer if non-null and at most
- * RAW_EXT_SIZE characters are copied to the RAW_EXT buffer if
- * non-null. If the actual extension is larger than the number
- * of characters requested then the buffer will not be null
- * terminated (that is, behavior like strncpy()). In addition,
- * if META_PROPERTIES and/or RAW_PROPERTIES are non-null then
- * the file access property list of the meta file and/or raw
- * file is copied and its OID returned through these arguments.
- * In the future, additional arguments may be added to this
- * function to match those added to H5Pset_sec2().
- *
- * Return: Non-negative on success/Negative on failure
- *
- * Programmer: Robb Matzke
- * Thursday, February 26, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5Pget_split(hid_t plist_id, size_t meta_ext_size, char *meta_ext/*out*/,
- hid_t *meta_properties/*out*/, size_t raw_ext_size,
- char *raw_ext/*out*/, hid_t *raw_properties/*out*/)
-{
- H5F_access_t *plist = NULL;
-
- FUNC_ENTER (H5Pget_split, FAIL);
- H5TRACE7("e","izxxzxx",plist_id,meta_ext_size,meta_ext,meta_properties,
- raw_ext_size,raw_ext,raw_properties);
-
- /* Check arguments */
- if (H5P_FILE_ACCESS != H5P_get_class (plist_id) ||
- NULL == (plist = H5I_object (plist_id))) {
- HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL,
- "not a file access property list");
- }
- if (H5F_LOW_SPLIT != plist->driver) {
- HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL,
- "the split driver is not set");
- }
-
- /* Reset output args for error handling */
- if (meta_ext && meta_ext_size>0) *meta_ext = '\0';
- if (raw_ext && raw_ext_size>0) *raw_ext = '\0';
- if (meta_properties) *meta_properties = FAIL;
- if (raw_properties) *raw_properties = FAIL;
-
- /* Output arguments */
- if (meta_ext && meta_ext_size>0) {
- if (plist->u.split.meta_ext) {
- HDstrncpy (meta_ext, plist->u.split.meta_ext, meta_ext_size);
- } else {
- HDstrncpy (meta_ext, ".meta", meta_ext_size);
- }
- }
- if (raw_ext && raw_ext_size>0) {
- if (plist->u.split.raw_ext) {
- HDstrncpy (raw_ext, plist->u.split.raw_ext, raw_ext_size);
- } else {
- HDstrncpy (raw_ext, ".raw", raw_ext_size);
- }
- }
- if (meta_properties) {
- assert (plist->u.split.meta_access);
- *meta_properties = H5P_create (H5P_FILE_ACCESS,
- H5P_copy (H5P_FILE_ACCESS,
- plist->u.split.meta_access));
- }
- if (raw_properties) {
- assert (plist->u.split.raw_access);
- *raw_properties = H5P_create (H5P_FILE_ACCESS,
- H5P_copy (H5P_FILE_ACCESS,
- plist->u.split.raw_access));
- }
-
- FUNC_LEAVE (SUCCEED);
+ if (-2==ret_value) ret_value = H5FD_SEC2;
+ FUNC_LEAVE(ret_value);
}
/*-------------------------------------------------------------------------
- * Function: H5Pset_family
+ * Function: H5Pget_driver_info
*
- * Purpose: Sets the low-level driver to stripe the hdf5 address space
- * across a family of files. The MEMB_SIZE argument indicates
- * the size in bytes of each family member and is only
- * meaningful when creating new files or opening families that
- * have only one member.
+ * Purpose: Returns a pointer directly to the file driver-specific
+ * information of a file access or data transfer property list.
*
- * Return: Non-negative on success/Negative on failure
+ * Return: Success: Ptr to *uncopied* driver specific data
+ * structure if any.
*
- * Programmer: Robb Matzke
- * Thursday, February 19, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5Pset_family(hid_t plist_id, hsize_t memb_size, hid_t memb_plist_id)
-{
-
- H5F_access_t *plist = NULL;
- H5F_access_t *memb_plist = &H5F_access_dflt;
-
- FUNC_ENTER (H5Pset_family, FAIL);
- H5TRACE3("e","ihi",plist_id,memb_size,memb_plist_id);
-
- /* Check arguments */
- if (H5P_FILE_ACCESS != H5P_get_class(plist_id) ||
- NULL == (plist = H5I_object(plist_id))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
- "not a file access property list");
- }
- if (memb_size && memb_size<1024) {
- HRETURN_ERROR (H5E_ARGS, H5E_BADRANGE, FAIL,
- "family member size is too small");
- }
- if (H5P_DEFAULT!=memb_plist_id &&
- (H5P_FILE_ACCESS != H5P_get_class(memb_plist_id) ||
- NULL == (plist = H5I_object(memb_plist_id)))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
- "not a file access property list");
- }
-
- /* Set driver */
- plist->driver = H5F_LOW_FAMILY;
- plist->u.fam.memb_size = memb_size;
- plist->u.fam.memb_access = H5P_copy (H5P_FILE_ACCESS, memb_plist);
-
- FUNC_LEAVE (SUCCEED);
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: H5Pget_family
- *
- * Purpose: If the file access property list is set to the family driver
- * then this function returns zero; otherwise it returns a
- * negative value. On success, if MEMB_PLIST_ID is a non-null
- * pointer it will be initialized with the id of an open
- * property list: the file access property list for the family
- * members. In the future, additional arguments may be added to
- * this function to match those added to H5Pset_family().
- *
- * Return: Non-negative on success/Negative on failure
+ * Failure: NULL. Null is also returned if the driver has
+ * not registered any driver-specific properties
+ * although no error is pushed on the stack in
+ * this case.
*
* Programmer: Robb Matzke
- * Thursday, February 26, 1998
+ * Wednesday, August 4, 1999
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
-herr_t
-H5Pget_family(hid_t plist_id, hsize_t *memb_size/*out*/,
- hid_t *memb_plist_id/*out*/)
+void *
+H5Pget_driver_info(hid_t plist_id)
{
- H5F_access_t *plist = NULL;
+ H5F_access_t *fapl=NULL;
+ H5F_xfer_t *dxpl=NULL;
+ void *ret_value=NULL;
- FUNC_ENTER (H5Pget_family, FAIL);
- H5TRACE3("e","ixx",plist_id,memb_size,memb_plist_id);
+ FUNC_ENTER(H5Pget_driver_info, NULL);
- /* Check arguments */
- if (H5P_FILE_ACCESS != H5P_get_class (plist_id) ||
- NULL == (plist = H5I_object (plist_id))) {
- HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL,
- "not a file access property list");
- }
- if (H5F_LOW_FAMILY != plist->driver) {
- HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL,
- "the family driver is not set");
- }
-
- /* Output args */
- if (memb_size) {
- *memb_size = plist->u.fam.memb_size;
- }
- if (memb_plist_id) {
- assert (plist->u.fam.memb_access);
- *memb_plist_id = H5P_create (H5P_FILE_ACCESS,
- H5P_copy (H5P_FILE_ACCESS,
- plist->u.fam.memb_access));
- }
+ if (H5P_FILE_ACCESS==H5P_get_class(plist_id) &&
+ (fapl=H5I_object(plist_id))) {
+ ret_value = fapl->driver_info;
- FUNC_LEAVE (SUCCEED);
+ } else if (H5P_DATA_XFER==H5P_get_class(plist_id) &&
+ (dxpl=H5I_object(plist_id))) {
+ ret_value = dxpl->driver_info;
+
+ } else {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, NULL,
+ "not a file access or data transfer property list");
+ }
+
+ FUNC_LEAVE(ret_value);
}
@@ -1986,7 +1617,7 @@ H5Pset_buffer(hid_t plist_id, size_t size, void *tconv, void *bkg)
H5TRACE4("e","izxx",plist_id,size,tconv,bkg);
/* Check arguments */
- if (H5P_DATASET_XFER != H5P_get_class (plist_id) ||
+ if (H5P_DATA_XFER != H5P_get_class (plist_id) ||
NULL == (plist = H5I_object (plist_id))) {
HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL,
"not a dataset transfer property list");
@@ -2030,7 +1661,7 @@ H5Pget_buffer(hid_t plist_id, void **tconv/*out*/, void **bkg/*out*/)
H5TRACE3("z","ixx",plist_id,tconv,bkg);
/* Check arguments */
- if (H5P_DATASET_XFER != H5P_get_class (plist_id) ||
+ if (H5P_DATA_XFER != H5P_get_class (plist_id) ||
NULL == (plist = H5I_object (plist_id))) {
HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, 0,
"not a dataset transfer property list");
@@ -2076,7 +1707,7 @@ H5Pset_hyper_cache(hid_t plist_id, unsigned cache, unsigned limit)
H5TRACE3("e","iIuIu",plist_id,cache,limit);
/* Check arguments */
- if (H5P_DATASET_XFER != H5P_get_class (plist_id) ||
+ if (H5P_DATA_XFER != H5P_get_class (plist_id) ||
NULL == (plist = H5I_object (plist_id))) {
HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL,
"not a dataset transfer property list");
@@ -2087,7 +1718,7 @@ H5Pset_hyper_cache(hid_t plist_id, unsigned cache, unsigned limit)
plist->block_limit = limit;
FUNC_LEAVE (SUCCEED);
-} /* end H5P_set_hyper_cache() */
+}
/*-------------------------------------------------------------------------
@@ -2114,7 +1745,7 @@ H5Pget_hyper_cache(hid_t plist_id, unsigned *cache/*out*/,
H5TRACE3("e","ixx",plist_id,cache,limit);
/* Check arguments */
- if (H5P_DATASET_XFER != H5P_get_class (plist_id) ||
+ if (H5P_DATA_XFER != H5P_get_class (plist_id) ||
NULL == (plist = H5I_object (plist_id))) {
HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, 0,
"not a dataset transfer property list");
@@ -2125,7 +1756,7 @@ H5Pget_hyper_cache(hid_t plist_id, unsigned *cache/*out*/,
if (limit) *limit = plist->block_limit;
FUNC_LEAVE (SUCCEED);
-} /* end H5Pget_hyper_cache() */
+}
/*-------------------------------------------------------------------------
@@ -2155,7 +1786,7 @@ H5Pset_preserve(hid_t plist_id, hbool_t status)
H5TRACE2("e","ib",plist_id,status);
/* Check arguments */
- if (H5P_DATASET_XFER != H5P_get_class (plist_id) ||
+ if (H5P_DATA_XFER != H5P_get_class (plist_id) ||
NULL == (plist = H5I_object (plist_id))) {
HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL,
"not a dataset transfer property list");
@@ -2193,7 +1824,7 @@ H5Pget_preserve(hid_t plist_id)
H5TRACE1("Is","i",plist_id);
/* Check arguments */
- if (H5P_DATASET_XFER != H5P_get_class (plist_id) ||
+ if (H5P_DATA_XFER != H5P_get_class (plist_id) ||
NULL == (plist = H5I_object (plist_id))) {
HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL,
"not a dataset transfer property list");
@@ -2249,7 +1880,7 @@ H5Pset_filter(hid_t plist_id, H5Z_filter_t filter, unsigned int flags,
H5TRACE5("e","iZfIuz*[a3]Iu",plist_id,filter,flags,cd_nelmts,cd_values);
/* Check arguments */
- if (H5P_DATASET_XFER==H5P_get_class(plist_id)) {
+ if (H5P_DATA_XFER==H5P_get_class(plist_id)) {
HRETURN_ERROR(H5E_PLINE, H5E_UNSUPPORTED, FAIL,
"transient pipelines are not supported yet");
}
@@ -2313,7 +1944,7 @@ H5Pget_nfilters(hid_t plist_id)
FUNC_ENTER(H5Pget_nfilters, FAIL);
H5TRACE1("Is","i",plist_id);
- if (H5P_DATASET_XFER==H5P_get_class(plist_id)) {
+ if (H5P_DATA_XFER==H5P_get_class(plist_id)) {
HRETURN_ERROR(H5E_PLINE, H5E_UNSUPPORTED, FAIL,
"transient pipelines are not supported yet");
}
@@ -2365,7 +1996,7 @@ H5Pget_filter(hid_t plist_id, int idx, unsigned int *flags/*out*/,
name);
/* Check arguments */
- if (H5P_DATASET_XFER==H5P_get_class(plist_id)) {
+ if (H5P_DATA_XFER==H5P_get_class(plist_id)) {
HRETURN_ERROR(H5E_PLINE, H5E_UNSUPPORTED, FAIL,
"transient filters are not supported yet");
}
@@ -2452,7 +2083,7 @@ H5Pset_deflate(hid_t plist_id, unsigned level)
H5TRACE2("e","iIu",plist_id,level);
/* Check arguments */
- if (H5P_DATASET_XFER==H5P_get_class(plist_id)) {
+ if (H5P_DATA_XFER==H5P_get_class(plist_id)) {
HRETURN_ERROR(H5E_PLINE, H5E_UNSUPPORTED, FAIL,
"transient filter pipelines are not supported yet");
}
@@ -2504,7 +2135,7 @@ H5Pget_btree_ratios(hid_t plist_id, double *left/*out*/, double *middle/*out*/,
H5TRACE4("e","ixxx",plist_id,left,middle,right);
/* Check arguments */
- if (H5P_DATASET_XFER!=H5P_get_class(plist_id) ||
+ if (H5P_DATA_XFER!=H5P_get_class(plist_id) ||
NULL==(plist=H5I_object(plist_id))) {
HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
"not a dataset transfer property list");
@@ -2551,7 +2182,7 @@ H5Pset_btree_ratios(hid_t plist_id, double left, double middle,
H5TRACE4("e","iddd",plist_id,left,middle,right);
/* Check arguments */
- if (H5P_DATASET_XFER!=H5P_get_class(plist_id) ||
+ if (H5P_DATA_XFER!=H5P_get_class(plist_id) ||
NULL==(plist=H5I_object(plist_id))) {
HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
"not a dataset transfer property list");
@@ -2736,261 +2367,27 @@ H5Pget_fill_value(hid_t plist_id, hid_t type_id, void *value/*out*/)
}
-#ifdef HAVE_PARALLEL
-/*-------------------------------------------------------------------------
- * Function: H5Pset_mpi
- *
- * Signature: herr_t H5Pset_mpi(hid_t plist_id, MPI_Comm comm, MPI_Info info)
- *
- * Purpose: Store the access mode for MPIO call and the user supplied
- * communicator and info in the access property list which can
- * then be used to open file. This function is available only
- * in the parallel HDF5 library and is not a collective
- * function.
- *
- * Parameters:
- * hid_t plist_id
- * ID of property list to modify
- * MPI_Comm comm
- * MPI communicator to be used for file open as defined in
- * MPI_FILE_OPEN of MPI-2. This function does not make a
- * duplicated communicator. Any modification to comm after
- * this function call returns may have undetermined effect
- * to the access property list. Users should call this
- * function again to setup the property list.
- * MPI_Info info
- * MPI info object to be used for file open as defined in
- * MPI_FILE_OPEN of MPI-2. This function does not make a
- * duplicated info. Any modification to info after
- * this function call returns may have undetermined effect
- * to the access property list. Users should call this
- * function again to setup the property list.
- *
- * Return: Non-negative on success/Negative on failure
- *
- * Programmer: Albert Cheng
- * Feb 3, 1998
- *
- * Modifications:
- *
- * Robb Matzke, 18 Feb 1998
- * Check all arguments before the property list is updated so we don't
- * leave the property list in a bad state if something goes wrong. Also,
- * the property list data type changed to allow more generality so all
- * the mpi-related stuff is in the `u.mpi' member. The `access_mode'
- * will contain only mpi-related flags defined in H5Fpublic.h.
- *
- * Albert Cheng, Apr 16, 1998
- * Removed the access_mode argument. The access_mode is changed
- * to be controlled by data transfer property list during data
- * read/write calls.
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5Pset_mpi(hid_t plist_id, MPI_Comm comm, MPI_Info info)
-{
- H5F_access_t *plist = NULL;
-
- FUNC_ENTER(H5Pset_mpi, FAIL);
- H5TRACE3("e","iMcMi",plist_id,comm,info);
-
- /* Check arguments */
- if (H5P_FILE_ACCESS != H5P_get_class(plist_id) ||
- NULL == (plist = H5I_object(plist_id))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
- "not a file access property list");
- }
-
-#ifdef LATER
- /*
- * Need to verify comm and info contain sensible information.
- */
-#endif
-
- plist->driver = H5F_LOW_MPIO;
- plist->u.mpio.comm = comm;
- plist->u.mpio.info = info;
-
- FUNC_LEAVE(SUCCEED);
-}
-#endif /*HAVE_PARALLEL*/
-
-
-#ifdef HAVE_PARALLEL
-/*-------------------------------------------------------------------------
- * Function: H5Pget_mpi
- *
- * Purpose: If the file access property list is set to the mpi driver
- * then this function returns zero; otherwise it returns a
- * negative value. In the future, additional arguments may be
- * added to this function to match those added to H5Pset_mpi().
- *
- * Return: Non-negative on success/Negative on failure
- *
- * Programmer: Robb Matzke
- * Thursday, February 26, 1998
- *
- * Modifications:
- *
- * Albert Cheng, Apr 16, 1998
- * Removed the access_mode argument. The access_mode is changed
- * to be controlled by data transfer property list during data
- * read/write calls.
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5Pget_mpi(hid_t plist_id, MPI_Comm *comm, MPI_Info *info)
-{
- H5F_access_t *plist = NULL;
-
- FUNC_ENTER (H5Pget_mpi, FAIL);
- H5TRACE3("e","i*Mc*Mi",plist_id,comm,info);
-
- /* Check arguments */
- if (H5P_FILE_ACCESS != H5P_get_class (plist_id) ||
- NULL == (plist = H5I_object (plist_id))) {
- HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL,
- "not a file access property list");
- }
- if (H5F_LOW_MPIO != plist->driver) {
- HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL,
- "the mpi driver is not set");
- }
- *comm = plist->u.mpio.comm;
- *info = plist->u.mpio.info;
-
- FUNC_LEAVE (SUCCEED);
-}
-#endif /*HAVE_PARALLEL*/
-
-
-#ifdef HAVE_PARALLEL
-/*-------------------------------------------------------------------------
- * Function: H5Pset_xfer
- *
- * Signature: herr_t H5Pset_xfer(hid_t plist_id,
- * H5D_transfer_t data_xfer_mode)
- *
- * Purpose: Set the transfer mode of the dataset transfer property list.
- * The list can then be used to control the I/O transfer mode
- * during dataset accesses. This function is available only
- * in the parallel HDF5 library and is not a collective function.
- *
- * Parameters:
- * hid_t plist_id
- * ID of a dataset transfer property list
- * H5D_transfer_t data_xfer_mode
- * Data transfer modes:
- * H5D_XFER_INDEPENDENT
- * Use independent I/O access.
- * H5D_XFER_COLLECTIVE
- * Use MPI collective I/O access.
- * H5D_XFER_DFLT
- * Use default I/O access. Currently,
- * independent is the default mode.
- *
- *
- * Return: Non-negative on success/Negative on failure
- *
- * Programmer: Albert Cheng
- * April 2, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5Pset_xfer(hid_t plist_id, H5D_transfer_t data_xfer_mode)
-{
- H5F_xfer_t *plist = NULL;
-
- FUNC_ENTER(H5Pset_xfer, FAIL);
- H5TRACE2("e","iDt",plist_id,data_xfer_mode);
-
- /* Check arguments */
- if (H5P_DATASET_XFER != H5P_get_class(plist_id) ||
- NULL == (plist = H5I_object(plist_id))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
- "not a dataset transfer property list");
- }
-
- switch (data_xfer_mode){
- case H5D_XFER_INDEPENDENT:
- case H5D_XFER_COLLECTIVE:
- case H5D_XFER_DFLT:
- plist->xfer_mode = data_xfer_mode;
- break;
- default:
- HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL,
- "invalid dataset transfer mode");
- }
-
- FUNC_LEAVE(SUCCEED);
-}
-#endif /*HAVE_PARALLEL*/
-
-
-#ifdef HAVE_PARALLEL
-/*-------------------------------------------------------------------------
- * Function: H5Pget_xfer
- *
- * Purpose: Reads the transfer mode current set in the property list.
- * This function is available only in the parallel HDF5 library
- * and is not a collective function.
- *
- * Return: Non-negative on success/Negative on failure
- *
- * Programmer: Albert Cheng
- * April 2, 1998
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5Pget_xfer(hid_t plist_id, H5D_transfer_t *data_xfer_mode)
-{
- H5F_xfer_t *plist = NULL;
-
- FUNC_ENTER (H5Pget_xfer, FAIL);
- H5TRACE2("e","i*Dt",plist_id,data_xfer_mode);
-
- /* Check arguments */
- if (H5P_DATASET_XFER != H5P_get_class(plist_id) ||
- NULL == (plist = H5I_object(plist_id))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
- "not a dataset transfer property list");
- }
-
- *data_xfer_mode = plist->xfer_mode;
-
- FUNC_LEAVE (SUCCEED);
-}
-#endif /*HAVE_PARALLEL*/
-
-
/*-------------------------------------------------------------------------
* Function: H5Pset_gc_references
*
* Purpose: Sets the flag for garbage collecting references for the file.
- * Dataset region references (and other reference types probably) use
- * space in the file heap. If garbage collection is on and the user
- * passes in an uninitialized value in a reference structure, the heap
- * might get corrupted. When garbage collection is off however and the
- * user re-uses a reference, the previous heap block will be orphaned and
- * not returned to the free heap space. When garbage collection is on,
- * the user must initialize the reference structures to 0 or risk heap
- * corruption.
- *
- * Default value for garbage collecting references is off, just to be
- * on the safe side.
+ * Dataset region references (and other reference types
+ * probably) use space in the file heap. If garbage collection
+ * is on and the user passes in an uninitialized value in a
+ * reference structure, the heap might get corrupted. When
+ * garbage collection is off however and the user re-uses a
+ * reference, the previous heap block will be orphaned and not
+ * returned to the free heap space. When garbage collection is
+ * on, the user must initialize the reference structures to 0 or
+ * risk heap corruption.
+ *
+ * Default value for garbage collecting references is off, just
+ * to be on the safe side.
*
* Return: Non-negative on success/Negative on failure
*
* Programmer: Quincey Koziol
- * Friday, November 13, 1998
+ * June, 1999
*
* Modifications:
*
@@ -3001,12 +2398,14 @@ H5Pset_gc_references(hid_t fapl_id, unsigned gc_ref)
{
H5F_access_t *fapl = NULL;
- FUNC_ENTER (H5Pset_gc_references, FAIL);
+ FUNC_ENTER(H5Pset_gc_references, FAIL);
H5TRACE2("e","iIu",fapl_id,gc_ref);
/* Check args */
- if (H5P_FILE_ACCESS != H5P_get_class (fapl_id) || NULL == (fapl = H5I_object (fapl_id))) {
- HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list");
+ if (H5P_FILE_ACCESS!=H5P_get_class(fapl_id) ||
+ NULL==(fapl=H5I_object(fapl_id))) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
+ "not a file access property list");
}
/* Set values */
@@ -3019,13 +2418,13 @@ H5Pset_gc_references(hid_t fapl_id, unsigned gc_ref)
/*-------------------------------------------------------------------------
* Function: H5Pget_gc_refernces
*
- * Purpose: Returns the current setting for the garbage collection refernces
- * property from a file access property list.
+ * Purpose: Returns the current setting for the garbage collection
+ * refernces property from a file access property list.
*
* Return: Non-negative on success/Negative on failure
*
- * Programmer: Robb Matzke
- * Tuesday, June 9, 1998
+ * Programmer: Quincey Koziol
+ * June, 1999
*
* Modifications:
*
@@ -3036,12 +2435,14 @@ H5Pget_gc_reference(hid_t fapl_id, unsigned *gc_ref/*out*/)
{
H5F_access_t *fapl = NULL;
- FUNC_ENTER (H5Pget_alignment, FAIL);
+ FUNC_ENTER(H5Pget_gc_reference, FAIL);
H5TRACE2("e","ix",fapl_id,gc_ref);
/* Check args */
- if (H5P_FILE_ACCESS != H5P_get_class (fapl_id) || NULL == (fapl = H5I_object (fapl_id))) {
- HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list");
+ if (H5P_FILE_ACCESS!=H5P_get_class(fapl_id) ||
+ NULL==(fapl=H5I_object(fapl_id))) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
+ "not a file access property list");
}
/* Get values */
@@ -3055,13 +2456,13 @@ H5Pget_gc_reference(hid_t fapl_id, unsigned *gc_ref/*out*/)
* Function: H5Pset_vlen_mem_manager
*
* Purpose: Sets the memory allocate/free pair for VL datatypes. The
- * allocation routine is called when data is read into a new array
- * and the free routine is called when H5Dvlen_reclaim is called.
- * The alloc_info and free_info are user parameters which are passed
- * to the allocation and freeing functions respectively.
- * To reset the allocate/free functions to the default setting of using
- * the system's malloc/free functions, call this routine with alloc_func
- * and free_func set to NULL.
+ * allocation routine is called when data is read into a new
+ * array and the free routine is called when H5Dvlen_reclaim is
+ * called. The alloc_info and free_info are user parameters
+ * which are passed to the allocation and freeing functions
+ * respectively. To reset the allocate/free functions to the
+ * default setting of using the system's malloc/free functions,
+ * call this routine with alloc_func and free_func set to NULL.
*
* Return: Non-negative on success/Negative on failure
*
@@ -3078,13 +2479,14 @@ H5Pset_vlen_mem_manager(hid_t plist_id, H5MM_allocate_t alloc_func,
{
H5F_xfer_t *plist = NULL;
- FUNC_ENTER (H5Pset_vlen_mem_manager, FAIL);
+ FUNC_ENTER(H5Pset_vlen_mem_manager, FAIL);
H5TRACE5("e","ixxxx",plist_id,alloc_func,alloc_info,free_func,free_info);
/* Check arguments */
- if (H5P_DATASET_XFER != H5P_get_class (plist_id) ||
- NULL == (plist = H5I_object (plist_id))) {
- HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset transfer property list");
+ if (H5P_DATA_XFER!=H5P_get_class(plist_id) ||
+ NULL==(plist=H5I_object(plist_id))) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
+ "not a dataset transfer property list");
}
/* Update property list */
@@ -3112,19 +2514,21 @@ H5Pset_vlen_mem_manager(hid_t plist_id, H5MM_allocate_t alloc_func,
*-------------------------------------------------------------------------
*/
herr_t
-H5Pget_vlen_mem_manager(hid_t plist_id, H5MM_allocate_t *alloc_func,
- void **alloc_info, H5MM_free_t *free_func, void **free_info)
+H5Pget_vlen_mem_manager(hid_t plist_id, H5MM_allocate_t *alloc_func/*out*/,
+ void **alloc_info/*out*/,
+ H5MM_free_t *free_func/*out*/,
+ void **free_info/*out*/)
{
H5F_xfer_t *plist = NULL;
- FUNC_ENTER (H5Pset_vlen_mem_manager, FAIL);
- H5TRACE5("e","i*x*x*x*x",plist_id,alloc_func,alloc_info,free_func,
- free_info);
+ FUNC_ENTER(H5Pget_vlen_mem_manager, FAIL);
+ H5TRACE5("e","ixxxx",plist_id,alloc_func,alloc_info,free_func,free_info);
/* Check arguments */
- if (H5P_DATASET_XFER != H5P_get_class (plist_id) ||
- NULL == (plist = H5I_object (plist_id))) {
- HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset transfer property list");
+ if (H5P_DATA_XFER!=H5P_get_class(plist_id) ||
+ NULL==(plist=H5I_object(plist_id))) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
+ "not a dataset transfer property list");
}
if(alloc_func!=NULL)
@@ -3139,31 +2543,27 @@ H5Pget_vlen_mem_manager(hid_t plist_id, H5MM_allocate_t *alloc_func,
FUNC_LEAVE (SUCCEED);
}
-
-/*--------------------------------------------------------------------------
- NAME
- H5Pcopy
- PURPOSE
- Copy a property list
- USAGE
- hid_t H5P_copy(plist_id)
- hid_t plist_id; IN: property list object to copy
- RETURNS
- Returns property list ID (atom) on success, Negative on failure
-
- ERRORS
- ARGS BADRANGE Unknown property list class.
- ATOM BADATOM Can't unatomize property list.
- ATOM CANTREGISTER Register the atom for the new property list.
- INTERNAL UNSUPPORTED Dataset transfer properties are not implemented
- yet.
- INTERNAL UNSUPPORTED File access properties are not implemented yet.
-
- DESCRIPTION
- * This function creates a new copy of a property list with all the same
- * parameter settings.
---------------------------------------------------------------------------*/
+/*-------------------------------------------------------------------------
+ * Function: H5Pcopy
+ *
+ * Purpose: Deep-copies a property list PLIST_ID.
+ *
+ * Return: Success: The ID of the new copy of the property list.
+ * The ID will be different than the input ID
+ * since the new ID refers to a completely
+ * separate copy of the the structure that the
+ * original ID points to.
+ *
+ * Failure: Negative
+ *
+ * Programmer: Unknown
+ *
+ * Modifications:
+ * Robb Matzke, 1999-08-03
+ * If PLIST_ID is H5P_DEFAULT then we return H5P_DEFAULT.
+ *-------------------------------------------------------------------------
+ */
hid_t
H5Pcopy(hid_t plist_id)
{
@@ -3176,6 +2576,8 @@ H5Pcopy(hid_t plist_id)
FUNC_ENTER(H5Pcopy, FAIL);
H5TRACE1("i","i",plist_id);
+ if (H5P_DEFAULT==plist_id) return H5P_DEFAULT;
+
/* Check args */
if (NULL == (plist = H5I_object(plist_id)) ||
(type = H5P_get_class(plist_id)) < 0 ||
@@ -3197,6 +2599,7 @@ H5Pcopy(hid_t plist_id)
}
FUNC_LEAVE(ret_value);
}
+
/*-------------------------------------------------------------------------
* Function: H5P_copy
@@ -3212,7 +2615,8 @@ H5Pcopy(hid_t plist_id)
* Tuesday, February 3, 1998
*
* Modifications:
- *
+ * Robb Matzke, 1999-08-03
+ * Modified to use the virtual file layer.
*-------------------------------------------------------------------------
*/
void *
@@ -3224,6 +2628,8 @@ H5P_copy (H5P_class_t type, const void *src)
H5D_create_t *dc_dst = NULL;
const H5F_access_t *fa_src = NULL;
H5F_access_t *fa_dst = NULL;
+ const H5F_xfer_t *dx_src = NULL;
+ H5F_xfer_t *dx_dst = NULL;
FUNC_ENTER (H5P_copy, NULL);
@@ -3241,7 +2647,7 @@ H5P_copy (H5P_class_t type, const void *src)
size = sizeof(H5D_create_t);
break;
- case H5P_DATASET_XFER:
+ case H5P_DATA_XFER:
size = sizeof(H5F_xfer_t);
break;
@@ -3269,26 +2675,11 @@ H5P_copy (H5P_class_t type, const void *src)
case H5P_FILE_ACCESS:
fa_src = (const H5F_access_t*)src;
fa_dst = (H5F_access_t*)dst;
- switch (fa_src->driver) {
- case H5F_LOW_ERROR:
- case H5F_LOW_SEC2:
- case H5F_LOW_STDIO:
- case H5F_LOW_CORE:
- case H5F_LOW_MPIO:
- /* Nothing to do */
- break;
-
- case H5F_LOW_FAMILY:
- fa_dst->u.fam.memb_access = H5P_copy (H5P_FILE_ACCESS,
- fa_src->u.fam.memb_access);
- break;
-
- case H5F_LOW_SPLIT:
- fa_dst->u.split.meta_access=H5P_copy (H5P_FILE_ACCESS,
- fa_src->u.split.meta_access);
- fa_dst->u.split.raw_access = H5P_copy (H5P_FILE_ACCESS,
- fa_src->u.split.raw_access);
- break;
+
+ if (fa_dst->driver_id>=0) {
+ H5I_inc_ref(fa_dst->driver_id);
+ fa_dst->driver_info = H5FD_fapl_copy(fa_dst->driver_id,
+ fa_dst->driver_info);
}
break;
@@ -3318,8 +2709,15 @@ H5P_copy (H5P_class_t type, const void *src)
break;
- case H5P_DATASET_XFER:
- /* Nothing to do */
+ case H5P_DATA_XFER:
+ dx_src = (const H5F_xfer_t*)src;
+ dx_dst = (H5F_xfer_t*)dst;
+
+ if (dx_dst->driver_id>=0) {
+ H5I_inc_ref(dx_dst->driver_id);
+ dx_dst->driver_info = H5FD_dxpl_copy(dx_dst->driver_id,
+ dx_dst->driver_info);
+ }
break;
case H5P_MOUNT: