summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/.indent.pro1
-rw-r--r--src/H5.c14
-rw-r--r--src/H5B.c4
-rw-r--r--src/H5D.c405
-rw-r--r--src/H5Distore.c29
-rw-r--r--src/H5Dprivate.h92
-rw-r--r--src/H5Dseq.c60
-rw-r--r--src/H5E.c8
-rw-r--r--src/H5Epublic.h6
-rw-r--r--src/H5F.c16
-rw-r--r--src/H5FD.c91
-rw-r--r--src/H5Farray.c84
-rw-r--r--src/H5Fistore.c29
-rw-r--r--src/H5Fseq.c60
-rw-r--r--src/H5Gnode.c4
-rw-r--r--src/H5HG.c6
-rw-r--r--src/H5HL.c10
-rw-r--r--src/H5Ipublic.h12
-rw-r--r--src/H5O.c10
-rw-r--r--src/H5P.c1174
-rw-r--r--src/H5Pprivate.h18
-rw-r--r--src/H5Ppublic.h62
-rw-r--r--src/H5Shyper.c94
-rw-r--r--src/H5Smpio.c29
-rw-r--r--src/H5Tconv.c11
-rw-r--r--src/H5Tpkg.h8
-rw-r--r--src/H5Tvlen.c45
27 files changed, 1680 insertions, 702 deletions
diff --git a/src/.indent.pro b/src/.indent.pro
index da9eadb..eec56da 100644
--- a/src/.indent.pro
+++ b/src/.indent.pro
@@ -65,7 +65,6 @@
-T H5D_create_t
-T H5D_layout_t
-T H5D_t
--T H5D_xfer_t
-T H5E_error_t
-T H5E_major_mesg_t
-T H5E_major_t
diff --git a/src/H5.c b/src/H5.c
index c1ae745..bdb9fb7 100644
--- a/src/H5.c
+++ b/src/H5.c
@@ -111,24 +111,26 @@ H5_init_library(void)
* Initialize interfaces that might not be able to initialize themselves
* soon enough. The file & dataset interfaces must be initialized because
* calling H5Pcreate() might require the file/dataset property classes to be
- * initialized.
+ * initialized. The property interface must be initialized before the file
+ * & dataset interfaces though, in order to provide them with the proper
+ * property classes.
*/
+ if (H5P_init()<0) {
+ HRETURN_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL,
+ "unable to initialize property list interface");
+ }
if (H5F_init()<0) {
HRETURN_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL,
"unable to initialize file interface");
}
if (H5T_init()<0) {
HRETURN_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL,
- "unable to initialize type interface");
+ "unable to initialize datatype interface");
}
if (H5D_init()<0) {
HRETURN_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL,
"unable to initialize dataset interface");
}
- if (H5P_init()<0) {
- HRETURN_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL,
- "unable to initialize property list interface");
- }
/* Debugging? */
H5_debug_mask("-all");
diff --git a/src/H5B.c b/src/H5B.c
index 1d066fd..1c3bfe1 100644
--- a/src/H5B.c
+++ b/src/H5B.c
@@ -338,7 +338,7 @@ H5B_load(H5F_t *f, haddr_t addr, const void *_type, void *udata)
HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL,
"memory allocation failed");
}
- if (H5F_block_read(f, H5FD_MEM_BTREE, addr, size, H5P_DEFAULT, bt->page)<0) {
+ if (H5F_block_read(f, H5FD_MEM_BTREE, addr, size, H5P_DATASET_XFER_DEFAULT, bt->page)<0) {
HGOTO_ERROR(H5E_BTREE, H5E_READERROR, NULL,
"can't read B-tree node");
}
@@ -487,7 +487,7 @@ H5B_flush(H5F_t *f, hbool_t destroy, haddr_t addr, H5B_t *bt)
if (IS_H5FD_MPIO(f))
H5FD_mpio_tas_allsame(f->shared->lf, TRUE); /* only p0 will write */
#endif /* H5_HAVE_PARALLEL */
- if (H5F_block_write(f, H5FD_MEM_BTREE, addr, size, H5P_DEFAULT, bt->page)<0) {
+ if (H5F_block_write(f, H5FD_MEM_BTREE, addr, size, H5P_DATASET_XFER_DEFAULT, bt->page)<0) {
HRETURN_ERROR(H5E_BTREE, H5E_CANTFLUSH, FAIL,
"unable to save B-tree node to disk");
}
diff --git a/src/H5D.c b/src/H5D.c
index c613915..256da83 100644
--- a/src/H5D.c
+++ b/src/H5D.c
@@ -16,7 +16,8 @@
#include "H5Iprivate.h" /* IDs */
#include "H5Dprivate.h" /* Dataset functions */
#include "H5Eprivate.h" /* Error handling */
-#include "H5FLprivate.h" /*Free Lists */
+#include "H5FDprivate.h" /* File drivers */
+#include "H5FLprivate.h" /* Free Lists */
#include "H5Gprivate.h" /* Group headers */
#include "H5HLprivate.h" /* Name heap */
#include "H5MMprivate.h" /* Memory management */
@@ -72,33 +73,6 @@ const H5D_create_t H5D_create_dflt = {
{0, 0, NULL} /* No filters in pipeline */
};
-/* Default data transfer property list */
-/* Not const anymore because some of the VFL drivers modify this struct - QAK */
-H5D_xfer_t H5D_xfer_dflt = {
- 1024*1024, /*Temporary buffer size */
- NULL, /*Type conversion buffer or NULL */
- NULL, /*Background buffer or NULL */
- H5T_BKG_NO, /*Type of background buffer needed */
- {0.1, 0.5, 0.9}, /*B-tree node splitting ratios */
-#ifndef H5_HAVE_PARALLEL
- 1, /*Cache the hyperslab blocks */
-#else
- 0, /*Don't cache the hyperslab blocks */
-#endif /* H5_HAVE_PARALLEL */
- 0, /*No limit on hyperslab block size to cache */
- 1024, /*Number of I/O vectors for hyperslabs */
- NULL, /*Use malloc() for VL data allocations */
- NULL, /*No information needed for malloc() calls */
- NULL, /*Use free() for VL data frees */
- NULL, /*No information needed for free() calls */
- H5FD_VFD_DEFAULT, /*See H5Pget_driver() */
- NULL, /*No file driver-specific information yet */
-#ifdef COALESCE_READS
- 0, /*coalesce single reads into a read */
- /*transaction */
-#endif
-};
-
/* Interface initialization? */
static intn interface_initialize_g = 0;
#define INTERFACE_INIT H5D_init_interface
@@ -165,18 +139,110 @@ DESCRIPTION
static herr_t
H5D_init_interface(void)
{
+ H5P_genclass_t *pclass; /* Property list class to modify */
+ hsize_t def_max_temp_buf=H5D_XFER_MAX_TEMP_BUF_DEF; /* Default value for maximum temp buffer size */
+ void *def_tconv_buf=H5D_XFER_TCONV_BUF_DEF; /* Default value for type conversion buffer */
+ void *def_bkgr_buf=H5D_XFER_BKGR_BUF_DEF; /* Default value for background buffer */
+ H5T_bkg_t def_bkgr_buf_type=H5D_XFER_BKGR_BUF_TYPE_DEF; /* Default value for background buffer type */
+ double def_btree_split_ratio[3]=H5D_XFER_BTREE_SPLIT_RATIO_DEF; /* Default value for B-tree node split ratios */
+ uintn def_hyper_cache=H5D_XFER_HYPER_CACHE_DEF; /* Default value for hyperslab caching */
+ uintn def_hyper_cache_lim=H5D_XFER_HYPER_CACHE_LIM_DEF; /* Default value for hyperslab cache limit */
+ H5MM_allocate_t def_vlen_alloc=H5D_XFER_VLEN_ALLOC_DEF; /* Default value for vlen allocation function */
+ void *def_vlen_alloc_info=H5D_XFER_VLEN_ALLOC_INFO_DEF; /* Default value for vlen allocation information */
+ H5MM_free_t def_vlen_free=H5D_XFER_VLEN_FREE_DEF; /* Default value for vlen free function */
+ void *def_vlen_free_info=H5D_XFER_VLEN_FREE_INFO_DEF; /* Default value for vlen free information */
+ hid_t def_vfl_id=H5D_XFER_VFL_ID_DEF; /* Default value for file driver ID */
+ void *def_vfl_info=H5D_XFER_VFL_INFO_DEF; /* Default value for file driver info */
+#ifdef COALESCE_READS
+ uintn def_gather_reads=H5D_XFER_GATHER_READS_DEF; /* Default value for 'gather reads' property */
+#endif /* COALESCE_READS */
+ size_t def_hyp_vec_size=H5D_XFER_HYPER_VECTOR_SIZE_DEF; /* Default value for vector size */
+ herr_t ret_value=SUCCEED; /* Return value */
+
FUNC_ENTER(H5D_init_interface, FAIL);
/* Initialize the atom group for the dataset IDs */
if (H5I_init_group(H5I_DATASET, H5I_DATASETID_HASHSIZE, H5D_RESERVED_ATOMS,
(H5I_free_t)H5D_close)<0) {
- HRETURN_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL,
+ HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL,
"unable to initialize interface");
}
-/* Register the default dataset creation & data xfer properties */
-
- FUNC_LEAVE(SUCCEED);
+ /* Register the default dataset creation properties */
+ assert(H5P_CLS_DATASET_XFER_g!=(-1));
+
+ /* Get the pointer to the dataset creation class */
+ if (H5I_GENPROP_CLS != H5I_get_type(H5P_CLS_DATASET_XFER_g) || NULL == (pclass = H5I_object(H5P_CLS_DATASET_XFER_g)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list class");
+
+ /* Register the max. temp buffer size property */
+ if(H5P_register(pclass,H5D_XFER_MAX_TEMP_BUF_NAME,H5D_XFER_MAX_TEMP_BUF_SIZE,&def_max_temp_buf,NULL,NULL,NULL,NULL,NULL,NULL)<0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class");
+
+ /* Register the type conversion buffer property */
+ if(H5P_register(pclass,H5D_XFER_TCONV_BUF_NAME,H5D_XFER_TCONV_BUF_SIZE,&def_tconv_buf,NULL,NULL,NULL,NULL,NULL,NULL)<0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class");
+
+ /* Register the background buffer property */
+ if(H5P_register(pclass,H5D_XFER_BKGR_BUF_NAME,H5D_XFER_BKGR_BUF_SIZE,&def_bkgr_buf,NULL,NULL,NULL,NULL,NULL,NULL)<0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class");
+
+ /* Register the background buffer type property */
+ if(H5P_register(pclass,H5D_XFER_BKGR_BUF_TYPE_NAME,H5D_XFER_BKGR_BUF_TYPE_SIZE,&def_bkgr_buf_type,NULL,NULL,NULL,NULL,NULL,NULL)<0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class");
+
+ /* Register the B-Tree node splitting ratios property */
+ if(H5P_register(pclass,H5D_XFER_BTREE_SPLIT_RATIO_NAME,H5D_XFER_BTREE_SPLIT_RATIO_SIZE,&def_btree_split_ratio,NULL,NULL,NULL,NULL,NULL,NULL)<0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class");
+
+ /* Register the hyperslab caching property */
+ if(H5P_register(pclass,H5D_XFER_HYPER_CACHE_NAME,H5D_XFER_HYPER_CACHE_SIZE,&def_hyper_cache,NULL,NULL,NULL,NULL,NULL,NULL)<0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class");
+
+ /* Register the hyperslab cache limit property */
+ if(H5P_register(pclass,H5D_XFER_HYPER_CACHE_LIM_NAME,H5D_XFER_HYPER_CACHE_LIM_SIZE,&def_hyper_cache_lim,NULL,NULL,NULL,NULL,NULL,NULL)<0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class");
+
+ /* Register the vlen allocation function property */
+ if(H5P_register(pclass,H5D_XFER_VLEN_ALLOC_NAME,H5D_XFER_VLEN_ALLOC_SIZE,&def_vlen_alloc,NULL,NULL,NULL,NULL,NULL,NULL)<0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class");
+
+ /* Register the vlen allocation information property */
+ if(H5P_register(pclass,H5D_XFER_VLEN_ALLOC_INFO_NAME,H5D_XFER_VLEN_ALLOC_INFO_SIZE,&def_vlen_alloc_info,NULL,NULL,NULL,NULL,NULL,NULL)<0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class");
+
+ /* Register the vlen free function property */
+ if(H5P_register(pclass,H5D_XFER_VLEN_FREE_NAME,H5D_XFER_VLEN_FREE_SIZE,&def_vlen_free,NULL,NULL,NULL,NULL,NULL,NULL)<0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class");
+
+ /* Register the vlen free information property */
+ if(H5P_register(pclass,H5D_XFER_VLEN_FREE_INFO_NAME,H5D_XFER_VLEN_FREE_INFO_SIZE,&def_vlen_free_info,NULL,NULL,NULL,NULL,NULL,NULL)<0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class");
+
+ /* Register the file driver ID property */
+ if(H5P_register(pclass,H5D_XFER_VFL_ID_NAME,H5D_XFER_VFL_ID_SIZE,&def_vfl_id,NULL,NULL,NULL,NULL,NULL,NULL)<0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class");
+
+ /* Register the file driver info property */
+ if(H5P_register(pclass,H5D_XFER_VFL_INFO_NAME,H5D_XFER_VFL_INFO_SIZE,&def_vfl_info,NULL,NULL,NULL,NULL,NULL,NULL)<0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class");
+
+#ifdef COALESCE_READS
+ /* Register the 'gather reads' property */
+ if(H5P_register(pclass,H5D_XFER_GATHER_READS_NAME,H5D_XFER_GATHER_READS_SIZE,&def_gather_reads,NULL,NULL,NULL,NULL,NULL)<0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class");
+#endif /* COALESCE_READS */
+
+ /* Register the vector size property */
+ if(H5P_register(pclass,H5D_XFER_HYPER_VECTOR_SIZE_NAME,H5D_XFER_HYPER_VECTOR_SIZE_SIZE,&def_hyp_vec_size,NULL,NULL,NULL,NULL,NULL,NULL)<0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class");
+
+ /* Register the default data transfer property list */
+ if ((H5P_LST_DATASET_XFER_g = H5Pcreate_list (H5P_CLS_DATASET_XFER_g))<0)
+ HRETURN_ERROR (H5E_PLIST, H5E_CANTREGISTER, FAIL, "can't register default property list");
+
+done:
+ FUNC_LEAVE(ret_value);
}
@@ -216,6 +282,108 @@ H5D_term_interface(void)
/*-------------------------------------------------------------------------
+ * Function: H5D_xfer_create
+ *
+ * Purpose: Callback routine which is called whenever any dataset transfer
+ * property list is created. This routine performs any generic
+ * initialization needed on the properties the library put into
+ * the list.
+ * Right now, it's just allocating the driver-specific dataset
+ * transfer information.
+ *
+ * Return: Success: Non-negative
+ *
+ * Failure: Negative
+ *
+ * Programmer: Quincey Koziol
+ * Thursday, August 2, 2001
+ *
+ * Notes: This same routine is currently used for the 'copy' callback.
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D_xfer_create(hid_t dxpl_id, void UNUSED *create_data)
+{
+ hid_t driver_id; /* VFL driver ID */
+ void *driver_info; /* VFL driver info */
+ herr_t ret_value=SUCCEED; /* Return value */
+
+ FUNC_ENTER(H5D_xfer_create, FAIL);
+
+ /* Get the driver information */
+ if(H5P_get(dxpl_id, H5D_XFER_VFL_ID_NAME, &driver_id)<0)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve VFL driver ID");
+ if(H5P_get(dxpl_id, H5D_XFER_VFL_INFO_NAME, &driver_info)<0)
+ 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((driver_info = H5FD_dxpl_copy(driver_id, driver_info))==NULL)
+ HGOTO_ERROR (H5E_DATASET, H5E_CANTCOPY, FAIL, "Can't copy VFL driver");
+
+ /* Set the driver information for the new property list */
+ if(H5P_set(dxpl_id, H5D_XFER_VFL_ID_NAME, &driver_id)<0)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTSET, FAIL, "Can't set VFL driver ID");
+ if(H5P_set(dxpl_id, H5D_XFER_VFL_INFO_NAME, &driver_info)<0)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTSET, FAIL, "Can't set VFL driver info");
+ } /* end if */
+
+done:
+ FUNC_LEAVE(ret_value);
+} /* end H5D_xfer_create() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5D_xfer_close
+ *
+ * Purpose: Callback routine which is called whenever any dataset transfer
+ * property list is closed. This routine performs any generic
+ * cleanup needed on the properties the library put into the list.
+ * Right now, it's just freeing the driver-specific dataset
+ * transfer information.
+ *
+ * Return: Success: Non-negative
+ *
+ * Failure: Negative
+ *
+ * Programmer: Quincey Koziol
+ * Wednesday, July 11, 2001
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D_xfer_close(hid_t dxpl_id, void UNUSED *close_data)
+{
+ hid_t driver_id; /* VFL driver ID */
+ void *driver_info; /* VFL driver info */
+ herr_t ret_value=SUCCEED; /* Return value */
+
+ FUNC_ENTER(H5D_xfer_close, FAIL);
+
+ if(H5Pget(dxpl_id, H5D_XFER_VFL_ID_NAME, &driver_id)<0)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve VFL driver ID");
+ if(H5Pget(dxpl_id, 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");
+ } /* end if */
+
+done:
+ FUNC_LEAVE(ret_value);
+} /* end H5D_xfer_close() */
+
+
+/*-------------------------------------------------------------------------
* Function: H5Dcreate
*
* Purpose: Creates a new dataset named NAME at LOC_ID, opens the
@@ -671,17 +839,17 @@ H5Dread(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id,
/* check arguments */
if (H5I_DATASET != H5I_get_type(dset_id) ||
- NULL == (dset = H5I_object(dset_id)) ||
- NULL == dset->ent.file) {
+ NULL == (dset = H5I_object(dset_id)) ||
+ NULL == dset->ent.file) {
HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset");
}
if (H5I_DATATYPE != H5I_get_type(mem_type_id) ||
- NULL == (mem_type = H5I_object(mem_type_id))) {
+ NULL == (mem_type = H5I_object(mem_type_id))) {
HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type");
}
if (H5S_ALL != mem_space_id) {
if (H5I_DATASPACE != H5I_get_type(mem_space_id) ||
- NULL == (mem_space = H5I_object(mem_space_id))) {
+ NULL == (mem_space = H5I_object(mem_space_id))) {
HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space");
}
/* Check for valid selection */
@@ -692,7 +860,7 @@ H5Dread(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id,
}
if (H5S_ALL != file_space_id) {
if (H5I_DATASPACE != H5I_get_type(file_space_id) ||
- NULL == (file_space = H5I_object(file_space_id))) {
+ NULL == (file_space = H5I_object(file_space_id))) {
HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space");
}
/* Check for valid selection */
@@ -701,18 +869,21 @@ H5Dread(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id,
"selection+offset not within extent");
}
}
- if (H5P_DEFAULT != plist_id && H5P_DATASET_XFER != H5P_get_class(plist_id)) {
+
+ /* Get the default dataset transfer property list if the user didn't provide one */
+ if (H5P_DEFAULT == plist_id)
+ plist_id= H5P_DATASET_XFER_DEFAULT;
+
+ if (H5I_GENPROP_LST != H5I_get_type(plist_id) ||
+ TRUE!=H5Pisa_class(plist_id,H5P_DATASET_XFER_NEW))
HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not xfer parms");
- }
- if (!buf) {
+ if (!buf)
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no output buffer");
- }
/* read raw data */
- if (H5D_read(dset, mem_type, mem_space, file_space, plist_id,
- buf/*out*/) < 0) {
+ if (H5D_read(dset, mem_type, mem_space, file_space, plist_id, buf/*out*/) < 0)
HRETURN_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "can't read data");
- }
+
FUNC_LEAVE(SUCCEED);
}
@@ -766,17 +937,17 @@ H5Dwrite(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id,
/* check arguments */
if (H5I_DATASET != H5I_get_type(dset_id) ||
- NULL == (dset = H5I_object(dset_id)) ||
- NULL == dset->ent.file) {
+ NULL == (dset = H5I_object(dset_id)) ||
+ NULL == dset->ent.file) {
HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset");
}
if (H5I_DATATYPE != H5I_get_type(mem_type_id) ||
- NULL == (mem_type = H5I_object(mem_type_id))) {
+ NULL == (mem_type = H5I_object(mem_type_id))) {
HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type");
}
if (H5S_ALL != mem_space_id) {
if (H5I_DATASPACE != H5I_get_type(mem_space_id) ||
- NULL == (mem_space = H5I_object(mem_space_id))) {
+ NULL == (mem_space = H5I_object(mem_space_id))) {
HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space");
}
/* Check for valid selection */
@@ -787,7 +958,7 @@ H5Dwrite(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id,
}
if (H5S_ALL != file_space_id) {
if (H5I_DATASPACE != H5I_get_type(file_space_id) ||
- NULL == (file_space = H5I_object(file_space_id))) {
+ NULL == (file_space = H5I_object(file_space_id))) {
HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space");
}
/* Check for valid selection */
@@ -796,18 +967,21 @@ H5Dwrite(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id,
"selection+offset not within extent");
}
}
- if (H5P_DEFAULT != plist_id && H5P_DATASET_XFER != H5P_get_class(plist_id)) {
+
+ /* Get the default dataset transfer property list if the user didn't provide one */
+ if (H5P_DEFAULT == plist_id)
+ plist_id= H5P_DATASET_XFER_DEFAULT;
+
+ if (H5I_GENPROP_LST != H5I_get_type(plist_id) ||
+ TRUE!=H5Pisa_class(plist_id,H5P_DATASET_XFER_NEW))
HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not xfer parms");
- }
- if (!buf) {
+ if (!buf)
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no output buffer");
- }
/* write raw data */
- if (H5D_write(dset, mem_type, mem_space, file_space, plist_id,
- buf) < 0) {
+ if (H5D_write(dset, mem_type, mem_space, file_space, plist_id, buf) < 0)
HRETURN_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "can't write data");
- }
+
FUNC_LEAVE(SUCCEED);
}
@@ -1572,7 +1746,6 @@ herr_t
H5D_read(H5D_t *dataset, const H5T_t *mem_type, const H5S_t *mem_space,
const H5S_t *file_space, hid_t dxpl_id, void *buf/*out*/)
{
- const H5D_xfer_t *xfer_parms = NULL;
hssize_t nelmts; /*number of elements */
hsize_t smine_start; /*strip mine start loc */
hsize_t n, smine_nelmts; /*elements per strip */
@@ -1609,20 +1782,14 @@ H5D_read(H5D_t *dataset, const H5T_t *mem_type, const H5S_t *mem_space,
assert(dataset && dataset->ent.file);
assert(mem_type);
assert(buf);
+ assert(H5I_GENPROP_LST==H5I_get_type(dxpl_id));
+ assert(TRUE==H5Pisa_class(dxpl_id,H5P_DATASET_XFER_NEW));
/* Initialize these before any errors can occur */
HDmemset(&mem_iter,0,sizeof(H5S_sel_iter_t));
HDmemset(&bkg_iter,0,sizeof(H5S_sel_iter_t));
HDmemset(&file_iter,0,sizeof(H5S_sel_iter_t));
- /* Get the dataset transfer property list */
- if (H5P_DEFAULT == dxpl_id) {
- xfer_parms = &H5D_xfer_dflt;
- } else if (H5P_DATASET_XFER != H5P_get_class(dxpl_id) ||
- NULL == (xfer_parms = H5I_object(dxpl_id))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not xfer parms");
- }
-
if (!file_space) {
if (NULL==(free_this_space=H5S_read (&(dataset->ent)))) {
HGOTO_ERROR (H5E_DATASET, H5E_CANTINIT, FAIL,
@@ -1636,13 +1803,12 @@ H5D_read(H5D_t *dataset, const H5T_t *mem_type, const H5S_t *mem_space,
#ifdef H5_HAVE_PARALLEL
/* Collect Parallel I/O information for possible later use */
- if (H5FD_MPIO==xfer_parms->driver_id){
+ if (H5FD_MPIO==H5P_peek_hid_t(dxpl_id,H5D_XFER_VFL_ID_NAME)) {
doing_mpio++;
- if (dx=xfer_parms->driver_info){
+ if (dx=H5P_peek_voidp(dxpl_id,H5D_XFER_VFL_INFO_NAME))
xfer_mode = dx->xfer_mode;
- }else
- HGOTO_ERROR (H5E_DATASET, H5E_CANTINIT, FAIL,
- "unable to retrieve data xfer info");
+ else
+ HGOTO_ERROR (H5E_DATASET, H5E_CANTINIT, FAIL, "unable to retrieve data xfer info");
}
/* Collective access is not permissible without the MPIO driver */
if (doing_mpio && xfer_mode==H5FD_MPIO_COLLECTIVE &&
@@ -1790,7 +1956,7 @@ printf("%s: check 1.2, \n",FUNC);
src_type_size = H5T_get_size(dataset->type);
dst_type_size = H5T_get_size(mem_type);
- target_size = xfer_parms->buf_size;
+ target_size = H5P_peek_hsize_t(dxpl_id,H5D_XFER_MAX_TEMP_BUF_NAME);
#ifdef QAK
printf("%s: check 2.0, src_type_size=%d, dst_type_size=%d, target_size=%d\n",FUNC,(int)src_type_size,(int)dst_type_size,(int)target_size);
#endif /* QAK */
@@ -1812,11 +1978,14 @@ printf("%s: check 2.0, src_type_size=%d, dst_type_size=%d, target_size=%d\n",FUN
* same size over and over.
*/
if (tpath->cdata.need_bkg) {
- need_bkg = MAX(tpath->cdata.need_bkg, xfer_parms->need_bkg);
+ /* Retrieve the bkgr buffer property */
+ if(H5Pget(dxpl_id, H5D_XFER_BKGR_BUF_TYPE_NAME, &need_bkg)<0)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve background buffer type");
+ need_bkg = MAX(tpath->cdata.need_bkg, need_bkg);
} else {
need_bkg = H5T_BKG_NO; /*never needed even if app says yes*/
}
- if (NULL==(tconv_buf=xfer_parms->tconv_buf)) {
+ if (NULL==(tconv_buf=H5P_peek_voidp(dxpl_id,H5D_XFER_TCONV_BUF_NAME))) {
#ifdef QAK
printf("%s: check 3.1, allocating conversion buffer\n",FUNC);
#endif
@@ -1825,7 +1994,7 @@ printf("%s: check 2.0, src_type_size=%d, dst_type_size=%d, target_size=%d\n",FUN
HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, FAIL,
"memory allocation failed for type conversion");
}
- if (need_bkg && NULL==(bkg_buf=xfer_parms->bkg_buf)) {
+ if (need_bkg && NULL==(bkg_buf=H5P_peek_voidp(dxpl_id,H5D_XFER_BKGR_BUF_NAME))) {
#ifdef QAK
printf("%s: check 3.2, allocating conversion buffer\n",FUNC);
#endif
@@ -1974,13 +2143,16 @@ printf("%s: check 2.0, src_type_size=%d, dst_type_size=%d, target_size=%d\n",FUN
H5S_sel_iter_release(mem_space,&mem_iter);
H5S_sel_iter_release(mem_space,&bkg_iter);
- if (src_id >= 0) H5I_dec_ref(src_id);
- if (dst_id >= 0) H5I_dec_ref(dst_id);
- if (tconv_buf && NULL==xfer_parms->tconv_buf)
+ if (src_id >= 0)
+ H5I_dec_ref(src_id);
+ if (dst_id >= 0)
+ H5I_dec_ref(dst_id);
+ if (tconv_buf && NULL==H5P_peek_voidp(dxpl_id,H5D_XFER_TCONV_BUF_NAME))
H5FL_BLK_FREE(type_conv,tconv_buf);
- if (bkg_buf && NULL==xfer_parms->bkg_buf)
+ if (bkg_buf && NULL==H5P_peek_voidp(dxpl_id,H5D_XFER_BKGR_BUF_NAME))
H5FL_BLK_FREE(bkgr_conv,bkg_buf);
- if (free_this_space) H5S_close(free_this_space);
+ if (free_this_space)
+ H5S_close(free_this_space);
FUNC_LEAVE(ret_value);
}
@@ -2021,7 +2193,6 @@ herr_t
H5D_write(H5D_t *dataset, const H5T_t *mem_type, const H5S_t *mem_space,
const H5S_t *file_space, hid_t dxpl_id, const void *buf)
{
- const H5D_xfer_t *xfer_parms = NULL;
hssize_t nelmts; /*total number of elmts */
hsize_t smine_start; /*strip mine start loc */
hsize_t n, smine_nelmts; /*elements per strip */
@@ -2058,6 +2229,8 @@ H5D_write(H5D_t *dataset, const H5T_t *mem_type, const H5S_t *mem_space,
assert(dataset && dataset->ent.file);
assert(mem_type);
assert(buf);
+ assert(H5I_GENPROP_LST==H5I_get_type(dxpl_id));
+ assert(TRUE==H5Pisa_class(dxpl_id,H5P_DATASET_XFER_NEW));
#ifdef H5_HAVE_PARALLEL
/* If MPIO is used, no VL datatype support yet. */
@@ -2089,14 +2262,6 @@ H5D_write(H5D_t *dataset, const H5T_t *mem_type, const H5S_t *mem_space,
printf("%s: check 0.3, buf=%p\n", FUNC,buf);
#endif /* QAK */
- /* Get the dataset transfer property list */
- if (H5P_DEFAULT == dxpl_id) {
- xfer_parms = &H5D_xfer_dflt;
- } else if (H5P_DATASET_XFER != H5P_get_class(dxpl_id) ||
- NULL == (xfer_parms = H5I_object(dxpl_id))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not xfer parms");
- }
-
if (0==(H5F_get_intent(dataset->ent.file) & H5F_ACC_RDWR)) {
HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL,
"no write intent on file");
@@ -2114,13 +2279,12 @@ H5D_write(H5D_t *dataset, const H5T_t *mem_type, const H5S_t *mem_space,
#ifdef H5_HAVE_PARALLEL
/* Collect Parallel I/O information for possible later use */
- if (H5FD_MPIO==xfer_parms->driver_id){
+ if (H5FD_MPIO==H5P_peek_hid_t(dxpl_id,H5D_XFER_VFL_ID_NAME)) {
doing_mpio++;
- if (dx=xfer_parms->driver_info){
+ if (dx=H5P_peek_voidp(dxpl_id,H5D_XFER_VFL_INFO_NAME))
xfer_mode = dx->xfer_mode;
- }else
- HGOTO_ERROR (H5E_DATASET, H5E_CANTINIT, FAIL,
- "unable to retrieve data xfer info");
+ else
+ HGOTO_ERROR (H5E_DATASET, H5E_CANTINIT, FAIL, "unable to retrieve data xfer info");
}
/* Collective access is not permissible without the MPIO driver */
if (doing_mpio && xfer_mode==H5FD_MPIO_COLLECTIVE &&
@@ -2268,7 +2432,7 @@ H5D_write(H5D_t *dataset, const H5T_t *mem_type, const H5S_t *mem_space,
src_type_size = H5T_get_size(mem_type);
dst_type_size = H5T_get_size(dataset->type);
- target_size = xfer_parms->buf_size;
+ target_size = H5P_peek_hsize_t(dxpl_id,H5D_XFER_MAX_TEMP_BUF_NAME);
#ifdef QAK
printf("%s: check 2.0, src_type_size=%d, dst_type_size=%d, target_size=%d\n",FUNC,(int)src_type_size,(int)dst_type_size,(int)target_size);
#endif /* QAK */
@@ -2290,17 +2454,20 @@ printf("%s: check 2.0, src_type_size=%d, dst_type_size=%d, target_size=%d\n",FUN
* same size over and over.
*/
if (tpath->cdata.need_bkg) {
- need_bkg = MAX (tpath->cdata.need_bkg, xfer_parms->need_bkg);
+ /* Retrieve the bkgr buffer property */
+ if(H5Pget(dxpl_id, H5D_XFER_BKGR_BUF_TYPE_NAME, &need_bkg)<0)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve background buffer type");
+ need_bkg = MAX (tpath->cdata.need_bkg, need_bkg);
} else {
need_bkg = H5T_BKG_NO; /*never needed even if app says yes*/
}
- if (NULL==(tconv_buf=xfer_parms->tconv_buf)) {
+ if (NULL==(tconv_buf=H5P_peek_voidp(dxpl_id,H5D_XFER_TCONV_BUF_NAME))) {
/* Allocate temporary buffer */
if((tconv_buf=H5FL_BLK_ALLOC(type_conv,target_size,0))==NULL)
HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, FAIL,
"memory allocation failed for type conversion");
}
- if (need_bkg && NULL==(bkg_buf=xfer_parms->bkg_buf)) {
+ if (need_bkg && NULL==(bkg_buf=H5P_peek_voidp(dxpl_id,H5D_XFER_BKGR_BUF_NAME))) {
/* Allocate temporary buffer */
H5_CHECK_OVERFLOW((request_nelmts*dst_type_size),hsize_t,size_t);
if((bkg_buf=H5FL_BLK_ALLOC(bkgr_conv,(size_t)(request_nelmts*dst_type_size),0))==NULL)
@@ -2462,13 +2629,16 @@ printf("%s: check 2.0, src_type_size=%d, dst_type_size=%d, target_size=%d\n",FUN
H5S_sel_iter_release(mem_space,&mem_iter);
H5S_sel_iter_release(file_space,&bkg_iter);
- if (src_id >= 0) H5I_dec_ref(src_id);
- if (dst_id >= 0) H5I_dec_ref(dst_id);
- if (tconv_buf && NULL==xfer_parms->tconv_buf)
+ if (src_id >= 0)
+ H5I_dec_ref(src_id);
+ if (dst_id >= 0)
+ H5I_dec_ref(dst_id);
+ if (tconv_buf && NULL==H5P_peek_voidp(dxpl_id,H5D_XFER_TCONV_BUF_NAME))
H5FL_BLK_FREE(type_conv,tconv_buf);
- if (bkg_buf && NULL==xfer_parms->bkg_buf)
+ if (bkg_buf && NULL==H5P_peek_voidp(dxpl_id,H5D_XFER_BKGR_BUF_NAME))
H5FL_BLK_FREE(bkgr_conv,bkg_buf);
- if (free_this_space) H5S_close(free_this_space);
+ if (free_this_space)
+ H5S_close(free_this_space);
FUNC_LEAVE(ret_value);
}
@@ -2706,7 +2876,7 @@ H5D_init_storage(H5D_t *dset, const H5S_t *space)
}
} else {
if (H5F_block_write(dset->ent.file, H5FD_MEM_DRAW, addr,
- size, H5P_DEFAULT, buf)<0) {
+ size, H5P_DATASET_XFER_DEFAULT, buf)<0) {
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL,
"unable to write fill value to dataset");
}
@@ -2741,7 +2911,7 @@ H5D_init_storage(H5D_t *dset, const H5S_t *space)
dim[ndims] = dset->layout.dim[ndims];
ndims++;
- if (H5F_istore_allocate(dset->ent.file, H5P_DEFAULT,
+ if (H5F_istore_allocate(dset->ent.file, H5P_DATASET_XFER_DEFAULT,
&(dset->layout), dim,
&(dset->create_parms->pline),
&(dset->create_parms->fill))<0) {
@@ -2946,8 +3116,6 @@ H5Diterate(void *buf, hid_t type_id, hid_t space_id, H5D_operator_t op,
herr_t
H5Dvlen_reclaim(hid_t type_id, hid_t space_id, hid_t plist_id, void *buf)
{
- H5D_xfer_t tmp_xfer_parms; /* Temporary copy of the default xfer parms */
- H5D_xfer_t *xfer_parms = NULL; /* xfer parms as iterator op_data */
herr_t ret_value=FAIL;
FUNC_ENTER(H5Dvlen_reclaim, FAIL);
@@ -2955,22 +3123,21 @@ H5Dvlen_reclaim(hid_t type_id, hid_t space_id, hid_t plist_id, void *buf)
/* Check args */
if (H5I_DATATYPE!=H5I_get_type(type_id) ||
- H5I_DATASPACE!=H5I_get_type(space_id) ||
- buf==NULL) {
+ H5I_DATASPACE!=H5I_get_type(space_id) ||
+ buf==NULL) {
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid argument");
}
- /* Retrieve dataset transfer property list */
- if (H5P_DEFAULT == plist_id) {
- HDmemcpy(&tmp_xfer_parms,&H5D_xfer_dflt,sizeof(H5D_xfer_t));
- xfer_parms = &tmp_xfer_parms;
- } else if (H5P_DATASET_XFER != H5P_get_class(plist_id) ||
- NULL == (xfer_parms = H5I_object(plist_id))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not xfer parms");
- }
+ /* Get the default dataset transfer property list if the user didn't provide one */
+ if (H5P_DEFAULT == plist_id)
+ plist_id= H5P_DATASET_XFER_DEFAULT;
+
+ if (H5I_GENPROP_LST != H5I_get_type(plist_id) ||
+ TRUE!=H5Pisa_class(plist_id,H5P_DATASET_XFER_NEW))
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not xfer parms");
/* Call H5Diterate with args, etc. */
- ret_value=H5Diterate(buf,type_id,space_id,H5T_vlen_reclaim,xfer_parms);
+ ret_value=H5Diterate(buf,type_id,space_id,H5T_vlen_reclaim,&plist_id);
FUNC_LEAVE(ret_value);
} /* end H5Dvlen_reclaim() */
@@ -3132,7 +3299,7 @@ H5Dvlen_get_buf_size(hid_t dataset_id, hid_t type_id, hid_t space_id,
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "no temporary buffers available");
/* Change to the custom memory allocation routines for reading VL data */
- if((vlen_bufsize.xfer_pid=H5Pcreate(H5P_DATASET_XFER))<0)
+ if((vlen_bufsize.xfer_pid=H5Pcreate_list(H5P_DATASET_XFER_NEW))<0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTCREATE, FAIL, "no dataset xfer plists available");
if(H5Pset_vlen_mem_manager(vlen_bufsize.xfer_pid,H5D_vlen_get_buf_size_alloc,&vlen_bufsize,NULL,NULL)<0)
@@ -3159,7 +3326,7 @@ done:
if(vlen_bufsize.vl_tbuf!=NULL)
H5FL_BLK_FREE(vlen_vl_buf,vlen_bufsize.vl_tbuf);
if(vlen_bufsize.xfer_pid>0)
- H5Pclose(vlen_bufsize.xfer_pid);
+ H5Pclose_list(vlen_bufsize.xfer_pid);
FUNC_LEAVE(ret_value);
} /* end H5Dvlen_get_buf_size() */
diff --git a/src/H5Distore.c b/src/H5Distore.c
index d37c474..ebdeda9 100644
--- a/src/H5Distore.c
+++ b/src/H5Distore.c
@@ -1001,7 +1001,7 @@ H5F_istore_flush_entry(H5F_t *f, H5F_rdcc_ent_t *ent, hbool_t reset)
HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL,
"unable to allocate chunk");
}
- if (H5F_block_write(f, H5FD_MEM_DRAW, udata.addr, udata.key.nbytes, H5P_DEFAULT,
+ if (H5F_block_write(f, H5FD_MEM_DRAW, udata.addr, udata.key.nbytes, H5P_DATASET_XFER_DEFAULT,
buf)<0) {
HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL,
"unable to write raw data to file");
@@ -1421,7 +1421,7 @@ H5F_istore_lock(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout,
/*
* The chunk exists on disk.
*/
- if (H5F_block_read(f, H5FD_MEM_DRAW, udata.addr, udata.key.nbytes, H5P_DEFAULT,
+ if (H5F_block_read(f, H5FD_MEM_DRAW, udata.addr, udata.key.nbytes, H5P_DATASET_XFER_DEFAULT,
chunk)<0) {
HGOTO_ERROR (H5E_IO, H5E_READERROR, NULL,
"unable to read raw data chunk");
@@ -1500,13 +1500,9 @@ H5F_istore_lock(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout,
ent->wr_count = chunk_size;
ent->chunk = chunk;
- {
- H5D_xfer_t *dxpl;
- dxpl = (H5P_DEFAULT==dxpl_id) ? &H5D_xfer_dflt : (H5D_xfer_t *)H5I_object(dxpl_id);
- ent->split_ratios[0] = dxpl->split_ratios[0];
- ent->split_ratios[1] = dxpl->split_ratios[1];
- ent->split_ratios[2] = dxpl->split_ratios[2];
- }
+ assert(H5I_GENPROP_LST==H5I_get_type(dxpl_id));
+ assert(TRUE==H5Pisa_class(dxpl_id,H5P_DATASET_XFER_NEW));
+ H5Pget(dxpl_id,H5D_XFER_BTREE_SPLIT_RATIO_NAME,&(ent->split_ratios));
/* Add it to the cache */
assert(NULL==rdcc->slot[idx]);
@@ -1646,13 +1642,10 @@ H5F_istore_unlock(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout,
}
x.alloc_size = x.chunk_size;
x.chunk = chunk;
- {
- H5D_xfer_t *dxpl;
- dxpl = (H5P_DEFAULT==dxpl_id) ? &H5D_xfer_dflt : (H5D_xfer_t *)H5I_object(dxpl_id);
- x.split_ratios[0] = dxpl->split_ratios[0];
- x.split_ratios[1] = dxpl->split_ratios[1];
- x.split_ratios[2] = dxpl->split_ratios[2];
- }
+
+ assert(H5I_GENPROP_LST==H5I_get_type(dxpl_id));
+ assert(TRUE==H5Pisa_class(dxpl_id,H5P_DATASET_XFER_NEW));
+ H5Pget(dxpl_id,H5D_XFER_BTREE_SPLIT_RATIO_NAME,&(x.split_ratios));
H5F_istore_flush_entry (f, &x, TRUE);
} else {
@@ -1800,7 +1793,7 @@ H5F_istore_read(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout,
for (u=l.ndims; u-- > 0; /*void*/)
l.dim[u] = layout->dim[u];
l.addr = udata.addr;
- if (H5F_arr_read(f, H5P_DEFAULT, &l, pline, fill, NULL/*no efl*/,
+ if (H5F_arr_read(f, H5P_DATASET_XFER_DEFAULT, &l, pline, fill, NULL/*no efl*/,
sub_size, size_m, sub_offset_m, offset_wrt_chunk, buf)<0) {
HRETURN_ERROR (H5E_IO, H5E_READERROR, FAIL,
"unable to read raw data from file");
@@ -1976,7 +1969,7 @@ H5F_istore_write(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout,
for (u=l.ndims; u-- > 0; /*void*/)
l.dim[u] = layout->dim[u];
l.addr = udata.addr;
- if (H5F_arr_write(f, H5P_DEFAULT, &l, pline, fill, NULL/*no efl*/,
+ if (H5F_arr_write(f, H5P_DATASET_XFER_DEFAULT, &l, pline, fill, NULL/*no efl*/,
sub_size, size_m, sub_offset_m, offset_wrt_chunk, buf)<0) {
HRETURN_ERROR (H5E_IO, H5E_WRITEERROR, FAIL,
"unable to write raw data to file");
diff --git a/src/H5Dprivate.h b/src/H5Dprivate.h
index 3254dde..ef942f7 100644
--- a/src/H5Dprivate.h
+++ b/src/H5Dprivate.h
@@ -51,32 +51,82 @@ typedef struct H5D_create_t {
H5O_pline_t pline; /*data filter pipeline */
} H5D_create_t;
-/* Data transfer property list */
-typedef struct H5D_xfer_t {
- size_t buf_size; /*max temp buffer size */
- void *tconv_buf; /*type conversion buffer or null */
- void *bkg_buf; /*background buffer or null */
- H5T_bkg_t need_bkg; /*type of background buffer needed */
- double split_ratios[3];/*B-tree node splitting ratios */
- uintn cache_hyper; /*cache hyperslab blocks during I/O? */
- uintn block_limit; /*largest hyperslab block to cache */
- size_t vector_size; /*Max. # of I/O vectors for hyperslabs */
- H5MM_allocate_t vlen_alloc; /*VL datatype allocation function */
- void *alloc_info; /*VL datatype allocation information */
- H5MM_free_t vlen_free; /*VL datatype free function */
- void *free_info; /*VL datatype free information */
- hid_t driver_id; /*File driver ID */
- void *driver_info; /*File driver specific information */
-#ifdef COALESCE_READS
- uintn gather_reads; /*coalesce single reads into a read transaction */
+/* Data transfer properties */
+/* Definitions for maximum temp buffer size property */
+#define H5D_XFER_MAX_TEMP_BUF_NAME "max_temp_buf"
+#define H5D_XFER_MAX_TEMP_BUF_SIZE sizeof(hsize_t)
+#define H5D_XFER_MAX_TEMP_BUF_DEF (1024*1024)
+/* Definitions for type conversion buffer property */
+#define H5D_XFER_TCONV_BUF_NAME "tconv_buf"
+#define H5D_XFER_TCONV_BUF_SIZE sizeof(void *)
+#define H5D_XFER_TCONV_BUF_DEF NULL
+/* Definitions for background buffer property */
+#define H5D_XFER_BKGR_BUF_NAME "bkgr_buf"
+#define H5D_XFER_BKGR_BUF_SIZE sizeof(void *)
+#define H5D_XFER_BKGR_BUF_DEF NULL
+/* Definitions for background buffer type property */
+#define H5D_XFER_BKGR_BUF_TYPE_NAME "bkgr_buf_type"
+#define H5D_XFER_BKGR_BUF_TYPE_SIZE sizeof(H5T_bkg_t)
+#define H5D_XFER_BKGR_BUF_TYPE_DEF H5T_BKG_NO
+/* Definitions for B-tree node splitting ratio property */
+#define H5D_XFER_BTREE_SPLIT_RATIO_NAME "btree_split_ratio"
+#define H5D_XFER_BTREE_SPLIT_RATIO_SIZE sizeof(double[3])
+#define H5D_XFER_BTREE_SPLIT_RATIO_DEF {0.1, 0.5, 0.9}
+/* Definitions for hyperslab caching property */
+#define H5D_XFER_HYPER_CACHE_NAME "hyper_cache"
+#define H5D_XFER_HYPER_CACHE_SIZE sizeof(uintn)
+#ifndef H5_HAVE_PARALLEL
+#define H5D_XFER_HYPER_CACHE_DEF 1
+#else
+#define H5D_XFER_HYPER_CACHE_DEF 0
#endif
-} H5D_xfer_t;
+/* Definitions for hyperslab cache limit property */
+#define H5D_XFER_HYPER_CACHE_LIM_NAME "hyper_cache_limit"
+#define H5D_XFER_HYPER_CACHE_LIM_SIZE sizeof(uintn)
+#define H5D_XFER_HYPER_CACHE_LIM_DEF 0
+/* Definitions for hyperslab cache limit property */
+#define H5D_XFER_HYPER_CACHE_LIM_NAME "hyper_cache_limit"
+#define H5D_XFER_HYPER_CACHE_LIM_SIZE sizeof(uintn)
+#define H5D_XFER_HYPER_CACHE_LIM_DEF 0
+/* Definitions for vlen allocation function property */
+#define H5D_XFER_VLEN_ALLOC_NAME "vlen_alloc"
+#define H5D_XFER_VLEN_ALLOC_SIZE sizeof(H5MM_allocate_t)
+#define H5D_XFER_VLEN_ALLOC_DEF NULL
+/* Definitions for vlen allocation info property */
+#define H5D_XFER_VLEN_ALLOC_INFO_NAME "vlen_alloc_info"
+#define H5D_XFER_VLEN_ALLOC_INFO_SIZE sizeof(void *)
+#define H5D_XFER_VLEN_ALLOC_INFO_DEF NULL
+/* Definitions for vlen free function property */
+#define H5D_XFER_VLEN_FREE_NAME "vlen_free"
+#define H5D_XFER_VLEN_FREE_SIZE sizeof(H5MM_free_t)
+#define H5D_XFER_VLEN_FREE_DEF NULL
+/* Definitions for vlen free info property */
+#define H5D_XFER_VLEN_FREE_INFO_NAME "vlen_free_info"
+#define H5D_XFER_VLEN_FREE_INFO_SIZE sizeof(void *)
+#define H5D_XFER_VLEN_FREE_INFO_DEF NULL
+/* Definitions for file driver ID property */
+#define H5D_XFER_VFL_ID_NAME "vfl_id"
+#define H5D_XFER_VFL_ID_SIZE sizeof(hid_t)
+#define H5D_XFER_VFL_ID_DEF H5FD_VFD_DEFAULT
+/* Definitions for file driver info property */
+#define H5D_XFER_VFL_INFO_NAME "vfl_info"
+#define H5D_XFER_VFL_INFO_SIZE sizeof(void *)
+#define H5D_XFER_VFL_INFO_DEF NULL
+#ifdef COALESCE_READS
+/* Definitions for 'gather reads' property */
+#define H5D_XFER_GATHER_READS_NAME "gather_reads"
+#define H5D_XFER_GATHER_READS_SIZE sizeof(uintn)
+#define H5D_XFER_GATHER_READS_DEF 0
+#endif /* COALESCE_READS */
+/* Definitions for hyperslab vector size property */
+#define H5D_XFER_HYPER_VECTOR_SIZE_NAME "vec_size"
+#define H5D_XFER_HYPER_VECTOR_SIZE_SIZE sizeof(size_t)
+#define H5D_XFER_HYPER_VECTOR_SIZE_DEF 1024
typedef struct H5D_t H5D_t;
/* library variables */
__DLLVAR__ const H5D_create_t H5D_create_dflt;
-__DLLVAR__ H5D_xfer_t H5D_xfer_dflt;
/* Functions defined in H5D.c */
__DLL__ herr_t H5D_init(void);
@@ -101,5 +151,7 @@ __DLL__ H5F_t * H5D_get_file(const H5D_t *dset);
__DLL__ hsize_t H5D_get_storage_size(H5D_t *dset);
__DLL__ void *H5D_vlen_get_buf_size_alloc(size_t size, void *info);
__DLL__ herr_t H5D_vlen_get_buf_size(void *elem, hid_t type_id, hsize_t ndim, hssize_t *point, void *op_data);
+__DLL__ herr_t H5D_xfer_create(hid_t dxpl_id, void *create_data);
+__DLL__ herr_t H5D_xfer_close(hid_t dxpl_id, void *close_data);
#endif
diff --git a/src/H5Dseq.c b/src/H5Dseq.c
index 1c05dcf..f33005a 100644
--- a/src/H5Dseq.c
+++ b/src/H5Dseq.c
@@ -172,18 +172,30 @@ H5F_seq_readv(H5F_t *f, hid_t dxpl_id, const struct H5O_layout_t *layout,
assert(f);
assert(layout);
assert(real_buf);
+ /* Make certain we have the correct type of property list */
+ assert(H5I_GENPROP_LST==H5I_get_type(dxpl_id));
+ assert(TRUE==H5Pisa_class(dxpl_id,H5P_DATASET_XFER_NEW));
#ifdef H5_HAVE_PARALLEL
{
- /* Get the transfer mode */
- H5D_xfer_t *dxpl;
- H5FD_mpio_dxpl_t *dx;
-
- if (H5P_DEFAULT!=dxpl_id && (dxpl=H5I_object(dxpl_id)) &&
- H5FD_MPIO==dxpl->driver_id && (dx=dxpl->driver_info) &&
- H5FD_MPIO_INDEPENDENT!=dx->xfer_mode) {
- xfer_mode = dx->xfer_mode;
- }
+ /* Get the transfer mode */
+ H5FD_mpio_dxpl_t *dx;
+ hid_t driver_id; /* VFL driver ID */
+
+ /* Get the driver ID */
+ if(H5P_get(dxpl_id, H5D_XFER_VFL_ID_NAME, &driver_id)<0)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve VFL driver ID");
+
+ /* Check if we are using the MPIO driver */
+ if(H5FD_MPIO==driver_id) {
+ /* Get the driver information */
+ if(H5P_get(dxpl_id, H5D_XFER_VFL_INFO_NAME, &dx)<0)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve VFL driver info");
+
+ /* Check if we are not using independent I/O */
+ if(H5FD_MPIO_INDEPENDENT!=dx->xfer_mode)
+ xfer_mode = dx->xfer_mode;
+ } /* end if */
}
/* Collective MPIO access is unsupported for non-contiguous datasets */
@@ -534,18 +546,30 @@ H5F_seq_writev(H5F_t *f, hid_t dxpl_id, const struct H5O_layout_t *layout,
assert(f);
assert(layout);
assert(real_buf);
+ /* Make certain we have the correct type of property list */
+ assert(H5I_GENPROP_LST==H5I_get_type(dxpl_id));
+ assert(TRUE==H5Pisa_class(dxpl_id,H5P_DATASET_XFER_NEW));
#ifdef H5_HAVE_PARALLEL
{
- /* Get the transfer mode */
- H5D_xfer_t *dxpl;
- H5FD_mpio_dxpl_t *dx;
-
- if (H5P_DEFAULT!=dxpl_id && (dxpl=H5I_object(dxpl_id)) &&
- H5FD_MPIO==dxpl->driver_id && (dx=dxpl->driver_info) &&
- H5FD_MPIO_INDEPENDENT!=dx->xfer_mode) {
- xfer_mode = dx->xfer_mode;
- }
+ /* Get the transfer mode */
+ H5FD_mpio_dxpl_t *dx;
+ hid_t driver_id; /* VFL driver ID */
+
+ /* Get the driver ID */
+ if(H5P_get(dxpl_id, H5D_XFER_VFL_ID_NAME, &driver_id)<0)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve VFL driver ID");
+
+ /* Check if we are using the MPIO driver */
+ if(H5FD_MPIO==driver_id) {
+ /* Get the driver information */
+ if(H5P_get(dxpl_id, H5D_XFER_VFL_INFO_NAME, &dx)<0)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve VFL driver info");
+
+ /* Check if we are not using independent I/O */
+ if(H5FD_MPIO_INDEPENDENT!=dx->xfer_mode)
+ xfer_mode = dx->xfer_mode;
+ } /* end if */
}
/* Collective MPIO access is unsupported for non-contiguous datasets */
diff --git a/src/H5E.c b/src/H5E.c
index cb45a9a..e1a830a 100644
--- a/src/H5E.c
+++ b/src/H5E.c
@@ -101,7 +101,9 @@ static const H5E_minor_mesg_t H5E_minor_mesg_g[] = {
/* Object atom related errors */
{H5E_BADATOM, "Unable to find atom information (already closed?)"},
- {H5E_CANTREGISTER, "Unable to register new atom"},
+ {H5E_CANTREGISTER, "Unable to register new atom"},
+ {H5E_CANTINC, "Unable to increment reference count"},
+ {H5E_CANTDEC, "Unable to decrement reference count"},
/* Cache related errors */
{H5E_CANTFLUSH, "Unable to flush data from cache"},
@@ -135,6 +137,10 @@ static const H5E_minor_mesg_t H5E_minor_mesg_g[] = {
/* Datatype conversion errors */
{H5E_CANTCONVERT, "Can't convert datatypes"},
+ /* Property list errors */
+ {H5E_CANTGET, "Can't get value"},
+ {H5E_CANTSET, "Can't set value"},
+
/* Datatype conversion errors */
{H5E_MPI, "Some MPI function failed"}
};
diff --git a/src/H5Epublic.h b/src/H5Epublic.h
index f0b59c8..1118302 100644
--- a/src/H5Epublic.h
+++ b/src/H5Epublic.h
@@ -142,6 +142,8 @@ typedef enum H5E_minor_t {
/* Object atom related errors */
H5E_BADATOM, /*Can't find atom information */
H5E_CANTREGISTER, /*Can't register new atom */
+ H5E_CANTINC, /*Can't increment reference count */
+ H5E_CANTDEC, /*Can't decrement reference count */
/* Cache related errors */
H5E_CANTFLUSH, /*Can't flush object from cache */
@@ -175,6 +177,10 @@ typedef enum H5E_minor_t {
/* Datatype conversion errors */
H5E_CANTCONVERT, /*Can't convert datatypes */
+ /* Property list errors */
+ H5E_CANTGET, /*Can't get value */
+ H5E_CANTSET, /*Can't set value */
+
/* Parallel errors */
H5E_MPI /*some MPI function failed */
} H5E_minor_t;
diff --git a/src/H5F.c b/src/H5F.c
index 349f926..5a606c3 100644
--- a/src/H5F.c
+++ b/src/H5F.c
@@ -596,7 +596,7 @@ H5F_locate_signature(H5FD_t *file)
HRETURN_ERROR(H5E_IO, H5E_CANTINIT, HADDR_UNDEF,
"unable to set EOA value for file signature");
}
- if (H5FD_read(file, H5FD_MEM_SUPER, H5P_DEFAULT, addr, H5F_SIGNATURE_LEN, buf)<0) {
+ if (H5FD_read(file, H5FD_MEM_SUPER, H5P_DATASET_XFER_DEFAULT, addr, H5F_SIGNATURE_LEN, buf)<0) {
HRETURN_ERROR(H5E_IO, H5E_CANTINIT, HADDR_UNDEF,
"unable to read file signature");
}
@@ -1110,7 +1110,7 @@ H5F_open(const char *name, uintn flags, hid_t fcpl_id, hid_t fapl_id)
"unable to find file signature");
}
if (H5FD_set_eoa(lf, shared->boot_addr+fixed_size)<0 ||
- H5FD_read(lf, H5FD_MEM_SUPER, H5P_DEFAULT, shared->boot_addr, fixed_size, buf)<0) {
+ H5FD_read(lf, H5FD_MEM_SUPER, H5P_DATASET_XFER_DEFAULT, shared->boot_addr, fixed_size, buf)<0) {
HGOTO_ERROR(H5E_FILE, H5E_READERROR, NULL,
"unable to read superblock");
}
@@ -1198,7 +1198,7 @@ H5F_open(const char *name, uintn flags, hid_t fcpl_id, hid_t fapl_id)
H5G_SIZEOF_ENTRY(file); /*root group ptr*/
assert(variable_size<=sizeof(buf));
if (H5FD_set_eoa(lf, shared->boot_addr+fixed_size+variable_size)<0 ||
- H5FD_read(lf, H5FD_MEM_SUPER, H5P_DEFAULT, shared->boot_addr+fixed_size,
+ H5FD_read(lf, H5FD_MEM_SUPER, H5P_DATASET_XFER_DEFAULT, shared->boot_addr+fixed_size,
variable_size, buf)<0) {
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL,
"unable to read superblock");
@@ -1217,7 +1217,7 @@ H5F_open(const char *name, uintn flags, hid_t fcpl_id, hid_t fapl_id)
if (H5F_addr_defined(shared->driver_addr)) {
haddr_t drv_addr = shared->base_addr + shared->driver_addr;
if (H5FD_set_eoa(lf, drv_addr+16)<0 ||
- H5FD_read(lf, H5FD_MEM_SUPER, H5P_DEFAULT, drv_addr, 16, buf)<0) {
+ H5FD_read(lf, H5FD_MEM_SUPER, H5P_DATASET_XFER_DEFAULT, drv_addr, 16, buf)<0) {
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL,
"unable to read driver information block");
}
@@ -1241,7 +1241,7 @@ H5F_open(const char *name, uintn flags, hid_t fcpl_id, hid_t fapl_id)
/* Read driver information and decode */
if (H5FD_set_eoa(lf, drv_addr+16+driver_size)<0 ||
- H5FD_read(lf, H5FD_MEM_SUPER, H5P_DEFAULT, drv_addr+16, driver_size, buf)<0) {
+ H5FD_read(lf, H5FD_MEM_SUPER, H5P_DATASET_XFER_DEFAULT, drv_addr+16, driver_size, buf)<0) {
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL,
"unable to read file driver information");
}
@@ -1660,7 +1660,7 @@ H5F_flush(H5F_t *f, H5F_scope_t scope, hbool_t invalidate,
/* flush the data sieve buffer, if we have a dirty one */
if(!alloc_only && f->shared->sieve_buf && f->shared->sieve_dirty) {
/* Write dirty data sieve buffer to file */
- if (H5F_block_write(f, H5FD_MEM_DRAW, f->shared->sieve_loc, f->shared->sieve_size, H5P_DEFAULT, f->shared->sieve_buf)<0) {
+ if (H5F_block_write(f, H5FD_MEM_DRAW, f->shared->sieve_loc, f->shared->sieve_size, H5P_DATASET_XFER_DEFAULT, f->shared->sieve_buf)<0) {
HRETURN_ERROR(H5E_IO, H5E_WRITEERROR, FAIL,
"block write failed");
}
@@ -1769,7 +1769,7 @@ H5F_flush(H5F_t *f, H5F_scope_t scope, hbool_t invalidate,
if (IS_H5FD_MPIO(f))
H5FD_mpio_tas_allsame(f->shared->lf, TRUE); /*only p0 will write*/
#endif
- if (H5FD_write(f->shared->lf, H5FD_MEM_SUPER, H5P_DEFAULT, f->shared->boot_addr,
+ if (H5FD_write(f->shared->lf, H5FD_MEM_SUPER, H5P_DATASET_XFER_DEFAULT, f->shared->boot_addr,
superblock_size, sbuf)<0) {
HRETURN_ERROR(H5E_IO, H5E_WRITEERROR, FAIL,
"unable to write superblock");
@@ -1781,7 +1781,7 @@ H5F_flush(H5F_t *f, H5F_scope_t scope, hbool_t invalidate,
if (IS_H5FD_MPIO(f))
H5FD_mpio_tas_allsame(f->shared->lf, TRUE); /*only p0 will write*/
#endif
- if (H5FD_write(f->shared->lf, H5FD_MEM_SUPER, H5P_DEFAULT,
+ if (H5FD_write(f->shared->lf, H5FD_MEM_SUPER, H5P_DATASET_XFER_DEFAULT,
f->shared->base_addr+superblock_size, driver_size,
dbuf)<0) {
HRETURN_ERROR(H5E_IO, H5E_WRITEERROR, FAIL,
diff --git a/src/H5FD.c b/src/H5FD.c
index f8538ae..fd24594 100644
--- a/src/H5FD.c
+++ b/src/H5FD.c
@@ -284,7 +284,6 @@ H5FD_get_class(hid_t id)
{
H5FD_class_t *ret_value=NULL;
H5F_access_t *fapl=NULL;
- H5D_xfer_t *dxpl=NULL;
FUNC_ENTER(H5FD_get_class, NULL);
@@ -292,28 +291,23 @@ H5FD_get_class(hid_t id)
ret_value = H5FD_get_class(H5F_access_dflt.driver_id);
} else if (H5I_VFL==H5I_get_type(id)) {
ret_value = H5I_object(id);
+ } else if (H5I_GENPROP_LST == H5I_get_type(id) &&
+ TRUE==H5Pisa_class(id,H5P_DATASET_XFER_NEW)) {
+ ret_value = H5FD_get_class(H5P_peek_hid_t(id,H5D_XFER_VFL_ID_NAME));
} else {
switch (H5P_get_class(id)) {
- case H5P_FILE_ACCESS:
- if (NULL==(fapl=H5I_object(id))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, NULL,
- "not a file access property list");
- }
- ret_value = H5FD_get_class(fapl->driver_id);
- break;
-
- case H5P_DATASET_XFER:
- if (NULL==(dxpl=H5I_object(id))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, NULL,
- "not a data transfer property list");
- }
- ret_value = H5FD_get_class(dxpl->driver_id);
- break;
-
- default:
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, NULL,
- "not a driver id, file access property list or "
- "data transfer property list");
+ case H5P_FILE_ACCESS:
+ if (NULL==(fapl=H5I_object(id))) {
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, NULL,
+ "not a file access property list");
+ }
+ ret_value = H5FD_get_class(fapl->driver_id);
+ break;
+
+ default:
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, NULL,
+ "not a driver id, file access property list or "
+ "data transfer property list");
}
}
FUNC_LEAVE(ret_value);
@@ -1968,23 +1962,20 @@ H5FDread(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, size_t size
H5TRACE6("e","xMtiazx",file,type,dxpl_id,addr,size,buf);
/* Check args */
- if (!file || !file->cls) {
+ if (!file || !file->cls)
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file pointer");
- }
- if (H5P_DEFAULT!=dxpl_id &&
- (H5P_DATASET_XFER!=H5P_get_class(dxpl_id) ||
- NULL==H5I_object(dxpl_id))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
- "not a data transfer property list");
- }
- if (!buf) {
+ /* Get the default dataset transfer property list if the user didn't provide one */
+ if (H5P_DEFAULT == dxpl_id)
+ dxpl_id= H5P_DATASET_XFER_DEFAULT;
+ if (H5I_GENPROP_LST != H5I_get_type(dxpl_id) ||
+ TRUE!=H5Pisa_class(dxpl_id,H5P_DATASET_XFER_NEW))
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data transfer property list");
+ if (!buf)
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "null result buffer");
- }
/* Do the real work */
- if (H5FD_read(file, type, dxpl_id, addr, size, buf)<0) {
+ if (H5FD_read(file, type, dxpl_id, addr, size, buf)<0)
HRETURN_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "file read request failed");
- }
FUNC_LEAVE(SUCCEED);
}
@@ -2016,8 +2007,8 @@ H5FD_read(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, size_t siz
{
FUNC_ENTER(H5FD_read, FAIL);
assert(file && file->cls);
- assert(H5P_DEFAULT==dxpl_id ||
- (H5P_DATASET_XFER==H5P_get_class(dxpl_id) || H5I_object(dxpl_id)));
+ assert(H5I_GENPROP_LST==H5I_get_type(dxpl_id));
+ assert(TRUE==H5Pisa_class(dxpl_id,H5P_DATASET_XFER_NEW));
assert(buf);
#ifndef H5_HAVE_PARALLEL
@@ -2124,24 +2115,20 @@ H5FDwrite(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, size_t siz
H5TRACE6("e","xMtiazx",file,type,dxpl_id,addr,size,buf);
/* Check args */
- if (!file || !file->cls) {
+ if (!file || !file->cls)
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file pointer");
- }
- if (H5P_DEFAULT!=dxpl_id &&
- (H5P_DATASET_XFER!=H5P_get_class(dxpl_id) ||
- NULL==H5I_object(dxpl_id))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
- "not a data transfer property list");
- }
- if (!buf) {
+ /* Get the default dataset transfer property list if the user didn't provide one */
+ if (H5P_DEFAULT == dxpl_id)
+ dxpl_id= H5P_DATASET_XFER_DEFAULT;
+ if (H5I_GENPROP_LST != H5I_get_type(dxpl_id) ||
+ TRUE!=H5Pisa_class(dxpl_id,H5P_DATASET_XFER_NEW))
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data transfer property list");
+ if (!buf)
HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "null buffer");
- }
/* The real work */
- if (H5FD_write(file, type, dxpl_id, addr, size, buf)<0) {
- HRETURN_ERROR(H5E_VFL, H5E_CANTINIT, FAIL,
- "file write request failed");
- }
+ if (H5FD_write(file, type, dxpl_id, addr, size, buf)<0)
+ HRETURN_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "file write request failed");
FUNC_LEAVE(SUCCEED);
}
@@ -2176,8 +2163,8 @@ H5FD_write(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, size_t si
FUNC_ENTER(H5FD_write, FAIL);
assert(file && file->cls);
- assert(H5P_DEFAULT==dxpl_id ||
- (H5P_DATASET_XFER==H5P_get_class(dxpl_id) && H5I_object(dxpl_id)));
+ assert(H5I_GENPROP_LST==H5I_get_type(dxpl_id));
+ assert(TRUE==H5Pisa_class(dxpl_id,H5P_DATASET_XFER_NEW));
assert(buf);
#ifndef H5_HAVE_PARALLEL
@@ -2427,7 +2414,7 @@ H5FD_flush(H5FD_t *file)
if((file->feature_flags&H5FD_FEAT_ACCUMULATE_METADATA) && file->accum_dirty && file->accum_size>0) {
/* Flush the metadata contents */
/* Not certain if the type and dxpl should be the way they are... -QAK */
- if ((file->cls->write)(file, H5FD_MEM_DEFAULT, H5P_DEFAULT, file->accum_loc, file->accum_size, file->meta_accum)<0)
+ if ((file->cls->write)(file, H5FD_MEM_DEFAULT, H5P_DATASET_XFER_DEFAULT, file->accum_loc, file->accum_size, file->meta_accum)<0)
HRETURN_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "driver write request failed");
/* Reset the dirty flag */
diff --git a/src/H5Farray.c b/src/H5Farray.c
index c1922fa..03b5751 100644
--- a/src/H5Farray.c
+++ b/src/H5Farray.c
@@ -152,7 +152,7 @@ H5F_arr_read(H5F_t *f, hid_t dxpl_id, const struct H5O_layout_t *layout,
H5FD_mpio_xfer_t xfer_mode=H5FD_MPIO_INDEPENDENT;
#endif
#ifdef COALESCE_READS
- H5D_xfer_t *xfer_parms; /*transfer property list*/
+ uintn gather_reads; /* # of MPIO reads to gather */
#endif
FUNC_ENTER(H5F_arr_read, FAIL);
@@ -165,6 +165,9 @@ H5F_arr_read(H5F_t *f, hid_t dxpl_id, const struct H5O_layout_t *layout,
assert(mem_offset);
assert(mem_size);
assert(buf);
+ /* Make certain we have the correct type of property list */
+ assert(H5I_GENPROP_LST==H5I_get_type(dxpl_id));
+ assert(TRUE==H5Pisa_class(dxpl_id,H5P_DATASET_XFER_NEW));
/* Make a local copy of size so we can modify it */
H5V_vector_cpy(layout->ndims, hslab_size, _hslab_size);
@@ -172,17 +175,25 @@ H5F_arr_read(H5F_t *f, hid_t dxpl_id, const struct H5O_layout_t *layout,
#ifdef H5_HAVE_PARALLEL
{
/* Get the transfer mode */
- H5D_xfer_t *dxpl;
H5FD_mpio_dxpl_t *dx;
- if (H5P_DEFAULT!=dxpl_id && (dxpl=H5I_object(dxpl_id)) &&
- H5FD_MPIO==dxpl->driver_id && (dx=dxpl->driver_info) &&
- H5FD_MPIO_INDEPENDENT!=dx->xfer_mode) {
- xfer_mode = dx->xfer_mode;
- }
+ hid_t driver_id; /* VFL driver ID */
+
+ /* Get the driver ID */
+ if(H5P_get(dxpl_id, H5D_XFER_VFL_ID_NAME, &driver_id)<0)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve VFL driver ID");
+
+ /* Check if we are using the MPIO driver */
+ if(H5FD_MPIO==driver_id) {
+ /* Get the driver information */
+ if(H5P_get(dxpl_id, H5D_XFER_VFL_INFO_NAME, &dx)<0)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve VFL driver info");
+
+ /* Check if we are not using independent I/O */
+ if(H5FD_MPIO_INDEPENDENT!=dx->xfer_mode)
+ xfer_mode = dx->xfer_mode;
+ } /* end if */
}
-#endif
-#ifdef H5_HAVE_PARALLEL
/* Collective MPIO access is unsupported for non-contiguous datasets */
if (H5D_CONTIGUOUS!=layout->type && H5FD_MPIO_COLLECTIVE==xfer_mode) {
HRETURN_ERROR (H5E_DATASET, H5E_READERROR, FAIL,
@@ -282,30 +293,25 @@ H5F_arr_read(H5F_t *f, hid_t dxpl_id, const struct H5O_layout_t *layout,
printf("nelmts=%lu, min=%lu, max=%lu\n", temp, min, max);
#endif
if (max != min)
- HRETURN_ERROR(H5E_DATASET, H5E_READERROR, FAIL,
+ HRETURN_ERROR(H5E_DATASET, H5E_READERROR, FAIL,
"collective access with unequal number of "
"blocks not supported yet");
}
#endif
-#ifdef COALESCE_READS
- /* Get the dataset transfer property list */
- if (H5P_DEFAULT == dxpl_id) {
- xfer_parms = &H5D_xfer_dflt;
- } else if (H5P_DATASET_XFER != H5P_get_class (dxpl_id) ||
- NULL == (xfer_parms = H5I_object (dxpl_id))) {
- HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not xfer parms");
- }
-
- for (z=0, xfer_parms->gather_reads = nelmts - 1;
- z<nelmts;
- z++, xfer_parms->gather_reads--) {
-#else
#ifdef QAK
printf("%s: nelmts=%d, addr=%lu, elmt_size=%lu\n",FUNC,(int)nelmts,(unsigned long)addr,(unsigned long)elmt_size);
printf("%s: sieve_buf=%p, sieve_loc=%lu, sieve_size=%lu, sieve_buf_size=%lu, sieve_dirty=%u\n",FUNC,f->shared->sieve_buf,(unsigned long)f->shared->sieve_loc,(unsigned long)f->shared->sieve_size,(unsigned long)f->shared->sieve_buf_size,(unsigned)f->shared->sieve_dirty);
printf("%s: feature_flags=%lx\n",FUNC,(unsigned long)f->shared->lf->feature_flags);
#endif /* QAK */
+#ifdef COALESCE_READS
+ for (z=0, gather_reads = nelmts - 1; z<nelmts; z++, gather_reads--) {
+
+ /* Track the number of reads to gather */
+ if(H5P_set(dxpl_id, H5D_XFER_GATHER_READS_NAME, &gather_reads)<0)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve gather reads");
+
+#else
for (z=0; z<nelmts; z++) {
#endif
@@ -446,6 +452,9 @@ H5F_arr_write(H5F_t *f, hid_t dxpl_id, const struct H5O_layout_t *layout,
assert(mem_offset);
assert(mem_size);
assert(buf);
+ /* Make certain we have the correct type of property list */
+ assert(H5I_GENPROP_LST==H5I_get_type(dxpl_id));
+ assert(TRUE==H5Pisa_class(dxpl_id,H5P_DATASET_XFER_NEW));
/* Make a local copy of _size so we can modify it */
H5V_vector_cpy(layout->ndims, hslab_size, _hslab_size);
@@ -453,17 +462,25 @@ H5F_arr_write(H5F_t *f, hid_t dxpl_id, const struct H5O_layout_t *layout,
#ifdef H5_HAVE_PARALLEL
{
/* Get the transfer mode */
- H5D_xfer_t *dxpl;
H5FD_mpio_dxpl_t *dx;
- if (H5P_DEFAULT!=dxpl_id && (dxpl=H5I_object(dxpl_id)) &&
- H5FD_MPIO==dxpl->driver_id && (dx=dxpl->driver_info) &&
- H5FD_MPIO_INDEPENDENT!=dx->xfer_mode) {
- xfer_mode = dx->xfer_mode;
- }
+ hid_t driver_id; /* VFL driver ID */
+
+ /* Get the driver ID */
+ if(H5P_get(dxpl_id, H5D_XFER_VFL_ID_NAME, &driver_id)<0)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve VFL driver ID");
+
+ /* Check if we are using the MPIO driver */
+ if(H5FD_MPIO==driver_id) {
+ /* Get the driver information */
+ if(H5P_get(dxpl_id, H5D_XFER_VFL_INFO_NAME, &dx)<0)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve VFL driver info");
+
+ /* Check if we are not using independent I/O */
+ if(H5FD_MPIO_INDEPENDENT!=dx->xfer_mode)
+ xfer_mode = dx->xfer_mode;
+ } /* end if */
}
-#endif
-#ifdef H5_HAVE_PARALLEL
if (H5D_CONTIGUOUS!=layout->type && H5FD_MPIO_COLLECTIVE==xfer_mode) {
HRETURN_ERROR (H5E_DATASET, H5E_WRITEERROR, FAIL,
"collective access on non-contiguous datasets not "
@@ -566,7 +583,7 @@ H5F_arr_write(H5F_t *f, hid_t dxpl_id, const struct H5O_layout_t *layout,
printf("nelmts=%lu, min=%lu, max=%lu\n", temp, min, max);
#endif
if (max != min) {
- HRETURN_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL,
+ HRETURN_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL,
"collective access with unequal number of "
"blocks not supported yet");
}
@@ -614,8 +631,7 @@ H5F_arr_write(H5F_t *f, hid_t dxpl_id, const struct H5O_layout_t *layout,
*/
if (efl && efl->nused>0) {
HRETURN_ERROR(H5E_IO, H5E_UNSUPPORTED, FAIL,
- "chunking and external files are mutually "
- "exclusive");
+ "chunking and external files are mutually exclusive");
}
for (u=0; u<layout->ndims; u++) {
if (0!=mem_offset[u] || hslab_size[u]!=mem_size[u]) {
diff --git a/src/H5Fistore.c b/src/H5Fistore.c
index d37c474..ebdeda9 100644
--- a/src/H5Fistore.c
+++ b/src/H5Fistore.c
@@ -1001,7 +1001,7 @@ H5F_istore_flush_entry(H5F_t *f, H5F_rdcc_ent_t *ent, hbool_t reset)
HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL,
"unable to allocate chunk");
}
- if (H5F_block_write(f, H5FD_MEM_DRAW, udata.addr, udata.key.nbytes, H5P_DEFAULT,
+ if (H5F_block_write(f, H5FD_MEM_DRAW, udata.addr, udata.key.nbytes, H5P_DATASET_XFER_DEFAULT,
buf)<0) {
HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL,
"unable to write raw data to file");
@@ -1421,7 +1421,7 @@ H5F_istore_lock(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout,
/*
* The chunk exists on disk.
*/
- if (H5F_block_read(f, H5FD_MEM_DRAW, udata.addr, udata.key.nbytes, H5P_DEFAULT,
+ if (H5F_block_read(f, H5FD_MEM_DRAW, udata.addr, udata.key.nbytes, H5P_DATASET_XFER_DEFAULT,
chunk)<0) {
HGOTO_ERROR (H5E_IO, H5E_READERROR, NULL,
"unable to read raw data chunk");
@@ -1500,13 +1500,9 @@ H5F_istore_lock(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout,
ent->wr_count = chunk_size;
ent->chunk = chunk;
- {
- H5D_xfer_t *dxpl;
- dxpl = (H5P_DEFAULT==dxpl_id) ? &H5D_xfer_dflt : (H5D_xfer_t *)H5I_object(dxpl_id);
- ent->split_ratios[0] = dxpl->split_ratios[0];
- ent->split_ratios[1] = dxpl->split_ratios[1];
- ent->split_ratios[2] = dxpl->split_ratios[2];
- }
+ assert(H5I_GENPROP_LST==H5I_get_type(dxpl_id));
+ assert(TRUE==H5Pisa_class(dxpl_id,H5P_DATASET_XFER_NEW));
+ H5Pget(dxpl_id,H5D_XFER_BTREE_SPLIT_RATIO_NAME,&(ent->split_ratios));
/* Add it to the cache */
assert(NULL==rdcc->slot[idx]);
@@ -1646,13 +1642,10 @@ H5F_istore_unlock(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout,
}
x.alloc_size = x.chunk_size;
x.chunk = chunk;
- {
- H5D_xfer_t *dxpl;
- dxpl = (H5P_DEFAULT==dxpl_id) ? &H5D_xfer_dflt : (H5D_xfer_t *)H5I_object(dxpl_id);
- x.split_ratios[0] = dxpl->split_ratios[0];
- x.split_ratios[1] = dxpl->split_ratios[1];
- x.split_ratios[2] = dxpl->split_ratios[2];
- }
+
+ assert(H5I_GENPROP_LST==H5I_get_type(dxpl_id));
+ assert(TRUE==H5Pisa_class(dxpl_id,H5P_DATASET_XFER_NEW));
+ H5Pget(dxpl_id,H5D_XFER_BTREE_SPLIT_RATIO_NAME,&(x.split_ratios));
H5F_istore_flush_entry (f, &x, TRUE);
} else {
@@ -1800,7 +1793,7 @@ H5F_istore_read(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout,
for (u=l.ndims; u-- > 0; /*void*/)
l.dim[u] = layout->dim[u];
l.addr = udata.addr;
- if (H5F_arr_read(f, H5P_DEFAULT, &l, pline, fill, NULL/*no efl*/,
+ if (H5F_arr_read(f, H5P_DATASET_XFER_DEFAULT, &l, pline, fill, NULL/*no efl*/,
sub_size, size_m, sub_offset_m, offset_wrt_chunk, buf)<0) {
HRETURN_ERROR (H5E_IO, H5E_READERROR, FAIL,
"unable to read raw data from file");
@@ -1976,7 +1969,7 @@ H5F_istore_write(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout,
for (u=l.ndims; u-- > 0; /*void*/)
l.dim[u] = layout->dim[u];
l.addr = udata.addr;
- if (H5F_arr_write(f, H5P_DEFAULT, &l, pline, fill, NULL/*no efl*/,
+ if (H5F_arr_write(f, H5P_DATASET_XFER_DEFAULT, &l, pline, fill, NULL/*no efl*/,
sub_size, size_m, sub_offset_m, offset_wrt_chunk, buf)<0) {
HRETURN_ERROR (H5E_IO, H5E_WRITEERROR, FAIL,
"unable to write raw data to file");
diff --git a/src/H5Fseq.c b/src/H5Fseq.c
index 1c05dcf..f33005a 100644
--- a/src/H5Fseq.c
+++ b/src/H5Fseq.c
@@ -172,18 +172,30 @@ H5F_seq_readv(H5F_t *f, hid_t dxpl_id, const struct H5O_layout_t *layout,
assert(f);
assert(layout);
assert(real_buf);
+ /* Make certain we have the correct type of property list */
+ assert(H5I_GENPROP_LST==H5I_get_type(dxpl_id));
+ assert(TRUE==H5Pisa_class(dxpl_id,H5P_DATASET_XFER_NEW));
#ifdef H5_HAVE_PARALLEL
{
- /* Get the transfer mode */
- H5D_xfer_t *dxpl;
- H5FD_mpio_dxpl_t *dx;
-
- if (H5P_DEFAULT!=dxpl_id && (dxpl=H5I_object(dxpl_id)) &&
- H5FD_MPIO==dxpl->driver_id && (dx=dxpl->driver_info) &&
- H5FD_MPIO_INDEPENDENT!=dx->xfer_mode) {
- xfer_mode = dx->xfer_mode;
- }
+ /* Get the transfer mode */
+ H5FD_mpio_dxpl_t *dx;
+ hid_t driver_id; /* VFL driver ID */
+
+ /* Get the driver ID */
+ if(H5P_get(dxpl_id, H5D_XFER_VFL_ID_NAME, &driver_id)<0)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve VFL driver ID");
+
+ /* Check if we are using the MPIO driver */
+ if(H5FD_MPIO==driver_id) {
+ /* Get the driver information */
+ if(H5P_get(dxpl_id, H5D_XFER_VFL_INFO_NAME, &dx)<0)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve VFL driver info");
+
+ /* Check if we are not using independent I/O */
+ if(H5FD_MPIO_INDEPENDENT!=dx->xfer_mode)
+ xfer_mode = dx->xfer_mode;
+ } /* end if */
}
/* Collective MPIO access is unsupported for non-contiguous datasets */
@@ -534,18 +546,30 @@ H5F_seq_writev(H5F_t *f, hid_t dxpl_id, const struct H5O_layout_t *layout,
assert(f);
assert(layout);
assert(real_buf);
+ /* Make certain we have the correct type of property list */
+ assert(H5I_GENPROP_LST==H5I_get_type(dxpl_id));
+ assert(TRUE==H5Pisa_class(dxpl_id,H5P_DATASET_XFER_NEW));
#ifdef H5_HAVE_PARALLEL
{
- /* Get the transfer mode */
- H5D_xfer_t *dxpl;
- H5FD_mpio_dxpl_t *dx;
-
- if (H5P_DEFAULT!=dxpl_id && (dxpl=H5I_object(dxpl_id)) &&
- H5FD_MPIO==dxpl->driver_id && (dx=dxpl->driver_info) &&
- H5FD_MPIO_INDEPENDENT!=dx->xfer_mode) {
- xfer_mode = dx->xfer_mode;
- }
+ /* Get the transfer mode */
+ H5FD_mpio_dxpl_t *dx;
+ hid_t driver_id; /* VFL driver ID */
+
+ /* Get the driver ID */
+ if(H5P_get(dxpl_id, H5D_XFER_VFL_ID_NAME, &driver_id)<0)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve VFL driver ID");
+
+ /* Check if we are using the MPIO driver */
+ if(H5FD_MPIO==driver_id) {
+ /* Get the driver information */
+ if(H5P_get(dxpl_id, H5D_XFER_VFL_INFO_NAME, &dx)<0)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve VFL driver info");
+
+ /* Check if we are not using independent I/O */
+ if(H5FD_MPIO_INDEPENDENT!=dx->xfer_mode)
+ xfer_mode = dx->xfer_mode;
+ } /* end if */
}
/* Collective MPIO access is unsupported for non-contiguous datasets */
diff --git a/src/H5Gnode.c b/src/H5Gnode.c
index 69777b5..cf090da 100644
--- a/src/H5Gnode.c
+++ b/src/H5Gnode.c
@@ -373,7 +373,7 @@ H5G_node_flush(H5F_t *f, hbool_t destroy, haddr_t addr, H5G_node_t *sym)
if (IS_H5FD_MPIO(f))
H5FD_mpio_tas_allsame(f->shared->lf, TRUE); /*only p0 will write*/
#endif /* H5_HAVE_PARALLEL */
- status = H5F_block_write(f, H5FD_MEM_BTREE, addr, size, H5P_DEFAULT, buf);
+ status = H5F_block_write(f, H5FD_MEM_BTREE, addr, size, H5P_DATASET_XFER_DEFAULT, buf);
if (status < 0)
HRETURN_ERROR(H5E_SYM, H5E_WRITEERROR, FAIL,
"unable to write symbol table node to the file");
@@ -443,7 +443,7 @@ H5G_node_load(H5F_t *f, haddr_t addr, const void UNUSED *_udata1,
HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL,
"memory allocation failed");
}
- if (H5F_block_read(f, H5FD_MEM_BTREE, addr, size, H5P_DEFAULT, buf) < 0) {
+ if (H5F_block_read(f, H5FD_MEM_BTREE, addr, size, H5P_DATASET_XFER_DEFAULT, buf) < 0) {
HGOTO_ERROR(H5E_SYM, H5E_READERROR, NULL,
"unabel to read symbol table node");
}
diff --git a/src/H5HG.c b/src/H5HG.c
index 83e7b78..7aec212 100644
--- a/src/H5HG.c
+++ b/src/H5HG.c
@@ -257,7 +257,7 @@ H5HG_load (H5F_t *f, haddr_t addr, const void UNUSED *udata1,
HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL,
"memory allocation failed");
}
- if (H5F_block_read(f, H5FD_MEM_GHEAP, addr, H5HG_MINSIZE, H5P_DEFAULT,
+ if (H5F_block_read(f, H5FD_MEM_GHEAP, addr, H5HG_MINSIZE, H5P_DATASET_XFER_DEFAULT,
heap->chunk)<0) {
HGOTO_ERROR (H5E_HEAP, H5E_READERROR, NULL,
"unable to read global heap collection");
@@ -294,7 +294,7 @@ H5HG_load (H5F_t *f, haddr_t addr, const void UNUSED *udata1,
"memory allocation failed");
}
if (H5F_block_read (f, H5FD_MEM_GHEAP, next_addr, (heap->size-H5HG_MINSIZE),
- H5P_DEFAULT, heap->chunk+H5HG_MINSIZE)<0) {
+ H5P_DATASET_XFER_DEFAULT, heap->chunk+H5HG_MINSIZE)<0) {
HGOTO_ERROR (H5E_HEAP, H5E_READERROR, NULL,
"unable to read global heap collection");
}
@@ -420,7 +420,7 @@ H5HG_flush (H5F_t *f, hbool_t destroy, haddr_t addr, H5HG_heap_t *heap)
if (heap->dirty) {
if (H5F_block_write (f, H5FD_MEM_GHEAP, addr, heap->size,
- H5P_DEFAULT, heap->chunk)<0) {
+ H5P_DATASET_XFER_DEFAULT, heap->chunk)<0) {
HRETURN_ERROR (H5E_HEAP, H5E_WRITEERROR, FAIL,
"unable to write global heap collection to file");
}
diff --git a/src/H5HL.c b/src/H5HL.c
index 4a36104..b3b98f3 100644
--- a/src/H5HL.c
+++ b/src/H5HL.c
@@ -219,7 +219,7 @@ H5HL_load(H5F_t *f, haddr_t addr, const void UNUSED *udata1,
assert(!udata1);
assert(!udata2);
- if (H5F_block_read(f, H5FD_MEM_LHEAP, addr, H5HL_SIZEOF_HDR(f), H5P_DEFAULT,
+ if (H5F_block_read(f, H5FD_MEM_LHEAP, addr, H5HL_SIZEOF_HDR(f), H5P_DATASET_XFER_DEFAULT,
hdr) < 0) {
HRETURN_ERROR(H5E_HEAP, H5E_READERROR, NULL,
"unable to read heap header");
@@ -260,7 +260,7 @@ H5HL_load(H5F_t *f, haddr_t addr, const void UNUSED *udata1,
}
if (heap->disk_alloc &&
H5F_block_read(f, H5FD_MEM_LHEAP, heap->addr, heap->disk_alloc,
- H5P_DEFAULT, heap->chunk + H5HL_SIZEOF_HDR(f)) < 0) {
+ H5P_DATASET_XFER_DEFAULT, heap->chunk + H5HL_SIZEOF_HDR(f)) < 0) {
HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, NULL,
"unable to read heap data");
}
@@ -400,7 +400,7 @@ H5HL_flush(H5F_t *f, hbool_t destroy, haddr_t addr, H5HL_t *heap)
#endif /* H5_HAVE_PARALLEL */
if (H5F_block_write(f, H5FD_MEM_LHEAP, addr,
(H5HL_SIZEOF_HDR(f)+heap->disk_alloc),
- H5P_DEFAULT, heap->chunk) < 0) {
+ H5P_DATASET_XFER_DEFAULT, heap->chunk) < 0) {
HRETURN_ERROR(H5E_HEAP, H5E_WRITEERROR, FAIL,
"unable to write heap header and data to file");
}
@@ -410,7 +410,7 @@ H5HL_flush(H5F_t *f, hbool_t destroy, haddr_t addr, H5HL_t *heap)
H5FD_mpio_tas_allsame( f->shared->lf, TRUE ); /* only p0 writes */
#endif /* H5_HAVE_PARALLEL */
if (H5F_block_write(f, H5FD_MEM_LHEAP, addr, H5HL_SIZEOF_HDR(f),
- H5P_DEFAULT, heap->chunk)<0) {
+ H5P_DATASET_XFER_DEFAULT, heap->chunk)<0) {
HRETURN_ERROR(H5E_HEAP, H5E_WRITEERROR, FAIL,
"unable to write heap header to file");
}
@@ -419,7 +419,7 @@ H5HL_flush(H5F_t *f, hbool_t destroy, haddr_t addr, H5HL_t *heap)
H5FD_mpio_tas_allsame( f->shared->lf, TRUE ); /* only p0 writes */
#endif /* H5_HAVE_PARALLEL */
if (H5F_block_write(f, H5FD_MEM_LHEAP, heap->addr, heap->disk_alloc,
- H5P_DEFAULT,
+ H5P_DATASET_XFER_DEFAULT,
heap->chunk + H5HL_SIZEOF_HDR(f)) < 0) {
HRETURN_ERROR(H5E_HEAP, H5E_WRITEERROR, FAIL,
"unable to write heap data to file");
diff --git a/src/H5Ipublic.h b/src/H5Ipublic.h
index 118ce98..2c82cfa 100644
--- a/src/H5Ipublic.h
+++ b/src/H5Ipublic.h
@@ -30,7 +30,7 @@ typedef enum {
H5I_BADID = (-1), /*invalid Group */
H5I_FILE = 1, /*group ID for File objects */
H5I_FILE_CLOSING, /*files pending close due to open objhdrs */
- H5I_TEMPLATE_0, /*group ID for Template objects */
+ H5I_TEMPLATE_0, /*group ID for Template objects */
H5I_TEMPLATE_1, /*group ID for Template objects */
H5I_TEMPLATE_2, /*group ID for Template objects */
H5I_TEMPLATE_3, /*group ID for Template objects */
@@ -38,17 +38,17 @@ typedef enum {
H5I_TEMPLATE_5, /*group ID for Template objects */
H5I_TEMPLATE_6, /*group ID for Template objects */
H5I_TEMPLATE_7, /*group ID for Template objects */
- H5I_TEMPLATE_MAX, /*not really a group ID */
+ H5I_TEMPLATE_MAX, /*not really a group ID */
H5I_GROUP, /*group ID for Group objects */
H5I_DATATYPE, /*group ID for Datatype objects */
H5I_DATASPACE, /*group ID for Dataspace objects */
H5I_DATASET, /*group ID for Dataset objects */
H5I_ATTR, /*group ID for Attribute objects */
- H5I_TEMPBUF, /*group ID for Temporary buffer objects */
+ H5I_TEMPBUF, /*group ID for Temporary buffer objects */
H5I_REFERENCE, /*group ID for Reference objects */
- H5I_VFL, /*group ID for virtual file layer */
- H5I_GENPROP_CLS, /*group ID for generic property list classes */
- H5I_GENPROP_LST, /*group ID for generic property lists */
+ H5I_VFL, /*group ID for virtual file layer */
+ H5I_GENPROP_CLS, /*group ID for generic property list classes */
+ H5I_GENPROP_LST, /*group ID for generic property lists */
H5I_NGROUPS /*number of valid groups, MUST BE LAST! */
} H5I_type_t;
diff --git a/src/H5O.c b/src/H5O.c
index a917ad7..b354231 100644
--- a/src/H5O.c
+++ b/src/H5O.c
@@ -379,7 +379,7 @@ H5O_load(H5F_t *f, haddr_t addr, const void UNUSED *_udata1,
/* read fixed-lenth part of object header */
hdr_size = H5O_SIZEOF_HDR(f);
- if (H5F_block_read(f, H5FD_MEM_OHDR, addr, hdr_size, H5P_DEFAULT, buf) < 0) {
+ if (H5F_block_read(f, H5FD_MEM_OHDR, addr, hdr_size, H5P_DATASET_XFER_DEFAULT, buf) < 0) {
HGOTO_ERROR(H5E_OHDR, H5E_READERROR, NULL,
"unable to read object header");
}
@@ -437,7 +437,7 @@ H5O_load(H5F_t *f, haddr_t addr, const void UNUSED *_udata1,
HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL,
"memory allocation failed");
}
- if (H5F_block_read(f, H5FD_MEM_OHDR, chunk_addr, chunk_size, H5P_DEFAULT,
+ if (H5F_block_read(f, H5FD_MEM_OHDR, chunk_addr, chunk_size, H5P_DATASET_XFER_DEFAULT,
oh->chunk[chunkno].image) < 0) {
HGOTO_ERROR(H5E_OHDR, H5E_READERROR, NULL,
"unable to read object header data");
@@ -593,7 +593,7 @@ H5O_flush(H5F_t *f, hbool_t destroy, haddr_t addr, H5O_t *oh)
H5FD_mpio_tas_allsame(f->shared->lf, TRUE); /*only p0 will write*/
#endif /* H5_HAVE_PARALLEL */
if (H5F_block_write(f, H5FD_MEM_OHDR, addr, H5O_SIZEOF_HDR(f),
- H5P_DEFAULT, buf) < 0) {
+ H5P_DATASET_XFER_DEFAULT, buf) < 0) {
HRETURN_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL,
"unable to write object header hdr to disk");
}
@@ -680,7 +680,7 @@ H5O_flush(H5F_t *f, hbool_t destroy, haddr_t addr, H5O_t *oh)
#endif /* H5_HAVE_PARALLEL */
if (H5F_block_write(f, H5FD_MEM_OHDR, addr,
(H5O_SIZEOF_HDR(f)+oh->chunk[u].size),
- H5P_DEFAULT, p) < 0) {
+ H5P_DATASET_XFER_DEFAULT, p) < 0) {
HRETURN_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL,
"unable to write object header data to disk");
} /* end if */
@@ -695,7 +695,7 @@ H5O_flush(H5F_t *f, hbool_t destroy, haddr_t addr, H5O_t *oh)
#endif /* H5_HAVE_PARALLEL */
if (H5F_block_write(f, H5FD_MEM_OHDR, oh->chunk[u].addr,
(oh->chunk[u].size),
- H5P_DEFAULT, oh->chunk[u].image) < 0) {
+ H5P_DATASET_XFER_DEFAULT, oh->chunk[u].image) < 0) {
HRETURN_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL,
"unable to write object header data to disk");
} /* end if */
diff --git a/src/H5P.c b/src/H5P.c
index 7aa71bb..c95e2ac 100644
--- a/src/H5P.c
+++ b/src/H5P.c
@@ -35,23 +35,39 @@ static intn interface_initialize_g = 0;
static herr_t H5P_init_interface(void);
/*
- * Predefined data types. These are initialized at runtime by
+ * Predefined property list classes. These are initialized at runtime by
* H5P_init_interface() in this source file.
*/
-hid_t H5P_NO_CLASS_g = FAIL;
-hid_t H5P_FILE_CREATE_g = FAIL;
-hid_t H5P_FILE_ACCESS_g = FAIL;
-hid_t H5P_DATASET_CREATE_g = FAIL;
-hid_t H5P_DATASET_XFER_g = FAIL;
-hid_t H5P_MOUNT_g = FAIL;
+hid_t H5P_CLS_NO_CLASS_g = FAIL;
+hid_t H5P_CLS_FILE_CREATE_g = FAIL;
+hid_t H5P_CLS_FILE_ACCESS_g = FAIL;
+hid_t H5P_CLS_DATASET_CREATE_g = FAIL;
+hid_t H5P_CLS_DATASET_XFER_g = FAIL;
+hid_t H5P_CLS_MOUNT_g = FAIL;
+
+/*
+ * Predefined property lists for each predefined class. These are initialized
+ * at runtime by H5P_init_interface() in this source file.
+ */
+hid_t H5P_LST_NO_CLASS_g = FAIL;
+hid_t H5P_LST_FILE_CREATE_g = FAIL;
+hid_t H5P_LST_FILE_ACCESS_g = FAIL;
+hid_t H5P_LST_DATASET_CREATE_g = FAIL;
+hid_t H5P_LST_DATASET_XFER_g = FAIL;
+hid_t H5P_LST_MOUNT_g = FAIL;
/* Local static functions */
static H5P_genclass_t *H5P_create_class(H5P_genclass_t *par_class,
const char *name, uintn hashsize, uintn internal,
H5P_cls_create_func_t cls_create, void *create_data,
+ H5P_cls_copy_func_t cls_copy, void *copy_data,
H5P_cls_close_func_t cls_close, void *close_data);
static herr_t H5P_close_list(void *_plist);
static herr_t H5P_close_class(void *_pclass);
+static H5P_genprop_t *H5P_copy_prop(H5P_genprop_t *oprop);
+static herr_t H5P_access_class(H5P_genclass_t *pclass, H5P_class_mod_t mod);
+static herr_t H5P_add_prop(H5P_genprop_t *hash[], uintn hashsize, H5P_genprop_t *prop);
+static herr_t H5P_free_prop(H5P_genprop_t *prop);
/* Declare a free list to manage the H5P_t struct */
H5FL_DEFINE_STATIC(H5P_t);
@@ -173,61 +189,56 @@ H5P_init_interface(void)
* Initialize the Generic Property class & object groups.
*/
if (H5I_init_group(H5I_GENPROP_CLS, H5I_GENPROPCLS_HASHSIZE, 0, (H5I_free_t)H5P_close_class) < 0)
- HRETURN_ERROR(H5E_ATOM, H5E_CANTINIT, FAIL,
- "unable to initialize atom group");
+ HRETURN_ERROR(H5E_ATOM, H5E_CANTINIT, FAIL, "unable to initialize atom group");
if (H5I_init_group(H5I_GENPROP_LST, H5I_GENPROPOBJ_HASHSIZE, 0, (H5I_free_t)H5P_close_list) < 0)
- HRETURN_ERROR(H5E_ATOM, H5E_CANTINIT, FAIL,
- "unable to initialize atom group");
+ HRETURN_ERROR(H5E_ATOM, H5E_CANTINIT, FAIL, "unable to initialize atom group");
/* Create root property list class */
/* Allocate the root class */
- if (NULL==(root_class = H5P_create_class (NULL,"none",H5P_NO_CLASS_HASH_SIZE,1,NULL,NULL,NULL,NULL)))
+ if (NULL==(root_class = H5P_create_class (NULL,"none",H5P_NO_CLASS_HASH_SIZE,1,NULL,NULL,NULL,NULL,NULL,NULL)))
HRETURN_ERROR (H5E_PLIST, H5E_CANTINIT, FAIL, "class initialization failed");
/* Register the root class */
- if ((H5P_NO_CLASS_g = H5I_register (H5I_GENPROP_CLS, root_class))<0)
+ if ((H5P_CLS_NO_CLASS_g = H5I_register (H5I_GENPROP_CLS, root_class))<0)
HRETURN_ERROR (H5E_PLIST, H5E_CANTREGISTER, FAIL, "can't register property list class");
/* Register the file creation and file access property classes */
/* Allocate the file creation class */
- if (NULL==(pclass = H5P_create_class (root_class,"file create",H5P_FILE_CREATE_HASH_SIZE,1,NULL,NULL,NULL,NULL)))
+ if (NULL==(pclass = H5P_create_class (root_class,"file create",H5P_FILE_CREATE_HASH_SIZE,1,NULL,NULL,NULL,NULL,NULL,NULL)))
HRETURN_ERROR (H5E_PLIST, H5E_CANTINIT, FAIL, "class initialization failed");
/* Register the dataset creation class */
- if ((H5P_FILE_CREATE_g = H5I_register (H5I_GENPROP_CLS, pclass))<0)
+ if ((H5P_CLS_FILE_CREATE_g = H5I_register (H5I_GENPROP_CLS, pclass))<0)
HRETURN_ERROR (H5E_PLIST, H5E_CANTREGISTER, FAIL, "can't register property list class");
/* Allocate the file access class */
- if (NULL==(pclass = H5P_create_class (root_class,"file access",H5P_FILE_ACCESS_HASH_SIZE,1,NULL,NULL,NULL,NULL)))
+ if (NULL==(pclass = H5P_create_class (root_class,"file access",H5P_FILE_ACCESS_HASH_SIZE,1,NULL,NULL,NULL,NULL,NULL,NULL)))
HRETURN_ERROR (H5E_PLIST, H5E_CANTINIT, FAIL, "class initialization failed");
/* Register the file access class */
- if ((H5P_DATASET_XFER_g = H5I_register (H5I_GENPROP_CLS, pclass))<0)
+ if ((H5P_CLS_FILE_ACCESS_g = H5I_register (H5I_GENPROP_CLS, pclass))<0)
HRETURN_ERROR (H5E_PLIST, H5E_CANTREGISTER, FAIL, "can't register property list class");
/* Register the dataset creation and data xfer property classes */
/* Allocate the dataset creation class */
- if (NULL==(pclass = H5P_create_class (root_class,"dataset create",H5P_DATASET_CREATE_HASH_SIZE,1,NULL,NULL,NULL,NULL)))
+ if (NULL==(pclass = H5P_create_class (root_class,"dataset create",H5P_DATASET_CREATE_HASH_SIZE,1,NULL,NULL,NULL,NULL,NULL,NULL)))
HRETURN_ERROR (H5E_PLIST, H5E_CANTINIT, FAIL, "class initialization failed");
/* Register the dataset creation class */
- if ((H5P_DATASET_CREATE_g = H5I_register (H5I_GENPROP_CLS, pclass))<0)
+ if ((H5P_CLS_DATASET_CREATE_g = H5I_register (H5I_GENPROP_CLS, pclass))<0)
HRETURN_ERROR (H5E_PLIST, H5E_CANTREGISTER, FAIL, "can't register property list class");
/* Allocate the data xfer class */
- if (NULL==(pclass = H5P_create_class (root_class,"data xfer",H5P_DATASET_XFER_HASH_SIZE,1,NULL,NULL,NULL,NULL)))
+ if (NULL==(pclass = H5P_create_class (root_class,"data xfer",H5P_DATASET_XFER_HASH_SIZE,1,H5D_xfer_create,NULL,H5D_xfer_create,NULL,H5D_xfer_close,NULL)))
HRETURN_ERROR (H5E_PLIST, H5E_CANTINIT, FAIL, "class initialization failed");
/* Register the data xfer class */
- if ((H5P_DATASET_XFER_g = H5I_register (H5I_GENPROP_CLS, pclass))<0)
+ if ((H5P_CLS_DATASET_XFER_g = H5I_register (H5I_GENPROP_CLS, pclass))<0)
HRETURN_ERROR (H5E_PLIST, H5E_CANTREGISTER, FAIL, "can't register property list class");
-/* When do the "basic" properties for each of the library classes get added? */
-/* Who adds them? */
-
FUNC_LEAVE(ret_value);
}
@@ -254,17 +265,22 @@ H5P_term_interface(void)
intn i, n=0;
if (interface_initialize_g) {
-/* Destroy HDF5 library property classes */
+ /* Destroy HDF5 library property classes & lists */
+
+ /* Check if there are any open property list classes or lists */
for (i=0; i<H5P_NCLASSES; i++)
n += H5I_nmembers((H5I_type_t)(H5I_TEMPLATE_0+i));
n += H5I_nmembers(H5I_GENPROP_CLS);
n += H5I_nmembers(H5I_GENPROP_LST);
+
+ /* If there are any open classes or groups, attempt to get rid of them. */
if (n) {
for (i=0; i<H5P_NCLASSES; i++)
H5I_clear_group((H5I_type_t)(H5I_TEMPLATE_0+i), FALSE);
H5I_clear_group(H5I_GENPROP_CLS, FALSE);
H5I_clear_group(H5I_GENPROP_LST, FALSE);
} else {
+ /* Close the ID groups which hold the property list classes & lists */
for (i=0; i<H5P_NCLASSES; i++) {
H5I_destroy_group((H5I_type_t)(H5I_TEMPLATE_0 + i));
n++; /*H5I*/
@@ -320,9 +336,6 @@ H5Pcreate(H5P_class_t type)
case H5P_DATASET_CREATE:
src = &H5D_create_dflt;
break;
- case H5P_DATASET_XFER:
- src = &H5D_xfer_dflt;
- break;
case H5P_MOUNT:
src = &H5F_mount_dflt;
break;
@@ -446,7 +459,6 @@ H5P_close(void *_plist)
{
H5P_t *plist=(H5P_t *)_plist;
H5F_access_t *fa_list = &(plist->u.faccess);
- H5D_xfer_t *dx_list = &(plist->u.dxfer);
H5D_create_t *dc_list = &(plist->u.dcreate);
FUNC_ENTER (H5P_close, FAIL);
@@ -475,15 +487,6 @@ H5P_close(void *_plist)
H5O_reset(H5O_PLINE, &(dc_list->pline));
break;
- case H5P_DATASET_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:
break;
@@ -564,6 +567,246 @@ H5P_get_class(hid_t plist_id)
}
+/*--------------------------------------------------------------------------
+ NAME
+ H5P_copy_pclass
+ PURPOSE
+ Internal routine to copy a generic property class
+ USAGE
+ hid_t H5P_copy_pclass(pclass)
+ H5P_genclass_t *pclass; IN: Property class to copy
+ RETURNS
+ Success: valid property class ID on success (non-negative)
+ Failure: negative
+ DESCRIPTION
+ Copy a property class and return the ID. This routine does not make
+ any callbacks. (They are only make when operating on property lists).
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static hid_t H5P_copy_pclass(H5P_genclass_t *pclass)
+{
+ H5P_genclass_t *new_pclass = NULL; /* Property list class copied */
+ H5P_genprop_t *tmp; /* Temporary pointer to parent class properties */
+ H5P_genprop_t *pcopy; /* Copy of property to insert into class */
+ uintn u; /* Local index variable */
+ hid_t ret_value=FAIL; /* return value */
+
+ FUNC_ENTER (H5P_copy_pclass, FAIL);
+
+ assert(pclass);
+
+ /*
+ * Create new property class object
+ */
+
+ /* Create the new property list class */
+ if (NULL==(new_pclass=H5P_create_class(pclass->parent, pclass->name, pclass->hashsize, 0, pclass->create_func, pclass->create_data, pclass->copy_func, pclass->copy_data, pclass->close_func, pclass->close_data)))
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTCREATE, FAIL, "unable to create property list class");
+
+ /* Copy the properties registered for this class */
+ if(pclass->nprops>0) {
+ /* Walk through the hash table */
+ for(u=0; u<pclass->hashsize; u++) {
+ tmp=pclass->props[u];
+
+ /* Walk through the list of properties at each hash location */
+ while(tmp!=NULL) {
+ /* Make a copy of the class's property */
+ if((pcopy=H5P_copy_prop(tmp))==NULL)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTCOPY, NULL,"Can't copy property");
+
+ /* Insert the initialized property into the property list */
+ if(H5P_add_prop(new_pclass->props,new_pclass->hashsize,pcopy)<0)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTINSERT, NULL,"Can't insert property into class");
+
+ /* Increment property count for class */
+ new_pclass->nprops++;
+
+ /* Go to next registered property in class */
+ tmp=tmp->next;
+ } /* end while */
+ } /* end for */
+ } /* end if */
+
+ /* Increment parent class's derived class value */
+ if(new_pclass->parent!=NULL)
+ if(H5P_access_class(new_pclass->parent,H5P_MOD_INC_CLS)<0)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTINIT, NULL,"Can't increment parent class ref count");
+
+ /* Get an atom for the class */
+ if ((ret_value = H5I_register(H5I_GENPROP_CLS, new_pclass))<0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to atomize property list class");
+
+done:
+ if (ret_value<0 && new_pclass)
+ H5P_close_class(new_pclass);
+
+ FUNC_LEAVE (ret_value);
+} /* H5P_copy_pclass() */
+
+
+/*--------------------------------------------------------------------------
+ NAME
+ H5P_copy_plist
+ PURPOSE
+ Internal routine to copy a generic property lists
+ USAGE
+ hid_t H5P_copy_plist(plist)
+ H5P_genplist_t *plist; IN: Property list to copy
+ RETURNS
+ Success: valid property list ID on success (non-negative)
+ Failure: negative
+ DESCRIPTION
+ Copy a property list or class and return the ID. This routine calls the
+ class 'copy' callback after any property 'copy' callbacks are called
+ (assuming all property 'copy' callbacks return successfully).
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static hid_t H5P_copy_plist(H5P_genplist_t *plist)
+{
+ H5P_genplist_t *new_plist; /* New property list generated from copy */
+ H5P_genprop_t *tprop; /* Temporary pointer to properties */
+ H5P_genprop_t *new_prop; /* New property created for copy */
+ hid_t plist_id; /* Property list ID of new list created */
+ uintn u; /* Local index variable */
+ hid_t ret_value=FAIL; /* return value */
+
+ FUNC_ENTER (H5P_copy_plist, FAIL);
+
+ assert(plist);
+
+ /*
+ * Create new property list object
+ */
+
+ /* Allocate room for the property list & it's hash table of properties */
+ if (NULL==(new_plist = H5MM_calloc (sizeof(H5P_genplist_t)+((plist->pclass->hashsize-1)*sizeof(H5P_genprop_t *)))))
+ HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL,"memory allocation failed");
+
+ /* Set class state */
+ new_plist->pclass = plist->pclass;
+ new_plist->nprops = 0; /* Initially the plist has the same number of properties as the class */
+ new_plist->class_init = 0; /* Initially, wait until the class callback finishes to set */
+
+ /* Cycle through the properties and copy them also */
+ for(u=0; u<plist->pclass->hashsize; u++) {
+ tprop=plist->props[u];
+
+ /* Walk through the list of properties at each hash location */
+ while(tprop!=NULL) {
+ /* Make a copy of the class's property */
+ if((new_prop=H5P_copy_prop(tprop))==NULL)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTCOPY, NULL,"Can't copy property");
+
+ /* Call property copy callback, if it exists */
+ if(new_prop->copy) {
+ if((new_prop->copy)(new_prop->name,new_prop->size,new_prop->value)<0) {
+ H5P_free_prop(new_prop);
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTINIT, NULL,"Can't copy property");
+ } /* end if */
+ } /* end if */
+
+ /* Insert the initialized property into the property list */
+ if(H5P_add_prop(new_plist->props,new_plist->pclass->hashsize,new_prop)<0)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTINSERT, NULL,"Can't insert property into list");
+
+ /* Increment the number of properties in list */
+ new_plist->nprops++;
+
+ /* Go to next registered property in class */
+ tprop=tprop->next;
+ } /* end while */
+ } /* end for */
+
+ /* Increment the number of property lists derived from class */
+ if(H5P_access_class(new_plist->pclass,H5P_MOD_INC_LST)<0)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTINIT, NULL,"Can't increment class ref count");
+
+ /* Get an atom for the property list */
+ if ((plist_id = H5I_register(H5I_GENPROP_LST, new_plist))<0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to atomize property list");
+
+ /* Call the class callback (if it exists) now that we have the property list ID */
+ if(new_plist->pclass->copy_func!=NULL) {
+ if((new_plist->pclass->copy_func)(plist_id,plist->pclass->copy_data)<0) {
+ /* Delete ID, ignore return value */
+ H5I_remove(plist_id);
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTINIT, FAIL,"Can't initialize property");
+ } /* end if */
+ } /* end if */
+
+ /* Set the class initialization flag */
+ new_plist->class_init=1;
+
+ /* Set the return value */
+ ret_value=plist_id;
+
+done:
+ if (ret_value<0 && new_plist)
+ H5P_close_list(new_plist);
+
+ FUNC_LEAVE (ret_value);
+} /* H5P_copy_plist() */
+
+
+/*--------------------------------------------------------------------------
+ NAME
+ H5P_copy_new
+ PURPOSE
+ Routine to copy a property list or class
+ USAGE
+ hid_t H5P_copy_new(id)
+ hid_t id; IN: Property list or class ID to copy
+ RETURNS
+ Success: valid property list ID on success (non-negative)
+ Failure: negative
+ DESCRIPTION
+ Copy a property list or class and return the ID. This routine calls the
+ class 'copy' callback after any property 'copy' callbacks are called
+ (assuming all property 'copy' callbacks return successfully).
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static hid_t H5P_copy_new(hid_t id)
+{
+ void *obj; /* Property object to copy */
+ hid_t ret_value=FALSE; /* return value */
+
+ FUNC_ENTER (H5P_copy_new, FAIL);
+
+ /* Check arguments. */
+ if (H5I_GENPROP_LST != H5I_get_type(id) && H5I_GENPROP_CLS != H5I_get_type(id))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not property object");
+ if(NULL == (obj = H5I_object(id)))
+ HGOTO_ERROR(H5E_PLIST, H5E_NOTFOUND, FAIL, "property object doesn't exist");
+
+ /* Compare property lists */
+ if(H5I_GENPROP_LST == H5I_get_type(id)) {
+ if((ret_value=H5P_copy_plist(obj))<0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy property list");
+ } /* end if */
+ /* Must be property classes */
+ else {
+ if((ret_value=H5P_copy_pclass(obj))<0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy property class");
+ } /* end else */
+
+done:
+ FUNC_LEAVE (ret_value);
+} /* H5P_copy_new() */
+
+
/*-------------------------------------------------------------------------
* Function: H5Pcopy
*
@@ -600,24 +843,39 @@ H5Pcopy(hid_t plist_id)
HRETURN(H5P_DEFAULT);
/* Check args */
- if (NULL == (plist = H5I_object(plist_id)) ||
- (type = H5P_get_class(plist_id)) < 0 ||
- (group = H5I_get_type(plist_id)) < 0) {
- HRETURN_ERROR(H5E_ATOM, H5E_BADATOM, FAIL,
- "unable to unatomize property list");
- }
-
- /* Copy it */
- if (NULL==(new_plist=H5P_copy (type, plist))) {
- HRETURN_ERROR (H5E_INTERNAL, H5E_CANTINIT, FAIL,
- "unable to copy property list");
- }
+ if ((group = H5I_get_type(plist_id)) < 0)
+ HRETURN_ERROR(H5E_ATOM, H5E_BADTYPE, FAIL,
+ "unable to retrieve ID type");
+
+ /* Copy generic property lists and classes in new way */
+ if(group==H5I_GENPROP_CLS || group==H5I_GENPROP_LST) {
+ /* Copy it */
+ if ((ret_value=H5P_copy_new (plist_id))<0)
+ HRETURN_ERROR (H5E_INTERNAL, H5E_CANTINIT, FAIL,
+ "unable to copy property list");
+ } /* end if */
+ /* Use old way to copy old-style property lists */
+ else {
+ /* Further arg checking... */
+ if (NULL == (plist = H5I_object(plist_id)))
+ HRETURN_ERROR(H5E_ATOM, H5E_BADATOM, FAIL,
+ "unable to unatomize property list");
+ if ((type = H5P_get_class(plist_id)) < 0)
+ HRETURN_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL,
+ "unable to retrieve property list type");
+
+ /* Copy it */
+ if (NULL==(new_plist=H5P_copy (type, plist)))
+ HRETURN_ERROR (H5E_INTERNAL, H5E_CANTINIT, FAIL,
+ "unable to copy property list");
+
+ /* Register the atom for the new property list */
+ if ((ret_value = H5I_register(group, new_plist)) < 0) {
+ HRETURN_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL,
+ "unable to atomize property list pointer");
+ }
+ } /* end else */
- /* Register the atom for the new property list */
- if ((ret_value = H5I_register(group, new_plist)) < 0) {
- HRETURN_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL,
- "unable to atomize property list pointer");
- }
FUNC_LEAVE(ret_value);
}
@@ -648,7 +906,6 @@ H5P_copy (H5P_class_t type, const void *src)
const H5D_create_t *dc_src = NULL;
H5D_create_t *dc_dst = NULL;
H5F_access_t *fa_dst = NULL;
- H5D_xfer_t *dx_dst = NULL;
FUNC_ENTER (H5P_copy, NULL);
@@ -666,10 +923,6 @@ H5P_copy (H5P_class_t type, const void *src)
size = sizeof(H5D_create_t);
break;
- case H5P_DATASET_XFER:
- size = sizeof(H5D_xfer_t);
- break;
-
case H5P_MOUNT:
size = sizeof(H5F_mprop_t);
break;
@@ -730,16 +983,6 @@ H5P_copy (H5P_class_t type, const void *src)
}
break;
- case H5P_DATASET_XFER:
- dx_dst = (H5D_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:
/* Nothing to do */
break;
@@ -1650,18 +1893,19 @@ H5Pget_external(hid_t plist_id, int idx, size_t name_size, char *name/*out*/,
*-------------------------------------------------------------------------
*/
herr_t
-H5Pset_driver(hid_t plist_id, hid_t driver_id, const void *driver_info)
+H5Pset_driver(hid_t plist_id, hid_t new_driver_id, const void *new_driver_info)
{
H5F_access_t *fapl=NULL;
- H5D_xfer_t *dxpl=NULL;
+ hid_t driver_id; /* VFL driver ID */
+ void *driver_info; /* VFL driver info */
+ void *tmp_driver_info; /* Temporary VFL driver info */
+ herr_t ret_value=SUCCEED; /* Return value */
FUNC_ENTER(H5Pset_driver, FAIL);
- H5TRACE3("e","iix",plist_id,driver_id,driver_info);
+ H5TRACE3("e","iix",plist_id,new_driver_id,new_driver_info);
- if (H5I_VFL!=H5I_get_type(driver_id) ||
- NULL==H5I_object(driver_id)) {
+ if (H5I_VFL!=H5I_get_type(new_driver_id) || NULL==H5I_object(new_driver_id))
HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file driver ID");
- }
if (H5P_FILE_ACCESS==H5P_get_class(plist_id)) {
if (NULL==(fapl=H5I_object(plist_id))) {
@@ -1675,32 +1919,50 @@ H5Pset_driver(hid_t plist_id, hid_t driver_id, const void *driver_info)
H5I_dec_ref(fapl->driver_id);
/* Add new driver */
- H5I_inc_ref(driver_id);
- fapl->driver_id = driver_id;
- fapl->driver_info = H5FD_fapl_copy(driver_id, driver_info);
+ H5I_inc_ref(new_driver_id);
+ fapl->driver_id = new_driver_id;
+ fapl->driver_info = H5FD_fapl_copy(new_driver_id, new_driver_info);
- } else if (H5P_DATASET_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");
- }
+ } else if (H5I_GENPROP_LST==H5I_get_type(plist_id)) {
+ /* Get the current driver information */
+ if(H5P_get(plist_id, H5D_XFER_VFL_ID_NAME, &driver_id)<0)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve VFL driver ID");
+ if(H5P_get(plist_id, H5D_XFER_VFL_INFO_NAME, &driver_info)<0)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve VFL driver info");
/* Remove old driver */
- assert(dxpl->driver_id>=0);
- H5FD_dxpl_free(dxpl->driver_id, dxpl->driver_info);
- H5I_dec_ref(dxpl->driver_id);
+
+ /* 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 */
- H5I_inc_ref(driver_id);
- dxpl->driver_id = driver_id;
- dxpl->driver_info = H5FD_dxpl_copy(driver_id, driver_info);
+
+ /* Increment reference count for new driver */
+ H5I_inc_ref(new_driver_id);
+
+ /* Make a copy of the driver information */
+ if((tmp_driver_info = H5FD_dxpl_copy(new_driver_id, new_driver_info))==NULL)
+ HGOTO_ERROR (H5E_DATASET, H5E_CANTCOPY, FAIL, "Can't copy VFL driver");
+
+ /* Set the driver info for the property list */
+ if(H5P_set(plist_id, 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_id, H5D_XFER_VFL_INFO_NAME, &tmp_driver_info)<0)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTSET, FAIL, "Can't set VFL driver info");
} else {
HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
"not a file access or data transfer property list");
}
- FUNC_LEAVE(SUCCEED);
+done:
+ FUNC_LEAVE(ret_value);
}
@@ -1778,20 +2040,17 @@ hid_t
H5P_get_driver(hid_t plist_id)
{
H5F_access_t *fapl=NULL;
- H5D_xfer_t *dxpl=NULL;
hid_t ret_value=-1;
FUNC_ENTER (H5P_get_driver, FAIL);
H5TRACE1("i","i",plist_id);
- if (H5P_FILE_ACCESS==H5P_get_class(plist_id) &&
- (fapl=H5I_object(plist_id))) {
+ if (H5P_FILE_ACCESS==H5P_get_class(plist_id) && (fapl=H5I_object(plist_id))) {
ret_value = fapl->driver_id;
-
- } else if (H5P_DATASET_XFER==H5P_get_class(plist_id) &&
- (dxpl=H5I_object(plist_id))) {
- ret_value = dxpl->driver_id;
-
+ } else if (H5I_GENPROP_LST==H5I_get_type(plist_id)) {
+ /* Get the current driver ID */
+ if(H5P_get(plist_id, H5D_XFER_VFL_ID_NAME, &ret_value)<0)
+ HRETURN_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve VFL driver ID");
} else {
HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL,
"not a file access or data transfer property list");
@@ -1802,6 +2061,7 @@ H5P_get_driver(hid_t plist_id)
FUNC_LEAVE(ret_value);
}
+
/*-------------------------------------------------------------------------
* Function: H5Pget_driver_info
@@ -1828,19 +2088,16 @@ void *
H5Pget_driver_info(hid_t plist_id)
{
H5F_access_t *fapl=NULL;
- H5D_xfer_t *dxpl=NULL;
void *ret_value=NULL;
FUNC_ENTER(H5Pget_driver_info, NULL);
- if (H5P_FILE_ACCESS==H5P_get_class(plist_id) &&
- (fapl=H5I_object(plist_id))) {
+ if (H5P_FILE_ACCESS==H5P_get_class(plist_id) && (fapl=H5I_object(plist_id))) {
ret_value = fapl->driver_info;
-
- } else if (H5P_DATASET_XFER==H5P_get_class(plist_id) &&
- (dxpl=H5I_object(plist_id))) {
- ret_value = dxpl->driver_info;
-
+ } else if (H5I_GENPROP_LST==H5I_get_type(plist_id)) {
+ /* Get the current driver info */
+ if(H5P_get(plist_id, H5D_XFER_VFL_INFO_NAME, &ret_value)<0)
+ HRETURN_ERROR (H5E_PLIST, H5E_CANTGET, NULL, "Can't retrieve VFL driver ID");
} else {
HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, NULL,
"not a file access or data transfer property list");
@@ -1984,26 +2241,22 @@ H5Pget_cache(hid_t plist_id, int *mdc_nelmts,
herr_t
H5Pset_buffer(hid_t plist_id, size_t size, void *tconv, void *bkg)
{
- H5D_xfer_t *plist = NULL;
-
FUNC_ENTER (H5Pset_buffer, FAIL);
H5TRACE4("e","izxx",plist_id,size,tconv,bkg);
/* 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 (size<=0) {
- HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL,
- "buffer size must not be zero");
- }
+ if (H5I_GENPROP_LST != H5I_get_type (plist_id))
+ HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset transfer property list");
+ if (size<=0)
+ HRETURN_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "buffer size must not be zero");
/* Update property list */
- plist->buf_size = size;
- plist->tconv_buf = tconv;
- plist->bkg_buf = bkg;
+ if(H5P_set(plist_id, H5D_XFER_MAX_TEMP_BUF_NAME, &size)<0)
+ HRETURN_ERROR (H5E_PLIST, H5E_CANTSET, FAIL, "Can't set transfer buffer size");
+ if(H5P_set(plist_id, H5D_XFER_TCONV_BUF_NAME, &tconv)<0)
+ HRETURN_ERROR (H5E_PLIST, H5E_CANTSET, FAIL, "Can't set transfer type conversion buffer");
+ if(H5P_set(plist_id, H5D_XFER_BKGR_BUF_NAME, &bkg)<0)
+ HRETURN_ERROR (H5E_PLIST, H5E_CANTSET, FAIL, "Can't set background type conversion buffer");
FUNC_LEAVE (SUCCEED);
}
@@ -2028,25 +2281,36 @@ H5Pset_buffer(hid_t plist_id, size_t size, void *tconv, void *bkg)
hsize_t
H5Pget_buffer(hid_t plist_id, void **tconv/*out*/, void **bkg/*out*/)
{
- H5D_xfer_t *plist = NULL;
-
+ size_t size; /* Type conversion buffer size */
+ size_t ret_value=0; /* Type conversion buffer size */
+
FUNC_ENTER (H5Pget_buffer, 0);
H5TRACE3("h","ixx",plist_id,tconv,bkg);
/* Check arguments */
- if (H5P_DATASET_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");
- }
+ if (H5I_GENPROP_LST != H5I_get_type(plist_id) ||
+ TRUE!=H5Pisa_class(plist_id,H5P_DATASET_XFER_NEW))
+ HGOTO_ERROR (H5E_ARGS, H5E_BADTYPE, 0, "not a dataset transfer property list");
/* Return values */
- if (tconv)
- *tconv = plist->tconv_buf;
- if (bkg)
- *bkg = plist->bkg_buf;
+ if (tconv) {
+ if(H5P_get(plist_id, H5D_XFER_TCONV_BUF_NAME, tconv)<0)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, 0, "Can't get transfer type conversion buffer");
+ } /* end if */
+ if (bkg) {
+ if(H5P_get(plist_id, H5D_XFER_BKGR_BUF_NAME, bkg)<0)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, 0, "Can't get background type conversion buffer");
+ } /* end if */
- FUNC_LEAVE (plist->buf_size);
+ /* Get the size */
+ if(H5P_set(plist_id, H5D_XFER_MAX_TEMP_BUF_NAME, &size)<0)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTSET, 0, "Can't set transfer buffer size");
+
+ /* Set the return value */
+ ret_value=size;
+
+done:
+ FUNC_LEAVE(ret_value);
}
@@ -2076,23 +2340,25 @@ H5Pget_buffer(hid_t plist_id, void **tconv/*out*/, void **bkg/*out*/)
herr_t
H5Pset_hyper_cache(hid_t plist_id, unsigned cache, unsigned limit)
{
- H5D_xfer_t *plist = NULL;
-
+ herr_t ret_value=SUCCEED;
+
FUNC_ENTER (H5Pset_hyper_cache, FAIL);
H5TRACE3("e","iIuIu",plist_id,cache,limit);
/* 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 (H5I_GENPROP_LST != H5I_get_type(plist_id) ||
+ TRUE!=H5Pisa_class(plist_id,H5P_DATASET_XFER_NEW))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list");
/* Update property list */
- plist->cache_hyper = (cache>0) ? 1 : 0;
- plist->block_limit = limit;
+ cache = (cache>0) ? 1 : 0;
+ if (H5P_set(plist_id,H5D_XFER_HYPER_CACHE_NAME,&cache)<0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to set value");
+ if (H5P_set(plist_id,H5D_XFER_HYPER_CACHE_LIM_NAME,&limit)<0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to set value");
- FUNC_LEAVE (SUCCEED);
+done:
+ FUNC_LEAVE (ret_value);
}
@@ -2114,23 +2380,23 @@ herr_t
H5Pget_hyper_cache(hid_t plist_id, unsigned *cache/*out*/,
unsigned *limit/*out*/)
{
- H5D_xfer_t *plist = NULL;
-
FUNC_ENTER (H5Pget_hyper_cache, FAIL);
H5TRACE3("e","ixx",plist_id,cache,limit);
/* 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 (H5I_GENPROP_LST != H5I_get_type(plist_id) ||
+ TRUE!=H5Pisa_class(plist_id,H5P_DATASET_XFER_NEW))
+ HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset transfer property list");
/* Return values */
- if (cache)
- *cache = plist->cache_hyper;
- if (limit)
- *limit = plist->block_limit;
+ if (cache) {
+ if (H5P_get(plist_id,H5D_XFER_HYPER_CACHE_NAME,cache)<0)
+ HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get value");
+ } /* end if */
+ if (limit) {
+ if (H5P_get(plist_id,H5D_XFER_HYPER_CACHE_LIM_NAME,limit)<0)
+ HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get value");
+ } /* end if */
FUNC_LEAVE (SUCCEED);
}
@@ -2157,20 +2423,20 @@ H5Pget_hyper_cache(hid_t plist_id, unsigned *cache/*out*/,
herr_t
H5Pset_preserve(hid_t plist_id, hbool_t status)
{
- H5D_xfer_t *plist = NULL;
+ H5T_bkg_t need_bkg; /* Value for background buffer type */
FUNC_ENTER (H5Pset_preserve, FAIL);
H5TRACE2("e","ib",plist_id,status);
/* 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 (H5I_GENPROP_LST != H5I_get_type(plist_id) ||
+ TRUE!=H5Pisa_class(plist_id,H5P_DATASET_XFER_NEW))
+ HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset transfer property list");
/* Update property list */
- plist->need_bkg = status ? H5T_BKG_YES : H5T_BKG_NO;
+ need_bkg = status ? H5T_BKG_YES : H5T_BKG_NO;
+ if (H5P_set(plist_id,H5D_XFER_BKGR_BUF_TYPE_NAME,&need_bkg)<0)
+ HRETURN_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value");
FUNC_LEAVE (SUCCEED);
}
@@ -2195,19 +2461,21 @@ H5Pset_preserve(hid_t plist_id, hbool_t status)
int
H5Pget_preserve(hid_t plist_id)
{
- H5D_xfer_t *plist = NULL;
+ H5T_bkg_t need_bkg; /* Return value */
FUNC_ENTER (H5Pget_preserve, FAIL);
H5TRACE1("Is","i",plist_id);
/* Check arguments */
- if (H5P_DATASET_XFER != H5P_get_class (plist_id) ||
- NULL == (plist = H5I_object (plist_id))) {
+ if (H5I_GENPROP_LST != H5I_get_type(plist_id) ||
+ TRUE!=H5Pisa_class(plist_id,H5P_DATASET_XFER_NEW))
HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL,
"not a dataset transfer property list");
- }
- FUNC_LEAVE (plist->need_bkg?TRUE:FALSE);
+ if (H5P_get(plist_id,H5D_XFER_BKGR_BUF_NAME,&need_bkg)<0)
+ HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get value");
+
+ FUNC_LEAVE (need_bkg ? TRUE : FALSE);
}
@@ -2514,25 +2782,27 @@ herr_t
H5Pget_btree_ratios(hid_t plist_id, double *left/*out*/, double *middle/*out*/,
double *right/*out*/)
{
- H5D_xfer_t *plist = NULL;
+ double btree_split_ratio[3]; /* B-tree node split ratios */
FUNC_ENTER(H5Pget_btree_ratios, FAIL);
H5TRACE4("e","ixxx",plist_id,left,middle,right);
/* 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 (H5I_GENPROP_LST != H5I_get_type(plist_id) ||
+ TRUE!=H5Pisa_class(plist_id,H5P_DATASET_XFER_NEW))
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset transfer property list");
+
+ /* Get the split ratios */
+ if (H5P_get(plist_id,H5D_XFER_BTREE_SPLIT_RATIO_NAME,&btree_split_ratio)<0)
+ HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get value");
/* Get values */
if (left)
- *left = plist->split_ratios[0];
+ *left = btree_split_ratio[0];
if (middle)
- *middle = plist->split_ratios[1];
+ *middle = btree_split_ratio[1];
if (right)
- *right = plist->split_ratios[2];
+ *right = btree_split_ratio[2];
FUNC_LEAVE(SUCCEED);
}
@@ -2564,27 +2834,27 @@ herr_t
H5Pset_btree_ratios(hid_t plist_id, double left, double middle,
double right)
{
- H5D_xfer_t *plist = NULL;
+ double split_ratio[3]; /* B-tree node split ratios */
- FUNC_ENTER(H5Pget_btree_ratios, FAIL);
+ FUNC_ENTER(H5Pset_btree_ratios, FAIL);
H5TRACE4("e","iddd",plist_id,left,middle,right);
/* 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 (H5I_GENPROP_LST != H5I_get_type(plist_id) ||
+ TRUE!=H5Pisa_class(plist_id,H5P_DATASET_XFER_NEW))
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset transfer property list");
if (left<0.0 || left>1.0 || middle<0.0 || middle>1.0 ||
- right<0.0 || right>1.0) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
- "split ratio must satisfy 0.0<=X<=1.0");
- }
+ right<0.0 || right>1.0)
+ HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "split ratio must satisfy 0.0<=X<=1.0");
/* Set values */
- plist->split_ratios[0] = left;
- plist->split_ratios[1] = middle;
- plist->split_ratios[2] = right;
+ split_ratio[0] = left;
+ split_ratio[1] = middle;
+ split_ratio[2] = right;
+
+ /* Set the split ratios */
+ if (H5P_set(plist_id,H5D_XFER_BTREE_SPLIT_RATIO_NAME,&split_ratio)<0)
+ HRETURN_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value");
FUNC_LEAVE(SUCCEED);
}
@@ -2871,23 +3141,23 @@ herr_t
H5Pset_vlen_mem_manager(hid_t plist_id, H5MM_allocate_t alloc_func,
void *alloc_info, H5MM_free_t free_func, void *free_info)
{
- H5D_xfer_t *plist = NULL;
-
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 (H5I_GENPROP_LST != H5I_get_type(plist_id) ||
+ TRUE!=H5Pisa_class(plist_id,H5P_DATASET_XFER_NEW))
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset transfer property list");
/* Update property list */
- plist->vlen_alloc = alloc_func;
- plist->alloc_info = alloc_info;
- plist->vlen_free = free_func;
- plist->free_info = free_info;
+ if (H5P_set(plist_id,H5D_XFER_VLEN_ALLOC_NAME,&alloc_func)<0)
+ HRETURN_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value");
+ if (H5P_set(plist_id,H5D_XFER_VLEN_ALLOC_INFO_NAME,&alloc_info)<0)
+ HRETURN_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value");
+ if (H5P_set(plist_id,H5D_XFER_VLEN_FREE_NAME,&free_func)<0)
+ HRETURN_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value");
+ if (H5P_set(plist_id,H5D_XFER_VLEN_FREE_INFO_NAME,&free_info)<0)
+ HRETURN_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value");
FUNC_LEAVE (SUCCEED);
}
@@ -2913,26 +3183,30 @@ H5Pget_vlen_mem_manager(hid_t plist_id, H5MM_allocate_t *alloc_func/*out*/,
H5MM_free_t *free_func/*out*/,
void **free_info/*out*/)
{
- H5D_xfer_t *plist = NULL;
-
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 (H5I_GENPROP_LST != H5I_get_type(plist_id) ||
+ TRUE!=H5Pisa_class(plist_id,H5P_DATASET_XFER_NEW))
+ HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset transfer property list");
- if(alloc_func!=NULL)
- *alloc_func= plist->vlen_alloc;
- if(alloc_info!=NULL)
- *alloc_info= plist->alloc_info;
- if(free_func!=NULL)
- *free_func= plist->vlen_free;
- if(free_info!=NULL)
- *free_info= plist->free_info;
+ if(alloc_func!=NULL) {
+ if (H5P_get(plist_id,H5D_XFER_VLEN_ALLOC_NAME,alloc_func)<0)
+ HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get value");
+ } /* end if */
+ if(alloc_info!=NULL) {
+ if (H5P_get(plist_id,H5D_XFER_VLEN_ALLOC_INFO_NAME,alloc_info)<0)
+ HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get value");
+ } /* end if */
+ if(free_func!=NULL) {
+ if (H5P_get(plist_id,H5D_XFER_VLEN_FREE_NAME,free_func)<0)
+ HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get value");
+ } /* end if */
+ if(free_info!=NULL) {
+ if (H5P_get(plist_id,H5D_XFER_VLEN_FREE_INFO_NAME,free_info)<0)
+ HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get value");
+ } /* end if */
FUNC_LEAVE (SUCCEED);
}
@@ -3132,25 +3406,20 @@ H5Pget_sieve_buf_size(hid_t fapl_id, size_t *size/*out*/)
herr_t
H5Pset_hyper_vector_size(hid_t plist_id, size_t vector_size)
{
- H5D_xfer_t *plist = NULL;
-
FUNC_ENTER (H5Pset_hyper_vector_size, FAIL);
H5TRACE2("e","iz",plist_id,vector_size);
/* 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 (H5I_GENPROP_LST != H5I_get_type(plist_id) ||
+ TRUE!=H5Pisa_class(plist_id,H5P_DATASET_XFER_NEW))
+ HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset transfer property list");
- if (vector_size<1) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL,
- "vector size too small");
- }
+ if (vector_size<1)
+ HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "vector size too small");
/* Update property list */
- plist->vector_size = vector_size;
+ if (H5P_set(plist_id,H5D_XFER_HYPER_VECTOR_SIZE_NAME,&vector_size)<0)
+ HRETURN_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value");
FUNC_LEAVE (SUCCEED);
} /* end H5Pset_hyper_vector_size() */
@@ -3173,21 +3442,19 @@ H5Pset_hyper_vector_size(hid_t plist_id, size_t vector_size)
herr_t
H5Pget_hyper_vector_size(hid_t plist_id, size_t *vector_size/*out*/)
{
- H5D_xfer_t *plist = NULL;
-
FUNC_ENTER (H5Pget_hyper_vector_size, FAIL);
H5TRACE2("e","ix",plist_id,vector_size);
/* 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 (H5I_GENPROP_LST != H5I_get_type(plist_id) ||
+ TRUE!=H5Pisa_class(plist_id,H5P_DATASET_XFER_NEW))
+ HRETURN_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset transfer property list");
/* Return values */
- if (vector_size)
- *vector_size = plist->vector_size;
+ if (vector_size) {
+ if (H5P_get(plist_id,H5D_XFER_HYPER_VECTOR_SIZE_NAME,vector_size)<0)
+ HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get value");
+ } /* end if */
FUNC_LEAVE (SUCCEED);
} /* end H5Pget_hyper_vector_size() */
@@ -3233,6 +3500,7 @@ H5P_copy_prop(H5P_genprop_t *oprop)
/* Duplicate current value, if it exists */
if(oprop->value!=NULL) {
+ assert(prop->size>0);
if (NULL==(prop->value = H5MM_malloc (prop->size)))
HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
HDmemcpy(prop->value,oprop->value,prop->size);
@@ -3240,6 +3508,7 @@ H5P_copy_prop(H5P_genprop_t *oprop)
/* Duplicate default value, if it exists */
if(oprop->def_value!=NULL) {
+ assert(prop->size>0);
if (NULL==(prop->def_value = H5MM_malloc (prop->size)))
HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
HDmemcpy(prop->def_value,oprop->def_value,prop->size);
@@ -3286,6 +3555,7 @@ done:
H5P_prp_set_func_t prp_set; IN: Function pointer to property set callback
H5P_prp_get_func_t prp_get; IN: Function pointer to property get callback
H5P_prp_delete_func_t prp_delete; IN: Function pointer to property delete callback
+ H5P_prp_copy_func_t prp_copy; IN: Function pointer to property copy callback
H5P_prp_close_func_t prp_close; IN: Function pointer to property close
callback
RETURNS
@@ -3302,7 +3572,7 @@ static H5P_genprop_t *
H5P_create_prop(const char *name, size_t size, void *def_value, void *value,
H5P_prp_create_func_t prp_create, H5P_prp_set_func_t prp_set,
H5P_prp_get_func_t prp_get, H5P_prp_delete_func_t prp_delete,
- H5P_prp_close_func_t prp_close)
+ H5P_prp_copy_func_t prp_copy, H5P_prp_close_func_t prp_close)
{
H5P_genprop_t *prop=NULL; /* Pointer to new property copied */
H5P_genprop_t *ret_value=NULL; /* Return value */
@@ -3344,6 +3614,7 @@ H5P_create_prop(const char *name, size_t size, void *def_value, void *value,
prop->set=prp_set;
prop->get=prp_get;
prop->del=prp_delete;
+ prop->copy=prp_copy;
prop->close=prp_close;
/* Reset the link to the next property */
@@ -3442,7 +3713,7 @@ H5P_find_prop(H5P_genprop_t *hash[], uintn hashsize, const char *name)
uintn loc; /* Hash table location */
uintn xor_val; /* XOR'ed value of the name to look for */
- FUNC_ENTER (H5P_add_prop, NULL);
+ FUNC_ENTER (H5P_find_prop, NULL);
assert(hash);
assert(hashsize>0);
@@ -3460,6 +3731,9 @@ H5P_find_prop(H5P_genprop_t *hash[], uintn hashsize, const char *name)
/* Check for name matching */
if(ret_value->xor_val==xor_val && HDstrcmp(ret_value->name,name)==0)
break;
+
+ /* Advance to the next property */
+ ret_value=ret_value->next;
} /* end while */
FUNC_LEAVE (ret_value);
@@ -3551,7 +3825,7 @@ H5P_free_all_prop(H5P_genprop_t *hash[], uintn hashsize, uintn make_cb)
/* Call the close callback and ignore the return value, there's nothing we can do about it */
if(make_cb && tprop->close!=NULL)
- (tprop->close)(tprop->name,tprop->value);
+ (tprop->close)(tprop->name,tprop->size,tprop->value);
/* Free the property, ignoring return value, nothing we can do */
H5P_free_prop(tprop);
@@ -3666,6 +3940,10 @@ done:
property list in this class is created.
void *create_data; IN: Pointer to user data to pass along to class
creation callback.
+ H5P_cls_copy_func_t; IN: The callback function to call when each
+ property list in this class is copied.
+ void *copy_data; IN: Pointer to user data to pass along to class
+ copy callback.
H5P_cls_close_func_t; IN: The callback function to call when each
property list in this class is closed.
void *close_data; IN: Pointer to user data to pass along to class
@@ -3683,6 +3961,7 @@ done:
static H5P_genclass_t *
H5P_create_class(H5P_genclass_t *par_class, const char *name, uintn hashsize, uintn internal,
H5P_cls_create_func_t cls_create, void *create_data,
+ H5P_cls_copy_func_t cls_copy, void *copy_data,
H5P_cls_close_func_t cls_close, void *close_data
)
{
@@ -3717,6 +3996,8 @@ H5P_create_class(H5P_genclass_t *par_class, const char *name, uintn hashsize, ui
/* Set callback functions and pass-along data */
pclass->create_func = cls_create;
pclass->create_data = create_data;
+ pclass->copy_func = cls_copy;
+ pclass->copy_data = copy_data;
pclass->close_func = cls_close;
pclass->close_data = close_data;
@@ -3755,6 +4036,11 @@ done:
created.
void *create_data; IN: Pointer to user data to pass along to class
creation callback.
+ H5P_cls_copy_func_t cls_copy; IN: The callback function to call
+ when each property list in this class is
+ copied.
+ void *copy_data; IN: Pointer to user data to pass along to class
+ copy callback.
H5P_cls_close_func_t cls_close; IN: The callback function to call
when each property list in this class is
closed.
@@ -3772,12 +4058,13 @@ done:
hid_t
H5Pcreate_class(hid_t parent, const char *name, unsigned hashsize,
H5P_cls_create_func_t cls_create, void *create_data,
+ H5P_cls_copy_func_t cls_copy, void *copy_data,
H5P_cls_close_func_t cls_close, void *close_data
)
{
H5P_genclass_t *par_class = NULL; /* Pointer to the parent class */
H5P_genclass_t *pclass = NULL; /* Property list class created */
- hid_t ret_value = FAIL; /* Return value */
+ hid_t ret_value = FAIL; /* Return value */
FUNC_ENTER(H5Pcreate_class, FAIL);
@@ -3788,7 +4075,9 @@ H5Pcreate_class(hid_t parent, const char *name, unsigned hashsize,
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid class name");
if (hashsize==0)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "hashsize too small");
- if ((create_data!=NULL && cls_create==NULL) || (close_data!=NULL && cls_close==NULL))
+ if ((create_data!=NULL && cls_create==NULL)
+ || (copy_data!=NULL && cls_copy==NULL)
+ || (close_data!=NULL && cls_close==NULL))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "data specified, but no callback provided");
/* Get the pointer to the parent class */
@@ -3798,7 +4087,7 @@ H5Pcreate_class(hid_t parent, const char *name, unsigned hashsize,
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't retrieve parent class");
/* Create the new property list class */
- if (NULL==(pclass=H5P_create_class(par_class, name, hashsize, 0, cls_create, create_data, cls_close, close_data)))
+ if (NULL==(pclass=H5P_create_class(par_class, name, hashsize, 0, cls_create, create_data, cls_copy, copy_data, cls_close, close_data)))
HGOTO_ERROR(H5E_PLIST, H5E_CANTCREATE, FAIL, "unable to create property list class");
/* Get an atom for the class */
@@ -3897,7 +4186,7 @@ static H5P_genplist_t *H5P_create_list(H5P_genclass_t *pclass)
/* Call property creation callback, if it exists */
if(pcopy->create) {
- if((pcopy->create)(pcopy->name,pcopy->value)<0) {
+ if((pcopy->create)(pcopy->name,pcopy->size,pcopy->value)<0) {
H5P_free_prop(pcopy);
HGOTO_ERROR (H5E_PLIST, H5E_CANTINIT, NULL,"Can't initialize property");
} /* end if */
@@ -4027,6 +4316,7 @@ done:
H5P_prp_set_func_t prp_set; IN: Function pointer to property set callback
H5P_prp_get_func_t prp_get; IN: Function pointer to property get callback
H5P_prp_delete_func_t prp_delete; IN: Function pointer to property delete callback
+ H5P_prp_copy_func_t prp_copy; IN: Function pointer to property copy callback
H5P_prp_close_func_t prp_close; IN: Function pointer to property close
callback
RETURNS
@@ -4099,6 +4389,17 @@ done:
'delete' routine returns a negative value, the property list deletion
routine returns an error value but the property is still deleted.
+ The 'copy' callback is called when a property list with this
+ property is copied. H5P_prp_copy_func_t is defined as:
+ typedef herr_t (*H5P_prp_copy_func_t)(const char *name, void *value);
+ where the parameters to the callback function are:
+ const char *name; IN: The name of the property being closed.
+ void *value; IN: The value of the property being closed.
+ The 'copy' routine may modify the value to be copied and those changes will be
+ stored as the value of the property. If the 'copy' routine returns a
+ negative value, the new property value is not copied into the property and
+ the property list copy routine returns an error value.
+
The 'close' callback is called when a property list with this
property is being destroyed. H5P_prp_close_func_t is defined as:
typedef herr_t (*H5P_prp_close_func_t)(const char *name, void *value);
@@ -4129,9 +4430,10 @@ done:
EXAMPLES
REVISION LOG
--------------------------------------------------------------------------*/
-static herr_t H5P_register(H5P_genclass_t *pclass, const char *name, size_t size,
+herr_t H5P_register(H5P_genclass_t *pclass, const char *name, size_t size,
void *def_value, H5P_prp_create_func_t prp_create, H5P_prp_set_func_t prp_set,
- H5P_prp_get_func_t prp_get, H5P_prp_delete_func_t prp_delete, H5P_prp_close_func_t prp_close)
+ H5P_prp_get_func_t prp_get, H5P_prp_delete_func_t prp_delete,
+ H5P_prp_copy_func_t prp_copy, H5P_prp_close_func_t prp_close)
{
H5P_genclass_t *new_class; /* New class pointer */
H5P_genprop_t *tmp_prop; /* Temporary property pointer */
@@ -4156,6 +4458,7 @@ static herr_t H5P_register(H5P_genclass_t *pclass, const char *name, size_t size
if(pclass->plists>0 || pclass->classes>0) {
if((new_class=H5P_create_class(pclass->parent,pclass->name,pclass->hashsize,
(uintn)pclass->internal,pclass->create_func,pclass->create_data,
+ pclass->copy_func,pclass->copy_data,
pclass->close_func,pclass->close_data))==NULL)
HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy class");
@@ -4181,7 +4484,7 @@ static herr_t H5P_register(H5P_genclass_t *pclass, const char *name, size_t size
} /* end if */
/* Create property object from parameters */
- if((new_prop=H5P_create_prop(name,size,def_value,NULL,prp_create,prp_set,prp_get,prp_delete,prp_close))==NULL)
+ if((new_prop=H5P_create_prop(name,size,def_value,NULL,prp_create,prp_set,prp_get,prp_delete,prp_copy,prp_close))==NULL)
HGOTO_ERROR (H5E_PLIST, H5E_CANTCREATE, FAIL,"Can't create property");
/* Insert property into property list class */
@@ -4227,6 +4530,7 @@ done:
H5P_prp_set_func_t prp_set; IN: Function pointer to property set callback
H5P_prp_get_func_t prp_get; IN: Function pointer to property get callback
H5P_prp_delete_func_t prp_delete; IN: Function pointer to property delete callback
+ H5P_prp_copy_func_t prp_copy; IN: Function pointer to property copy callback
H5P_prp_close_func_t prp_close; IN: Function pointer to property close
callback
RETURNS
@@ -4299,6 +4603,17 @@ done:
'delete' routine returns a negative value, the property list deletion
routine returns an error value but the property is still deleted.
+ The 'copy' callback is called when a property list with this
+ property is copied. H5P_prp_copy_func_t is defined as:
+ typedef herr_t (*H5P_prp_copy_func_t)(const char *name, void *value);
+ where the parameters to the callback function are:
+ const char *name; IN: The name of the property being closed.
+ void *value; IN: The value of the property being closed.
+ The 'copy' routine may modify the value to be copied and those changes will be
+ stored as the value of the property. If the 'copy' routine returns a
+ negative value, the new property value is not copied into the property and
+ the property list copy routine returns an error value.
+
The 'close' callback is called when a property list with this
property is being destroyed. H5P_prp_close_func_t is defined as:
typedef herr_t (*H5P_prp_close_func_t)(const char *name, void *value);
@@ -4331,7 +4646,8 @@ done:
--------------------------------------------------------------------------*/
herr_t H5Pregister(hid_t cls_id, const char *name, size_t size, void *def_value,
H5P_prp_create_func_t prp_create, H5P_prp_set_func_t prp_set,
- H5P_prp_get_func_t prp_get, H5P_prp_delete_func_t prp_delete, H5P_prp_close_func_t prp_close)
+ H5P_prp_get_func_t prp_get, H5P_prp_delete_func_t prp_delete,
+ H5P_prp_copy_func_t prp_copy, H5P_prp_close_func_t prp_close)
{
H5P_genclass_t *pclass; /* Property list class to modify */
herr_t ret_value=FAIL; /* return value */
@@ -4347,7 +4663,7 @@ herr_t H5Pregister(hid_t cls_id, const char *name, size_t size, void *def_value,
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "properties >0 size must have default");
/* Create the new property list class */
- if ((ret_value=H5P_register(pclass,name,size,def_value,prp_create,prp_set,prp_get,prp_delete,prp_close))<0)
+ if ((ret_value=H5P_register(pclass,name,size,def_value,prp_create,prp_set,prp_get,prp_delete,prp_copy,prp_close))<0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to register property in class");
done:
@@ -4463,7 +4779,8 @@ done:
--------------------------------------------------------------------------*/
static herr_t H5P_insert(H5P_genplist_t *plist, const char *name, size_t size,
void *value, H5P_prp_set_func_t prp_set, H5P_prp_get_func_t prp_get,
- H5P_prp_delete_func_t prp_delete, H5P_prp_close_func_t prp_close)
+ H5P_prp_delete_func_t prp_delete, H5P_prp_copy_func_t prp_copy,
+ H5P_prp_close_func_t prp_close)
{
H5P_genprop_t *new_prop=NULL; /* Temporary property pointer */
herr_t ret_value=FAIL; /* return value */
@@ -4479,7 +4796,7 @@ static herr_t H5P_insert(H5P_genplist_t *plist, const char *name, size_t size,
HGOTO_ERROR(H5E_PLIST, H5E_EXISTS, FAIL, "property already exists");
/* Create property object from parameters */
- if((new_prop=H5P_create_prop(name,size,NULL,value,NULL,prp_set,prp_get,prp_delete,prp_close))==NULL)
+ if((new_prop=H5P_create_prop(name,size,NULL,value,NULL,prp_set,prp_get,prp_delete,prp_copy,prp_close))==NULL)
HGOTO_ERROR (H5E_PLIST, H5E_CANTCREATE, FAIL,"Can't create property");
/* Insert property into property list class */
@@ -4615,7 +4932,8 @@ done:
--------------------------------------------------------------------------*/
herr_t H5Pinsert(hid_t plist_id, const char *name, size_t size, void *value,
H5P_prp_set_func_t prp_set, H5P_prp_get_func_t prp_get,
- H5P_prp_delete_func_t prp_delete, H5P_prp_close_func_t prp_close)
+ H5P_prp_delete_func_t prp_delete, H5P_prp_copy_func_t prp_copy,
+ H5P_prp_close_func_t prp_close)
{
H5P_genplist_t *plist; /* Property list to modify */
herr_t ret_value=FAIL; /* return value */
@@ -4631,7 +4949,7 @@ herr_t H5Pinsert(hid_t plist_id, const char *name, size_t size, void *value,
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "properties >0 size must have default");
/* Create the new property list class */
- if ((ret_value=H5P_insert(plist,name,size,value,prp_set,prp_get,prp_delete,prp_close))<0)
+ if ((ret_value=H5P_insert(plist,name,size,value,prp_set,prp_get,prp_delete,prp_copy,prp_close))<0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to register property in plist");
done:
@@ -4670,7 +4988,7 @@ done:
EXAMPLES
REVISION LOG
--------------------------------------------------------------------------*/
-static herr_t H5P_set(hid_t plist_id, const char *name, void *value)
+herr_t H5P_set(hid_t plist_id, const char *name, void *value)
{
H5P_genplist_t *plist; /* Property list to modify */
H5P_genprop_t *prop; /* Temporary property pointer */
@@ -4703,7 +5021,7 @@ static herr_t H5P_set(hid_t plist_id, const char *name, void *value)
HDmemcpy(tmp_value,value,prop->size);
/* Call user's callback */
- if((*(prop->set))(plist_id,name,tmp_value)<0)
+ if((*(prop->set))(plist_id,name,prop->size,tmp_value)<0)
HRETURN_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't set property value");
/* Copy new [possibly unchanged] value into property value */
@@ -5355,6 +5673,16 @@ static intn H5P_cmp_prop(H5P_genprop_t *prop1, H5P_genprop_t *prop2)
if(prop1->get!=NULL && prop2->get==NULL) HGOTO_DONE(1);
if(prop1->get!=prop2->get) HGOTO_DONE(-1);
+ /* Check if they both have the same 'delete' callback */
+ if(prop1->del==NULL && prop2->del!=NULL) HGOTO_DONE(-1);
+ if(prop1->del!=NULL && prop2->del==NULL) HGOTO_DONE(1);
+ if(prop1->del!=prop2->del) HGOTO_DONE(-1);
+
+ /* Check if they both have the same 'copy' callback */
+ if(prop1->copy==NULL && prop2->copy!=NULL) HGOTO_DONE(-1);
+ if(prop1->copy!=NULL && prop2->copy==NULL) HGOTO_DONE(1);
+ if(prop1->copy!=prop2->copy) HGOTO_DONE(-1);
+
/* Check if they both have the same 'close' callback */
if(prop1->close==NULL && prop2->close!=NULL) HGOTO_DONE(-1);
if(prop1->close!=NULL && prop2->close==NULL) HGOTO_DONE(1);
@@ -5672,7 +6000,7 @@ done:
EXAMPLES
REVISION LOG
--------------------------------------------------------------------------*/
-hid_t H5Pisa_class(hid_t plist_id, hid_t pclass_id)
+htri_t H5Pisa_class(hid_t plist_id, hid_t pclass_id)
{
H5P_genplist_t *plist; /* Property list to query */
H5P_genclass_t *pclass=NULL; /* Property list class */
@@ -6020,12 +6348,332 @@ done:
/*--------------------------------------------------------------------------
NAME
+ H5P_peek_uintn
+ PURPOSE
+ Internal routine to quickly retrieve the value of a property in a property list.
+ USAGE
+ intn H5P_peek_uintn(plist_id, name)
+ hid_t plist_id; IN: Property list to check
+ const char *name; IN: Name of property to query
+ RETURNS
+ Directly returns the value of the property in the list
+ DESCRIPTION
+ This function directly returns the value of a property in a property
+ list. Because this function is only able to just copy a particular property
+ value to the return value, there is no way to check for errors. We attempt
+ to make certain that bad things don't happen by validating that the size of
+ the property is the same as the size of the return type, but that can't
+ catch all errors.
+ This function does call the user's 'get' callback routine still.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ No error checking!
+ Use with caution!
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+uintn H5P_peek_uintn(hid_t plist_id, const char *name)
+{
+ H5P_genplist_t *plist; /* Property list pointer */
+ H5P_genprop_t *prop; /* Temporary property pointer */
+ uintn ret_value; /* return value */
+
+ FUNC_ENTER (H5P_peek_uintn, UFAIL);
+
+ assert(name);
+
+ /* Check arguments. */
+ if (H5I_GENPROP_LST != H5I_get_type(plist_id) || NULL == (plist = H5I_object(plist_id)))
+ assert(0 && "not a property list");
+
+ /* Find property */
+ if((prop=H5P_find_prop(plist->props,plist->pclass->hashsize,name))==NULL)
+ assert(0 && "property doesn't exist");
+
+ /* Check for property size >0 */
+ if(prop->size==0)
+ assert(0 && "property has zero size");
+
+ /* Check for property size not the same as the return type */
+ if(prop->size!=sizeof(uintn))
+ assert(0 && "property has incorrect size");
+
+ /* Make a copy of the value and pass to 'get' callback */
+ if(prop->get!=NULL) {
+ void *tmp_value; /* Temporary value for property */
+
+ /* Make a copy of the current value, in case the callback fails */
+ if (NULL==(tmp_value=H5MM_malloc(prop->size)))
+ assert(0 && "memory allocation failed temporary property value");
+ HDmemcpy(tmp_value,prop->value,prop->size);
+
+ /* Call user's callback */
+ if((*(prop->get))(plist_id,name,prop->size,tmp_value)<0)
+ assert(0 && "can't get property value");
+
+ /* Copy new [possibly unchanged] value into return value */
+ HDmemcpy(&ret_value,tmp_value,sizeof(uintn));
+
+ /* Free the temporary value buffer */
+ H5MM_xfree(tmp_value);
+ } /* end if */
+ /* No 'get' callback, just copy value */
+ else
+ HDmemcpy(&ret_value,prop->value,sizeof(uintn));
+
+ FUNC_LEAVE (ret_value);
+} /* H5P_peek_uintn() */
+
+
+/*--------------------------------------------------------------------------
+ NAME
+ H5P_peek_hid_t
+ PURPOSE
+ Internal routine to quickly retrieve the value of a property in a property list.
+ USAGE
+ hid_t H5P_peek_hid_t(plist_id, name)
+ hid_t plist_id; IN: Property list to check
+ const char *name; IN: Name of property to query
+ RETURNS
+ Directly returns the value of the property in the list
+ DESCRIPTION
+ This function directly returns the value of a property in a property
+ list. Because this function is only able to just copy a particular property
+ value to the return value, there is no way to check for errors. We attempt
+ to make certain that bad things don't happen by validating that the size of
+ the property is the same as the size of the return type, but that can't
+ catch all errors.
+ This function does call the user's 'get' callback routine still.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ No error checking!
+ Use with caution!
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+hid_t H5P_peek_hid_t(hid_t plist_id, const char *name)
+{
+ H5P_genplist_t *plist; /* Property list pointer */
+ H5P_genprop_t *prop; /* Temporary property pointer */
+ hid_t ret_value; /* return value */
+
+ FUNC_ENTER (H5P_peek_hid_t, FAIL);
+
+ assert(name);
+
+ /* Check arguments. */
+ if (H5I_GENPROP_LST != H5I_get_type(plist_id) || NULL == (plist = H5I_object(plist_id)))
+ assert(0 && "not a property list");
+
+ /* Find property */
+ if((prop=H5P_find_prop(plist->props,plist->pclass->hashsize,name))==NULL)
+ assert(0 && "property doesn't exist");
+
+ /* Check for property size >0 */
+ if(prop->size==0)
+ assert(0 && "property has zero size");
+
+ /* Check for property size not the same as the return type */
+ if(prop->size!=sizeof(hid_t))
+ assert(0 && "property has incorrect size");
+
+ /* Make a copy of the value and pass to 'get' callback */
+ if(prop->get!=NULL) {
+ void *tmp_value; /* Temporary value for property */
+
+ /* Make a copy of the current value, in case the callback fails */
+ if (NULL==(tmp_value=H5MM_malloc(prop->size)))
+ assert(0 && "memory allocation failed temporary property value");
+ HDmemcpy(tmp_value,prop->value,prop->size);
+
+ /* Call user's callback */
+ if((*(prop->get))(plist_id,name,prop->size,tmp_value)<0)
+ assert(0 && "can't get property value");
+
+ /* Copy new [possibly unchanged] value into return value */
+ HDmemcpy(&ret_value,tmp_value,sizeof(hid_t));
+
+ /* Free the temporary value buffer */
+ H5MM_xfree(tmp_value);
+ } /* end if */
+ /* No 'get' callback, just copy value */
+ else
+ HDmemcpy(&ret_value,prop->value,sizeof(hid_t));
+
+ FUNC_LEAVE (ret_value);
+} /* H5P_peek_hid_t() */
+
+
+/*--------------------------------------------------------------------------
+ NAME
+ H5P_peek_voidp
+ PURPOSE
+ Internal routine to quickly retrieve the value of a property in a property list.
+ USAGE
+ void *H5P_peek_voidp(plist_id, name)
+ hid_t plist_id; IN: Property list to check
+ const char *name; IN: Name of property to query
+ RETURNS
+ Directly returns the value of the property in the list
+ DESCRIPTION
+ This function directly returns the value of a property in a property
+ list. Because this function is only able to just copy a particular property
+ value to the return value, there is no way to check for errors. We attempt
+ to make certain that bad things don't happen by validating that the size of
+ the property is the same as the size of the return type, but that can't
+ catch all errors.
+ This function does call the user's 'get' callback routine still.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ No error checking!
+ Use with caution!
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+void *H5P_peek_voidp(hid_t plist_id, const char *name)
+{
+ H5P_genplist_t *plist; /* Property list pointer */
+ H5P_genprop_t *prop; /* Temporary property pointer */
+ void * ret_value; /* return value */
+
+ FUNC_ENTER (H5P_peek_hid_t, NULL);
+
+ assert(name);
+
+ /* Check arguments. */
+ if (H5I_GENPROP_LST != H5I_get_type(plist_id) || NULL == (plist = H5I_object(plist_id)))
+ assert(0 && "not a property list");
+
+ /* Find property */
+ if((prop=H5P_find_prop(plist->props,plist->pclass->hashsize,name))==NULL)
+ assert(0 && "property doesn't exist");
+
+ /* Check for property size >0 */
+ if(prop->size==0)
+ assert(0 && "property has zero size");
+
+ /* Check for property size not the same as the return type */
+ if(prop->size!=sizeof(void *))
+ assert(0 && "property has incorrect size");
+
+ /* Make a copy of the value and pass to 'get' callback */
+ if(prop->get!=NULL) {
+ void *tmp_value; /* Temporary value for property */
+
+ /* Make a copy of the current value, in case the callback fails */
+ if (NULL==(tmp_value=H5MM_malloc(prop->size)))
+ assert(0 && "memory allocation failed temporary property value");
+ HDmemcpy(tmp_value,prop->value,prop->size);
+
+ /* Call user's callback */
+ if((*(prop->get))(plist_id,name,prop->size,tmp_value)<0)
+ assert(0 && "can't get property value");
+
+ /* Copy new [possibly unchanged] value into return value */
+ HDmemcpy(&ret_value,tmp_value,sizeof(void *));
+
+ /* Free the temporary value buffer */
+ H5MM_xfree(tmp_value);
+ } /* end if */
+ /* No 'get' callback, just copy value */
+ else
+ HDmemcpy(&ret_value,prop->value,sizeof(void *));
+
+ FUNC_LEAVE (ret_value);
+} /* H5P_peek_voidp() */
+
+
+/*--------------------------------------------------------------------------
+ NAME
+ H5P_peek_hsize_t
+ PURPOSE
+ Internal routine to quickly retrieve the value of a property in a property list.
+ USAGE
+ hsize_t H5P_peek_hsize_t(plist_id, name)
+ hid_t plist_id; IN: Property list to check
+ const char *name; IN: Name of property to query
+ RETURNS
+ Directly returns the value of the property in the list
+ DESCRIPTION
+ This function directly returns the value of a property in a property
+ list. Because this function is only able to just copy a particular property
+ value to the return value, there is no way to check for errors. We attempt
+ to make certain that bad things don't happen by validating that the size of
+ the property is the same as the size of the return type, but that can't
+ catch all errors.
+ This function does call the user's 'get' callback routine still.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ No error checking!
+ Use with caution!
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+hsize_t H5P_peek_hsize_t(hid_t plist_id, const char *name)
+{
+ H5P_genplist_t *plist; /* Property list pointer */
+ H5P_genprop_t *prop; /* Temporary property pointer */
+ hsize_t ret_value; /* return value */
+
+ FUNC_ENTER (H5P_peek_hid_t, UFAIL);
+
+ assert(name);
+
+ /* Check arguments. */
+ if (H5I_GENPROP_LST != H5I_get_type(plist_id) || NULL == (plist = H5I_object(plist_id)))
+ assert(0 && "not a property list");
+
+ /* Find property */
+ if((prop=H5P_find_prop(plist->props,plist->pclass->hashsize,name))==NULL)
+ assert(0 && "property doesn't exist");
+
+ /* Check for property size >0 */
+ if(prop->size==0)
+ assert(0 && "property has zero size");
+
+ /* Check for property size not the same as the return type */
+ if(prop->size!=sizeof(hsize_t))
+ assert(0 && "property has incorrect size");
+
+ /* Make a copy of the value and pass to 'get' callback */
+ if(prop->get!=NULL) {
+ void *tmp_value; /* Temporary value for property */
+
+ /* Make a copy of the current value, in case the callback fails */
+ if (NULL==(tmp_value=H5MM_malloc(prop->size)))
+ assert(0 && "memory allocation failed temporary property value");
+ HDmemcpy(tmp_value,prop->value,prop->size);
+
+ /* Call user's callback */
+ if((*(prop->get))(plist_id,name,prop->size,tmp_value)<0)
+ assert(0 && "can't get property value");
+
+ /* Copy new [possibly unchanged] value into return value */
+ HDmemcpy(&ret_value,tmp_value,sizeof(hsize_t));
+
+ /* Free the temporary value buffer */
+ H5MM_xfree(tmp_value);
+ } /* end if */
+ /* No 'get' callback, just copy value */
+ else
+ HDmemcpy(&ret_value,prop->value,sizeof(hsize_t));
+
+ FUNC_LEAVE (ret_value);
+} /* H5P_peek_hsize_t() */
+
+
+/*--------------------------------------------------------------------------
+ NAME
H5P_get
PURPOSE
Internal routine to query the value of a property in a property list.
USAGE
herr_t H5P_get(plist, name, value)
- H5P_genplist_t *plist; IN: Property list to check
+ hid_t plist_id; IN: Property list to check
const char *name; IN: Name of property to query
void *value; OUT: Pointer to the buffer for the property value
RETURNS
@@ -6046,7 +6694,7 @@ done:
EXAMPLES
REVISION LOG
--------------------------------------------------------------------------*/
-static herr_t H5P_get(hid_t plist_id, const char *name, void *value)
+herr_t H5P_get(hid_t plist_id, const char *name, void *value)
{
H5P_genplist_t *plist; /* Property list pointer */
H5P_genprop_t *prop; /* Temporary property pointer */
@@ -6079,7 +6727,7 @@ static herr_t H5P_get(hid_t plist_id, const char *name, void *value)
HDmemcpy(tmp_value,prop->value,prop->size);
/* Call user's callback */
- if((*(prop->get))(plist_id,name,tmp_value)<0)
+ if((*(prop->get))(plist_id,name,prop->size,tmp_value)<0)
HRETURN_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't get property value");
/* Copy new [possibly unchanged] value into return value */
@@ -6144,7 +6792,7 @@ herr_t H5Pget(hid_t plist_id, const char *name, void * value)
/* Create the new property list class */
if ((ret_value=H5P_get(plist_id,name,value))<0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to query property value");
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to query property value");
done:
FUNC_LEAVE (ret_value);
@@ -6196,7 +6844,7 @@ static herr_t H5P_remove(hid_t plist_id, H5P_genplist_t *plist, const char *name
/* Pass value to 'close' callback, if it exists */
if(prop->del!=NULL) {
/* Call user's callback */
- if((*(prop->del))(plist_id,name,prop->value)<0)
+ if((*(prop->del))(plist_id,name,prop->size,prop->value)<0)
HRETURN_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't close property value");
} /* end if */
@@ -6491,7 +7139,7 @@ herr_t H5Pclose_list(hid_t plist_id)
FUNC_ENTER (H5Pclose_list, FAIL);
/* Check arguments. */
- if (H5I_GENPROP_LST != H5I_get_type(plist_id) || NULL == (plist = H5I_remove(plist_id)))
+ if (H5I_GENPROP_LST != H5I_get_type(plist_id) || NULL == (plist = H5I_object(plist_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list");
/* Make call to property list class close callback, if needed */
@@ -6504,6 +7152,10 @@ herr_t H5Pclose_list(hid_t plist_id)
if ((ret_value=H5P_close_list(plist)) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTFREE, FAIL, "can't close");
+ /* Remove the property list from the ID manager now */
+ if (NULL == H5I_remove(plist_id))
+ HGOTO_ERROR(H5E_ARGS, H5E_CANTDELETE, FAIL, "can't delete property list");
+
done:
FUNC_LEAVE (ret_value);
} /* H5Pclose_list() */
diff --git a/src/H5Pprivate.h b/src/H5Pprivate.h
index 906826e..93c8beb 100644
--- a/src/H5Pprivate.h
+++ b/src/H5Pprivate.h
@@ -50,6 +50,7 @@ typedef struct H5P_genprop_tag {
H5P_prp_set_func_t set; /* Function to call when a property value is set */
H5P_prp_get_func_t get; /* Function to call when a property value is retrieved */
H5P_prp_delete_func_t del; /* Function to call when a property is deleted */
+ H5P_prp_copy_func_t copy; /* Function to call when a property is copied */
H5P_prp_close_func_t close; /* Function to call when a property is closed */
struct H5P_genprop_tag *next; /* Pointer to the next property in this list */
@@ -70,8 +71,10 @@ typedef struct H5P_genclass_tag {
/* Callback function pointers & info */
H5P_cls_create_func_t create_func; /* Function to call when a property list is created */
void *create_data; /* Pointer to user data to pass along to create callback */
+ H5P_cls_copy_func_t copy_func; /* Function to call when a property list is copied */
+ void *copy_data; /* Pointer to user data to pass along to copy callback */
H5P_cls_close_func_t close_func; /* Function to call when a property list is closed */
- void *close_data; /* Pointer to user data to pass along to close callback */
+ void *close_data; /* Pointer to user data to pass along to close callback */
H5P_genprop_t *props[1]; /* Hash table of pointers to properties in the class */
} H5P_genclass_t;
@@ -93,7 +96,6 @@ typedef struct {
H5F_create_t fcreate; /* File creation properties */
H5F_access_t faccess; /* File access properties */
H5D_create_t dcreate; /* Dataset creation properties */
- H5D_xfer_t dxfer; /* Data transfer properties */
H5F_mprop_t mount; /* Mounting properties */
} u;
H5P_class_t cls; /* Property list class */
@@ -104,7 +106,19 @@ __DLL__ herr_t H5P_init(void);
__DLL__ hid_t H5P_create(H5P_class_t type, H5P_t *plist);
__DLL__ void *H5P_copy(H5P_class_t type, const void *src);
__DLL__ herr_t H5P_close(void *plist);
+__DLL__ herr_t H5P_register(H5P_genclass_t *pclass, const char *name, size_t size,
+ void *def_value, H5P_prp_create_func_t prp_create, H5P_prp_set_func_t prp_set,
+ H5P_prp_get_func_t prp_get, H5P_prp_delete_func_t prp_delete,
+ H5P_prp_copy_func_t prp_copy, H5P_prp_close_func_t prp_close);
+__DLL__ herr_t H5P_get(hid_t plist_id, const char *name, void *value);
+__DLL__ herr_t H5P_set(hid_t plist_id, const char *name, void *value);
__DLL__ H5P_class_t H5P_get_class(hid_t tid);
__DLL__ hid_t H5P_get_driver(hid_t plist_id);
+/* Private functions to "peek" at properties of a certain type */
+__DLL__ uintn H5P_peek_uintn(hid_t plist_id, const char *name);
+__DLL__ hid_t H5P_peek_hid_t(hid_t plist_id, const char *name);
+__DLL__ void *H5P_peek_voidp(hid_t plist_id, const char *name);
+__DLL__ hsize_t H5P_peek_hsize_t(hid_t plist_id, const char *name);
+
#endif
diff --git a/src/H5Ppublic.h b/src/H5Ppublic.h
index ee925dc..ded0a0b 100644
--- a/src/H5Ppublic.h
+++ b/src/H5Ppublic.h
@@ -57,14 +57,16 @@ typedef enum H5P_class_t {
/* Define property list class callback function pointer types */
typedef herr_t (*H5P_cls_create_func_t)(hid_t prop_id, void *create_data);
+typedef herr_t (*H5P_cls_copy_func_t)(hid_t prop_id, void *copy_data);
typedef herr_t (*H5P_cls_close_func_t)(hid_t prop_id, void *close_data);
/* Define property list callback function pointer types */
-typedef herr_t (*H5P_prp_create_func_t)(const char *name, void *def_value);
-typedef herr_t (*H5P_prp_set_func_t)(hid_t prop_id, const char *name, void *value);
-typedef herr_t (*H5P_prp_get_func_t)(hid_t prop_id, const char *name, void *value);
-typedef herr_t (*H5P_prp_delete_func_t)(hid_t prop_id, const char *name, void *value);
-typedef herr_t (*H5P_prp_close_func_t)(const char *name, void *value);
+typedef herr_t (*H5P_prp_create_func_t)(const char *name, size_t size, void *def_value);
+typedef herr_t (*H5P_prp_set_func_t)(hid_t prop_id, const char *name, size_t size, void *value);
+typedef herr_t (*H5P_prp_get_func_t)(hid_t prop_id, const char *name, size_t size, void *value);
+typedef herr_t (*H5P_prp_delete_func_t)(hid_t prop_id, const char *name, size_t size, void *value);
+typedef herr_t (*H5P_prp_copy_func_t)(const char *name, size_t size, void *value);
+typedef herr_t (*H5P_prp_close_func_t)(const char *name, size_t size, void *value);
/* Define property list iteration function type */
typedef herr_t (*H5P_iterate_t)(hid_t id, const char *name, void *iter_data);
@@ -76,38 +78,58 @@ extern "C" {
/*
* The library created property list classes
*/
-#define H5P_NO_CLASS_NEW (H5open(), H5P_NO_CLASS_g)
+#define H5P_NO_CLASS_NEW (H5open(), H5P_CLS_NO_CLASS_g)
#define H5P_NO_CLASS_HASH_SIZE 1 /* 1, not 0, otherwise allocations get weird */
-#define H5P_FILE_CREATE_NEW (H5open(), H5P_FILE_CREATE_g)
+#define H5P_FILE_CREATE_NEW (H5open(), H5P_CLS_FILE_CREATE_g)
#define H5P_FILE_CREATE_HASH_SIZE 17
-#define H5P_FILE_ACCESS_NEW (H5open(), H5P_FILE_ACCESS_g)
+#define H5P_FILE_ACCESS_NEW (H5open(), H5P_CLS_FILE_ACCESS_g)
#define H5P_FILE_ACCESS_HASH_SIZE 17
-#define H5P_DATASET_CREATE_NEW (H5open(), H5P_DATASET_CREATE_g)
+#define H5P_DATASET_CREATE_NEW (H5open(), H5P_CLS_DATASET_CREATE_g)
#define H5P_DATASET_CREATE_HASH_SIZE 17
-#define H5P_DATASET_XFER_NEW (H5open(), H5P_DATASET_XFER_g)
+#define H5P_DATASET_XFER_NEW (H5open(), H5P_CLS_DATASET_XFER_g)
#define H5P_DATASET_XFER_HASH_SIZE 17
-#define H5P_MOUNT_NEW (H5open(), H5P_MOUNT_g)
+#define H5P_MOUNT_NEW (H5open(), H5P_CLS_MOUNT_g)
#define H5P_MOUNT_HASH_SIZE 17
-__DLLVAR__ hid_t H5P_NO_CLASS_g;
-__DLLVAR__ hid_t H5P_FILE_CREATE_g;
-__DLLVAR__ hid_t H5P_FILE_ACCESS_g;
-__DLLVAR__ hid_t H5P_DATASET_CREATE_g;
-__DLLVAR__ hid_t H5P_DATASET_XFER_g;
-__DLLVAR__ hid_t H5P_MOUNT_g;
+__DLLVAR__ hid_t H5P_CLS_NO_CLASS_g;
+__DLLVAR__ hid_t H5P_CLS_FILE_CREATE_g;
+__DLLVAR__ hid_t H5P_CLS_FILE_ACCESS_g;
+__DLLVAR__ hid_t H5P_CLS_DATASET_CREATE_g;
+__DLLVAR__ hid_t H5P_CLS_DATASET_XFER_g;
+__DLLVAR__ hid_t H5P_CLS_MOUNT_g;
+/*
+ * The library created default property lists
+ */
+#define H5P_NO_CLASS_DEFAULT (H5open(), H5P_LST_NO_CLASS_g)
+#define H5P_FILE_CREATE_DEFAULT (H5open(), H5P_LST_FILE_CREATE_g)
+#define H5P_FILE_ACCESS_DEFAULT (H5open(), H5P_LST_FILE_ACCESS_g)
+#define H5P_DATASET_CREATE_DEFAULT (H5open(), H5P_LST_DATASET_CREATE_g)
+#define H5P_DATASET_XFER_DEFAULT (H5open(), H5P_LST_DATASET_XFER_g)
+#define H5P_MOUNT_DEFAULT (H5open(), H5P_LST_MOUNT_g)
+__DLLVAR__ hid_t H5P_LST_NO_CLASS_g;
+__DLLVAR__ hid_t H5P_LST_FILE_CREATE_g;
+__DLLVAR__ hid_t H5P_LST_FILE_ACCESS_g;
+__DLLVAR__ hid_t H5P_LST_DATASET_CREATE_g;
+__DLLVAR__ hid_t H5P_LST_DATASET_XFER_g;
+__DLLVAR__ hid_t H5P_LST_MOUNT_g;
/* Public functions */
__DLL__ hid_t H5Pcreate_class(hid_t parent, const char *name, unsigned hashsize,
H5P_cls_create_func_t cls_create, void *create_data,
+ H5P_cls_copy_func_t cls_copy, void *copy_data,
H5P_cls_close_func_t cls_close, void *close_data);
__DLL__ char *H5Pget_class_name(hid_t pclass_id);
__DLL__ hid_t H5Pcreate_list(hid_t cls_id);
__DLL__ herr_t H5Pregister(hid_t cls_id, const char *name, size_t size,
void *def_value, H5P_prp_create_func_t prp_create,
H5P_prp_set_func_t prp_set, H5P_prp_get_func_t prp_get,
- H5P_prp_delete_func_t prp_del, H5P_prp_close_func_t prp_close);
+ H5P_prp_delete_func_t prp_del,
+ H5P_prp_copy_func_t prp_copy,
+ H5P_prp_close_func_t prp_close);
__DLL__ herr_t H5Pinsert(hid_t plist_id, const char *name, size_t size,
void *value, H5P_prp_set_func_t prp_set, H5P_prp_get_func_t prp_get,
- H5P_prp_delete_func_t prp_delete, H5P_prp_close_func_t prp_close);
+ H5P_prp_delete_func_t prp_delete,
+ H5P_prp_copy_func_t prp_copy,
+ H5P_prp_close_func_t prp_close);
__DLL__ herr_t H5Pset(hid_t plist_id, const char *name, void *value);
__DLL__ htri_t H5Pexist(hid_t plist_id, const char *name);
__DLL__ herr_t H5Pget_size(hid_t id, const char *name, size_t *size);
@@ -116,7 +138,7 @@ __DLL__ hid_t H5Pget_class_new(hid_t plist_id);
__DLL__ hid_t H5Pget_class_parent(hid_t pclass_id);
__DLL__ herr_t H5Pget(hid_t plist_id, const char *name, void * value);
__DLL__ htri_t H5Pequal(hid_t id1, hid_t id2);
-__DLL__ hid_t H5Pisa_class(hid_t plist_id, hid_t pclass_id);
+__DLL__ htri_t H5Pisa_class(hid_t plist_id, hid_t pclass_id);
__DLL__ int H5Piterate(hid_t id, int *idx, H5P_iterate_t iter_func,
void *iter_data);
__DLL__ herr_t H5Premove(hid_t plist_id, const char *name);
diff --git a/src/H5Shyper.c b/src/H5Shyper.c
index 6b59f24..06c7f08 100644
--- a/src/H5Shyper.c
+++ b/src/H5Shyper.c
@@ -609,17 +609,18 @@ H5S_hyper_fread (intn dim, H5S_hyper_io_info_t *io_info)
uintn u;
#endif /* QAK */
hsize_t num_read=0; /* Number of elements read */
- const H5D_xfer_t *xfer_parms;/* Data transfer property list */
+ uintn cache_hyper; /* Hyperslab caching turned on? */
+ uintn block_limit; /* Hyperslab cache limit */
FUNC_ENTER (H5S_hyper_fread, 0);
assert(io_info);
- if (H5P_DEFAULT==io_info->dxpl_id) {
- xfer_parms = &H5D_xfer_dflt;
- } else {
- xfer_parms = H5I_object(io_info->dxpl_id);
- assert(xfer_parms);
- }
+
+ /* Get the hyperslab cache setting and limit */
+ if (H5P_get(io_info->dxpl_id,H5D_XFER_HYPER_CACHE_NAME,&cache_hyper)<0)
+ HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, 0, "unable to get value");
+ if (H5P_get(io_info->dxpl_id,H5D_XFER_HYPER_CACHE_LIM_NAME,&block_limit)<0)
+ HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, 0, "unable to get value");
#ifdef QAK
printf("%s: check 1.0, dim=%d\n",FUNC,dim);
@@ -672,9 +673,8 @@ H5S_hyper_fread (intn dim, H5S_hyper_io_info_t *io_info)
#endif /* QAK */
/* Check if this hyperslab block is cached or could be cached */
if(!regions[i].node->cinfo.cached &&
- (xfer_parms->cache_hyper &&
- (xfer_parms->block_limit==0 ||
- xfer_parms->block_limit>=(regions[i].node->cinfo.size*io_info->elmt_size)))) {
+ (cache_hyper &&
+ (block_limit==0 || block_limit>=(regions[i].node->cinfo.size*io_info->elmt_size)))) {
/* if we aren't cached, attempt to cache the block */
#ifdef QAK
printf("%s: check 2.1.3, caching block\n",FUNC);
@@ -992,7 +992,7 @@ H5S_hyper_fread_opt (H5F_t *f, const struct H5O_layout_t *layout,
#ifndef NO_DUFFS_DEVICE
size_t duffs_index; /* Counting index for Duff's device */
#endif /* NO_DUFFS_DEVICE */
- const H5D_xfer_t *xfer_parms;/* Data transfer property list */
+ size_t vector_size; /* Value for vector size */
hsize_t ret_value=0; /* Return value */
FUNC_ENTER (H5S_hyper_fread_opt, 0);
@@ -1011,18 +1011,14 @@ for(i=0; i<file_space->extent.u.simple.rank; i++)
printf("%s: file_file->hyp.pos[%d]=%d\n",FUNC,(int)i,(int)file_iter->hyp.pos[i]);
#endif /* QAK */
- /* Get the data transfer properties */
- if (H5P_DEFAULT==dxpl_id) {
- xfer_parms = &H5D_xfer_dflt;
- } else {
- xfer_parms = H5I_object(dxpl_id);
- assert(xfer_parms);
- } /* end else */
+ /* Get the hyperslab vector size */
+ if (H5P_get(dxpl_id,H5D_XFER_HYPER_VECTOR_SIZE_NAME,&vector_size)<0)
+ HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, 0, "unable to get value");
/* Allocate the vector I/O arrays */
- if((seq_len_arr = H5FL_ARR_ALLOC(size_t,xfer_parms->vector_size,0))==NULL)
+ if((seq_len_arr = H5FL_ARR_ALLOC(size_t,vector_size,0))==NULL)
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0, "can't allocate vector I/O array");
- if((buf_off_arr = H5FL_ARR_ALLOC(hsize_t,xfer_parms->vector_size,0))==NULL)
+ if((buf_off_arr = H5FL_ARR_ALLOC(hsize_t,vector_size,0))==NULL)
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0, "can't allocate vector I/O array");
/* Set the rank of the fastest changing dimension */
@@ -1186,7 +1182,7 @@ for(i=0; i<file_space->extent.u.simple.rank; i++)
skip[i]=(tdiminfo[i].stride-tdiminfo[i].block)*slab[i];
/* Fill the sequence length array (since they will all be the same for optimized hyperslabs) */
- for(u=0; u<xfer_parms->vector_size; u++)
+ for(u=0; u<vector_size; u++)
seq_len_arr[u]=actual_bytes;
/* Read in data until an entire sequence can't be read in any longer */
@@ -1205,7 +1201,7 @@ for(i=0; i<file_space->extent.u.simple.rank; i++)
/* Gather the sequence */
/* Compute the number of sequences to fill */
- tot_seq=MIN(xfer_parms->vector_size-nseq,fast_dim_count);
+ tot_seq=MIN(vector_size-nseq,fast_dim_count);
/* Get a copy of the number of sequences to fill */
seq_count=tot_seq;
@@ -1308,7 +1304,7 @@ for(i=0; i<file_space->extent.u.simple.rank; i++)
fast_dim_count -= tot_seq;
/* If the sequence & offset arrays are full, read them in */
- if(nseq>=xfer_parms->vector_size) {
+ if(nseq>=vector_size) {
/* Read in the sequences */
if (H5F_seq_readv(f, dxpl_id, layout, pline, fill, efl, file_space,
elmt_size, nseq, seq_len_arr, buf_off_arr, buf/*out*/)<0) {
@@ -1350,7 +1346,7 @@ for(i=0; i<file_space->extent.u.simple.rank; i++)
/* Gather the sequence */
/* Compute the number of sequences to fill */
- tot_seq=MIN(xfer_parms->vector_size-nseq,fast_dim_count);
+ tot_seq=MIN(vector_size-nseq,fast_dim_count);
/* Get a copy of the number of sequences to fill */
seq_count=tot_seq;
@@ -1380,7 +1376,7 @@ for(i=0; i<file_space->extent.u.simple.rank; i++)
fast_dim_count -= tot_seq;
/* If the sequence & offset arrays are full, read them in */
- if(nseq>=xfer_parms->vector_size) {
+ if(nseq>=vector_size) {
/* Read in the sequences */
if (H5F_seq_readv(f, dxpl_id, layout, pline, fill, efl, file_space,
elmt_size, nseq, seq_len_arr, buf_off_arr, buf/*out*/)<0) {
@@ -1424,7 +1420,7 @@ for(i=0; i<file_space->extent.u.simple.rank; i++)
nseq++;
/* If the sequence & offset arrays are full, read them in */
- if(nseq>=xfer_parms->vector_size) {
+ if(nseq>=vector_size) {
/* Read in the sequences */
if (H5F_seq_readv(f, dxpl_id, layout, pline, fill, efl, file_space,
elmt_size, nseq, seq_len_arr, buf_off_arr, buf/*out*/)<0) {
@@ -1638,17 +1634,19 @@ H5S_hyper_fwrite (intn dim, H5S_hyper_io_info_t *io_info)
size_t i; /* Counters */
intn j;
hsize_t num_written=0; /* Number of elements read */
- const H5D_xfer_t *xfer_parms; /* Data transfer properties */
+ uintn cache_hyper; /* Hyperslab caching turned on? */
+ uintn block_limit; /* Hyperslab cache limit */
FUNC_ENTER (H5S_hyper_fwrite, 0);
assert(io_info);
- if (H5P_DEFAULT==io_info->dxpl_id) {
- xfer_parms = &H5D_xfer_dflt;
- } else {
- xfer_parms = H5I_object(io_info->dxpl_id);
- assert(xfer_parms);
- }
+
+ /* Get the hyperslab cache setting and limit */
+ if (H5P_get(io_info->dxpl_id,H5D_XFER_HYPER_CACHE_NAME,&cache_hyper)<0)
+ HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, 0, "unable to get value");
+ if (H5P_get(io_info->dxpl_id,H5D_XFER_HYPER_CACHE_LIM_NAME,&block_limit)<0)
+ HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, 0, "unable to get value");
+
#ifdef QAK
printf("%s: check 1.0\n", FUNC);
@@ -1682,7 +1680,7 @@ H5S_hyper_fwrite (intn dim, H5S_hyper_io_info_t *io_info)
region_size=MIN((hssize_t)io_info->nelmts, (regions[i].end-regions[i].start)+1);
/* Check if this hyperslab block is cached or could be cached */
- if(!regions[i].node->cinfo.cached && (xfer_parms->cache_hyper && (xfer_parms->block_limit==0 || xfer_parms->block_limit>=(regions[i].node->cinfo.size*io_info->elmt_size)))) {
+ if(!regions[i].node->cinfo.cached && (cache_hyper && (block_limit==0 || block_limit>=(regions[i].node->cinfo.size*io_info->elmt_size)))) {
/* if we aren't cached, attempt to cache the block */
H5S_hyper_block_cache(regions[i].node,io_info,0);
} /* end if */
@@ -1837,7 +1835,7 @@ H5S_hyper_fwrite_opt (H5F_t *f, const struct H5O_layout_t *layout,
#ifndef NO_DUFFS_DEVICE
size_t duffs_index; /* Counting index for Duff's device */
#endif /* NO_DUFFS_DEVICE */
- const H5D_xfer_t *xfer_parms;/* Data transfer property list */
+ size_t vector_size; /* Value for vector size */
hsize_t ret_value=0; /* Return value */
FUNC_ENTER (H5S_hyper_fwrite_opt, 0);
@@ -1856,18 +1854,14 @@ for(i=0; i<file_space->extent.u.simple.rank; i++)
printf("%s: file_file->hyp.pos[%d]=%d\n",FUNC,(int)i,(int)file_iter->hyp.pos[i]);
#endif /* QAK */
- /* Get the data transfer properties */
- if (H5P_DEFAULT==dxpl_id) {
- xfer_parms = &H5D_xfer_dflt;
- } else {
- xfer_parms = H5I_object(dxpl_id);
- assert(xfer_parms);
- } /* end else */
+ /* Get the hyperslab vector size */
+ if (H5P_get(dxpl_id,H5D_XFER_HYPER_VECTOR_SIZE_NAME,&vector_size)<0)
+ HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, 0, "unable to get value");
/* Allocate the vector I/O arrays */
- if((seq_len_arr = H5FL_ARR_ALLOC(size_t,xfer_parms->vector_size,0))==NULL)
+ if((seq_len_arr = H5FL_ARR_ALLOC(size_t,vector_size,0))==NULL)
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0, "can't allocate vector I/O array");
- if((buf_off_arr = H5FL_ARR_ALLOC(hsize_t,xfer_parms->vector_size,0))==NULL)
+ if((buf_off_arr = H5FL_ARR_ALLOC(hsize_t,vector_size,0))==NULL)
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0, "can't allocate vector I/O array");
/* Set the rank of the fastest changing dimension */
@@ -2031,7 +2025,7 @@ for(i=0; i<file_space->extent.u.simple.rank; i++)
skip[i]=(tdiminfo[i].stride-tdiminfo[i].block)*slab[i];
/* Fill the sequence length array (since they will all be the same for optimized hyperslabs) */
- for(u=0; u<xfer_parms->vector_size; u++)
+ for(u=0; u<vector_size; u++)
seq_len_arr[u]=actual_bytes;
/* Write out data until an entire sequence can't be written any longer */
@@ -2050,7 +2044,7 @@ for(i=0; i<file_space->extent.u.simple.rank; i++)
/* Gather the sequence */
/* Compute the number of sequences to fill */
- tot_seq=MIN(xfer_parms->vector_size-nseq,fast_dim_count);
+ tot_seq=MIN(vector_size-nseq,fast_dim_count);
/* Get a copy of the number of sequences to fill */
seq_count=tot_seq;
@@ -2153,7 +2147,7 @@ for(i=0; i<file_space->extent.u.simple.rank; i++)
fast_dim_count -= tot_seq;
/* If the sequence & offset arrays are full, write them out */
- if(nseq>=xfer_parms->vector_size) {
+ if(nseq>=vector_size) {
/* Write out the sequences */
if (H5F_seq_writev(f, dxpl_id, layout, pline, fill, efl, file_space,
elmt_size, nseq, seq_len_arr, buf_off_arr, buf)<0) {
@@ -2195,7 +2189,7 @@ for(i=0; i<file_space->extent.u.simple.rank; i++)
/* Gather the sequence */
/* Compute the number of sequences to fill */
- tot_seq=MIN(xfer_parms->vector_size-nseq,fast_dim_count);
+ tot_seq=MIN(vector_size-nseq,fast_dim_count);
/* Get a copy of the number of sequences to fill */
seq_count=tot_seq;
@@ -2225,7 +2219,7 @@ for(i=0; i<file_space->extent.u.simple.rank; i++)
fast_dim_count -= tot_seq;
/* If the sequence & offset arrays are full, write them out */
- if(nseq>=xfer_parms->vector_size) {
+ if(nseq>=vector_size) {
/* Write out the sequences */
if (H5F_seq_writev(f, dxpl_id, layout, pline, fill, efl, file_space,
elmt_size, nseq, seq_len_arr, buf_off_arr, buf)<0) {
@@ -2269,7 +2263,7 @@ for(i=0; i<file_space->extent.u.simple.rank; i++)
nseq++;
/* If the sequence & offset arrays are full, write them out */
- if(nseq>=xfer_parms->vector_size) {
+ if(nseq>=vector_size) {
/* Write out the sequences */
if (H5F_seq_writev(f, dxpl_id, layout, pline, fill, efl, file_space,
elmt_size, nseq, seq_len_arr, buf_off_arr, buf)<0) {
diff --git a/src/H5Smpio.c b/src/H5Smpio.c
index 63a1347..16bbda7 100644
--- a/src/H5Smpio.c
+++ b/src/H5Smpio.c
@@ -575,6 +575,9 @@ H5S_mpio_spaces_xfer(H5F_t *f, const struct H5O_layout_t *layout,
assert (mem_space);
assert (buf);
assert (IS_H5FD_MPIO(f));
+ /* Make certain we have the correct type of property list */
+ assert(H5I_GENPROP_LST==H5I_get_type(dxpl_id));
+ assert(TRUE==H5Pisa_class(dxpl_id,H5P_DATASET_XFER_NEW));
/* INCOMPLETE!!! rky 980816 */
/* Currently can only handle H5D_CONTIGUOUS layout */
@@ -601,18 +604,24 @@ H5S_mpio_spaces_xfer(H5F_t *f, const struct H5O_layout_t *layout,
* the following block of code, though with the right idea, is not
* correct yet.
*/
- { /* Get the transfer mode */
- H5D_xfer_t *dxpl;
- H5FD_mpio_dxpl_t *dx;
-
- if (H5P_DEFAULT!=dxpl_id && (dxpl=H5I_object(dxpl_id)) &&
- H5FD_MPIO==dxpl->driver_id && (dx=dxpl->driver_info) &&
- H5FD_MPIO_COLLECTIVE==dx->xfer_mode) {
- /* let it fall through */
- }else{
+ {
+ /* Get the transfer mode */
+ H5FD_mpio_dxpl_t *dx;
+ hid_t driver_id; /* VFL driver ID */
+
+ /* Get the driver ID */
+ if(H5P_get(dxpl_id, H5D_XFER_VFL_ID_NAME, &driver_id)<0)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve VFL driver ID");
+
+ /* Get the driver information */
+ if(H5P_get(dxpl_id, H5D_XFER_VFL_INFO_NAME, &dx)<0)
+ HGOTO_ERROR (H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve VFL driver info");
+
+ /* Check if we are using the MPIO driver */
+ if(H5FD_MPIO!=driver_id || H5FD_MPIO_COLLECTIVE!=dx->xfer_mode) {
*must_convert = 1; /* can't do optimized xfer; do the old way */
HGOTO_DONE(SUCCEED);
- }
+ } /* end if */
}
#endif
diff --git a/src/H5Tconv.c b/src/H5Tconv.c
index 070c63b..e65e03a 100644
--- a/src/H5Tconv.c
+++ b/src/H5Tconv.c
@@ -1809,7 +1809,6 @@ H5T_conv_vlen(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, hsize_t nelmts,
size_t buf_stride, size_t bkg_stride, void *_buf,
void *_bkg, hid_t dset_xfer_plist)
{
- const H5D_xfer_t *xfer_parms = NULL;
H5T_path_t *tpath; /* Type conversion path */
hid_t tsrc_id = -1, tdst_id = -1;/*temporary type atoms */
H5T_t *src = NULL; /*source data type */
@@ -1867,14 +1866,6 @@ H5T_conv_vlen(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, hsize_t nelmts,
HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type");
}
- /* Get the dataset transfer property list */
- if (H5P_DEFAULT == dset_xfer_plist) {
- xfer_parms = &H5D_xfer_dflt;
- } else if (H5P_DATASET_XFER != H5P_get_class(dset_xfer_plist) ||
- NULL == (xfer_parms = H5I_object(dset_xfer_plist))) {
- HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not xfer parms");
- }
-
/*
* Do we process the values from beginning to end or vice
* versa? Also, how many of the elements have the source and
@@ -1972,7 +1963,7 @@ H5T_conv_vlen(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, hsize_t nelmts,
"datatype conversion failed");
/* Write sequence to destination location */
- if((*(dst->u.vlen.write))(xfer_parms,dst->u.vlen.f,d,conv_buf,
+ if((*(dst->u.vlen.write))(dset_xfer_plist,dst->u.vlen.f,d,conv_buf,
(hsize_t)seq_len,(hsize_t)dst_base_size)<0)
HRETURN_ERROR(H5E_DATATYPE, H5E_WRITEERROR, FAIL,
"can't write VL data");
diff --git a/src/H5Tpkg.h b/src/H5Tpkg.h
index 64ebc0f..8d92d5c 100644
--- a/src/H5Tpkg.h
+++ b/src/H5Tpkg.h
@@ -92,7 +92,7 @@ typedef struct H5T_enum_t {
/* VL function pointers */
typedef hssize_t (*H5T_vlen_getlenfunc_t)(H5F_t *f, void *vl_addr);
typedef herr_t (*H5T_vlen_readfunc_t)(H5F_t *f, void *vl_addr, void *buf, size_t len);
-typedef herr_t (*H5T_vlen_writefunc_t)(const H5D_xfer_t *xfer_parms, H5F_t *f, void *vl_addr, void *buf, hsize_t seq_len, hsize_t base_size);
+typedef herr_t (*H5T_vlen_writefunc_t)(hid_t dxpl_id, H5F_t *f, void *vl_addr, void *buf, hsize_t seq_len, hsize_t base_size);
/* A VL datatype */
typedef struct H5T_vlen_t {
@@ -751,13 +751,13 @@ __DLL__ htri_t H5T_bit_inc(uint8_t *buf, size_t start, size_t size);
/* VL functions */
__DLL__ hssize_t H5T_vlen_seq_mem_getlen(H5F_t *f, void *vl_addr);
__DLL__ herr_t H5T_vlen_seq_mem_read(H5F_t *f, void *vl_addr, void *_buf, size_t len);
-__DLL__ herr_t H5T_vlen_seq_mem_write(const H5D_xfer_t *xfer_parms, H5F_t *f, void *vl_addr, void *_buf, hsize_t seq_len, hsize_t base_size);
+__DLL__ herr_t H5T_vlen_seq_mem_write(hid_t dxpl_id, H5F_t *f, void *vl_addr, void *_buf, hsize_t seq_len, hsize_t base_size);
__DLL__ hssize_t H5T_vlen_str_mem_getlen(H5F_t *f, void *vl_addr);
__DLL__ herr_t H5T_vlen_str_mem_read(H5F_t *f, void *vl_addr, void *_buf, size_t len);
-__DLL__ herr_t H5T_vlen_str_mem_write(const H5D_xfer_t *xfer_parms, H5F_t *f, void *vl_addr, void *_buf, hsize_t seq_len, hsize_t base_size);
+__DLL__ herr_t H5T_vlen_str_mem_write(hid_t dxpl_id, H5F_t *f, void *vl_addr, void *_buf, hsize_t seq_len, hsize_t base_size);
__DLL__ hssize_t H5T_vlen_disk_getlen(H5F_t *f, void *vl_addr);
__DLL__ herr_t H5T_vlen_disk_read(H5F_t *f, void *vl_addr, void *_buf, size_t len);
-__DLL__ herr_t H5T_vlen_disk_write(const H5D_xfer_t *xfer_parms, H5F_t *f, void *vl_addr, void *_buf, hsize_t seq_len, hsize_t base_size);
+__DLL__ herr_t H5T_vlen_disk_write(hid_t dxpl_id, H5F_t *f, void *vl_addr, void *_buf, hsize_t seq_len, hsize_t base_size);
/* Array functions */
__DLL__ H5T_t * H5T_array_create(H5T_t *base, int ndims,
diff --git a/src/H5Tvlen.c b/src/H5Tvlen.c
index e1515ab..6932d70 100644
--- a/src/H5Tvlen.c
+++ b/src/H5Tvlen.c
@@ -18,6 +18,7 @@
#include "H5Eprivate.h" /* Errors */
#include "H5HGprivate.h" /* Global Heaps */
#include "H5Iprivate.h" /* IDs */
+#include "H5Pprivate.h" /* Property Lists */
#include "H5MMprivate.h" /* Memory Allocation */
#include "H5Tpkg.h" /* Datatypes */
@@ -202,8 +203,10 @@ herr_t H5T_vlen_seq_mem_read(H5F_t UNUSED *f, void *vl_addr, void *buf, size_t l
*
*-------------------------------------------------------------------------
*/
-herr_t H5T_vlen_seq_mem_write(const H5D_xfer_t *xfer_parms, H5F_t UNUSED *f, void *vl_addr, void *buf, hsize_t seq_len, hsize_t base_size)
+herr_t H5T_vlen_seq_mem_write(hid_t plist_id, H5F_t UNUSED *f, void *vl_addr, void *buf, hsize_t seq_len, hsize_t base_size)
{
+ H5MM_allocate_t alloc_func; /* Vlen allocation function */
+ void *alloc_info; /* Vlen allocation information */
hvl_t *vl=(hvl_t *)vl_addr; /* Pointer to the user's hvl_t information */
size_t len=seq_len*base_size;
@@ -216,8 +219,15 @@ herr_t H5T_vlen_seq_mem_write(const H5D_xfer_t *xfer_parms, H5F_t UNUSED *f, voi
if(seq_len!=0) {
/* Use the user's memory allocation routine is one is defined */
assert((seq_len*base_size)==(hsize_t)((size_t)(seq_len*base_size))); /*check for overflow*/
- if(xfer_parms->vlen_alloc!=NULL) {
- if(NULL==(vl->p=(xfer_parms->vlen_alloc)((size_t)(seq_len*base_size),xfer_parms->alloc_info)))
+
+ /* Get the allocation function & info */
+ if (H5P_get(plist_id,H5D_XFER_VLEN_ALLOC_NAME,&alloc_func)<0)
+ HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get value");
+ if (H5P_get(plist_id,H5D_XFER_VLEN_ALLOC_INFO_NAME,&alloc_info)<0)
+ HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get value");
+
+ if(alloc_func!=NULL) {
+ if(NULL==(vl->p=(alloc_func)((size_t)(seq_len*base_size),alloc_info)))
HRETURN_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for VL data");
} /* end if */
else { /* Default to system malloc */
@@ -313,8 +323,10 @@ herr_t H5T_vlen_str_mem_read(H5F_t UNUSED *f, void *vl_addr, void *buf, size_t l
*
*-------------------------------------------------------------------------
*/
-herr_t H5T_vlen_str_mem_write(const H5D_xfer_t *xfer_parms, H5F_t UNUSED *f, void *vl_addr, void *buf, hsize_t seq_len, hsize_t base_size)
+herr_t H5T_vlen_str_mem_write(hid_t plist_id, H5F_t UNUSED *f, void *vl_addr, void *buf, hsize_t seq_len, hsize_t base_size)
{
+ H5MM_allocate_t alloc_func; /* Vlen allocation function */
+ void *alloc_info; /* Vlen allocation information */
char **s=(char **)vl_addr; /* Pointer to the user's hvl_t information */
size_t len=seq_len*base_size;
@@ -325,8 +337,15 @@ herr_t H5T_vlen_str_mem_write(const H5D_xfer_t *xfer_parms, H5F_t UNUSED *f, voi
/* Use the user's memory allocation routine is one is defined */
assert(((seq_len+1)*base_size)==(hsize_t)((size_t)((seq_len+1)*base_size))); /*check for overflow*/
- if(xfer_parms->vlen_alloc!=NULL) {
- if(NULL==(*s=(xfer_parms->vlen_alloc)((size_t)((seq_len+1)*base_size),xfer_parms->alloc_info)))
+
+ /* Get the allocation function & info */
+ if (H5P_get(plist_id,H5D_XFER_VLEN_ALLOC_NAME,&alloc_func)<0)
+ HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get value");
+ if (H5P_get(plist_id,H5D_XFER_VLEN_ALLOC_INFO_NAME,&alloc_info)<0)
+ HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get value");
+
+ if(alloc_func!=NULL) {
+ if(NULL==(*s=(alloc_func)((size_t)((seq_len+1)*base_size),alloc_info)))
HRETURN_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for VL data");
} /* end if */
else { /* Default to system malloc */
@@ -430,7 +449,7 @@ herr_t H5T_vlen_disk_read(H5F_t *f, void *vl_addr, void *buf, size_t UNUSED len)
*
*-------------------------------------------------------------------------
*/
-herr_t H5T_vlen_disk_write(const H5D_xfer_t UNUSED *xfer_parms, H5F_t *f, void *vl_addr, void *buf, hsize_t seq_len, hsize_t base_size)
+herr_t H5T_vlen_disk_write(hid_t plist_id, H5F_t *f, void *vl_addr, void *buf, hsize_t seq_len, hsize_t base_size)
{
uint8_t *vl=(uint8_t *)vl_addr; /* Pointer to the user's hvl_t information */
H5HG_t hobjid;
@@ -600,7 +619,9 @@ done:
herr_t
H5T_vlen_reclaim(void *elem, hid_t type_id, hsize_t UNUSED ndim, hssize_t UNUSED *point, void *op_data)
{
- H5D_xfer_t *xfer_parms = (H5D_xfer_t *)op_data; /* Dataset transfer plist from iterator */
+ hid_t plist_id = *(hid_t *)op_data; /* Dataset transfer plist from iterator */
+ H5MM_free_t free_func; /* Vlen free function */
+ void *free_info=NULL; /* Vlen free information */
H5T_t *dt = NULL;
herr_t ret_value = FAIL;
@@ -613,8 +634,14 @@ H5T_vlen_reclaim(void *elem, hid_t type_id, hsize_t UNUSED ndim, hssize_t UNUSED
if (H5I_DATATYPE!=H5I_get_type(type_id) || NULL==(dt=H5I_object(type_id)))
HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type");
+ /* Get the free func & information */
+ if (H5P_get(plist_id,H5D_XFER_VLEN_FREE_NAME,&free_func)<0)
+ HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get value");
+ if (H5P_get(plist_id,H5D_XFER_VLEN_FREE_INFO_NAME,&free_info)<0)
+ HRETURN_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get value");
+
/* Pull the free function and free info pointer out of the op_data and call the recurse datatype free function */
- ret_value=H5T_vlen_reclaim_recurse(elem,dt,xfer_parms->vlen_free,xfer_parms->free_info);
+ ret_value=H5T_vlen_reclaim_recurse(elem,dt,free_func,free_info);
#ifdef LATER
done: