mirror of
https://github.com/HDFGroup/hdf5.git
synced 2025-01-06 14:56:51 +08:00
[svn-r23162] synchronized DECTRIS branch (r23161) with the trunk
This commit is contained in:
commit
ec704e0077
5
MANIFEST
5
MANIFEST
@ -2157,6 +2157,9 @@
|
||||
./hl/src/COPYING
|
||||
./hl/src/Makefile.am
|
||||
./hl/src/Makefile.in
|
||||
./hl/src/H5DO.c
|
||||
./hl/src/H5DOprivate.h
|
||||
./hl/src/H5DOpublic.h
|
||||
./hl/src/H5DS.c
|
||||
./hl/src/H5DSprivate.h
|
||||
./hl/src/H5DSpublic.h
|
||||
@ -2195,8 +2198,10 @@
|
||||
./hl/test/image24plane.txt
|
||||
./hl/test/pal_rgb.h
|
||||
./hl/test/sepia.pal
|
||||
./hl/test/dectris_hl_perf.c
|
||||
./hl/test/gen_test_ds.c
|
||||
./hl/test/test_ds.c
|
||||
./hl/test/test_dset_opt.c
|
||||
./hl/test/test_file_image.c
|
||||
./hl/test/test_image.c
|
||||
./hl/test/test_lite.c
|
||||
|
@ -14,6 +14,7 @@ ENDIF (BUILD_SHARED_LIBS)
|
||||
INCLUDE_DIRECTORIES (${HDF5_HL_SRC_DIR}/src)
|
||||
|
||||
SET (HL_SRCS
|
||||
${HDF5_HL_SRC_SOURCE_DIR}/H5DO.c
|
||||
${HDF5_HL_SRC_SOURCE_DIR}/H5DS.c
|
||||
${HDF5_HL_SRC_SOURCE_DIR}/H5IM.c
|
||||
${HDF5_HL_SRC_SOURCE_DIR}/H5LT.c
|
||||
@ -24,6 +25,7 @@ SET (HL_SRCS
|
||||
)
|
||||
|
||||
SET (HL_HEADERS
|
||||
${HDF5_HL_SRC_SOURCE_DIR}/H5DOpublic.h
|
||||
${HDF5_HL_SRC_SOURCE_DIR}/H5DSpublic.h
|
||||
${HDF5_HL_SRC_SOURCE_DIR}/H5IMpublic.h
|
||||
${HDF5_HL_SRC_SOURCE_DIR}/H5LTparse.h
|
||||
|
137
hl/src/H5DO.c
Normal file
137
hl/src/H5DO.c
Normal file
@ -0,0 +1,137 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
* Copyright by The HDF Group. *
|
||||
* Copyright by the Board of Trustees of the University of Illinois. *
|
||||
* All rights reserved. *
|
||||
* *
|
||||
* This file is part of HDF5. The full HDF5 copyright notice, including *
|
||||
* terms governing use, modification, and redistribution, is contained in *
|
||||
* the files COPYING and Copyright.html. COPYING can be found at the root *
|
||||
* of the source code distribution tree; Copyright.html can be found at the *
|
||||
* root level of an installed copy of the electronic HDF5 document set and *
|
||||
* is linked from the top-level documents page. It can also be found at *
|
||||
* http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
|
||||
* access to either file, you may request a copy from help@hdfgroup.org. *
|
||||
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "H5DOprivate.h"
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5DOwrite_chunk
|
||||
*
|
||||
* Purpose: Writes an entire chunk to the file directly.
|
||||
*
|
||||
* Return: Non-negative on success/Negative on failure
|
||||
*
|
||||
* Programmer: Raymond Lu
|
||||
* 30 July 2012
|
||||
*
|
||||
* Modifications:
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
herr_t
|
||||
H5DOwrite_chunk(hid_t dset_id, hid_t dxpl_id, uint32_t filters, const hsize_t *offset,
|
||||
size_t data_size, const void *buf)
|
||||
{
|
||||
hbool_t created_dxpl = FALSE;
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
if(dset_id < 0) {
|
||||
ret_value = FAIL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if(!buf) {
|
||||
ret_value = FAIL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if(!offset) {
|
||||
ret_value = FAIL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if(!data_size) {
|
||||
ret_value = FAIL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if(H5P_DEFAULT == dxpl_id) {
|
||||
if((dxpl_id = H5Pcreate(H5P_DATASET_XFER)) < 0) {
|
||||
ret_value = FAIL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
created_dxpl = TRUE;
|
||||
}
|
||||
|
||||
if(H5DO_write_chunk(dset_id, dxpl_id, filters, offset, data_size, buf) < 0) {
|
||||
ret_value = FAIL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
done:
|
||||
if(created_dxpl) {
|
||||
if(H5Pclose(dxpl_id) < 0)
|
||||
ret_value = FAIL;
|
||||
}
|
||||
|
||||
return ret_value;
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5DO_write_chunk
|
||||
*
|
||||
* Purpose: Private function for H5DOwrite_chunk
|
||||
*
|
||||
* Return: Non-negative on success/Negative on failure
|
||||
*
|
||||
* Programmer: Raymond Lu
|
||||
* 30 July 2012
|
||||
*
|
||||
* Modifications:
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
herr_t
|
||||
H5DO_write_chunk(hid_t dset_id, hid_t dxpl_id, uint32_t filters, const hsize_t *offset,
|
||||
size_t data_size, const void *buf)
|
||||
{
|
||||
hbool_t do_direct_write = TRUE;
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_NAME, &do_direct_write) < 0) {
|
||||
ret_value = FAIL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_NAME, &filters) < 0) {
|
||||
ret_value = FAIL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_NAME, &offset) < 0) {
|
||||
ret_value = FAIL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_NAME, &data_size) < 0) {
|
||||
ret_value = FAIL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if(H5Dwrite(dset_id, 0, H5S_ALL, H5S_ALL, dxpl_id, buf) < 0) {
|
||||
ret_value = FAIL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
done:
|
||||
do_direct_write = FALSE;
|
||||
if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_NAME, &do_direct_write) < 0)
|
||||
ret_value = FAIL;
|
||||
|
||||
return ret_value;
|
||||
}
|
37
hl/src/H5DOprivate.h
Normal file
37
hl/src/H5DOprivate.h
Normal file
@ -0,0 +1,37 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
* Copyright by The HDF Group. *
|
||||
* Copyright by the Board of Trustees of the University of Illinois. *
|
||||
* All rights reserved. *
|
||||
* *
|
||||
* This file is part of HDF5. The full HDF5 copyright notice, including *
|
||||
* terms governing use, modification, and redistribution, is contained in *
|
||||
* the files COPYING and Copyright.html. COPYING can be found at the root *
|
||||
* of the source code distribution tree; Copyright.html can be found at the *
|
||||
* root level of an installed copy of the electronic HDF5 document set and *
|
||||
* is linked from the top-level documents page. It can also be found at *
|
||||
* http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
|
||||
* access to either file, you may request a copy from help@hdfgroup.org. *
|
||||
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
#ifndef _H5DOprivate_H
|
||||
#define _H5DOprivate_H
|
||||
|
||||
/* High-level library internal header file */
|
||||
#include "H5HLprivate2.h"
|
||||
|
||||
/* public LT prototypes */
|
||||
#include "H5DOpublic.h"
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Private functions
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
H5_HLDLL herr_t H5DO_write_chunk(hid_t dset_id,
|
||||
hid_t dxpl_id,
|
||||
uint32_t filters,
|
||||
const hsize_t *offset,
|
||||
size_t data_size,
|
||||
const void *buf);
|
||||
|
||||
#endif
|
42
hl/src/H5DOpublic.h
Normal file
42
hl/src/H5DOpublic.h
Normal file
@ -0,0 +1,42 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
* Copyright by The HDF Group. *
|
||||
* Copyright by the Board of Trustees of the University of Illinois. *
|
||||
* All rights reserved. *
|
||||
* *
|
||||
* This file is part of HDF5. The full HDF5 copyright notice, including *
|
||||
* terms governing use, modification, and redistribution, is contained in *
|
||||
* the files COPYING and Copyright.html. COPYING can be found at the root *
|
||||
* of the source code distribution tree; Copyright.html can be found at the *
|
||||
* root level of an installed copy of the electronic HDF5 document set and *
|
||||
* is linked from the top-level documents page. It can also be found at *
|
||||
* http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
|
||||
* access to either file, you may request a copy from help@hdfgroup.org. *
|
||||
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
#ifndef _H5DOpublic_H
|
||||
#define _H5DOpublic_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* Direct chunk write function
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
H5_HLDLL herr_t H5DOwrite_chunk(hid_t dset_id,
|
||||
hid_t dxpl_id,
|
||||
uint32_t filters,
|
||||
const hsize_t *offset,
|
||||
size_t data_size,
|
||||
const void *buf);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -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@
|
||||
|
@ -22,6 +22,7 @@
|
||||
#ifndef _HDF5_HL_H
|
||||
#define _HDF5_HL_H
|
||||
|
||||
#include "H5DOpublic.h" /* dataset optimization */
|
||||
#include "H5DSpublic.h" /* dimension scales */
|
||||
#include "H5LTpublic.h" /* lite */
|
||||
#include "H5IMpublic.h" /* image */
|
||||
|
@ -65,6 +65,7 @@ ADD_TEST (
|
||||
test_ds7.h5
|
||||
test_ds8.h5
|
||||
test_ds9.h5
|
||||
test_dectris.h5
|
||||
test_image1.h5
|
||||
test_image2.h5
|
||||
test_image3.h5
|
||||
@ -76,6 +77,7 @@ ADD_TEST (
|
||||
)
|
||||
|
||||
HL_ADD_TEST (test_ds "dsdata.txt;dslat.txt;dslon.txt;test_ds_be.h5;test_ds_le.h5")
|
||||
HL_ADD_TEST (test_dset_opt "")
|
||||
HL_ADD_TEST (test_image "image8.txt;sepia.pal;earth.pal;image24pixel.txt;image24plane.txt;usa.wri")
|
||||
HL_ADD_TEST (test_lite "dtype_file.txt")
|
||||
HL_ADD_TEST (test_packet "")
|
||||
|
@ -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@
|
||||
|
643
hl/test/dectris_hl_perf.c
Normal file
643
hl/test/dectris_hl_perf.c
Normal file
@ -0,0 +1,643 @@
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
* Copyright by The HDF Group. *
|
||||
* Copyright by the Board of Trustees of the University of Illinois. *
|
||||
* All rights reserved. *
|
||||
* *
|
||||
* This file is part of HDF5. The full HDF5 copyright notice, including *
|
||||
* terms governing use, modification, and redistribution, is contained in *
|
||||
* the files COPYING and Copyright.html. COPYING can be found at the root *
|
||||
* of the source code distribution tree; Copyright.html can be found at the *
|
||||
* root level of an installed copy of the electronic HDF5 document set and *
|
||||
* is linked from the top-level documents page. It can also be found at *
|
||||
* http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
|
||||
* access to either file, you may request a copy from help@hdfgroup.org. *
|
||||
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
/*
|
||||
* This test is for the DECTRIS project to the H5DOwrite_chunk function
|
||||
*
|
||||
*/
|
||||
|
||||
#include "hdf5.h"
|
||||
#include "hdf5_hl.h"
|
||||
#include <zlib.h>
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
|
||||
const char *FILENAME[] = {
|
||||
"dectris_perf",
|
||||
"unix.raw",
|
||||
NULL
|
||||
};
|
||||
|
||||
/*
|
||||
* Print the current location on the standard output stream.
|
||||
*/
|
||||
#define FUNC __func__
|
||||
#define AT() printf (" at %s:%d in %s()...\n", \
|
||||
__FILE__, __LINE__, FUNC);
|
||||
#define H5_FAILED() {puts("*FAILED*");fflush(stdout);}
|
||||
#define TEST_ERROR {H5_FAILED(); AT(); goto error;}
|
||||
#define TESTING(WHAT) {printf("Testing %-62s",WHAT); fflush(stdout);}
|
||||
#define PASSED() {puts(" PASSED");fflush(stdout);}
|
||||
|
||||
#define DIRECT_UNCOMPRESSED_DSET "direct_uncompressed_dset"
|
||||
#define DIRECT_COMPRESSED_DSET "direct_compressed_dset"
|
||||
#define REG_COMPRESSED_DSET "reg_compressed_dset"
|
||||
#define REG_NO_COMPRESS_DSET "reg_no_compress_dset"
|
||||
#define RANK 3
|
||||
#define NX 100
|
||||
#define NY 1000
|
||||
#define NZ 250
|
||||
#define CHUNK_NX 1
|
||||
#define CHUNK_NY 1000
|
||||
#define CHUNK_NZ 250
|
||||
|
||||
#define DEFLATE_SIZE_ADJUST(s) (ceil(((double)(s))*1.001)+12)
|
||||
char filename[1024];
|
||||
unsigned int *outbuf[NX];
|
||||
size_t data_size[NX];
|
||||
double total_size = 0.0;
|
||||
unsigned int *direct_buf[NX];
|
||||
double MB = 1048576.0;
|
||||
|
||||
/*--------------------------------------------------
|
||||
* Function to report IO rate
|
||||
*--------------------------------------------------
|
||||
*/
|
||||
void reportTime(struct timeval start, double mbytes)
|
||||
{
|
||||
struct timeval timeval_stop,timeval_diff;
|
||||
|
||||
/*end timing*/
|
||||
gettimeofday(&timeval_stop,NULL);
|
||||
|
||||
/* Calculate the elapsed gettimeofday time */
|
||||
timeval_diff.tv_usec=timeval_stop.tv_usec-start.tv_usec;
|
||||
timeval_diff.tv_sec=timeval_stop.tv_sec-start.tv_sec;
|
||||
|
||||
if(timeval_diff.tv_usec<0) {
|
||||
timeval_diff.tv_usec+=1000000;
|
||||
timeval_diff.tv_sec--;
|
||||
} /* end if */
|
||||
|
||||
/*printf("mbytes=%lf, sec=%lf, usec=%lf\n", mbytes, (double)timeval_diff.tv_sec, (double)timeval_diff.tv_usec);*/
|
||||
printf("MBytes/second: %lf\n", (double)mbytes/((double)timeval_diff.tv_sec+((double)timeval_diff.tv_usec/(double)1000000.0)));
|
||||
}
|
||||
|
||||
/*--------------------------------------------------
|
||||
* Create file, datasets, and initialize data
|
||||
*--------------------------------------------------
|
||||
*/
|
||||
int create_file(hid_t fapl_id)
|
||||
{
|
||||
hid_t file; /* handles */
|
||||
hid_t fapl;
|
||||
hid_t cparms;
|
||||
hid_t dataspace, dataset;
|
||||
hsize_t dims[RANK] = {NX, NY, NZ};
|
||||
hsize_t chunk_dims[RANK] ={CHUNK_NX, CHUNK_NY, CHUNK_NZ};
|
||||
unsigned int aggression = 9; /* Compression aggression setting */
|
||||
int ret;
|
||||
int i, j, n;
|
||||
|
||||
int flag;
|
||||
int unix_file;
|
||||
|
||||
unsigned int *p;
|
||||
size_t buf_size = CHUNK_NY*CHUNK_NZ*sizeof(unsigned int);
|
||||
|
||||
const Bytef *z_src;
|
||||
Bytef *z_dst; /*destination buffer */
|
||||
uLongf z_dst_nbytes = (uLongf)DEFLATE_SIZE_ADJUST(buf_size);
|
||||
uLong z_src_nbytes = (uLong)buf_size;
|
||||
|
||||
TESTING("Create a file and dataset");
|
||||
|
||||
/*
|
||||
* Create the data space with unlimited dimensions.
|
||||
*/
|
||||
if((dataspace = H5Screate_simple(RANK, dims, NULL)) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
/*
|
||||
* Create a new file. If file exists its contents will be overwritten.
|
||||
*/
|
||||
if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id)) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
/*
|
||||
* Modify dataset creation properties, i.e. enable chunking and compression
|
||||
*/
|
||||
if((cparms = H5Pcreate(H5P_DATASET_CREATE)) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
if(H5Pset_chunk( cparms, RANK, chunk_dims) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
/*
|
||||
* Create a new dataset within the file using cparms
|
||||
* creation properties.
|
||||
*/
|
||||
if((dataset = H5Dcreate2(file, DIRECT_UNCOMPRESSED_DSET, H5T_NATIVE_INT, dataspace, H5P_DEFAULT,
|
||||
cparms, H5P_DEFAULT)) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
if(H5Dclose(dataset) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
if((dataset = H5Dcreate2(file, REG_NO_COMPRESS_DSET, H5T_NATIVE_INT, dataspace, H5P_DEFAULT,
|
||||
cparms, H5P_DEFAULT)) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
if(H5Dclose(dataset) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
/* Set compression */
|
||||
if(H5Pset_deflate( cparms, aggression) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
if((dataset = H5Dcreate2(file, DIRECT_COMPRESSED_DSET, H5T_NATIVE_INT, dataspace, H5P_DEFAULT,
|
||||
cparms, H5P_DEFAULT)) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
if(H5Dclose(dataset) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
|
||||
if((dataset = H5Dcreate2(file, REG_COMPRESSED_DSET, H5T_NATIVE_INT, dataspace, H5P_DEFAULT,
|
||||
cparms, H5P_DEFAULT)) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
if(H5Dclose(dataset) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
if(H5Fclose(file) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
if(H5Sclose(dataspace) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
if(H5Pclose(cparms) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
/* create a unix file*/
|
||||
flag = O_CREAT|O_TRUNC|O_WRONLY;
|
||||
|
||||
if ((unix_file=open(FILENAME[1],flag,S_IRWXU))== -1)
|
||||
TEST_ERROR;
|
||||
|
||||
if (close(unix_file) < 0)
|
||||
{
|
||||
printf(" unable to close the file\n");
|
||||
TEST_ERROR;
|
||||
}
|
||||
|
||||
|
||||
/* Initialize data for chunks */
|
||||
for(i = 0; i < NX; i++) {
|
||||
p = direct_buf[i] = (unsigned int*)malloc(CHUNK_NY*CHUNK_NZ*sizeof(unsigned int));
|
||||
|
||||
for(j=0; j < CHUNK_NY*CHUNK_NZ; j++, p++)
|
||||
*p = rand() % 65000;
|
||||
|
||||
z_src = (const Bytef*)direct_buf[i];
|
||||
|
||||
z_dst_nbytes = (uLongf)DEFLATE_SIZE_ADJUST(buf_size);
|
||||
/* Allocate output (compressed) buffer */
|
||||
outbuf[i] = (unsigned int*)malloc((size_t)z_dst_nbytes);
|
||||
z_dst = (Bytef *)outbuf[i];
|
||||
|
||||
/* Perform compression from the source to the destination buffer */
|
||||
ret = compress2(z_dst, &z_dst_nbytes, z_src, z_src_nbytes, aggression);
|
||||
|
||||
data_size[i] = (size_t)z_dst_nbytes;
|
||||
total_size += data_size[i];
|
||||
|
||||
/* Check for various zlib errors */
|
||||
if(Z_BUF_ERROR == ret) {
|
||||
fprintf(stderr, "overflow");
|
||||
TEST_ERROR;
|
||||
} else if(Z_MEM_ERROR == ret) {
|
||||
fprintf(stderr, "deflate memory error");
|
||||
TEST_ERROR;
|
||||
} else if(Z_OK != ret) {
|
||||
fprintf(stderr, "other deflate error");
|
||||
TEST_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
PASSED();
|
||||
|
||||
error:
|
||||
H5E_BEGIN_TRY {
|
||||
H5Dclose(dataset);
|
||||
H5Sclose(dataspace);
|
||||
H5Pclose(cparms);
|
||||
H5Fclose(file);
|
||||
} H5E_END_TRY;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*--------------------------------------------------
|
||||
* Benchmark the performance of the new function
|
||||
* with precompressed data.
|
||||
*--------------------------------------------------
|
||||
*/
|
||||
int
|
||||
test_direct_write_uncompressed_data(hid_t fapl_id)
|
||||
{
|
||||
hid_t file; /* handles */
|
||||
hid_t dataspace, dataset;
|
||||
hid_t dxpl;
|
||||
herr_t status;
|
||||
int i;
|
||||
|
||||
unsigned filter_mask = 0;
|
||||
hsize_t offset[RANK] = {0, 0, 0};
|
||||
|
||||
struct timeval timeval_start;
|
||||
|
||||
TESTING("H5DOwrite_chunk for uncompressed data");
|
||||
|
||||
if((dxpl = H5Pcreate(H5P_DATASET_XFER)) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
/* Start the timer */
|
||||
gettimeofday(&timeval_start,NULL);
|
||||
|
||||
/* Reopen the file and dataset */
|
||||
if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl_id)) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
if((dataset = H5Dopen2(file, DIRECT_UNCOMPRESSED_DSET, H5P_DEFAULT)) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
|
||||
/* Write the compressed chunk data repeatedly to cover all the chunks in the
|
||||
* dataset, using the direct writing function. */
|
||||
for(i=0; i<NX; i++) {
|
||||
status = H5DOwrite_chunk(dataset, dxpl, filter_mask, offset, CHUNK_NY*CHUNK_NZ*sizeof(unsigned int), direct_buf[i]);
|
||||
(offset[0])++;
|
||||
}
|
||||
|
||||
/*
|
||||
* Close/release resources.
|
||||
*/
|
||||
H5Dclose(dataset);
|
||||
H5Pclose(dxpl);
|
||||
H5Fclose(file);
|
||||
|
||||
/* Report the performance */
|
||||
reportTime(timeval_start, (double)(NX*NY*NZ*sizeof(unsigned int)/MB));
|
||||
|
||||
PASSED();
|
||||
return 0;
|
||||
|
||||
error:
|
||||
H5E_BEGIN_TRY {
|
||||
H5Dclose(dataset);
|
||||
H5Pclose(dxpl);
|
||||
H5Fclose(file);
|
||||
} H5E_END_TRY;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/*--------------------------------------------------
|
||||
* Benchmark the performance of the new function
|
||||
* with precompressed data.
|
||||
*--------------------------------------------------
|
||||
*/
|
||||
int
|
||||
test_direct_write_compressed_data(hid_t fapl_id)
|
||||
{
|
||||
hid_t file; /* handles */
|
||||
hid_t dataspace, dataset;
|
||||
hid_t dxpl;
|
||||
herr_t status;
|
||||
int i;
|
||||
|
||||
unsigned filter_mask = 0;
|
||||
hsize_t offset[RANK] = {0, 0, 0};
|
||||
|
||||
struct timeval timeval_start;
|
||||
|
||||
TESTING("H5DOwrite_chunk for pre-compressed data");
|
||||
|
||||
if((dxpl = H5Pcreate(H5P_DATASET_XFER)) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
/* Start the timer */
|
||||
gettimeofday(&timeval_start,NULL);
|
||||
|
||||
/* Reopen the file and dataset */
|
||||
if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl_id)) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
if((dataset = H5Dopen2(file, DIRECT_COMPRESSED_DSET, H5P_DEFAULT)) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
|
||||
/* Write the compressed chunk data repeatedly to cover all the chunks in the
|
||||
* dataset, using the direct writing function. */
|
||||
for(i=0; i<NX; i++) {
|
||||
status = H5DOwrite_chunk(dataset, dxpl, filter_mask, offset, data_size[i], outbuf[i]);
|
||||
(offset[0])++;
|
||||
}
|
||||
|
||||
/*
|
||||
* Close/release resources.
|
||||
*/
|
||||
H5Dclose(dataset);
|
||||
H5Pclose(dxpl);
|
||||
H5Fclose(file);
|
||||
|
||||
/* Report the performance */
|
||||
reportTime(timeval_start, (double)(total_size/MB));
|
||||
|
||||
PASSED();
|
||||
return 0;
|
||||
|
||||
error:
|
||||
H5E_BEGIN_TRY {
|
||||
H5Dclose(dataset);
|
||||
H5Pclose(dxpl);
|
||||
H5Fclose(file);
|
||||
} H5E_END_TRY;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*--------------------------------------------------
|
||||
* Benchmark the performance of the regular H5Dwrite
|
||||
* with compression filter enabled.
|
||||
*--------------------------------------------------
|
||||
*/
|
||||
int
|
||||
test_compressed_write(hid_t fapl_id)
|
||||
{
|
||||
hid_t file; /* handles */
|
||||
hid_t dataspace, dataset;
|
||||
hid_t mem_space;
|
||||
hsize_t chunk_dims[RANK] ={CHUNK_NX, CHUNK_NY, CHUNK_NZ};
|
||||
hid_t dxpl;
|
||||
herr_t status;
|
||||
int i;
|
||||
|
||||
hsize_t start[RANK]; /* Start of hyperslab */
|
||||
hsize_t stride[RANK]; /* Stride of hyperslab */
|
||||
hsize_t count[RANK]; /* Block count */
|
||||
hsize_t block[RANK]; /* Block sizes */
|
||||
|
||||
struct timeval timeval_start;
|
||||
|
||||
TESTING("H5Dwrite with compression enabled");
|
||||
|
||||
if((dxpl = H5Pcreate(H5P_DATASET_XFER)) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
if((mem_space = H5Screate_simple(RANK, chunk_dims, NULL)) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
/* Start the timer */
|
||||
gettimeofday(&timeval_start,NULL);
|
||||
|
||||
/* Reopen the file and dataset */
|
||||
if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl_id)) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
if((dataset = H5Dopen2(file, REG_COMPRESSED_DSET, H5P_DEFAULT)) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
if((dataspace = H5Dget_space(dataset)) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
start[0] = start[1] = start[2] = 0;
|
||||
stride[0] = stride[1] = stride[2] = 1;
|
||||
count[0] = count[1] = count[2] = 1;
|
||||
block[0] = CHUNK_NX; block[1] = CHUNK_NY; block[2] = CHUNK_NZ;
|
||||
|
||||
for(i=0; i<NX; i++) {
|
||||
/*
|
||||
* Select hyperslab for one chunk in the file
|
||||
*/
|
||||
if((status = H5Sselect_hyperslab(dataspace, H5S_SELECT_SET, start, stride, count, block)) < 0)
|
||||
TEST_ERROR;
|
||||
(start[0])++;
|
||||
|
||||
if((status = H5Dwrite(dataset, H5T_NATIVE_INT, mem_space, dataspace,
|
||||
H5P_DEFAULT, direct_buf[i])) < 0)
|
||||
TEST_ERROR;
|
||||
}
|
||||
|
||||
/*
|
||||
* Close/release resources.
|
||||
*/
|
||||
H5Dclose(dataset);
|
||||
H5Sclose(dataspace);
|
||||
H5Sclose(mem_space);
|
||||
H5Pclose(dxpl);
|
||||
H5Fclose(file);
|
||||
|
||||
/* Report the performance */
|
||||
reportTime(timeval_start, (double)(NX*NY*NZ*sizeof(unsigned int)/MB));
|
||||
|
||||
PASSED();
|
||||
return 0;
|
||||
|
||||
error:
|
||||
H5E_BEGIN_TRY {
|
||||
H5Dclose(dataset);
|
||||
H5Sclose(dataspace);
|
||||
H5Sclose(mem_space);
|
||||
H5Pclose(dxpl);
|
||||
H5Fclose(file);
|
||||
} H5E_END_TRY;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*--------------------------------------------------
|
||||
* Benchmark the performance of the regular H5Dwrite
|
||||
* with compression
|
||||
*--------------------------------------------------
|
||||
*/
|
||||
int
|
||||
test_no_compress_write(hid_t fapl_id)
|
||||
{
|
||||
hid_t file; /* handles */
|
||||
hid_t dataspace, dataset;
|
||||
hid_t mem_space;
|
||||
hsize_t chunk_dims[RANK] ={CHUNK_NX, CHUNK_NY, CHUNK_NZ};
|
||||
hid_t dxpl;
|
||||
herr_t status;
|
||||
int i;
|
||||
|
||||
hsize_t start[RANK]; /* Start of hyperslab */
|
||||
hsize_t stride[RANK]; /* Stride of hyperslab */
|
||||
hsize_t count[RANK]; /* Block count */
|
||||
hsize_t block[RANK]; /* Block sizes */
|
||||
|
||||
struct timeval timeval_start;
|
||||
|
||||
TESTING("H5Dwrite without compression");
|
||||
|
||||
if((dxpl = H5Pcreate(H5P_DATASET_XFER)) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
if((mem_space = H5Screate_simple(RANK, chunk_dims, NULL)) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
/* Start the timer */
|
||||
gettimeofday(&timeval_start,NULL);
|
||||
|
||||
/* Reopen the file and dataset */
|
||||
if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl_id)) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
if((dataset = H5Dopen2(file, REG_NO_COMPRESS_DSET, H5P_DEFAULT)) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
if((dataspace = H5Dget_space(dataset)) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
start[0] = start[1] = start[2] = 0;
|
||||
stride[0] = stride[1] = stride[2] = 1;
|
||||
count[0] = count[1] = count[2] = 1;
|
||||
block[0] = CHUNK_NX; block[1] = CHUNK_NY; block[2] = CHUNK_NZ;
|
||||
|
||||
for(i=0; i<NX; i++) {
|
||||
/*
|
||||
* Select hyperslab for one chunk in the file
|
||||
*/
|
||||
if((status = H5Sselect_hyperslab(dataspace, H5S_SELECT_SET, start, stride, count, block)) < 0)
|
||||
TEST_ERROR;
|
||||
(start[0])++;
|
||||
|
||||
if((status = H5Dwrite(dataset, H5T_NATIVE_INT, mem_space, dataspace,
|
||||
H5P_DEFAULT, direct_buf[i])) < 0)
|
||||
TEST_ERROR;
|
||||
}
|
||||
|
||||
/*
|
||||
* Close/release resources.
|
||||
*/
|
||||
H5Dclose(dataset);
|
||||
H5Sclose(dataspace);
|
||||
H5Sclose(mem_space);
|
||||
H5Pclose(dxpl);
|
||||
H5Fclose(file);
|
||||
|
||||
/* Report the performance */
|
||||
reportTime(timeval_start, (double)(NX*NY*NZ*sizeof(unsigned int)/MB));
|
||||
|
||||
PASSED();
|
||||
return 0;
|
||||
|
||||
error:
|
||||
H5E_BEGIN_TRY {
|
||||
H5Dclose(dataset);
|
||||
H5Sclose(dataspace);
|
||||
H5Sclose(mem_space);
|
||||
H5Pclose(dxpl);
|
||||
H5Fclose(file);
|
||||
} H5E_END_TRY;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*--------------------------------------------------
|
||||
* Benchmark the performance for writing compressed
|
||||
* data to a Unix file
|
||||
*--------------------------------------------------
|
||||
*/
|
||||
int
|
||||
test_unix_write(void)
|
||||
{
|
||||
int file, flag;
|
||||
ssize_t op_size;
|
||||
int i;
|
||||
struct timeval timeval_start;
|
||||
|
||||
TESTING("Write compressed data to a Unix file");
|
||||
|
||||
/* create file*/
|
||||
flag = O_WRONLY;
|
||||
|
||||
/* Start the timer */
|
||||
gettimeofday(&timeval_start,NULL);
|
||||
|
||||
if ((file=open(FILENAME[1],flag))== -1)
|
||||
TEST_ERROR;
|
||||
|
||||
/* Write the compressed chunk data repeatedly to cover all the chunks in the
|
||||
* dataset, using the direct writing function. */
|
||||
for(i=0; i<NX; i++) {
|
||||
op_size = write(file, outbuf[i],data_size[i]);
|
||||
if (op_size < 0)
|
||||
{
|
||||
printf(" Error in writing data to file because %s \n", strerror(errno));
|
||||
TEST_ERROR;
|
||||
}
|
||||
else if (op_size == 0)
|
||||
{
|
||||
printf(" unable to write sufficent data to file because %s \n", strerror(errno));
|
||||
TEST_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
if (close(file) < 0)
|
||||
{
|
||||
printf(" unable to close the file\n");
|
||||
TEST_ERROR;
|
||||
}
|
||||
|
||||
/* Report the performance */
|
||||
reportTime(timeval_start, (double)(total_size/MB));
|
||||
|
||||
PASSED();
|
||||
return 0;
|
||||
|
||||
error:
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*--------------------------------------------------
|
||||
* Main function
|
||||
*--------------------------------------------------
|
||||
*/
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
hid_t fapl = H5P_DEFAULT;
|
||||
int i;
|
||||
|
||||
/* Testing setup */
|
||||
/* h5_reset();
|
||||
fapl = h5_fileaccess();
|
||||
|
||||
h5_fixname(FILENAME[0], fapl, filename, sizeof filename);*/
|
||||
|
||||
sprintf(filename, "%s.h5", FILENAME[0]);
|
||||
|
||||
create_file(fapl);
|
||||
test_direct_write_uncompressed_data(fapl);
|
||||
test_direct_write_compressed_data(fapl);
|
||||
test_no_compress_write(fapl);
|
||||
test_compressed_write(fapl);
|
||||
test_unix_write();
|
||||
|
||||
for(i=0; i<NX; i++) {
|
||||
free(outbuf[i]);
|
||||
free(direct_buf[i]);
|
||||
}
|
||||
|
||||
/* h5_cleanup(FILENAME, fapl);*/
|
||||
return 0;
|
||||
}
|
1138
hl/test/test_dset_opt.c
Normal file
1138
hl/test/test_dset_opt.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -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;
|
||||
|
||||
|
||||
}
|
||||
|
102
src/H5Dchunk.c
102
src/H5Dchunk.c
@ -281,6 +281,108 @@ H5FL_DEFINE(H5D_chunk_info_t);
|
||||
/* Declare a free list to manage the chunk sequence information */
|
||||
H5FL_BLK_DEFINE_STATIC(chunk);
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5D__chunk_direct_write
|
||||
*
|
||||
* Purpose: Internal routine to write a chunk
|
||||
* directly into the file.
|
||||
*
|
||||
* Return: Non-negative on success/Negative on failure
|
||||
*
|
||||
* Programmer: Raymond Lu
|
||||
* 30 July 2012
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
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)
|
||||
{
|
||||
const H5O_layout_t *layout = &(dset->shared->layout); /* Dataset layout */
|
||||
H5D_chunk_ud_t udata; /* User data for querying chunk info */
|
||||
hsize_t chunk_idx;
|
||||
H5D_dxpl_cache_t _dxpl_cache; /* Data transfer property cache buffer */
|
||||
H5D_dxpl_cache_t *dxpl_cache = &_dxpl_cache; /* Data transfer property cache */
|
||||
const H5D_rdcc_t *rdcc = &(dset->shared->cache.chunk); /*raw data chunk cache */
|
||||
int space_ndims; /* Dataset's space rank */
|
||||
hsize_t space_dim[H5O_LAYOUT_NDIMS]; /* Dataset's dataspace dimensions */
|
||||
H5FD_t *lf;
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_STATIC_TAG(dxpl_id, dset->oloc.addr, FAIL)
|
||||
|
||||
/* Allocate data space and initialize it if it hasn't been. */
|
||||
if(!(*dset->shared->layout.ops->is_space_alloc)(&dset->shared->layout.storage)) {
|
||||
/* Allocate storage */
|
||||
if(H5D__alloc_storage(dset, dxpl_id, H5D_ALLOC_WRITE, FALSE, NULL) < 0)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize storage")
|
||||
} /* end if */
|
||||
|
||||
|
||||
/* Retrieve the dataset dimensions */
|
||||
if((space_ndims = H5S_get_simple_extent_dims(dset->shared->space, space_dim, NULL)) < 0)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to get simple dataspace info")
|
||||
|
||||
/* Calculate the index of this chunk */
|
||||
if(H5V_chunk_index((unsigned)space_ndims, offset,
|
||||
layout->u.chunk.dim, layout->u.chunk.down_chunks, &chunk_idx) < 0)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't get chunk index")
|
||||
|
||||
/* Find out the file address of the chunk */
|
||||
if(H5D__chunk_lookup(dset, dxpl_id, offset, chunk_idx,
|
||||
&udata) < 0)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "error looking up chunk address")
|
||||
|
||||
udata.filter_mask = filters;
|
||||
|
||||
/* Check if the chunk needs to be 'inserted' (could exist already and
|
||||
* the 'insert' operation could resize it)
|
||||
*/
|
||||
{
|
||||
H5D_chk_idx_info_t idx_info; /* Chunked index info */
|
||||
|
||||
/* Compose chunked index info struct */
|
||||
idx_info.f = dset->oloc.file;
|
||||
idx_info.dxpl_id = dxpl_id;
|
||||
idx_info.pline = &(dset->shared->dcpl_cache.pline);
|
||||
idx_info.layout = &(dset->shared->layout.u.chunk);
|
||||
idx_info.storage = &(dset->shared->layout.storage.u.chunk);
|
||||
|
||||
/* Set up the size of chunk for user data */
|
||||
udata.nbytes = data_size;
|
||||
|
||||
/* Create the chunk it if it doesn't exist, or reallocate the chunk
|
||||
* if its size changed.
|
||||
*/
|
||||
if((dset->shared->layout.storage.u.chunk.ops->insert)(&idx_info, &udata) < 0)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_CANTINSERT, FAIL, "unable to insert/resize chunk")
|
||||
|
||||
/* Make sure the address of the chunk is returned. */
|
||||
if(!H5F_addr_defined(udata.addr))
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "chunk address isn't defined")
|
||||
} /* end if */
|
||||
|
||||
/* Fill the DXPL cache values for later use */
|
||||
if(H5D__get_dxpl_cache(dxpl_id, &dxpl_cache) < 0)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't fill dxpl cache")
|
||||
|
||||
/* Evict the entry from the cache if present, but do not flush
|
||||
* it to disk */
|
||||
if(UINT_MAX != udata.idx_hint) {
|
||||
if(H5D__chunk_cache_evict(dset, dxpl_id, dxpl_cache,
|
||||
rdcc->slot[udata.idx_hint], FALSE) < 0)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_CANTREMOVE, FAIL, "unable to evict chunk")
|
||||
} /* end if */
|
||||
|
||||
/* Write the data to the file */
|
||||
if(H5F_block_write(dset->oloc.file, H5FD_MEM_DRAW, udata.addr, data_size, dxpl_id, buf) < 0)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to write raw data to file")
|
||||
|
||||
|
||||
done:
|
||||
FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
|
||||
}
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
|
169
src/H5Dio.c
169
src/H5Dio.c
@ -28,6 +28,8 @@
|
||||
#include "H5Eprivate.h" /* Error handling */
|
||||
#include "H5FLprivate.h" /* Free Lists */
|
||||
#include "H5Iprivate.h" /* IDs */
|
||||
#include "H5MMprivate.h" /* Memory management */
|
||||
#include "H5Sprivate.h" /* Dataspace */
|
||||
|
||||
#ifdef H5_HAVE_PARALLEL
|
||||
/* Remove this if H5R_DATASET_REGION is no longer used in this file */
|
||||
@ -56,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,
|
||||
@ -136,6 +140,10 @@ H5Dread(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id,
|
||||
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(mem_space_id < 0 || file_space_id < 0)
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
|
||||
|
||||
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")
|
||||
@ -213,37 +221,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 */
|
||||
hbool_t direct_write = FALSE;
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_STATIC
|
||||
|
||||
/* 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)
|
||||
@ -251,23 +273,102 @@ 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[H5O_LAYOUT_NDIMS];
|
||||
hsize_t internal_offset[H5O_LAYOUT_NDIMS];
|
||||
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 */
|
||||
if((ndims = 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(mem_space_id < 0 || file_space_id < 0)
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
|
||||
|
||||
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() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
|
@ -174,5 +174,8 @@ 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, 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 */
|
||||
/*******************/
|
||||
|
@ -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(hbool_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 hbool_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,30 @@ 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 */
|
||||
/* (Note: this property should not have an encode/decode callback -QAK) */
|
||||
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 */
|
||||
/* (Note: this property should not have an encode/decode callback -QAK) */
|
||||
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 */
|
||||
/* (Note: this property should not have an encode/decode callback -QAK) */
|
||||
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 */
|
||||
/* (Note: this property should not have an encode/decode callback -QAK) */
|
||||
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…
Reference in New Issue
Block a user