mirror of
https://github.com/HDFGroup/hdf5.git
synced 2025-03-19 16:50:46 +08:00
[svn-r23017] I added a prototype function H5DOwrite_chunk in HL library for Dectris people to test performance. The library's API function H5PSIdirect_write
is still in. I reorganized the internal library by adding H5D__pre_write function. Tested on koala.
This commit is contained in:
parent
0cf58a4755
commit
b7041a91cd
@ -31,12 +31,12 @@ lib_LTLIBRARIES=libhdf5_hl.la
|
||||
libhdf5_hl_la_LDFLAGS= -version-info $(LT_VERS_INTERFACE):$(LT_VERS_REVISION):$(LT_VERS_AGE) $(AM_LDFLAGS)
|
||||
|
||||
# List sources to include in the HDF5 HL Library.
|
||||
libhdf5_hl_la_SOURCES=H5DS.c H5IM.c H5LT.c H5LTanalyze.c H5LTparse.c H5PT.c H5TB.c
|
||||
libhdf5_hl_la_SOURCES=H5DO.c H5DS.c H5IM.c H5LT.c H5LTanalyze.c H5LTparse.c H5PT.c H5TB.c
|
||||
|
||||
# HDF5 HL library depends on HDF5 Library.
|
||||
libhdf5_hl_la_LIBADD=$(LIBHDF5)
|
||||
|
||||
# Public header files (to be installed)
|
||||
include_HEADERS=hdf5_hl.h H5IMpublic.h H5LTpublic.h H5TBpublic.h H5DSpublic.h H5PTpublic.h
|
||||
include_HEADERS=hdf5_hl.h H5DOpublic.h H5IMpublic.h H5LTpublic.h H5TBpublic.h H5DSpublic.h H5PTpublic.h
|
||||
|
||||
include $(top_srcdir)/config/conclude.am
|
||||
|
@ -114,8 +114,8 @@ am__uninstall_files_from_dir = { \
|
||||
am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"
|
||||
LTLIBRARIES = $(lib_LTLIBRARIES)
|
||||
libhdf5_hl_la_DEPENDENCIES = $(LIBHDF5)
|
||||
am_libhdf5_hl_la_OBJECTS = H5DS.lo H5IM.lo H5LT.lo H5LTanalyze.lo \
|
||||
H5LTparse.lo H5PT.lo H5TB.lo
|
||||
am_libhdf5_hl_la_OBJECTS = H5DO.lo H5DS.lo H5IM.lo H5LT.lo \
|
||||
H5LTanalyze.lo H5LTparse.lo H5PT.lo H5TB.lo
|
||||
libhdf5_hl_la_OBJECTS = $(am_libhdf5_hl_la_OBJECTS)
|
||||
AM_V_lt = $(am__v_lt_@AM_V@)
|
||||
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
|
||||
@ -467,13 +467,13 @@ lib_LTLIBRARIES = libhdf5_hl.la
|
||||
libhdf5_hl_la_LDFLAGS = -version-info $(LT_VERS_INTERFACE):$(LT_VERS_REVISION):$(LT_VERS_AGE) $(AM_LDFLAGS)
|
||||
|
||||
# List sources to include in the HDF5 HL Library.
|
||||
libhdf5_hl_la_SOURCES = H5DS.c H5IM.c H5LT.c H5LTanalyze.c H5LTparse.c H5PT.c H5TB.c
|
||||
libhdf5_hl_la_SOURCES = H5DO.c H5DS.c H5IM.c H5LT.c H5LTanalyze.c H5LTparse.c H5PT.c H5TB.c
|
||||
|
||||
# HDF5 HL library depends on HDF5 Library.
|
||||
libhdf5_hl_la_LIBADD = $(LIBHDF5)
|
||||
|
||||
# Public header files (to be installed)
|
||||
include_HEADERS = hdf5_hl.h H5IMpublic.h H5LTpublic.h H5TBpublic.h H5DSpublic.h H5PTpublic.h
|
||||
include_HEADERS = hdf5_hl.h H5DOpublic.h H5IMpublic.h H5LTpublic.h H5TBpublic.h H5DSpublic.h H5PTpublic.h
|
||||
|
||||
# Automake needs to be taught how to build lib, progs, and tests targets.
|
||||
# These will be filled in automatically for the most part (e.g.,
|
||||
@ -572,6 +572,7 @@ mostlyclean-compile:
|
||||
distclean-compile:
|
||||
-rm -f *.tab.c
|
||||
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5DO.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5DS.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5IM.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5LT.Plo@am__quote@
|
||||
|
@ -29,7 +29,7 @@ LDADD=$(LIBH5_HL) $(LIBH5TEST) $(LIBHDF5)
|
||||
|
||||
# Test programs. These are our main targets. They should be listed in the
|
||||
# order to be executed, generally most specific tests to least specific tests.
|
||||
TEST_PROG=test_lite test_image test_file_image test_table test_ds test_packet
|
||||
TEST_PROG=test_lite test_image test_file_image test_table test_ds test_packet test_dset_opt
|
||||
check_PROGRAMS=$(TEST_PROG)
|
||||
|
||||
# These programs generate test files for the tests. They don't need to be
|
||||
@ -46,6 +46,7 @@ endif
|
||||
# Temporary files. These files are the ones created by running `make test'.
|
||||
CHECK_CLEANFILES+=combine_tables[1-2].h5 test_ds[1-9].h5 test_ds10.h5 \
|
||||
test_image[1-3].h5 file_img[1-2].h5 test_lite[1-4].h5 test_table.h5 \
|
||||
test_packet_table.h5 test_packet_compress.h5 test_detach.h5
|
||||
test_packet_table.h5 test_packet_compress.h5 test_detach.h5 \
|
||||
test_dectris.h5
|
||||
|
||||
include $(top_srcdir)/config/conclude.am
|
||||
|
@ -88,7 +88,7 @@ CONFIG_CLEAN_FILES = H5srcdir_str.h
|
||||
CONFIG_CLEAN_VPATH_FILES =
|
||||
am__EXEEXT_1 = test_lite$(EXEEXT) test_image$(EXEEXT) \
|
||||
test_file_image$(EXEEXT) test_table$(EXEEXT) test_ds$(EXEEXT) \
|
||||
test_packet$(EXEEXT)
|
||||
test_packet$(EXEEXT) test_dset_opt$(EXEEXT)
|
||||
am__EXEEXT_2 = gen_test_ds$(EXEEXT)
|
||||
PROGRAMS = $(noinst_PROGRAMS)
|
||||
gen_test_ds_SOURCES = gen_test_ds.c
|
||||
@ -103,6 +103,10 @@ test_ds_SOURCES = test_ds.c
|
||||
test_ds_OBJECTS = test_ds.$(OBJEXT)
|
||||
test_ds_LDADD = $(LDADD)
|
||||
test_ds_DEPENDENCIES = $(LIBH5_HL) $(LIBH5TEST) $(LIBHDF5)
|
||||
test_dset_opt_SOURCES = test_dset_opt.c
|
||||
test_dset_opt_OBJECTS = test_dset_opt.$(OBJEXT)
|
||||
test_dset_opt_LDADD = $(LDADD)
|
||||
test_dset_opt_DEPENDENCIES = $(LIBH5_HL) $(LIBH5TEST) $(LIBHDF5)
|
||||
test_file_image_SOURCES = test_file_image.c
|
||||
test_file_image_OBJECTS = test_file_image.$(OBJEXT)
|
||||
test_file_image_LDADD = $(LDADD)
|
||||
@ -157,10 +161,11 @@ AM_V_CCLD = $(am__v_CCLD_@AM_V@)
|
||||
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
|
||||
am__v_CCLD_0 = @echo " CCLD " $@;
|
||||
am__v_CCLD_1 =
|
||||
SOURCES = gen_test_ds.c test_ds.c test_file_image.c test_image.c \
|
||||
test_lite.c test_packet.c test_table.c
|
||||
DIST_SOURCES = gen_test_ds.c test_ds.c test_file_image.c test_image.c \
|
||||
test_lite.c test_packet.c test_table.c
|
||||
SOURCES = gen_test_ds.c test_ds.c test_dset_opt.c test_file_image.c \
|
||||
test_image.c test_lite.c test_packet.c test_table.c
|
||||
DIST_SOURCES = gen_test_ds.c test_ds.c test_dset_opt.c \
|
||||
test_file_image.c test_image.c test_lite.c test_packet.c \
|
||||
test_table.c
|
||||
am__can_run_installinfo = \
|
||||
case $$AM_UPDATE_INFO_DIR in \
|
||||
n|no|NO) false;; \
|
||||
@ -460,14 +465,15 @@ TRACE = perl $(top_srcdir)/bin/trace
|
||||
CHECK_CLEANFILES = *.chkexe *.chklog *.clog combine_tables[1-2].h5 \
|
||||
test_ds[1-9].h5 test_ds10.h5 test_image[1-3].h5 \
|
||||
file_img[1-2].h5 test_lite[1-4].h5 test_table.h5 \
|
||||
test_packet_table.h5 test_packet_compress.h5 test_detach.h5
|
||||
test_packet_table.h5 test_packet_compress.h5 test_detach.h5 \
|
||||
test_dectris.h5
|
||||
|
||||
# The tests depend on the hdf5, hdf5 test, and hdf5_hl libraries
|
||||
LDADD = $(LIBH5_HL) $(LIBH5TEST) $(LIBHDF5)
|
||||
|
||||
# Test programs. These are our main targets. They should be listed in the
|
||||
# order to be executed, generally most specific tests to least specific tests.
|
||||
TEST_PROG = test_lite test_image test_file_image test_table test_ds test_packet
|
||||
TEST_PROG = test_lite test_image test_file_image test_table test_ds test_packet test_dset_opt
|
||||
|
||||
# These programs generate test files for the tests. They don't need to be
|
||||
# compiled every time we want to test the library. However, putting
|
||||
@ -556,6 +562,9 @@ gen_test_ds$(EXEEXT): $(gen_test_ds_OBJECTS) $(gen_test_ds_DEPENDENCIES) $(EXTRA
|
||||
test_ds$(EXEEXT): $(test_ds_OBJECTS) $(test_ds_DEPENDENCIES) $(EXTRA_test_ds_DEPENDENCIES)
|
||||
@rm -f test_ds$(EXEEXT)
|
||||
$(AM_V_CCLD)$(LINK) $(test_ds_OBJECTS) $(test_ds_LDADD) $(LIBS)
|
||||
test_dset_opt$(EXEEXT): $(test_dset_opt_OBJECTS) $(test_dset_opt_DEPENDENCIES) $(EXTRA_test_dset_opt_DEPENDENCIES)
|
||||
@rm -f test_dset_opt$(EXEEXT)
|
||||
$(AM_V_CCLD)$(LINK) $(test_dset_opt_OBJECTS) $(test_dset_opt_LDADD) $(LIBS)
|
||||
test_file_image$(EXEEXT): $(test_file_image_OBJECTS) $(test_file_image_DEPENDENCIES) $(EXTRA_test_file_image_DEPENDENCIES)
|
||||
@rm -f test_file_image$(EXEEXT)
|
||||
$(AM_V_CCLD)$(LINK) $(test_file_image_OBJECTS) $(test_file_image_LDADD) $(LIBS)
|
||||
@ -580,6 +589,7 @@ distclean-compile:
|
||||
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gen_test_ds.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_ds.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_dset_opt.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_file_image.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_image.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_lite.Po@am__quote@
|
||||
|
@ -51,7 +51,6 @@
|
||||
static herr_t make_attributes( hid_t loc_id, const char* obj_name );
|
||||
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* test dataset functions
|
||||
*-------------------------------------------------------------------------
|
||||
@ -2137,7 +2136,6 @@ static int test_valid_path(void)
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* the main program
|
||||
*-------------------------------------------------------------------------
|
||||
@ -2166,6 +2164,4 @@ int main( void )
|
||||
|
||||
error:
|
||||
return 1;
|
||||
|
||||
|
||||
}
|
||||
|
@ -296,7 +296,7 @@ H5FL_BLK_DEFINE_STATIC(chunk);
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
herr_t
|
||||
H5D__chunk_direct_write(const H5D_t *dset, hid_t dxpl_id, unsigned filters, hsize_t *offset,
|
||||
H5D__chunk_direct_write(const H5D_t *dset, hid_t dxpl_id, uint32_t filters, hsize_t *offset,
|
||||
size_t data_size, const void *buf)
|
||||
{
|
||||
const H5O_layout_t *layout = &(dset->shared->layout); /* Dataset layout */
|
||||
|
182
src/H5Dio.c
182
src/H5Dio.c
@ -58,6 +58,8 @@ static herr_t H5D__read(H5D_t *dataset, hid_t mem_type_id,
|
||||
static herr_t H5D__write(H5D_t *dataset, hid_t mem_type_id,
|
||||
const H5S_t *mem_space, const H5S_t *file_space, hid_t dset_xfer_plist,
|
||||
const void *buf);
|
||||
static herr_t H5D__pre_write(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id,
|
||||
hid_t file_space_id, hid_t dxpl_id, const void *buf);
|
||||
|
||||
/* Setup/teardown routines */
|
||||
static herr_t H5D__ioinfo_init(H5D_t *dset, const H5D_dxpl_cache_t *dxpl_cache,
|
||||
@ -215,37 +217,51 @@ herr_t
|
||||
H5Dwrite(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id,
|
||||
hid_t file_space_id, hid_t dxpl_id, const void *buf)
|
||||
{
|
||||
H5D_t *dset = NULL;
|
||||
const H5S_t *mem_space = NULL;
|
||||
const H5S_t *file_space = NULL;
|
||||
char fake_char;
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE6("e", "iiiii*x", dset_id, mem_type_id, mem_space_id, file_space_id,
|
||||
dxpl_id, buf);
|
||||
|
||||
if(!dset_id)
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
|
||||
|
||||
if(H5D__pre_write(dset_id, mem_type_id, mem_space_id, file_space_id, dxpl_id, buf) < 0)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "can't prepare for writing data")
|
||||
|
||||
done:
|
||||
FUNC_LEAVE_API(ret_value)
|
||||
} /* end H5Dwrite() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5D__pre_write
|
||||
*
|
||||
* Purpose: Preparation for writing data.
|
||||
*
|
||||
* Return: Non-negative on success/Negative on failure
|
||||
*
|
||||
* Programmer: Raymond Lu
|
||||
* 2 November 2012
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
static herr_t
|
||||
H5D__pre_write(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id,
|
||||
hid_t file_space_id, hid_t dxpl_id, const void *buf)
|
||||
{
|
||||
H5D_t *dset = NULL;
|
||||
H5P_genplist_t *plist; /* Property list pointer */
|
||||
htri_t direct_write = FALSE;
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_NOAPI(FAIL)
|
||||
|
||||
/* check arguments */
|
||||
if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
|
||||
if(NULL == dset->oloc.file)
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
|
||||
if(H5S_ALL != mem_space_id) {
|
||||
if(NULL == (mem_space = (const H5S_t *)H5I_object_verify(mem_space_id, H5I_DATASPACE)))
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
|
||||
|
||||
/* Check for valid selection */
|
||||
if(H5S_SELECT_VALID(mem_space) != TRUE)
|
||||
HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "memory selection+offset not within extent")
|
||||
} /* end if */
|
||||
if(H5S_ALL != file_space_id) {
|
||||
if(NULL == (file_space = (const H5S_t *)H5I_object_verify(file_space_id, H5I_DATASPACE)))
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
|
||||
|
||||
/* Check for valid selection */
|
||||
if(H5S_SELECT_VALID(file_space) != TRUE)
|
||||
HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "file selection+offset not within extent")
|
||||
} /* end if */
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
|
||||
|
||||
/* Get the default dataset transfer property list if the user didn't provide one */
|
||||
if(H5P_DEFAULT == dxpl_id)
|
||||
@ -253,23 +269,107 @@ H5Dwrite(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id,
|
||||
else
|
||||
if(TRUE != H5P_isa_class(dxpl_id, H5P_DATASET_XFER))
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not xfer parms")
|
||||
if(!buf && (NULL == file_space || H5S_GET_SELECT_NPOINTS(file_space) != 0))
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no output buffer")
|
||||
|
||||
/* If the buffer is nil, and 0 element is selected, make a fake buffer.
|
||||
* This is for some MPI package like ChaMPIon on NCSA's tungsten which
|
||||
* doesn't support this feature.
|
||||
*/
|
||||
if(!buf)
|
||||
buf = &fake_char;
|
||||
/* Get the plist structure */
|
||||
if(NULL == (plist = H5P_object_verify(dxpl_id, H5P_DATASET_XFER)))
|
||||
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
|
||||
|
||||
/* write raw data */
|
||||
if(H5D__write(dset, mem_type_id, mem_space, file_space, dxpl_id, buf) < 0)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "can't write data")
|
||||
if(H5P_get(plist, H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_NAME, &direct_write) < 0)
|
||||
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "error getting flag for direct chunk write")
|
||||
|
||||
/* Direct chunk write */
|
||||
if(direct_write) {
|
||||
uint32_t direct_filters = 0;
|
||||
hsize_t *direct_offset;
|
||||
size_t direct_datasize = 0;
|
||||
int ndims = 0;
|
||||
hsize_t *dims = NULL;
|
||||
hsize_t *internal_offset = NULL;
|
||||
int i;
|
||||
|
||||
if(H5D_CHUNKED != dset->shared->layout.type)
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a chunked dataset")
|
||||
|
||||
|
||||
if(H5P_get(plist, H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_NAME, &direct_filters) < 0)
|
||||
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "error getting filter info for direct chunk write")
|
||||
|
||||
if(H5P_get(plist, H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_NAME, &direct_offset) < 0)
|
||||
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "error getting offset info for direct chunk write")
|
||||
|
||||
if(H5P_get(plist, H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_NAME, &direct_datasize) < 0)
|
||||
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "error getting data size for direct chunk write")
|
||||
|
||||
/* The library's chunking code requires the offset terminates with a zero. So transfer the
|
||||
* offset array to an internal offset array */
|
||||
ndims = (int)H5S_GET_EXTENT_NDIMS(dset->shared->space);
|
||||
if(NULL == (dims = (hsize_t *)H5MM_malloc(ndims*sizeof(hsize_t))))
|
||||
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for dimensions")
|
||||
|
||||
if(NULL == (internal_offset = (hsize_t *)H5MM_malloc((ndims+1)*sizeof(hsize_t))))
|
||||
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for offset")
|
||||
|
||||
if(H5S_get_simple_extent_dims(dset->shared->space, dims, NULL) < 0)
|
||||
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't retrieve dataspace extent dims")
|
||||
|
||||
for(i=0; i<ndims; i++) {
|
||||
/* Make sure the offset doesn't exceed the dataset's dimensions */
|
||||
if(direct_offset[i] > dims[i])
|
||||
HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "offset exceeds dimensions of dataset")
|
||||
|
||||
/* Make sure the offset fall right on a chunk's boundary */
|
||||
if(direct_offset[i] % dset->shared->layout.u.chunk.dim[i])
|
||||
HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "offset doesn't fall on chunks's boundary")
|
||||
|
||||
internal_offset[i] = direct_offset[i];
|
||||
}
|
||||
|
||||
/* Terminate the offset with a zero */
|
||||
internal_offset[ndims] = 0;
|
||||
|
||||
/* write raw data */
|
||||
if(H5D__chunk_direct_write(dset, dxpl_id, direct_filters, internal_offset, direct_datasize, buf) < 0)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "can't write chunk directly")
|
||||
} else { /* Normal write */
|
||||
const H5S_t *mem_space = NULL;
|
||||
const H5S_t *file_space = NULL;
|
||||
char fake_char;
|
||||
|
||||
if(H5S_ALL != mem_space_id) {
|
||||
if(NULL == (mem_space = (const H5S_t *)H5I_object_verify(mem_space_id, H5I_DATASPACE)))
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
|
||||
|
||||
/* Check for valid selection */
|
||||
if(H5S_SELECT_VALID(mem_space) != TRUE)
|
||||
HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "memory selection+offset not within extent")
|
||||
} /* end if */
|
||||
if(H5S_ALL != file_space_id) {
|
||||
if(NULL == (file_space = (const H5S_t *)H5I_object_verify(file_space_id, H5I_DATASPACE)))
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
|
||||
|
||||
/* Check for valid selection */
|
||||
if(H5S_SELECT_VALID(file_space) != TRUE)
|
||||
HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "file selection+offset not within extent")
|
||||
} /* end if */
|
||||
|
||||
if(!buf && (NULL == file_space || H5S_GET_SELECT_NPOINTS(file_space) != 0))
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no output buffer")
|
||||
|
||||
/* If the buffer is nil, and 0 element is selected, make a fake buffer.
|
||||
* This is for some MPI package like ChaMPIon on NCSA's tungsten which
|
||||
* doesn't support this feature.
|
||||
*/
|
||||
if(!buf)
|
||||
buf = &fake_char;
|
||||
|
||||
/* write raw data */
|
||||
if(H5D__write(dset, mem_type_id, mem_space, file_space, dxpl_id, buf) < 0)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "can't write data")
|
||||
}
|
||||
|
||||
done:
|
||||
FUNC_LEAVE_API(ret_value)
|
||||
} /* end H5Dwrite() */
|
||||
FUNC_LEAVE_NOAPI(ret_value)
|
||||
} /* end H5D__pre_write() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
@ -286,7 +386,7 @@ done:
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
herr_t
|
||||
H5PSIdirect_write(hid_t dset_id, hid_t dxpl_id, unsigned filters, hsize_t *offset,
|
||||
H5PSIdirect_write(hid_t dset_id, hid_t dxpl_id, uint32_t filters, hsize_t *offset,
|
||||
size_t data_size, const void *buf)
|
||||
{
|
||||
H5D_t *dset = NULL;
|
||||
@ -302,7 +402,7 @@ H5PSIdirect_write(hid_t dset_id, hid_t dxpl_id, unsigned filters, hsize_t *offse
|
||||
if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
|
||||
if(NULL == dset->oloc.file)
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
|
||||
|
||||
if(H5D_CHUNKED != dset->shared->layout.type)
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a chunked dataset")
|
||||
@ -314,8 +414,14 @@ H5PSIdirect_write(hid_t dset_id, hid_t dxpl_id, unsigned filters, hsize_t *offse
|
||||
if(TRUE != H5P_isa_class(dxpl_id, H5P_DATASET_XFER))
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not xfer parms")
|
||||
|
||||
if(!offset)
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no offset")
|
||||
|
||||
if(!data_size)
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no data size")
|
||||
|
||||
if(!buf)
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no output buffer")
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no data buffer")
|
||||
|
||||
ndims = (int)H5S_GET_EXTENT_NDIMS(dset->shared->space);
|
||||
if(NULL == (dims = (hsize_t *)H5MM_malloc(ndims*sizeof(hsize_t))))
|
||||
@ -344,7 +450,7 @@ H5PSIdirect_write(hid_t dset_id, hid_t dxpl_id, unsigned filters, hsize_t *offse
|
||||
|
||||
/* write raw data */
|
||||
if(H5D__chunk_direct_write(dset, dxpl_id, filters, internal_offset, data_size, buf) < 0)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "can't write data")
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "can't write chunk directly")
|
||||
|
||||
done:
|
||||
if(dims)
|
||||
|
@ -176,7 +176,7 @@ H5_DLL herr_t H5D_chunk_idx_reset(H5O_storage_chunk_t *storage, hbool_t reset_ad
|
||||
H5_DLL herr_t H5D_btree_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE * stream,
|
||||
int indent, int fwidth, unsigned ndims);
|
||||
|
||||
H5_DLL herr_t H5D__chunk_direct_write(const H5D_t *dset, hid_t dxpl_id, unsigned filters,
|
||||
H5_DLL herr_t H5D__chunk_direct_write(const H5D_t *dset, hid_t dxpl_id, uint32_t filters,
|
||||
hsize_t *offset, size_t data_size, const void *buf);
|
||||
|
||||
#endif /* _H5Dprivate_H */
|
||||
|
@ -34,6 +34,12 @@
|
||||
#define H5D_CHUNK_CACHE_NBYTES_DEFAULT ((size_t) -1)
|
||||
#define H5D_CHUNK_CACHE_W0_DEFAULT -1.
|
||||
|
||||
/* Property names for H5LTDdirect_chunk_write */
|
||||
#define H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_NAME "direct_chunk_flag"
|
||||
#define H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_NAME "direct_chunk_filters"
|
||||
#define H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_NAME "direct_chunk_offset"
|
||||
#define H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_NAME "direct_chunk_datasize"
|
||||
|
||||
/*******************/
|
||||
/* Public Typedefs */
|
||||
/*******************/
|
||||
@ -118,7 +124,7 @@ H5_DLL herr_t H5Dread(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id,
|
||||
hid_t file_space_id, hid_t plist_id, void *buf/*out*/);
|
||||
H5_DLL herr_t H5Dwrite(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id,
|
||||
hid_t file_space_id, hid_t plist_id, const void *buf);
|
||||
H5_DLL herr_t H5PSIdirect_write(hid_t dset_id, hid_t dxpl_id, unsigned filters, hsize_t *offset,
|
||||
H5_DLL herr_t H5PSIdirect_write(hid_t dset_id, hid_t dxpl_id, uint32_t filters, hsize_t *offset,
|
||||
size_t data_size, const void *buf);
|
||||
H5_DLL herr_t H5Diterate(void *buf, hid_t type_id, hid_t space_id,
|
||||
H5D_operator_t op, void *operator_data);
|
||||
|
@ -158,6 +158,15 @@
|
||||
#define H5D_XFER_XFORM_COPY H5P__dxfr_xform_copy
|
||||
#define H5D_XFER_XFORM_CMP H5P__dxfr_xform_cmp
|
||||
#define H5D_XFER_XFORM_CLOSE H5P__dxfr_xform_close
|
||||
/* Definitions for properties of direct chunk write */
|
||||
#define H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_SIZE sizeof(htri_t)
|
||||
#define H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_DEF FALSE
|
||||
#define H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_SIZE sizeof(uint32_t)
|
||||
#define H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_DEF 0
|
||||
#define H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_SIZE sizeof(hsize_t *)
|
||||
#define H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_DEF NULL
|
||||
#define H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_SIZE sizeof(size_t)
|
||||
#define H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_DEF 0
|
||||
|
||||
/******************/
|
||||
/* Local Typedefs */
|
||||
@ -255,7 +264,10 @@ static const H5Z_EDC_t H5D_def_enable_edc_g = H5D_XFER_EDC_DEF; /* De
|
||||
static const H5Z_cb_t H5D_def_filter_cb_g = H5D_XFER_FILTER_CB_DEF; /* Default value for filter callback */
|
||||
static const H5T_conv_cb_t H5D_def_conv_cb_g = H5D_XFER_CONV_CB_DEF; /* Default value for datatype conversion callback */
|
||||
static const void *H5D_def_xfer_xform_g = H5D_XFER_XFORM_DEF; /* Default value for data transform */
|
||||
|
||||
static const htri_t H5D_def_direct_chunk_flag_g = H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_DEF; /* Default value for the flag of direct chunk write */
|
||||
static const uint32_t H5D_def_direct_chunk_filters_g = H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_DEF; /* Default value for the filters of direct chunk write */
|
||||
static const hsize_t *H5D_def_direct_chunk_offset_g = H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_DEF; /* Default value for the offset of direct chunk write */
|
||||
static const size_t H5D_def_direct_chunk_datasize_g = H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_DEF; /* Default value for the datasize of direct chunk write */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
@ -426,6 +438,26 @@ H5P__dxfr_reg_prop(H5P_genclass_t *pclass)
|
||||
H5D_XFER_XFORM_DEL, H5D_XFER_XFORM_COPY, H5D_XFER_XFORM_CMP, H5D_XFER_XFORM_CLOSE) < 0)
|
||||
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
|
||||
|
||||
/* Register the property of flag for direct chunk write */
|
||||
if(H5P_register_real(pclass, H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_NAME, H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_SIZE, &H5D_def_direct_chunk_flag_g,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
|
||||
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
|
||||
|
||||
/* Register the property of filter for direct chunk write */
|
||||
if(H5P_register_real(pclass, H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_NAME, H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_SIZE, &H5D_def_direct_chunk_filters_g,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
|
||||
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
|
||||
|
||||
/* Register the property of offset for direct chunk write */
|
||||
if(H5P_register_real(pclass, H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_NAME, H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_SIZE, &H5D_def_direct_chunk_offset_g,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
|
||||
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
|
||||
|
||||
/* Register the property of datasize for direct chunk write */
|
||||
if(H5P_register_real(pclass, H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_NAME, H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_SIZE, &H5D_def_direct_chunk_datasize_g,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
|
||||
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
|
||||
|
||||
done:
|
||||
FUNC_LEAVE_NOAPI(ret_value)
|
||||
} /* end H5P__dxfr_reg_prop() */
|
||||
|
@ -57,6 +57,9 @@ HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
|
||||
#001: (file name) line (number) in test_error2(): H5Dwrite shouldn't succeed
|
||||
major: Error API
|
||||
minor: Write failed
|
||||
#002: (file name) line (number) in H5Dwrite(): not a dataset
|
||||
#002: (file name) line (number) in H5Dwrite(): can't prepare for writing data
|
||||
major: Dataset
|
||||
minor: Write failed
|
||||
#003: (file name) line (number) in H5D__pre_write(): not a dataset
|
||||
major: Invalid arguments to routine
|
||||
minor: Inappropriate type
|
||||
|
Loading…
x
Reference in New Issue
Block a user