summaryrefslogtreecommitdiffstats
path: root/tools/test
diff options
context:
space:
mode:
authorjrmainzer <72230804+jrmainzer@users.noreply.github.com>2021-11-23 01:20:56 (GMT)
committerGitHub <noreply@github.com>2021-11-23 01:20:56 (GMT)
commit28d0a7b1b93e3918f3c8ee361af3280a2c9ee8a4 (patch)
tree0ac1b135f2c8a8bd9dbb980ebdbeb36dcf89f2c2 /tools/test
parent65d6d256cf9d04dbeb275025cc2b01d0f36ed3f1 (diff)
parent68c00b3fa1c0f4ba9b8e9724beb1d0b0b31f69ad (diff)
downloadhdf5-28d0a7b1b93e3918f3c8ee361af3280a2c9ee8a4.zip
hdf5-28d0a7b1b93e3918f3c8ee361af3280a2c9ee8a4.tar.gz
hdf5-28d0a7b1b93e3918f3c8ee361af3280a2c9ee8a4.tar.bz2
Merge pull request #1217 from jrmainzer/selection_io_with_subfiling_vfd
Selection io with subfiling vfd
Diffstat (limited to 'tools/test')
-rw-r--r--tools/test/h5copy/CMakeLists.txt2
-rw-r--r--tools/test/h5copy/CMakeTests.cmake22
-rw-r--r--tools/test/h5copy/dynlib_copy.c16
-rw-r--r--tools/test/h5copy/h5copygentest.c54
-rw-r--r--tools/test/h5diff/CMakeLists.txt2
-rw-r--r--tools/test/h5diff/CMakeTests.cmake65
-rw-r--r--tools/test/h5diff/dynlib_diff.c16
-rw-r--r--tools/test/h5diff/h5diffgentest.c170
-rw-r--r--tools/test/h5diff/testfiles/h5diff_10.txt12
-rw-r--r--tools/test/h5diff/testfiles/h5diff_600.txt12
-rw-r--r--tools/test/h5diff/testfiles/h5diff_603.txt12
-rw-r--r--tools/test/h5diff/testfiles/h5diff_606.txt12
-rw-r--r--tools/test/h5diff/testfiles/h5diff_612.txt12
-rw-r--r--tools/test/h5diff/testfiles/h5diff_615.txt12
-rw-r--r--tools/test/h5diff/testfiles/h5diff_621.txt12
-rw-r--r--tools/test/h5diff/testfiles/h5diff_622.txt12
-rw-r--r--tools/test/h5diff/testfiles/h5diff_623.txt12
-rw-r--r--tools/test/h5diff/testfiles/h5diff_624.txt12
-rw-r--r--tools/test/h5diff/testh5diff.sh.in2
-rw-r--r--tools/test/h5dump/CMakeLists.txt2
-rw-r--r--tools/test/h5dump/CMakeTests.cmake17
-rw-r--r--tools/test/h5dump/CMakeVFDTests.cmake2
-rw-r--r--tools/test/h5dump/dynlib_dump.c16
-rw-r--r--tools/test/h5dump/h5dumpgentest.c228
-rw-r--r--tools/test/h5dump/testh5dump.sh.in43
-rw-r--r--tools/test/h5import/h5importtest.c4
-rw-r--r--tools/test/h5jam/getub.c18
-rw-r--r--tools/test/h5jam/h5jamgentest.c447
-rw-r--r--tools/test/h5jam/tellub.c12
-rw-r--r--tools/test/h5ls/CMakeLists.txt2
-rw-r--r--tools/test/h5ls/CMakeTests.cmake4
-rw-r--r--tools/test/h5ls/CMakeTestsVDS.cmake4
-rw-r--r--tools/test/h5ls/dynlib_ls.c16
-rw-r--r--tools/test/h5repack/CMakeLists.txt4
-rw-r--r--tools/test/h5repack/CMakeTests.cmake10
-rw-r--r--tools/test/h5repack/CMakeVFDTests.cmake19
-rw-r--r--tools/test/h5repack/dynlib_rpk.c14
-rw-r--r--tools/test/h5repack/dynlib_vrpk.c14
-rw-r--r--tools/test/h5repack/h5repack.sh.in9
-rw-r--r--tools/test/h5repack/h5repackgentest.c34
-rw-r--r--tools/test/h5repack/h5repacktst.c924
-rw-r--r--tools/test/h5repack/testfiles/h5repack-help.txt12
-rw-r--r--tools/test/h5repack/testfiles/h5repack_CVE-2018-14460.h5bin0 -> 2560 bytes
-rw-r--r--tools/test/h5repack/testfiles/h5repack_CVE-2018-17432.h5 (renamed from tools/test/h5repack/testfiles/h5repack_HDFFV-10590_CVE-2018-17432.h5)bin7648 -> 7648 bytes
-rw-r--r--tools/test/h5stat/CMakeTests.cmake2
-rw-r--r--tools/test/h5stat/h5stat_gentest.c145
-rw-r--r--tools/test/h5stat/testh5stat.sh.in2
-rw-r--r--tools/test/misc/CMakeTestsClear.cmake4
-rw-r--r--tools/test/misc/repart_test.c5
-rw-r--r--tools/test/misc/talign.c5
-rw-r--r--tools/test/misc/testfiles/h5mkgrp_help.txt6
-rw-r--r--tools/test/misc/testh5clear.sh.in4
-rw-r--r--tools/test/misc/vds/UC_common.h11
-rw-r--r--tools/test/perform/CMakeLists.txt81
-rw-r--r--tools/test/perform/COPYING13
-rw-r--r--tools/test/perform/Makefile.am23
-rw-r--r--tools/test/perform/chunk.c19
-rw-r--r--tools/test/perform/chunk_cache.c40
-rw-r--r--tools/test/perform/direct_write_perf.c29
-rw-r--r--tools/test/perform/iopipe.c13
-rw-r--r--tools/test/perform/overhead.c10
-rw-r--r--tools/test/perform/perf.c476
-rw-r--r--tools/test/perform/perf_meta.c4
-rw-r--r--tools/test/perform/pio_engine.c2747
-rw-r--r--tools/test/perform/pio_perf.c1699
-rw-r--r--tools/test/perform/pio_perf.h100
-rw-r--r--tools/test/perform/pio_standalone.c192
-rw-r--r--tools/test/perform/pio_standalone.h136
-rw-r--r--tools/test/perform/sio_engine.c1338
-rw-r--r--tools/test/perform/sio_perf.c1438
-rw-r--r--tools/test/perform/sio_perf.h104
-rw-r--r--tools/test/perform/sio_standalone.c57
-rw-r--r--tools/test/perform/sio_standalone.h136
-rw-r--r--tools/test/perform/zip_perf.c96
74 files changed, 1781 insertions, 9478 deletions
diff --git a/tools/test/h5copy/CMakeLists.txt b/tools/test/h5copy/CMakeLists.txt
index f76a65e..f63eb84 100644
--- a/tools/test/h5copy/CMakeLists.txt
+++ b/tools/test/h5copy/CMakeLists.txt
@@ -32,7 +32,7 @@ if (BUILD_SHARED_LIBS)
add_library (${H5COPY_TOOL_PLUGIN_LIB_TARGET} SHARED dynlib_copy.c)
target_include_directories (${H5COPY_TOOL_PLUGIN_LIB_TARGET} PRIVATE "${HDF5_SRC_DIR};${HDF5_SRC_BINARY_DIR};$<$<BOOL:${HDF5_ENABLE_PARALLEL}>:${MPI_C_INCLUDE_DIRS}>")
TARGET_C_PROPERTIES (${H5COPY_TOOL_PLUGIN_LIB_TARGET} SHARED)
- target_link_libraries (${H5COPY_TOOL_PLUGIN_LIB_TARGET} PRIVATE ${HDF5_TEST_LIBSH_TARGET})
+ target_link_libraries (${H5COPY_TOOL_PLUGIN_LIB_TARGET} PRIVATE ${HDF5_LIBSH_TARGET})
H5_SET_LIB_OPTIONS (${H5COPY_TOOL_PLUGIN_LIB_TARGET} ${H5COPY_TOOL_PLUGIN_LIB_NAME} SHARED "LIB")
#-----------------------------------------------------------------------------
diff --git a/tools/test/h5copy/CMakeTests.cmake b/tools/test/h5copy/CMakeTests.cmake
index 73fbda6..e9b36fe 100644
--- a/tools/test/h5copy/CMakeTests.cmake
+++ b/tools/test/h5copy/CMakeTests.cmake
@@ -76,13 +76,13 @@
endif ()
# resultcode=2 will cause the test to skip the diff test
- if (NOT ${resultcode} EQUAL 2)
+ if (NOT "${resultcode}" STREQUAL "2")
add_test (
NAME H5COPY_F-${testname}-DIFF
COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $<TARGET_FILE:h5diff${tgt_file_ext}> -v ./testfiles/${infile} ./testfiles/${testname}.out.h5 ${srcname} ${dstname}
)
set_tests_properties (H5COPY_F-${testname}-DIFF PROPERTIES DEPENDS H5COPY_F-${testname})
- if (${resultcode} EQUAL 1)
+ if ("${resultcode}" STREQUAL "1")
set_tests_properties (H5COPY_F-${testname}-DIFF PROPERTIES WILL_FAIL "true")
endif ()
endif ()
@@ -110,13 +110,13 @@
endif ()
# resultcode=2 will cause the test to skip the diff test
- if (NOT ${resultcode} EQUAL 2)
+ if (NOT "${resultcode}" STREQUAL "2")
add_test (
NAME H5COPY-${testname}-DIFF
COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $<TARGET_FILE:h5diff${tgt_file_ext}> -v ./testfiles/${infile} ./testfiles/${testname}.out.h5 ${srcname} ${dstname}
)
set_tests_properties (H5COPY-${testname}-DIFF PROPERTIES DEPENDS H5COPY-${testname})
- if (${resultcode} EQUAL 1)
+ if ("${resultcode}" STREQUAL "1")
set_tests_properties (H5COPY-${testname}-DIFF PROPERTIES WILL_FAIL "true")
endif ()
endif ()
@@ -159,13 +159,13 @@
)
set_tests_properties (H5COPY-${testname} PROPERTIES DEPENDS H5COPY-${testname}-prefill)
# resultcode=2 will cause the test to skip the diff test
- if (NOT ${resultcode} EQUAL 2)
+ if (NOT "${resultcode}" STREQUAL "2")
add_test (
NAME H5COPY-${testname}-DIFF
COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $<TARGET_FILE:h5diff${tgt_file_ext}> -v ./testfiles/${infile} ./testfiles/${testname}.out.h5 ${srcname} ${dstname}
)
set_tests_properties (H5COPY-${testname}-DIFF PROPERTIES DEPENDS H5COPY-${testname})
- if (${resultcode} EQUAL 1)
+ if ("${resultcode}" STREQUAL "1")
set_tests_properties (H5COPY-${testname}-DIFF PROPERTIES WILL_FAIL "true")
endif ()
endif ()
@@ -198,13 +198,13 @@
)
set_tests_properties (H5COPY_SAME-${testname} PROPERTIES DEPENDS H5COPY_SAME-${testname}-prefill)
# resultcode=2 will cause the test to skip the diff test
- if (NOT ${resultcode} EQUAL 2)
+ if (NOT "${resultcode}" STREQUAL "2")
add_test (
NAME H5COPY_SAME-${testname}-DIFF
COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $<TARGET_FILE:h5diff${tgt_file_ext}> -v ./testfiles/${testname}.out.h5 ./testfiles/${testname}.out.h5 ${srcname} ${dstname}
)
set_tests_properties (H5COPY_SAME-${testname}-DIFF PROPERTIES DEPENDS H5COPY_SAME-${testname})
- if (${resultcode} EQUAL 1)
+ if ("${resultcode}" STREQUAL "1")
set_tests_properties (H5COPY_SAME-${testname}-DIFF PROPERTIES WILL_FAIL "true")
endif ()
endif ()
@@ -218,7 +218,7 @@
# If using memchecker add tests without using scripts
if (HDF5_ENABLE_USING_MEMCHECKER)
add_test (NAME H5COPY-CMP-${testname} COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $<TARGET_FILE:h5copy${tgt_file_ext}> -i ./testfiles/${infile} -o ./testfiles/${testname}.out.h5 ${vparam} ${sparam} ${srcname} ${dparam} ${dstname} ${ARGN})
- if (${resultcode} EQUAL 1)
+ if ("${resultcode}" STREQUAL "1")
set_tests_properties (H5COPY-CMP-${testname} PROPERTIES WILL_FAIL "true")
endif ()
if (last_test)
@@ -255,7 +255,7 @@
NAME H5COPY_UD-${testname}-clear-objects
COMMAND ${CMAKE_COMMAND} -E remove testfiles/${testname}.out.h5
)
- if (${resultcode} EQUAL 2)
+ if ("${resultcode}" STREQUAL "2")
add_test (
NAME H5COPY_UD-${testname}
COMMAND "${CMAKE_COMMAND}"
@@ -318,7 +318,7 @@
NAME H5COPY_UD_ERR-${testname}-clearall-objects
COMMAND ${CMAKE_COMMAND} -E remove testfiles/${testname}_ERR.out.h5
)
- if (${resultcode} EQUAL 2)
+ if ("${resultcode}" STREQUAL "2")
add_test (
NAME H5COPY_UD_ERR-${testname}
COMMAND "${CMAKE_COMMAND}"
diff --git a/tools/test/h5copy/dynlib_copy.c b/tools/test/h5copy/dynlib_copy.c
index 57de3bc..b954a22 100644
--- a/tools/test/h5copy/dynlib_copy.c
+++ b/tools/test/h5copy/dynlib_copy.c
@@ -25,13 +25,13 @@ static size_t H5Z_filter_dynlibud(unsigned int flags, size_t cd_nelmts, const un
/* This message derives from H5Z */
const H5Z_class2_t H5Z_DYNLIBUD[1] = {{
- H5Z_CLASS_T_VERS, /* H5Z_class_t version */
- H5Z_FILTER_DYNLIBUD, /* Filter id number */
- 1, 1, /* Encoding and decoding enabled */
- "dynlibud", /* Filter name for debugging */
- NULL, /* The "can apply" callback */
- NULL, /* The "set local" callback */
- (H5Z_func_t)H5Z_filter_dynlibud, /* The actual filter function */
+ H5Z_CLASS_T_VERS, /* H5Z_class_t version */
+ H5Z_FILTER_DYNLIBUD, /* Filter id number */
+ 1, 1, /* Encoding and decoding enabled */
+ "dynlibud", /* Filter name for debugging */
+ NULL, /* The "can apply" callback */
+ NULL, /* The "set local" callback */
+ H5Z_filter_dynlibud, /* The actual filter function */
}};
H5PL_type_t
@@ -70,7 +70,7 @@ H5Z_filter_dynlibud(unsigned int flags, size_t cd_nelmts, const unsigned int *cd
return (0);
/* Assignment to eliminate unused parameter warning. */
- cd_values = cd_values;
+ (void)cd_values;
if (flags & H5Z_FLAG_REVERSE) { /*read*/
/* Subtract the original value with MULTIPLIER */
diff --git a/tools/test/h5copy/h5copygentest.c b/tools/test/h5copy/h5copygentest.c
index 429ad42..6898839 100644
--- a/tools/test/h5copy/h5copygentest.c
+++ b/tools/test/h5copy/h5copygentest.c
@@ -513,21 +513,21 @@ gen_obj_ref(hid_t loc_id)
* add dataset */
sid = H5Screate_simple(1, dims1, NULL);
if (sid < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
oid = H5Dcreate2(loc_id, OBJ_REF_DS, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
if (oid < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
status = H5Dwrite(oid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -539,7 +539,7 @@ gen_obj_ref(hid_t loc_id)
* add group */
oid = H5Gcreate2(loc_id, OBJ_REF_GRP, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
if (oid < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Gcreate2 failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Gcreate2 failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -547,34 +547,34 @@ gen_obj_ref(hid_t loc_id)
status = H5Rcreate(&or_data[0], loc_id, OBJ_REF_DS, H5R_OBJECT, (hid_t)-1);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
status = H5Rcreate(&or_data[1], loc_id, OBJ_REF_GRP, H5R_OBJECT, (hid_t)-1);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
sid = H5Screate_simple(1, dims2, NULL);
if (sid < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
oid = H5Dcreate2(loc_id, "Dset_OBJREF", H5T_STD_REF_OBJ, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
if (oid < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
status = H5Dwrite(oid, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, or_data);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -613,7 +613,7 @@ gen_region_ref(hid_t loc_id)
sid = H5Screate_simple(2, dims2, NULL);
if (sid < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -621,7 +621,7 @@ gen_region_ref(hid_t loc_id)
/* create normal dataset which is refered */
oid2 = H5Dcreate2(loc_id, REG_REF_DS2, H5T_STD_I8LE, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
if (oid2 < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -629,7 +629,7 @@ gen_region_ref(hid_t loc_id)
/* write values to dataset */
status = H5Dwrite(oid2, H5T_NATIVE_CHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -637,7 +637,7 @@ gen_region_ref(hid_t loc_id)
/* select elements space for reference */
status = H5Sselect_elements(sid, H5S_SELECT_SET, 4, coords[0]);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Sselect_elements failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Sselect_elements failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -645,7 +645,7 @@ gen_region_ref(hid_t loc_id)
/* create region reference from elements space */
status = H5Rcreate(&rr_data[0], loc_id, REG_REF_DS2, H5R_DATASET_REGION, sid);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -653,7 +653,7 @@ gen_region_ref(hid_t loc_id)
/* select hyperslab space for reference */
status = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, stride, count, block);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Sselect_hyperslab failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Sselect_hyperslab failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -661,7 +661,7 @@ gen_region_ref(hid_t loc_id)
/* create region reference from hyperslab space */
status = H5Rcreate(&rr_data[1], loc_id, REG_REF_DS2, H5R_DATASET_REGION, sid);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -671,7 +671,7 @@ gen_region_ref(hid_t loc_id)
/* Create dataspace. */
sid = H5Screate_simple(1, dims1, NULL);
if (sid < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -679,7 +679,7 @@ gen_region_ref(hid_t loc_id)
/* create region reference dataset */
oid1 = H5Dcreate2(loc_id, REG_REF_DS1, H5T_STD_REF_DSETREG, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
if (oid1 < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -687,7 +687,7 @@ gen_region_ref(hid_t loc_id)
/* write data as region references */
status = H5Dwrite(oid1, H5T_STD_REF_DSETREG, H5S_ALL, H5S_ALL, H5P_DEFAULT, rr_data);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -816,7 +816,7 @@ gen_extlink_trg(hid_t loc_id)
* target file */
gid = H5Gcreate2(loc_id, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
if (gid < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Gcreate2 failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Gcreate2 failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -831,7 +831,7 @@ gen_extlink_trg(hid_t loc_id)
tid = H5Tcopy(H5T_NATIVE_INT);
status = H5Tcommit2(loc_id, "datatype", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Tcommit2 failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Tcommit2 failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -864,7 +864,7 @@ gen_extlink_src(hid_t loc_id)
*------------------------------------------------------------------------*/
gid = H5Gcreate2(loc_id, "/group_ext", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
if (gid < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Gcreate2 failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Gcreate2 failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -875,7 +875,7 @@ gen_extlink_src(hid_t loc_id)
/* link to dataset */
status = H5Lcreate_external(HDF_EXT_TRG_FILE, "/simple", gid, "extlink_dset", H5P_DEFAULT, H5P_DEFAULT);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Lcreate_external failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Lcreate_external failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -883,7 +883,7 @@ gen_extlink_src(hid_t loc_id)
/* link to group */
status = H5Lcreate_external(HDF_EXT_TRG_FILE, "/group", gid, "extlink_grp", H5P_DEFAULT, H5P_DEFAULT);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Lcreate_external failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Lcreate_external failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -892,7 +892,7 @@ gen_extlink_src(hid_t loc_id)
status =
H5Lcreate_external(HDF_EXT_TRG_FILE, "/datatype", gid, "extlink_datatype", H5P_DEFAULT, H5P_DEFAULT);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Lcreate_external failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Lcreate_external failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -900,7 +900,7 @@ gen_extlink_src(hid_t loc_id)
/* dangling link - no obj*/
status = H5Lcreate_external(HDF_EXT_TRG_FILE, "notyet", gid, "extlink_notyet1", H5P_DEFAULT, H5P_DEFAULT);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Lcreate_external failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Lcreate_external failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -908,7 +908,7 @@ gen_extlink_src(hid_t loc_id)
/* dangling link - no file */
status = H5Lcreate_external("notyet_file.h5", "notyet", gid, "extlink_notyet2", H5P_DEFAULT, H5P_DEFAULT);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Lcreate_external failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Lcreate_external failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
diff --git a/tools/test/h5diff/CMakeLists.txt b/tools/test/h5diff/CMakeLists.txt
index 9349ace..f74db0f 100644
--- a/tools/test/h5diff/CMakeLists.txt
+++ b/tools/test/h5diff/CMakeLists.txt
@@ -32,7 +32,7 @@ if (BUILD_SHARED_LIBS)
add_library (${H5DIFF_TOOL_PLUGIN_LIB_TARGET} SHARED dynlib_diff.c)
target_include_directories (${H5DIFF_TOOL_PLUGIN_LIB_TARGET} PRIVATE "${HDF5_SRC_DIR};${HDF5_SRC_BINARY_DIR};$<$<BOOL:${HDF5_ENABLE_PARALLEL}>:${MPI_C_INCLUDE_DIRS}>")
TARGET_C_PROPERTIES (${H5DIFF_TOOL_PLUGIN_LIB_TARGET} SHARED)
- target_link_libraries (${H5DIFF_TOOL_PLUGIN_LIB_TARGET} PRIVATE ${HDF5_TEST_LIBSH_TARGET})
+ target_link_libraries (${H5DIFF_TOOL_PLUGIN_LIB_TARGET} PRIVATE ${HDF5_LIBSH_TARGET})
H5_SET_LIB_OPTIONS (${H5DIFF_TOOL_PLUGIN_LIB_TARGET} ${H5DIFF_TOOL_PLUGIN_LIB_NAME} SHARED "LIB")
#-----------------------------------------------------------------------------
diff --git a/tools/test/h5diff/CMakeTests.cmake b/tools/test/h5diff/CMakeTests.cmake
index aeae2e4..4fcfa26 100644
--- a/tools/test/h5diff/CMakeTests.cmake
+++ b/tools/test/h5diff/CMakeTests.cmake
@@ -376,40 +376,44 @@
macro (ADD_H5_TEST resultfile resultcode)
if (HDF5_TEST_SERIAL)
- # If using memchecker add tests without using scripts
- if (HDF5_ENABLE_USING_MEMCHECKER)
- add_test (NAME H5DIFF-${resultfile} COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $<TARGET_FILE:h5diff${tgt_file_ext}> ${ARGN})
- set_tests_properties (H5DIFF-${resultfile} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
- if (${resultcode})
- set_tests_properties (H5DIFF-${resultfile} PROPERTIES WILL_FAIL "true")
- endif ()
- if (last_test)
- set_tests_properties (H5DIFF-${resultfile} PROPERTIES DEPENDS ${last_test})
- endif ()
- else ()
- add_test (
- NAME H5DIFF-${resultfile}
- COMMAND "${CMAKE_COMMAND}"
- -D "TEST_EMULATOR=${CMAKE_CROSSCOMPILING_EMULATOR}"
- -D "TEST_PROGRAM=$<TARGET_FILE:h5diff${tgt_file_ext}>"
- -D "TEST_ARGS:STRING=${ARGN}"
- -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
- -D "TEST_OUTPUT=${resultfile}.out"
- -D "TEST_EXPECT=${resultcode}"
- -D "TEST_REFERENCE=${resultfile}.txt"
- -D "TEST_APPEND=EXIT CODE:"
- -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
- )
- if (last_test)
- set_tests_properties (H5DIFF-${resultfile} PROPERTIES DEPENDS ${last_test})
- endif ()
- endif ()
+ ADD_SH5_TEST (${resultfile} ${resultcode} ${ARGN})
endif ()
if (H5_HAVE_PARALLEL AND HDF5_TEST_PARALLEL)
ADD_PH5_TEST (${resultfile} ${resultcode} ${ARGN})
endif ()
endmacro ()
+ macro (ADD_SH5_TEST resultfile resultcode)
+ # If using memchecker add tests without using scripts
+ if (HDF5_ENABLE_USING_MEMCHECKER)
+ add_test (NAME H5DIFF-${resultfile} COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $<TARGET_FILE:h5diff${tgt_file_ext}> ${ARGN})
+ set_tests_properties (H5DIFF-${resultfile} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
+ if (${resultcode})
+ set_tests_properties (H5DIFF-${resultfile} PROPERTIES WILL_FAIL "true")
+ endif ()
+ if (last_test)
+ set_tests_properties (H5DIFF-${resultfile} PROPERTIES DEPENDS ${last_test})
+ endif ()
+ else ()
+ add_test (
+ NAME H5DIFF-${resultfile}
+ COMMAND "${CMAKE_COMMAND}"
+ -D "TEST_EMULATOR=${CMAKE_CROSSCOMPILING_EMULATOR}"
+ -D "TEST_PROGRAM=$<TARGET_FILE:h5diff${tgt_file_ext}>"
+ -D "TEST_ARGS:STRING=${ARGN}"
+ -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
+ -D "TEST_OUTPUT=${resultfile}.out"
+ -D "TEST_EXPECT=${resultcode}"
+ -D "TEST_REFERENCE=${resultfile}.txt"
+ -D "TEST_APPEND=EXIT CODE:"
+ -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+ )
+ if (last_test)
+ set_tests_properties (H5DIFF-${resultfile} PROPERTIES DEPENDS ${last_test})
+ endif ()
+ endif ()
+ endmacro ()
+
macro (ADD_PH5_TEST resultfile resultcode)
# If using memchecker add tests without using scripts
if (HDF5_ENABLE_USING_MEMCHECKER)
@@ -446,7 +450,7 @@
macro (ADD_H5_UD_TEST testname resultcode resultfile)
if (NOT HDF5_ENABLE_USING_MEMCHECKER)
- if (${resultcode} EQUAL 2)
+ if ("${resultcode}" STREQUAL "2")
add_test (
NAME H5DIFF_UD-${testname}
COMMAND "${CMAKE_COMMAND}"
@@ -1549,7 +1553,8 @@ ADD_H5_TEST (h5diff_801 1 -v ${FILE7} ${FILE8A} /g1/array /g1/array)
# ##############################################################################
# # dataset subsets
# ##############################################################################
-#TRILABS_227 ADD_H5_TEST (h5diff_830 1 --enable-error-stack -v ${FILE7} ${FILE8} /g1/array3D[0,0,0;2,2,1;2,2,2;] /g1/array3D[0,0,0;2,2,1;2,2,2;])
+#serial only
+ADD_SH5_TEST (h5diff_830 1 --enable-error-stack -v ${FILE7} ${FILE8} /g1/array3D[0,0,0;2,2,1;2,2,2;] /g1/array3D[0,0,0;2,2,1;2,2,2;])
# ##############################################################################
# # VDS tests
diff --git a/tools/test/h5diff/dynlib_diff.c b/tools/test/h5diff/dynlib_diff.c
index 4568ca1..433522d 100644
--- a/tools/test/h5diff/dynlib_diff.c
+++ b/tools/test/h5diff/dynlib_diff.c
@@ -25,13 +25,13 @@ static size_t H5Z_filter_dynlibud(unsigned int flags, size_t cd_nelmts, const un
/* This message derives from H5Z */
const H5Z_class2_t H5Z_DYNLIBUD[1] = {{
- H5Z_CLASS_T_VERS, /* H5Z_class_t version */
- H5Z_FILTER_DYNLIBUD, /* Filter id number */
- 1, 1, /* Encoding and decoding enabled */
- "dynlibud", /* Filter name for debugging */
- NULL, /* The "can apply" callback */
- NULL, /* The "set local" callback */
- (H5Z_func_t)H5Z_filter_dynlibud, /* The actual filter function */
+ H5Z_CLASS_T_VERS, /* H5Z_class_t version */
+ H5Z_FILTER_DYNLIBUD, /* Filter id number */
+ 1, 1, /* Encoding and decoding enabled */
+ "dynlibud", /* Filter name for debugging */
+ NULL, /* The "can apply" callback */
+ NULL, /* The "set local" callback */
+ H5Z_filter_dynlibud, /* The actual filter function */
}};
H5PL_type_t
@@ -70,7 +70,7 @@ H5Z_filter_dynlibud(unsigned int flags, size_t cd_nelmts, const unsigned int *cd
return (0);
/* Assignment to eliminate unused parameter warning. */
- cd_values = cd_values;
+ (void)cd_values;
if (flags & H5Z_FLAG_REVERSE) { /*read*/
/* Subtract the original value with MULTIPLIER */
diff --git a/tools/test/h5diff/h5diffgentest.c b/tools/test/h5diff/h5diffgentest.c
index b2f4e9e..8b23e27 100644
--- a/tools/test/h5diff/h5diffgentest.c
+++ b/tools/test/h5diff/h5diffgentest.c
@@ -112,7 +112,7 @@ size_t H5TOOLS_MALLOCSIZE = (128 * 1024 * 1024);
#define SPACE1_DIM2 0
/* Error macros */
-#define AT() HDprintf("ERROR at %s:%d in %s()...\n", __FILE__, __LINE__, FUNC);
+#define AT() HDprintf("ERROR at %s:%d in %s()...\n", __FILE__, __LINE__, __func__);
#define PROGRAM_ERROR \
do { \
AT(); \
@@ -358,10 +358,10 @@ test_basic(const char *fname1, const char *fname2, const char *fname3)
*/
{
- double data1[3][2] = {{1.0F, 1.0F}, {1.00F, 1.000F}, {0.0F, 0.0F}};
- double data2[3][2] = {{0.0F, 1.1F}, {1.01F, 1.001F}, {0.0F, 1.0F}};
- double data3[3][2] = {{100.0F, 100.0F}, {100.00F, 100.000F}, {100.0F, 100.0F}};
- double data4[3][2] = {{105.0F, 120.0F}, {160.00F, 95.000F}, {80.0F, 40.0F}};
+ double data1[3][2] = {{1.0, 1.0}, {1.00, 1.000}, {0.0, 0.0}};
+ double data2[3][2] = {{0.0, 1.1}, {1.01, 1.001}, {0.0, 1.0}};
+ double data3[3][2] = {{100.0, 100.0}, {100.00, 100.000}, {100.0, 100.0}};
+ double data4[3][2] = {{105.0, 120.0}, {160.00, 95.000}, {80.0, 40.0}};
write_dset(gid1, 2, dims2, "dset1", H5T_NATIVE_DOUBLE, data1);
write_dset(gid2, 2, dims2, "dset2", H5T_NATIVE_DOUBLE, data2);
@@ -409,8 +409,8 @@ test_basic(const char *fname1, const char *fname2, const char *fname3)
*-------------------------------------------------------------------------
*/
{
- double data9[3][2] = {{100.0F, 100.0F}, {100.0F, 0.0F}, {0.0F, 100.0F}};
- double data10[3][2] = {{120.0F, 80.0F}, {0.0F, 100.0F}, {0.0F, 50.0F}};
+ double data9[3][2] = {{100.0, 100.0}, {100.0, 0.0}, {0.0, 100.0}};
+ double data10[3][2] = {{120.0, 80.0}, {0.0, 100.0}, {0.0, 50.0}};
write_dset(gid1, 2, dims2, "dset9", H5T_NATIVE_DOUBLE, data9);
write_dset(gid1, 2, dims2, "dset10", H5T_NATIVE_DOUBLE, data10);
@@ -465,19 +465,19 @@ test_basic(const char *fname1, const char *fname2, const char *fname3)
float data15[6];
float data16[6];
- data15[0] = (float)HDsqrt(-1.0F);
- data15[1] = 1.0F;
- data15[2] = (float)HDsqrt(-1.0F);
- data15[3] = 1.0F;
- data15[4] = 1.0F;
- data15[5] = 1.0F;
+ data15[0] = (float)HDsqrt(-1.0);
+ data15[1] = 1.0;
+ data15[2] = (float)HDsqrt(-1.0);
+ data15[3] = 1.0;
+ data15[4] = 1.0;
+ data15[5] = 1.0;
- data16[0] = (float)HDsqrt(-1.0F);
- data16[1] = (float)HDsqrt(-1.0F);
- data16[2] = 1.0F;
- data16[3] = 1.0F;
- data16[4] = 1.0F;
- data16[5] = 1.0F;
+ data16[0] = (float)HDsqrt(-1.0);
+ data16[1] = (float)HDsqrt(-1.0);
+ data16[2] = 1.0;
+ data16[3] = 1.0;
+ data16[4] = 1.0;
+ data16[5] = 1.0;
write_dset(gid1, 1, dims1, "fp15", H5T_NATIVE_FLOAT, data15);
write_dset(gid1, 1, dims1, "fp16", H5T_NATIVE_FLOAT, data16);
@@ -492,19 +492,19 @@ test_basic(const char *fname1, const char *fname2, const char *fname3)
double data17[6];
double data18[6];
- data17[0] = HDsqrt(-1.0F);
- data17[1] = 1.0F;
- data17[2] = HDsqrt(-1.0F);
- data17[3] = 1.0F;
- data17[4] = 1.0F;
- data17[5] = 1.0F;
+ data17[0] = HDsqrt(-1.0);
+ data17[1] = 1.0;
+ data17[2] = HDsqrt(-1.0);
+ data17[3] = 1.0;
+ data17[4] = 1.0;
+ data17[5] = 1.0;
- data18[0] = HDsqrt(-1.0F);
- data18[1] = HDsqrt(-10000.0F);
- data18[2] = 1.0F;
- data18[3] = 1.0F;
- data18[4] = 1.0F;
- data18[5] = 1.0F;
+ data18[0] = HDsqrt(-1.0);
+ data18[1] = HDsqrt(-10000.0);
+ data18[2] = 1.0;
+ data18[3] = 1.0;
+ data18[4] = 1.0;
+ data18[5] = 1.0;
write_dset(gid1, 1, dims1, "fp17", H5T_NATIVE_DOUBLE, data17);
write_dset(gid1, 1, dims1, "fp18", H5T_NATIVE_DOUBLE, data18);
@@ -519,11 +519,11 @@ test_basic(const char *fname1, const char *fname2, const char *fname3)
float data19[6];
double data20[6];
- data19[0] = data19[1] = data19[2] = (float)HDlog(0.0F);
- data19[3] = data19[4] = data19[5] = (float)-HDlog(0.0F);
+ data19[0] = data19[1] = data19[2] = (float)HDlog(0.0);
+ data19[3] = data19[4] = data19[5] = (float)-HDlog(0.0);
- data20[0] = data20[1] = data20[2] = HDlog(0.0F);
- data20[3] = data20[4] = data20[5] = -HDlog(0.0F);
+ data20[0] = data20[1] = data20[2] = HDlog(0.0);
+ data20[3] = data20[4] = data20[5] = -HDlog(0.0);
write_dset(gid1, 1, dims1, "fp19", H5T_NATIVE_FLOAT, data19);
write_dset(gid1, 1, dims1, "fp19_COPY", H5T_NATIVE_FLOAT, data19);
@@ -547,15 +547,15 @@ test_basic(const char *fname1, const char *fname2, const char *fname3)
size_t type_size;
hid_t tid;
- buf1[0].d = HDsqrt(-1.0F);
- buf1[0].f = (float)HDsqrt(-1.0F);
- buf2[0].d = HDsqrt(-1.0F);
- buf2[0].f = (float)HDsqrt(-1.0F);
+ buf1[0].d = HDsqrt(-1.0);
+ buf1[0].f = (float)HDsqrt(-1.0);
+ buf2[0].d = HDsqrt(-1.0);
+ buf2[0].f = (float)HDsqrt(-1.0);
- buf1[1].d = HDsqrt(-1.0F);
- buf1[1].f = (float)HDsqrt(-1.0F);
- buf2[1].d = 0.0F;
- buf2[1].f = 0.0F;
+ buf1[1].d = HDsqrt(-1.0);
+ buf1[1].f = (float)HDsqrt(-1.0);
+ buf2[1].d = 0.0;
+ buf2[1].f = 0.0;
type_size = sizeof(cmp1_t);
tid = H5Tcreate(H5T_COMPOUND, type_size);
@@ -583,13 +583,13 @@ test_basic(const char *fname1, const char *fname2, const char *fname3)
int i;
} cmp3_t;
- double data2[6] = {0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F};
+ double data2[6] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
int data3[6] = {0, 0, 0, 0, 0, 0};
int data4[3][2] = {{0, 0}, {0, 0}, {0, 0}};
int data5[2][2] = {{0, 0}, {0, 0}};
unsigned int data6[3][2] = {{0, 0}, {0, 0}, {0, 0}};
- cmp1_t data7[1] = {{1.0f, 2}};
- cmp2_t data8[1] = {{1, 2.0f}};
+ cmp1_t data7[1] = {{1.0, 2}};
+ cmp2_t data8[1] = {{1, 2.0}};
hsize_t dims3[2] = {2, 2};
hsize_t dims4[1] = {1};
size_t type_size;
@@ -789,10 +789,10 @@ test_datatypes(const char *fname)
int buf3b[3][2] = {{1, 1}, {3, 4}, {5, 6}};
long buf4a[3][2] = {{1, 1}, {1, 1}, {1, 1}};
long buf4b[3][2] = {{1, 1}, {3, 4}, {5, 6}};
- float buf5a[3][2] = {{1.0F, 1.0F}, {1.0F, 1.0F}, {1.0F, 1.0F}};
- float buf5b[3][2] = {{1.0F, 1.0F}, {3.0F, 4.0F}, {5.0F, 6.0F}};
- double buf6a[3][2] = {{1.0F, 1.0F}, {1.0F, 1.0F}, {1.0F, 1.0F}};
- double buf6b[3][2] = {{1.0F, 1.0F}, {3.0F, 4.0F}, {5.0F, 6.0F}};
+ float buf5a[3][2] = {{1.0, 1.0}, {1.0, 1.0}, {1.0, 1.0}};
+ float buf5b[3][2] = {{1.0, 1.0}, {3.0, 4.0}, {5.0, 6.0}};
+ double buf6a[3][2] = {{1.0, 1.0}, {1.0, 1.0}, {1.0, 1.0}};
+ double buf6b[3][2] = {{1.0, 1.0}, {3.0, 4.0}, {5.0, 6.0}};
/*unsigned/signed test
signed char -128 to 127
@@ -5009,8 +5009,6 @@ error:
H5Tclose(tid2);
}
H5E_END_TRY;
-
- return;
}
static hid_t
@@ -5214,27 +5212,27 @@ write_attr_strings(hid_t loc_id, const char *dset_name, hid_t fid,
char buf1[2][STR_SIZE] = {"ab", "de"}; /* string */
char * buf1a[2]; /* VL string */
char buf2[2] = {1, 2}; /* bitfield, opaque */
- s_t buf3[2] = {{1, 2.0F}, {3, 4.0F}}; /* compound */
+ s_t buf3[2] = {{1, 2.0}, {3, 4.0}}; /* compound */
hobj_ref_t buf4[2]; /* reference */
e_t buf45[2] = {RED, RED}; /* enum */
hvl_t buf5[2]; /* vlen */
hsize_t dimarray[1] = {3}; /* array dimension */
int buf6[2][3] = {{1, 2, 3}, {4, 5, 6}}; /* array */
int buf7[2] = {1, 2}; /* integer */
- float buf8[2] = {1.0F, 2.0F}; /* float */
+ float buf8[2] = {1.0, 2.0}; /* float */
/* create 2D attributes with dimension [3][2], 6 elements */
- hsize_t dims2[2] = {3, 2};
- char buf12[3][2][STR_SIZE] = {{"ab", "cd"}, {"ef", "gh"}, {"ij", "kl"}}; /* string */
- char * buf12a[3][2]; /* VL string */
- char buf22[3][2] = {{1, 2}, {3, 4}, {5, 6}}; /* bitfield, opaque */
- s_t buf32[6] = {{1, 2.0F}, {3, 4.0F}, {5, 6.0F}, {7, 8.0F}, {9, 10.0F}, {11, 12.0F}}; /* compound */
+ hsize_t dims2[2] = {3, 2};
+ char buf12[3][2][STR_SIZE] = {{"ab", "cd"}, {"ef", "gh"}, {"ij", "kl"}}; /* string */
+ char * buf12a[3][2]; /* VL string */
+ char buf22[3][2] = {{1, 2}, {3, 4}, {5, 6}}; /* bitfield, opaque */
+ s_t buf32[6] = {{1, 2.0}, {3, 4.0}, {5, 6.0}, {7, 8.0}, {9, 10.0}, {11, 12.0}}; /* compound */
hobj_ref_t buf42[3][2]; /* reference */
e_t buf452[3][2]; /* enum */
hvl_t buf52[3][2]; /* vlen */
int buf62[6][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}, {13, 14, 15}, {16, 17, 18}}; /* array */
- int buf72[3][2] = {{1, 2}, {3, 4}, {5, 6}}; /* integer */
- float buf82[3][2] = {{1.0F, 2.0F}, {3.0F, 4.0F}, {5.0F, 6.0F}}; /* float */
+ int buf72[3][2] = {{1, 2}, {3, 4}, {5, 6}}; /* integer */
+ float buf82[3][2] = {{1.0, 2.0}, {3.0, 4.0}, {5.0, 6.0}}; /* float */
/* create 3D attributes with dimension [4][3][2], 24 elements */
hsize_t dims3[3] = {4, 3, 2};
@@ -5935,7 +5933,7 @@ write_attr_strings(hid_t loc_id, const char *dset_name, hid_t fid,
for (k = 0; k < 2; k++)
if (make_diffs) {
buf33[i][j][k].a = 0;
- buf33[i][j][k].b = 0.0F;
+ buf33[i][j][k].b = 0.0;
}
else {
buf33[i][j][k].a = (char)n++;
@@ -6145,7 +6143,7 @@ write_attr_strings(hid_t loc_id, const char *dset_name, hid_t fid,
for (k = 0; k < 2; k++) {
if (make_diffs) {
buf73[i][j][k] = 0;
- buf83[i][j][k] = 0.0F;
+ buf83[i][j][k] = 0.0;
}
else {
buf73[i][j][k] = n++;
@@ -6203,27 +6201,27 @@ write_attr_in(hid_t loc_id, const char *dset_name, hid_t fid,
char buf1[2][STR_SIZE] = {"ab", "de"}; /* string */
char * buf1a[2]; /* VL string */
char buf2[2] = {1, 2}; /* bitfield, opaque */
- s_t buf3[2] = {{1, 2.0F}, {3, 4.0F}}; /* compound */
+ s_t buf3[2] = {{1, 2.0}, {3, 4.0}}; /* compound */
hobj_ref_t buf4[2]; /* reference */
e_t buf45[2] = {RED, RED}; /* enum */
hvl_t buf5[2]; /* vlen */
hsize_t dimarray[1] = {3}; /* array dimension */
int buf6[2][3] = {{1, 2, 3}, {4, 5, 6}}; /* array */
int buf7[2] = {1, 2}; /* integer */
- float buf8[2] = {1.0F, 2.0F}; /* float */
+ float buf8[2] = {1.0, 2.0}; /* float */
/* create 2D attributes with dimension [3][2], 6 elements */
- hsize_t dims2[2] = {3, 2};
- char buf12[3][2][STR_SIZE] = {{"ab", "cd"}, {"ef", "gh"}, {"ij", "kl"}}; /* string */
- char * buf12a[3][2]; /* VL string */
- char buf22[3][2] = {{1, 2}, {3, 4}, {5, 6}}; /* bitfield, opaque */
- s_t buf32[6] = {{1, 2.0F}, {3, 4.0F}, {5, 6.0F}, {7, 8.0F}, {9, 10.0F}, {11, 12.0F}}; /* compound */
+ hsize_t dims2[2] = {3, 2};
+ char buf12[3][2][STR_SIZE] = {{"ab", "cd"}, {"ef", "gh"}, {"ij", "kl"}}; /* string */
+ char * buf12a[3][2]; /* VL string */
+ char buf22[3][2] = {{1, 2}, {3, 4}, {5, 6}}; /* bitfield, opaque */
+ s_t buf32[6] = {{1, 2.0}, {3, 4.0}, {5, 6.0}, {7, 8.0}, {9, 10.0}, {11, 12.0}}; /* compound */
hobj_ref_t buf42[3][2]; /* reference */
e_t buf452[3][2]; /* enum */
hvl_t buf52[3][2]; /* vlen */
int buf62[6][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}, {13, 14, 15}, {16, 17, 18}}; /* array */
- int buf72[3][2] = {{1, 2}, {3, 4}, {5, 6}}; /* integer */
- float buf82[3][2] = {{1.0F, 2.0F}, {3.0F, 4.0F}, {5.0F, 6.0F}}; /* float */
+ int buf72[3][2] = {{1, 2}, {3, 4}, {5, 6}}; /* integer */
+ float buf82[3][2] = {{1.0, 2.0}, {3.0, 4.0}, {5.0, 6.0}}; /* float */
/* create 3D attributes with dimension [4][3][2], 24 elements */
hsize_t dims3[3] = {4, 3, 2};
@@ -6924,7 +6922,7 @@ write_attr_in(hid_t loc_id, const char *dset_name, hid_t fid,
for (k = 0; k < 2; k++) {
if (make_diffs) {
buf33[i][j][k].a = 0;
- buf33[i][j][k].b = 0.0F;
+ buf33[i][j][k].b = 0.0;
}
else {
buf33[i][j][k].a = (char)n++;
@@ -7134,7 +7132,7 @@ write_attr_in(hid_t loc_id, const char *dset_name, hid_t fid,
for (k = 0; k < 2; k++) {
if (make_diffs) {
buf73[i][j][k] = 0;
- buf83[i][j][k] = 0.0F;
+ buf83[i][j][k] = 0.0;
}
else {
buf73[i][j][k] = n++;
@@ -7195,26 +7193,26 @@ write_dset_in(hid_t loc_id, const char *dset_name, hid_t fid,
char buf1[2][STR_SIZE] = {"ab", "de"}; /* string */
char * buf1a[2]; /* VL string */
char buf2[2] = {1, 2}; /* bitfield, opaque */
- s_t buf3[2] = {{1, 2.0F}, {3, 4.0F}}; /* compound */
+ s_t buf3[2] = {{1, 2.0}, {3, 4.0}}; /* compound */
hobj_ref_t buf4[2]; /* reference */
e_t buf45[2] = {RED, GREEN}; /* enum */
hvl_t buf5[2]; /* vlen */
hsize_t dimarray[1] = {3}; /* array dimension */
int buf6[2][3] = {{1, 2, 3}, {4, 5, 6}}; /* array */
int buf7[2] = {1, 2}; /* integer */
- float buf8[2] = {1.0F, 2.0F}; /* float */
+ float buf8[2] = {1.0, 2.0}; /* float */
/* create 2D attributes with dimension [3][2], 6 elements */
- hsize_t dims2[2] = {3, 2};
- char buf12[3][2][STR_SIZE] = {{"ab", "cd"}, {"ef", "gh"}, {"ij", "kl"}}; /* string */
- char * buf12a[3][2]; /* VL string */
- char buf22[3][2] = {{1, 2}, {3, 4}, {5, 6}}; /* bitfield, opaque */
- s_t buf32[6] = {{1, 2.0F}, {3, 4.0F}, {5, 6.0F}, {7, 8.0F}, {9, 10.0F}, {11, 12.0F}}; /* compound */
+ hsize_t dims2[2] = {3, 2};
+ char buf12[3][2][STR_SIZE] = {{"ab", "cd"}, {"ef", "gh"}, {"ij", "kl"}}; /* string */
+ char * buf12a[3][2]; /* VL string */
+ char buf22[3][2] = {{1, 2}, {3, 4}, {5, 6}}; /* bitfield, opaque */
+ s_t buf32[6] = {{1, 2.0}, {3, 4.0}, {5, 6.0}, {7, 8.0}, {9, 10.0}, {11, 12.0}}; /* compound */
hobj_ref_t buf42[3][2]; /* reference */
hvl_t buf52[3][2]; /* vlen */
int buf62[6][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}, {13, 14, 15}, {16, 17, 18}}; /* array */
- int buf72[3][2] = {{1, 2}, {3, 4}, {5, 6}}; /* integer */
- float buf82[3][2] = {{1.0F, 2.0F}, {3.0F, 4.0F}, {5.0F, 6.0F}}; /* float */
+ int buf72[3][2] = {{1, 2}, {3, 4}, {5, 6}}; /* integer */
+ float buf82[3][2] = {{1.0, 2.0}, {3.0, 4.0}, {5.0, 6.0}}; /* float */
/* create 3D attributes with dimension [4][3][2], 24 elements */
hsize_t dims3[3] = {4, 3, 2};
@@ -7682,7 +7680,7 @@ write_dset_in(hid_t loc_id, const char *dset_name, hid_t fid,
for (k = 0; k < 2; k++) {
if (make_diffs) {
buf33[i][j][k].a = 0;
- buf33[i][j][k].b = 0.0F;
+ buf33[i][j][k].b = 0.0;
}
else {
buf33[i][j][k].a = (char)n++;
@@ -7780,7 +7778,7 @@ write_dset_in(hid_t loc_id, const char *dset_name, hid_t fid,
for (k = 0; k < 2; k++) {
if (make_diffs) {
buf73[i][j][k] = 0;
- buf83[i][j][k] = 0.0F;
+ buf83[i][j][k] = 0.0;
}
else {
buf73[i][j][k] = n++;
@@ -8058,8 +8056,6 @@ error:
H5Fclose(fid2);
}
H5E_END_TRY;
-
- return;
}
/*-------------------------------------------------------------------------
diff --git a/tools/test/h5diff/testfiles/h5diff_10.txt b/tools/test/h5diff/testfiles/h5diff_10.txt
index 3631db7..c8e8560 100644
--- a/tools/test/h5diff/testfiles/h5diff_10.txt
+++ b/tools/test/h5diff/testfiles/h5diff_10.txt
@@ -36,6 +36,18 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[ obj2]]
HDF5 file specified
--vol-info-2 VOL-specific info to pass to the VOL connector used for
opening the second HDF5 file specified
+ --vfd-value-1 Value (ID) of the VFL driver to use for opening the
+ first HDF5 file specified
+ --vfd-name-1 Name of the VFL driver to use for opening the first
+ HDF5 file specified
+ --vfd-info-1 VFD-specific info to pass to the VFL driver used for
+ opening the first HDF5 file specified
+ --vfd-value-2 Value (ID) of the VFL driver to use for opening the
+ second HDF5 file specified
+ --vfd-name-2 Name of the VFL driver to use for opening the second
+ HDF5 file specified
+ --vfd-info-2 VFD-specific info to pass to the VFL driver used for
+ opening the second HDF5 file specified
--follow-symlinks
Follow symbolic links (soft links and external links and compare the)
links' target objects.
diff --git a/tools/test/h5diff/testfiles/h5diff_600.txt b/tools/test/h5diff/testfiles/h5diff_600.txt
index 8a4ce6d..c8190ce 100644
--- a/tools/test/h5diff/testfiles/h5diff_600.txt
+++ b/tools/test/h5diff/testfiles/h5diff_600.txt
@@ -36,6 +36,18 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[ obj2]]
HDF5 file specified
--vol-info-2 VOL-specific info to pass to the VOL connector used for
opening the second HDF5 file specified
+ --vfd-value-1 Value (ID) of the VFL driver to use for opening the
+ first HDF5 file specified
+ --vfd-name-1 Name of the VFL driver to use for opening the first
+ HDF5 file specified
+ --vfd-info-1 VFD-specific info to pass to the VFL driver used for
+ opening the first HDF5 file specified
+ --vfd-value-2 Value (ID) of the VFL driver to use for opening the
+ second HDF5 file specified
+ --vfd-name-2 Name of the VFL driver to use for opening the second
+ HDF5 file specified
+ --vfd-info-2 VFD-specific info to pass to the VFL driver used for
+ opening the second HDF5 file specified
--follow-symlinks
Follow symbolic links (soft links and external links and compare the)
links' target objects.
diff --git a/tools/test/h5diff/testfiles/h5diff_603.txt b/tools/test/h5diff/testfiles/h5diff_603.txt
index d4c7336..03c23e7 100644
--- a/tools/test/h5diff/testfiles/h5diff_603.txt
+++ b/tools/test/h5diff/testfiles/h5diff_603.txt
@@ -37,6 +37,18 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[ obj2]]
HDF5 file specified
--vol-info-2 VOL-specific info to pass to the VOL connector used for
opening the second HDF5 file specified
+ --vfd-value-1 Value (ID) of the VFL driver to use for opening the
+ first HDF5 file specified
+ --vfd-name-1 Name of the VFL driver to use for opening the first
+ HDF5 file specified
+ --vfd-info-1 VFD-specific info to pass to the VFL driver used for
+ opening the first HDF5 file specified
+ --vfd-value-2 Value (ID) of the VFL driver to use for opening the
+ second HDF5 file specified
+ --vfd-name-2 Name of the VFL driver to use for opening the second
+ HDF5 file specified
+ --vfd-info-2 VFD-specific info to pass to the VFL driver used for
+ opening the second HDF5 file specified
--follow-symlinks
Follow symbolic links (soft links and external links and compare the)
links' target objects.
diff --git a/tools/test/h5diff/testfiles/h5diff_606.txt b/tools/test/h5diff/testfiles/h5diff_606.txt
index 3123587..0e9d5be 100644
--- a/tools/test/h5diff/testfiles/h5diff_606.txt
+++ b/tools/test/h5diff/testfiles/h5diff_606.txt
@@ -37,6 +37,18 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[ obj2]]
HDF5 file specified
--vol-info-2 VOL-specific info to pass to the VOL connector used for
opening the second HDF5 file specified
+ --vfd-value-1 Value (ID) of the VFL driver to use for opening the
+ first HDF5 file specified
+ --vfd-name-1 Name of the VFL driver to use for opening the first
+ HDF5 file specified
+ --vfd-info-1 VFD-specific info to pass to the VFL driver used for
+ opening the first HDF5 file specified
+ --vfd-value-2 Value (ID) of the VFL driver to use for opening the
+ second HDF5 file specified
+ --vfd-name-2 Name of the VFL driver to use for opening the second
+ HDF5 file specified
+ --vfd-info-2 VFD-specific info to pass to the VFL driver used for
+ opening the second HDF5 file specified
--follow-symlinks
Follow symbolic links (soft links and external links and compare the)
links' target objects.
diff --git a/tools/test/h5diff/testfiles/h5diff_612.txt b/tools/test/h5diff/testfiles/h5diff_612.txt
index ce2d887..ac19926 100644
--- a/tools/test/h5diff/testfiles/h5diff_612.txt
+++ b/tools/test/h5diff/testfiles/h5diff_612.txt
@@ -37,6 +37,18 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[ obj2]]
HDF5 file specified
--vol-info-2 VOL-specific info to pass to the VOL connector used for
opening the second HDF5 file specified
+ --vfd-value-1 Value (ID) of the VFL driver to use for opening the
+ first HDF5 file specified
+ --vfd-name-1 Name of the VFL driver to use for opening the first
+ HDF5 file specified
+ --vfd-info-1 VFD-specific info to pass to the VFL driver used for
+ opening the first HDF5 file specified
+ --vfd-value-2 Value (ID) of the VFL driver to use for opening the
+ second HDF5 file specified
+ --vfd-name-2 Name of the VFL driver to use for opening the second
+ HDF5 file specified
+ --vfd-info-2 VFD-specific info to pass to the VFL driver used for
+ opening the second HDF5 file specified
--follow-symlinks
Follow symbolic links (soft links and external links and compare the)
links' target objects.
diff --git a/tools/test/h5diff/testfiles/h5diff_615.txt b/tools/test/h5diff/testfiles/h5diff_615.txt
index 61fd036..44eba43 100644
--- a/tools/test/h5diff/testfiles/h5diff_615.txt
+++ b/tools/test/h5diff/testfiles/h5diff_615.txt
@@ -37,6 +37,18 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[ obj2]]
HDF5 file specified
--vol-info-2 VOL-specific info to pass to the VOL connector used for
opening the second HDF5 file specified
+ --vfd-value-1 Value (ID) of the VFL driver to use for opening the
+ first HDF5 file specified
+ --vfd-name-1 Name of the VFL driver to use for opening the first
+ HDF5 file specified
+ --vfd-info-1 VFD-specific info to pass to the VFL driver used for
+ opening the first HDF5 file specified
+ --vfd-value-2 Value (ID) of the VFL driver to use for opening the
+ second HDF5 file specified
+ --vfd-name-2 Name of the VFL driver to use for opening the second
+ HDF5 file specified
+ --vfd-info-2 VFD-specific info to pass to the VFL driver used for
+ opening the second HDF5 file specified
--follow-symlinks
Follow symbolic links (soft links and external links and compare the)
links' target objects.
diff --git a/tools/test/h5diff/testfiles/h5diff_621.txt b/tools/test/h5diff/testfiles/h5diff_621.txt
index dc8655d..32310eb 100644
--- a/tools/test/h5diff/testfiles/h5diff_621.txt
+++ b/tools/test/h5diff/testfiles/h5diff_621.txt
@@ -37,6 +37,18 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[ obj2]]
HDF5 file specified
--vol-info-2 VOL-specific info to pass to the VOL connector used for
opening the second HDF5 file specified
+ --vfd-value-1 Value (ID) of the VFL driver to use for opening the
+ first HDF5 file specified
+ --vfd-name-1 Name of the VFL driver to use for opening the first
+ HDF5 file specified
+ --vfd-info-1 VFD-specific info to pass to the VFL driver used for
+ opening the first HDF5 file specified
+ --vfd-value-2 Value (ID) of the VFL driver to use for opening the
+ second HDF5 file specified
+ --vfd-name-2 Name of the VFL driver to use for opening the second
+ HDF5 file specified
+ --vfd-info-2 VFD-specific info to pass to the VFL driver used for
+ opening the second HDF5 file specified
--follow-symlinks
Follow symbolic links (soft links and external links and compare the)
links' target objects.
diff --git a/tools/test/h5diff/testfiles/h5diff_622.txt b/tools/test/h5diff/testfiles/h5diff_622.txt
index f20ffbe..630184f 100644
--- a/tools/test/h5diff/testfiles/h5diff_622.txt
+++ b/tools/test/h5diff/testfiles/h5diff_622.txt
@@ -37,6 +37,18 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[ obj2]]
HDF5 file specified
--vol-info-2 VOL-specific info to pass to the VOL connector used for
opening the second HDF5 file specified
+ --vfd-value-1 Value (ID) of the VFL driver to use for opening the
+ first HDF5 file specified
+ --vfd-name-1 Name of the VFL driver to use for opening the first
+ HDF5 file specified
+ --vfd-info-1 VFD-specific info to pass to the VFL driver used for
+ opening the first HDF5 file specified
+ --vfd-value-2 Value (ID) of the VFL driver to use for opening the
+ second HDF5 file specified
+ --vfd-name-2 Name of the VFL driver to use for opening the second
+ HDF5 file specified
+ --vfd-info-2 VFD-specific info to pass to the VFL driver used for
+ opening the second HDF5 file specified
--follow-symlinks
Follow symbolic links (soft links and external links and compare the)
links' target objects.
diff --git a/tools/test/h5diff/testfiles/h5diff_623.txt b/tools/test/h5diff/testfiles/h5diff_623.txt
index f73d202..82c4ce2 100644
--- a/tools/test/h5diff/testfiles/h5diff_623.txt
+++ b/tools/test/h5diff/testfiles/h5diff_623.txt
@@ -37,6 +37,18 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[ obj2]]
HDF5 file specified
--vol-info-2 VOL-specific info to pass to the VOL connector used for
opening the second HDF5 file specified
+ --vfd-value-1 Value (ID) of the VFL driver to use for opening the
+ first HDF5 file specified
+ --vfd-name-1 Name of the VFL driver to use for opening the first
+ HDF5 file specified
+ --vfd-info-1 VFD-specific info to pass to the VFL driver used for
+ opening the first HDF5 file specified
+ --vfd-value-2 Value (ID) of the VFL driver to use for opening the
+ second HDF5 file specified
+ --vfd-name-2 Name of the VFL driver to use for opening the second
+ HDF5 file specified
+ --vfd-info-2 VFD-specific info to pass to the VFL driver used for
+ opening the second HDF5 file specified
--follow-symlinks
Follow symbolic links (soft links and external links and compare the)
links' target objects.
diff --git a/tools/test/h5diff/testfiles/h5diff_624.txt b/tools/test/h5diff/testfiles/h5diff_624.txt
index 903b738..a675ec6 100644
--- a/tools/test/h5diff/testfiles/h5diff_624.txt
+++ b/tools/test/h5diff/testfiles/h5diff_624.txt
@@ -37,6 +37,18 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[ obj2]]
HDF5 file specified
--vol-info-2 VOL-specific info to pass to the VOL connector used for
opening the second HDF5 file specified
+ --vfd-value-1 Value (ID) of the VFL driver to use for opening the
+ first HDF5 file specified
+ --vfd-name-1 Name of the VFL driver to use for opening the first
+ HDF5 file specified
+ --vfd-info-1 VFD-specific info to pass to the VFL driver used for
+ opening the first HDF5 file specified
+ --vfd-value-2 Value (ID) of the VFL driver to use for opening the
+ second HDF5 file specified
+ --vfd-name-2 Name of the VFL driver to use for opening the second
+ HDF5 file specified
+ --vfd-info-2 VFD-specific info to pass to the VFL driver used for
+ opening the second HDF5 file specified
--follow-symlinks
Follow symbolic links (soft links and external links and compare the)
links' target objects.
diff --git a/tools/test/h5diff/testh5diff.sh.in b/tools/test/h5diff/testh5diff.sh.in
index 53e9bf4..bd27dd0 100644
--- a/tools/test/h5diff/testh5diff.sh.in
+++ b/tools/test/h5diff/testh5diff.sh.in
@@ -1205,7 +1205,7 @@ TOOLTEST h5diff_801.txt -v h5diff_dset1.h5 h5diff_dset3.h5 /g1/array /g1/array
# ##############################################################################
# # dataset subsets
# ##############################################################################
-#TRILABS_227 TOOLTEST h5diff_830.txt --enable-error-stack -v h5diff_dset1.h5 h5diff_dset2.h5 /g1/array3D[0,0,0;2,2,1;2,2,2;] /g1/array3D[0,0,0;2,2,1;2,2,2;]
+#TOOLTEST h5diff_830.txt --enable-error-stack -v h5diff_dset1.h5 h5diff_dset2.h5 "/g1/array3D[0,0,0;2,2,1;2,2,2;]" "/g1/array3D[0,0,0;2,2,1;2,2,2;]"
# ##############################################################################
# VDS tests
diff --git a/tools/test/h5dump/CMakeLists.txt b/tools/test/h5dump/CMakeLists.txt
index 242465e..a7b4846 100644
--- a/tools/test/h5dump/CMakeLists.txt
+++ b/tools/test/h5dump/CMakeLists.txt
@@ -12,7 +12,7 @@ if (BUILD_SHARED_LIBS)
add_library (${H5DUMP_TOOL_PLUGIN_LIB_TARGET} SHARED dynlib_dump.c)
target_include_directories (${H5DUMP_TOOL_PLUGIN_LIB_TARGET} PRIVATE "${HDF5_SRC_DIR};${HDF5_SRC_BINARY_DIR};$<$<BOOL:${HDF5_ENABLE_PARALLEL}>:${MPI_C_INCLUDE_DIRS}>")
TARGET_C_PROPERTIES (${H5DUMP_TOOL_PLUGIN_LIB_TARGET} SHARED)
- target_link_libraries (${H5DUMP_TOOL_PLUGIN_LIB_TARGET} PRIVATE ${HDF5_TEST_LIBSH_TARGET})
+ target_link_libraries (${H5DUMP_TOOL_PLUGIN_LIB_TARGET} PRIVATE ${HDF5_LIBSH_TARGET})
H5_SET_LIB_OPTIONS (${H5DUMP_TOOL_PLUGIN_LIB_TARGET} ${H5DUMP_TOOL_PLUGIN_LIB_NAME} SHARED "LIB")
#-----------------------------------------------------------------------------
diff --git a/tools/test/h5dump/CMakeTests.cmake b/tools/test/h5dump/CMakeTests.cmake
index f54da76..a8984de 100644
--- a/tools/test/h5dump/CMakeTests.cmake
+++ b/tools/test/h5dump/CMakeTests.cmake
@@ -101,6 +101,8 @@
${HDF5_TOOLS_DIR}/testfiles/tfamily.ddl
${HDF5_TOOLS_DIR}/testfiles/tfill.ddl
${HDF5_TOOLS_DIR}/testfiles/tfletcher32.ddl
+ #${HDF5_TOOLS_DIR}/testfiles/tfloatsattrs.ddl #native
+ #${HDF5_TOOLS_DIR}/testfiles/tfloatsattrs.wddl #special for windows
${HDF5_TOOLS_DIR}/testfiles/tfpformat.ddl
${HDF5_TOOLS_DIR}/testfiles/tgroup-1.ddl
${HDF5_TOOLS_DIR}/testfiles/tgroup-2.ddl
@@ -128,6 +130,7 @@
${HDF5_TOOLS_DIR}/testfiles/tintsnodata.ddl
${HDF5_TOOLS_DIR}/testfiles/tlarge_objname.ddl
${HDF5_TOOLS_DIR}/testfiles/tldouble.ddl
+ ${HDF5_TOOLS_DIR}/testfiles/tldouble_scalar.ddl
${HDF5_TOOLS_DIR}/testfiles/tlonglinks.ddl
${HDF5_TOOLS_DIR}/testfiles/tloop-1.ddl
${HDF5_TOOLS_DIR}/testfiles/tmulti.ddl
@@ -282,6 +285,7 @@
${HDF5_TOOLS_DIR}/testfiles/tfcontents1.h5
${HDF5_TOOLS_DIR}/testfiles/tfcontents2.h5
${HDF5_TOOLS_DIR}/testfiles/tfilters.h5
+ ${HDF5_TOOLS_DIR}/testfiles/tfloatsattrs.h5
${HDF5_TOOLS_DIR}/testfiles/tfpformat.h5
${HDF5_TOOLS_DIR}/testfiles/tfvalues.h5
${HDF5_TOOLS_DIR}/testfiles/tgroup.h5
@@ -294,6 +298,7 @@
${HDF5_TOOLS_DIR}/testfiles/tintsnodata.h5
${HDF5_TOOLS_DIR}/testfiles/tlarge_objname.h5
${HDF5_TOOLS_DIR}/testfiles/tldouble.h5
+ ${HDF5_TOOLS_DIR}/testfiles/tldouble_scalar.h5
${HDF5_TOOLS_DIR}/testfiles/tlonglinks.h5
${HDF5_TOOLS_DIR}/testfiles/tloop.h5
${HDF5_TOOLS_DIR}/testfiles/tmulti-b.h5
@@ -331,6 +336,8 @@
${HDF5_TOOLS_DIR}/testfiles/tvlstr.h5
${HDF5_TOOLS_DIR}/testfiles/tvms.h5
${HDF5_TOOLS_DIR}/testfiles/t128bit_float.h5
+ ${HDF5_TOOLS_DIR}/testfiles/tCVE_2018_11206_fill_old.h5
+ ${HDF5_TOOLS_DIR}/testfiles/tCVE_2018_11206_fill_new.h5
${HDF5_TOOLS_DIR}/testfiles/zerodim.h5
#STD_REF_OBJ files
${HDF5_TOOLS_DIR}/testfiles/trefer_attr.h5
@@ -409,8 +416,10 @@
configure_file(${HDF5_TOOLS_DIR}/testfiles/tbinregR.exp ${PROJECT_BINARY_DIR}/testfiles/std/tbinregR.exp NEWLINE_STYLE CRLF)
#file (READ ${HDF5_TOOLS_DIR}/testfiles/tbinregR.exp TEST_STREAM)
#file (WRITE ${PROJECT_BINARY_DIR}/testfiles/std/tbinregR.exp "${TEST_STREAM}")
+ HDFTEST_COPY_FILE("${HDF5_TOOLS_DIR}/testfiles/tfloatsattrs.wddl" "${PROJECT_BINARY_DIR}/testfiles/std/tfloatsattrs.ddl" "h5dump_std_files")
else ()
HDFTEST_COPY_FILE("${HDF5_TOOLS_DIR}/testfiles/tbinregR.exp" "${PROJECT_BINARY_DIR}/testfiles/std/tbinregR.exp" "h5dump_std_files")
+ HDFTEST_COPY_FILE("${HDF5_TOOLS_DIR}/testfiles/tfloatsattrs.ddl" "${PROJECT_BINARY_DIR}/testfiles/std/tfloatsattrs.ddl" "h5dump_std_files")
endif ()
add_custom_target(h5dump_std_files ALL COMMENT "Copying files needed by h5dump_std tests" DEPENDS ${h5dump_std_files_list})
@@ -1085,7 +1094,9 @@
ADD_H5_TEST (zerodim 0 --enable-error-stack zerodim.h5)
# test for long double (some systems do not have long double)
-# ADD_H5_TEST (tldouble 0 --enable-error-stack tldouble.h5)
+ ADD_H5_TEST (tfloatsattrs 0 -p --enable-error-stack tfloatsattrs.h5)
+ ADD_H5_TEST (tldouble 0 --enable-error-stack tldouble.h5)
+ ADD_H5_TEST (tldouble_scalar 0 -p --enable-error-stack tldouble_scalar.h5)
# test for vms
ADD_H5_TEST (tvms 0 --enable-error-stack tvms.h5)
@@ -1172,6 +1183,10 @@
# test to verify HDFFV-9407: long double full precision
# ADD_H5_GREP_TEST (t128bit_float 1 "1.123456789012345" -m %.35Lg t128bit_float.h5)
+ # test to verify HDFFV-10480: out of bounds read in H5O_fill_new[old]_decode
+ ADD_H5_TEST (tCVE_2018_11206_fill_old 1 tCVE_2018_11206_fill_old.h5)
+ ADD_H5_TEST (tCVE_2018_11206_fill_new 1 tCVE_2018_11206_fill_new.h5)
+
##############################################################################
### P L U G I N T E S T S
##############################################################################
diff --git a/tools/test/h5dump/CMakeVFDTests.cmake b/tools/test/h5dump/CMakeVFDTests.cmake
index 014790f..01834b3 100644
--- a/tools/test/h5dump/CMakeVFDTests.cmake
+++ b/tools/test/h5dump/CMakeVFDTests.cmake
@@ -26,7 +26,7 @@ set (VFD_H5DUMP_LIST
family
)
-if (DIRECT_VFD)
+if (H5_HAVE_DIRECT)
set (VFD_H5DUMP_LIST ${VFD_H5DUMP_LIST} direct)
endif ()
diff --git a/tools/test/h5dump/dynlib_dump.c b/tools/test/h5dump/dynlib_dump.c
index 4568ca1..433522d 100644
--- a/tools/test/h5dump/dynlib_dump.c
+++ b/tools/test/h5dump/dynlib_dump.c
@@ -25,13 +25,13 @@ static size_t H5Z_filter_dynlibud(unsigned int flags, size_t cd_nelmts, const un
/* This message derives from H5Z */
const H5Z_class2_t H5Z_DYNLIBUD[1] = {{
- H5Z_CLASS_T_VERS, /* H5Z_class_t version */
- H5Z_FILTER_DYNLIBUD, /* Filter id number */
- 1, 1, /* Encoding and decoding enabled */
- "dynlibud", /* Filter name for debugging */
- NULL, /* The "can apply" callback */
- NULL, /* The "set local" callback */
- (H5Z_func_t)H5Z_filter_dynlibud, /* The actual filter function */
+ H5Z_CLASS_T_VERS, /* H5Z_class_t version */
+ H5Z_FILTER_DYNLIBUD, /* Filter id number */
+ 1, 1, /* Encoding and decoding enabled */
+ "dynlibud", /* Filter name for debugging */
+ NULL, /* The "can apply" callback */
+ NULL, /* The "set local" callback */
+ H5Z_filter_dynlibud, /* The actual filter function */
}};
H5PL_type_t
@@ -70,7 +70,7 @@ H5Z_filter_dynlibud(unsigned int flags, size_t cd_nelmts, const unsigned int *cd
return (0);
/* Assignment to eliminate unused parameter warning. */
- cd_values = cd_values;
+ (void)cd_values;
if (flags & H5Z_FLAG_REVERSE) { /*read*/
/* Subtract the original value with MULTIPLIER */
diff --git a/tools/test/h5dump/h5dumpgentest.c b/tools/test/h5dump/h5dumpgentest.c
index 15d3eef..7efe53c 100644
--- a/tools/test/h5dump/h5dumpgentest.c
+++ b/tools/test/h5dump/h5dumpgentest.c
@@ -116,6 +116,7 @@
#define FILE86 "err_attr_dspace.h5"
#define FILE87 "tintsnodata.h5"
#define FILE88 "tldouble_scalar.h5"
+#define FILE89 "tfloatsattrs.h5"
/*-------------------------------------------------------------------------
* prototypes
@@ -154,13 +155,13 @@ static size_t H5Z_filter_dynlibud(unsigned int flags, size_t cd_nelmts, const un
/* This message derives from H5Z */
const H5Z_class2_t H5Z_DYNLIBUD[1] = {{
- H5Z_CLASS_T_VERS, /* H5Z_class_t version */
- H5Z_FILTER_DYNLIBUD, /* Filter id number */
- 1, 1, /* Encoding and decoding enabled */
- "dynlibud", /* Filter name for debugging */
- NULL, /* The "can apply" callback */
- NULL, /* The "set local" callback */
- (H5Z_func_t)H5Z_filter_dynlibud, /* The actual filter function */
+ H5Z_CLASS_T_VERS, /* H5Z_class_t version */
+ H5Z_FILTER_DYNLIBUD, /* Filter id number */
+ 1, 1, /* Encoding and decoding enabled */
+ "dynlibud", /* Filter name for debugging */
+ NULL, /* The "can apply" callback */
+ NULL, /* The "set local" callback */
+ H5Z_filter_dynlibud, /* The actual filter function */
}};
/* A UD link traversal function. Shouldn't actually be called. */
@@ -198,8 +199,8 @@ const H5L_class_t UD_link_class[1] = {{
#define DIM1 20
#define DIM2 10
-#define CDIM1 DIM1 / 2
-#define CDIM2 DIM2 / 2
+#define CDIM1 (DIM1 / 2)
+#define CDIM2 (DIM2 / 2)
#define RANK 2
/* Dataspace of 0 dimension size */
@@ -396,6 +397,15 @@ typedef struct s1_t {
#define F83_RANK 1
#define F83_ARRAYDIM 3
+/* "FILE89" macros */
+#define F89_XDIM 8
+#define F89_DATASETF32 "DS32BITS"
+#define F89_YDIM32 32
+#define F89_DATASETF64 "DS64BITS"
+#define F89_YDIM64 64
+#define F89_DATASETF128 "DS128BITS"
+#define F89_YDIM128 128
+
static void
gent_group(void)
{
@@ -488,7 +498,7 @@ gent_dataset(void)
for (i = 0; i < 30; i++)
for (j = 0; j < 20; j++)
- dset2[i][j] = 0.0001F * (float)j + (float)i;
+ dset2[i][j] = 0.0001 * (double)j + (double)i;
H5Dwrite(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2_data);
@@ -595,7 +605,7 @@ gent_attribute(void)
attr = H5Acreate2(root, "attr3", H5T_IEEE_F64BE, space, H5P_DEFAULT, H5P_DEFAULT);
for (i = 0; i < 10; i++)
- d[i] = 0.1F * (float)i;
+ d[i] = 0.1 * (double)i;
H5Awrite(attr, H5T_NATIVE_DOUBLE, d);
H5Sclose(space);
@@ -1009,7 +1019,7 @@ gent_compound_dt(void)
for (i = 0; i < (int)sdim; i++) {
dset1[i].a = i;
dset1[i].b = (float)(i * i);
- dset1[i].c = (float)(1.0F / (float)(i + 1));
+ dset1[i].c = (double)(1.0 / (double)(i + 1));
dset2[i].a = i;
dset2[i].b = (float)((float)i + (float)i * 0.1F);
@@ -1196,7 +1206,7 @@ gent_compound_dt2(void)
for (i = 0; i < (int)sdim; i++) {
dset1[i].a = i;
dset1[i].b = (float)(i * i);
- dset1[i].c = (float)(1.0F / (float)(i + 1));
+ dset1[i].c = (double)(1.0 / (double)(i + 1));
dset2[i].a = i;
dset2[i].b = (float)((float)i + (float)i * 0.1F);
@@ -1636,7 +1646,7 @@ gent_many(void)
space2 = H5Screate_simple(1, dims, NULL);
attr = H5Acreate2(dataset, "attr3", H5T_IEEE_F64BE, space2, H5P_DEFAULT, H5P_DEFAULT);
for (i = 0; i < 10; i++)
- d[i] = 0.1F * (float)i;
+ d[i] = 0.1 * (double)i;
H5Awrite(attr, H5T_NATIVE_DOUBLE, d);
H5Sclose(space2);
H5Aclose(attr);
@@ -2493,7 +2503,7 @@ gent_nestcomp(void)
for (i = 0; i < 10; i++) {
s1[i].a = i;
s1[i].b = (float)(i * i);
- s1[i].c = 1.0F / (float)(i + 1);
+ s1[i].c = 1.0 / (double)(i + 1);
s1[i].d.a = (char)(65 + i);
s1[i].d.b[0] = -100.0F;
s1[i].d.b[1] = 100.0F;
@@ -5067,7 +5077,7 @@ gent_compound_complex(void)
Array1[m].e = (float)((float)m * 0.96F);
for (n = 0; n < F41_ARRAY_DIMf; n++)
- Array1[m].f[n] = ((float)m * 1024.9637F);
+ Array1[m].f[n] = ((double)m * 1024.9637);
Array1[m].g = 'm';
}
@@ -5375,7 +5385,10 @@ make_dset(hid_t loc_id, const char *name, hid_t sid, hid_t tid, hid_t dcpl, void
return 0;
out:
- H5E_BEGIN_TRY { H5Dclose(dsid); }
+ H5E_BEGIN_TRY
+ {
+ H5Dclose(dsid);
+ }
H5E_END_TRY;
return -1;
}
@@ -6348,7 +6361,7 @@ gent_ldouble_scalar(void)
hid_t tid;
hid_t sid;
hsize_t dims[1] = {6};
- long double buf[6] = {0.0, 1.0, 2.0, 3.0, 4.0, 5.0};
+ long double buf[6] = {0.0L, 1.0L, 2.0L, 3.0L, 4.0L, 5.0L};
if ((fid = H5Fcreate(FILE88, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
goto error;
@@ -6356,7 +6369,7 @@ gent_ldouble_scalar(void)
if ((sid = H5Screate(H5S_SCALAR)) < 0)
goto error;
- if ((tid = H5Tarray_create(H5T_NATIVE_LDOUBLE, 1, dims)) < 0)
+ if ((tid = H5Tarray_create2(H5T_NATIVE_LDOUBLE, 1, dims)) < 0)
goto error;
if (H5Tget_size(tid) == 0)
@@ -6548,7 +6561,6 @@ out:
H5Fclose(fid);
}
H5E_END_TRY;
- return;
}
/*-------------------------------------------------------------------------
@@ -6734,7 +6746,6 @@ out:
H5Fclose(fid);
}
H5E_END_TRY;
- return;
}
/*-------------------------------------------------------------------------
@@ -6994,7 +7005,6 @@ out:
H5Fclose(fid);
}
H5E_END_TRY;
- return;
}
/*-------------------------------------------------------------------------
@@ -7012,7 +7022,7 @@ gent_fpformat(void)
{
hid_t fid, sid, did;
hsize_t dims[1] = {6};
- double dbuf[6] = {-0.1234567f, 0.1234567f, 0, 0, 0, 0};
+ double dbuf[6] = {-0.1234567, 0.1234567, 0, 0, 0, 0};
float fbuf[6] = {-0.1234567f, 0.1234567f, 0, 0, 0, 0};
fid = H5Fcreate(FILE60, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
@@ -7440,7 +7450,7 @@ gent_packedbits(void)
for (i = 0; i < dims[0]; i++)
for (j = 0; j < dims[1]; j++)
- dsetdbl[i][j] = 0.0001F * (float)j + (float)i;
+ dsetdbl[i][j] = 0.0001 * (double)j + (double)i;
H5Dwrite(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetdbl[0]);
@@ -7674,7 +7684,7 @@ gent_attr_intsize(void)
for (i = 0; i < dims[0]; i++)
for (j = 0; j < dims[1]; j++)
- dsetdbl[i][j] = 0.0001F * (float)j + (float)i;
+ dsetdbl[i][j] = 0.0001 * (double)j + (double)i;
H5Awrite(attr, H5T_NATIVE_DOUBLE, dsetdbl[0]);
@@ -7984,7 +7994,7 @@ gent_compound_intsizes(void)
for (n = 0; n < (int)dims[0]; n++)
for (o = 0; o < (int)dims[1]; o++)
- Array1[m].dsetdbl[n][o] = 0.0001F * (float)o + (float)n;
+ Array1[m].dsetdbl[n][o] = 0.0001 * (double)o + (double)n;
}
/* Create the array data type for the 8 bits signed int array */
@@ -8274,7 +8284,7 @@ gent_compound_attr_intsizes(void)
for (n = 0; n < (int)dims[0]; n++)
for (o = 0; o < (int)dims[1]; o++)
- Array1[m].dsetdbl[n][o] = 0.0001F * (float)o + (float)n;
+ Array1[m].dsetdbl[n][o] = 0.0001 * (double)o + (double)n;
}
/* Create the array data type for the 8 bits signed int array */
@@ -8779,7 +8789,7 @@ gent_intscalars(void)
for (i = 0; i < dims[0]; i++)
for (j = 0; j < dims[1]; j++)
- dsetdbl[i][j] = 0.0001F * (float)j + (float)i;
+ dsetdbl[i][j] = 0.0001 * (double)j + (double)i;
H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetdbl[0]);
@@ -9023,7 +9033,7 @@ gent_attr_intscalars(void)
for (i = 0; i < dims[0]; i++)
for (j = 0; j < dims[1]; j++)
- dsetdbl[i][j] = 0.0001F * (float)j + (float)i;
+ dsetdbl[i][j] = 0.0001 * (double)j + (double)i;
H5Awrite(attr, tid, dsetdbl[0]);
@@ -9226,7 +9236,7 @@ gent_compound_int_array(void)
dims[0] = F76_DIM8;
for (n = 0; n < (int)dims[0]; n++)
- Cmpd1[m].dsetdbl[n] = 0.0001F + (float)n;
+ Cmpd1[m].dsetdbl[n] = 0.0001 + (double)n;
}
/* Create the array data type for the 8 bits signed int array */
@@ -9467,8 +9477,8 @@ gent_compound_ints(void)
val64bits <<= 1;
/* Double Dummy set for failure tests */
- Cmpd1[m].dsetdbl = 0.0001F + (float)m;
- Cmpd2[m].dsetdbl = 0.0001F + (float)m;
+ Cmpd1[m].dsetdbl = 0.0001 + (double)m;
+ Cmpd2[m].dsetdbl = 0.0001 + (double)m;
}
/* Create the dataspace */
@@ -9843,7 +9853,7 @@ gent_intattrscalars(void)
for (i = 0; i < dims[0]; i++)
for (j = 0; j < dims[1]; j++)
- dsetdbl[i][j] = 0.0001F * (float)j + (float)i;
+ dsetdbl[i][j] = 0.0001 * (double)j + (double)i;
H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dsetdbl);
/* Attribute of double */
@@ -10172,7 +10182,7 @@ gent_intsattrs(void)
for (i = 0; i < dims[0]; i++)
for (j = 0; j < dims[1]; j++) {
- dsetdbl[i][j] = 0.0001F * (float)j + (float)i;
+ dsetdbl[i][j] = 0.0001 * (double)j + (double)i;
asetdbl[i * dims[1] + j] = dsetdbl[i][j];
}
@@ -10209,6 +10219,152 @@ gent_intsattrs(void)
HDfree(asetdbl);
}
+/*-------------------------------------------------------------------------
+ * Function: gent_floatsattrs
+ *
+ * Purpose: Generate a file to be used in the h5dump tests.
+ * Three datasets of 4, 8 and 16 bytes of float types are created.
+ * Fill them with raw data such that no bit will be all zero in a dataset.
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_floatsattrs(void)
+{
+ hid_t fid = H5I_INVALID_HID;
+ hid_t tid = H5I_INVALID_HID;
+ hid_t attr = H5I_INVALID_HID;
+ hid_t dataset = H5I_INVALID_HID;
+ hid_t space = H5I_INVALID_HID;
+ hid_t aspace = H5I_INVALID_HID;
+ hsize_t dims[2], adims[1];
+
+ float ** dset32 = NULL;
+ double ** dset64 = NULL;
+ long double **dset128 = NULL;
+
+ float * aset32 = NULL;
+ double * aset64 = NULL;
+ long double *aset128 = NULL;
+
+ float val32bits;
+ double val64bits;
+ long double val128bits;
+
+ unsigned int i, j;
+
+ /* Create arrays */
+ H5TEST_ALLOCATE_2D_ARRAY(dset32, float, F89_XDIM, F89_YDIM32);
+ H5TEST_ALLOCATE_2D_ARRAY(dset64, double, F89_XDIM, F89_YDIM64);
+ H5TEST_ALLOCATE_2D_ARRAY(dset128, long double, F89_XDIM, F89_YDIM128);
+
+ aset32 = HDcalloc(F89_XDIM * F89_YDIM32, sizeof(float));
+ aset64 = HDcalloc(F89_XDIM * F89_YDIM64, sizeof(double));
+ aset128 = HDcalloc(F89_XDIM * F89_YDIM128, sizeof(long double));
+
+ fid = H5Fcreate(FILE89, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+ if ((tid = H5Tcopy(H5T_NATIVE_LDOUBLE)) < 0)
+ goto error;
+
+ if (H5Tget_size(tid) == 0)
+ goto error;
+
+ /* Dataset of 32 bits float */
+ dims[0] = F89_XDIM;
+ dims[1] = F89_YDIM32;
+ space = H5Screate_simple(2, dims, NULL);
+ dataset = H5Dcreate2(fid, F89_DATASETF32, H5T_IEEE_F32LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+ val32bits = (float)F89_YDIM32;
+ for (i = 0; i < dims[0]; i++) {
+ dset32[i][0] = val32bits;
+ aset32[i * dims[1]] = dset32[i][0];
+ for (j = 1; j < dims[1]; j++) {
+ dset32[i][j] = (float)(j * dims[0] + i) / (float)F89_YDIM32;
+ aset32[i * dims[1] + j] = dset32[i][j];
+ }
+ val32bits -= (float)1;
+ }
+
+ H5Dwrite(dataset, H5T_IEEE_F32LE, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset32[0]);
+ /* Attribute of 32 bits float */
+ adims[0] = F89_XDIM * F89_YDIM32;
+ aspace = H5Screate_simple(1, adims, NULL);
+ attr = H5Acreate2(dataset, F89_DATASETF32, H5T_IEEE_F32LE, aspace, H5P_DEFAULT, H5P_DEFAULT);
+ H5Awrite(attr, H5T_IEEE_F32LE, aset32);
+ H5Aclose(attr);
+ H5Sclose(aspace);
+ H5Sclose(space);
+ H5Dclose(dataset);
+
+ /* Dataset of 64 bits double */
+ dims[0] = F89_XDIM;
+ dims[1] = F89_YDIM64;
+ space = H5Screate_simple(2, dims, NULL);
+ dataset = H5Dcreate2(fid, F89_DATASETF64, H5T_IEEE_F64LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+ val64bits = (double)F89_YDIM64;
+ for (i = 0; i < dims[0]; i++) {
+ dset64[i][0] = val64bits;
+ aset64[i * dims[1]] = dset64[i][0];
+ for (j = 1; j < dims[1]; j++) {
+ dset64[i][j] = (double)(j * dims[0] + i) / (double)F89_YDIM64;
+ aset64[i * dims[1] + j] = dset64[i][j];
+ }
+ val64bits -= (double)1;
+ }
+
+ H5Dwrite(dataset, H5T_IEEE_F64LE, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset64[0]);
+ /* Attribute of 64 bits double */
+ adims[0] = F89_XDIM * F89_YDIM64;
+ aspace = H5Screate_simple(1, adims, NULL);
+ attr = H5Acreate2(dataset, F89_DATASETF64, H5T_IEEE_F64LE, aspace, H5P_DEFAULT, H5P_DEFAULT);
+ H5Awrite(attr, H5T_IEEE_F64LE, aset64);
+ H5Aclose(attr);
+ H5Sclose(aspace);
+ H5Sclose(space);
+ H5Dclose(dataset);
+
+ /* Dataset of 128 bits long double */
+ dims[0] = F89_XDIM;
+ dims[1] = F89_YDIM128;
+ space = H5Screate_simple(2, dims, NULL);
+ dataset = H5Dcreate2(fid, F89_DATASETF128, tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+ val128bits = (long double)F89_YDIM128;
+ for (i = 0; i < dims[0]; i++) {
+ dset128[i][0] = val128bits;
+ aset128[i * dims[1]] = dset128[i][0];
+ for (j = 1; j < dims[1]; j++) {
+ dset128[i][j] = (long double)(j * dims[0] + i) / (long double)F89_YDIM128;
+ aset128[i * dims[1] + j] = dset128[i][j];
+ }
+ val128bits -= (long double)1;
+ }
+
+ H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset128[0]);
+ /* Attribute of 128 bits long double */
+ adims[0] = F89_XDIM * F89_YDIM128;
+ aspace = H5Screate_simple(1, adims, NULL);
+ attr = H5Acreate2(dataset, F89_DATASETF128, tid, aspace, H5P_DEFAULT, H5P_DEFAULT);
+ H5Awrite(attr, tid, aset128);
+ H5Aclose(attr);
+ H5Sclose(aspace);
+ H5Sclose(space);
+ H5Dclose(dataset);
+
+error:
+ H5Fclose(fid);
+
+ HDfree(dset32);
+ HDfree(dset64);
+ HDfree(dset128);
+
+ HDfree(aset32);
+ HDfree(aset64);
+ HDfree(aset128);
+}
+
static void
gent_bitnopaquefields(void)
{
@@ -10921,7 +11077,7 @@ H5Z_filter_dynlibud(unsigned int flags, size_t cd_nelmts, const unsigned int *cd
return (0);
/* Assignment to eliminate unused parameter warning. */
- cd_values = cd_values;
+ (void)cd_values;
if (flags & H5Z_FLAG_REVERSE) { /*read*/
/* Subtract the original value with MULTIPLIER */
@@ -11138,6 +11294,7 @@ main(void)
gent_aindices();
gent_longlinks();
gent_ldouble();
+ gent_ldouble_scalar();
gent_binary();
gent_bigdims();
gent_hyperslab();
@@ -11161,6 +11318,7 @@ main(void)
gent_compound_ints();
gent_intattrscalars();
gent_intsattrs();
+ gent_floatsattrs();
gent_bitnopaquefields();
gent_nodata();
diff --git a/tools/test/h5dump/testh5dump.sh.in b/tools/test/h5dump/testh5dump.sh.in
index 8f478b0..9464302 100644
--- a/tools/test/h5dump/testh5dump.sh.in
+++ b/tools/test/h5dump/testh5dump.sh.in
@@ -132,6 +132,7 @@ $SRC_H5DUMP_TESTFILES/tfamily00010.h5
$SRC_H5DUMP_TESTFILES/tfcontents1.h5
$SRC_H5DUMP_TESTFILES/tfcontents2.h5
$SRC_H5DUMP_TESTFILES/tfilters.h5
+$SRC_H5DUMP_TESTFILES/tfloatsattrs.h5
$SRC_H5DUMP_TESTFILES/tfpformat.h5
$SRC_H5DUMP_TESTFILES/tfvalues.h5
$SRC_H5DUMP_TESTFILES/tgroup.h5
@@ -143,6 +144,7 @@ $SRC_H5DUMP_TESTFILES/tintsattrs.h5
$SRC_H5DUMP_TESTFILES/tints4dims.h5
$SRC_H5DUMP_TESTFILES/tlarge_objname.h5
$SRC_H5DUMP_TESTFILES/tldouble.h5
+$SRC_H5DUMP_TESTFILES/tldouble_scalar.h5
$SRC_H5DUMP_TESTFILES/tlonglinks.h5
$SRC_H5DUMP_TESTFILES/tloop.h5
$SRC_H5DUMP_TESTFILES/tmulti-b.h5
@@ -180,6 +182,8 @@ $SRC_H5DUMP_TESTFILES/tvlenstr_array.h5
$SRC_H5DUMP_TESTFILES/tvlstr.h5
$SRC_H5DUMP_TESTFILES/tvms.h5
$SRC_H5DUMP_TESTFILES/err_attr_dspace.h5
+$SRC_H5DUMP_TESTFILES/tCVE_2018_11206_fill_old.h5
+$SRC_H5DUMP_TESTFILES/tCVE_2018_11206_fill_new.h5
"
LIST_OTHER_TEST_FILES="
@@ -262,6 +266,7 @@ $SRC_H5DUMP_TESTFILES/textlink.ddl
$SRC_H5DUMP_TESTFILES/tfamily.ddl
$SRC_H5DUMP_TESTFILES/tfill.ddl
$SRC_H5DUMP_TESTFILES/tfletcher32.ddl
+$SRC_H5DUMP_TESTFILES/tfloatsattrs.ddl
$SRC_H5DUMP_TESTFILES/tfpformat.ddl
$SRC_H5DUMP_TESTFILES/tgroup-1.ddl
$SRC_H5DUMP_TESTFILES/tgroup-2.ddl
@@ -288,6 +293,7 @@ $SRC_H5DUMP_TESTFILES/tints4dimsStride2.ddl
$SRC_H5DUMP_TESTFILES/tintsattrs.ddl
$SRC_H5DUMP_TESTFILES/tlarge_objname.ddl
$SRC_H5DUMP_TESTFILES/tldouble.ddl
+$SRC_H5DUMP_TESTFILES/tldouble_scalar.ddl
$SRC_H5DUMP_TESTFILES/tlonglinks.ddl
$SRC_H5DUMP_TESTFILES/tloop-1.ddl
$SRC_H5DUMP_TESTFILES/tmulti.ddl
@@ -868,6 +874,35 @@ TOOLTEST5() {
fi
}
+# same as TOOLTEST1 but expects h5dump to fail
+#
+TOOLTEST_FAIL() {
+
+ infile=$1
+ expect="$TESTDIR/`basename $1 exp`.ddl"
+ actual="$TESTDIR/`basename $1 .exp`.out"
+
+ # Run test.
+ TESTING $DUMPER $@
+ (
+ cd $TESTDIR
+ $RUNSERIAL $DUMPER_BIN "$@" $infile
+ ) >&$actual
+ RET=$?
+ # Segfault occurred
+ if [ $RET == 139 ] ; then
+ nerrors="`expr $nerrors + 1`"
+ echo "*FAILED - test on $infile failed with segmentation fault"
+ # Should fail but didn't
+ elif [ $RET == 0 ] ; then
+ nerrors="`expr $nerrors + 1`"
+ echo "*FAILED - test on $infile did not fail as expected"
+ else
+ echo " PASSED"
+ fi
+
+}
+
# ADD_HELP_TEST
TOOLTEST_HELP() {
@@ -1351,7 +1386,9 @@ TOOLTEST tgrpnullspace.ddl -p --enable-error-stack tgrpnullspace.h5
TOOLTEST zerodim.ddl --enable-error-stack zerodim.h5
# test for long double (some systems do not have long double)
-#TOOLTEST tldouble.ddl --enable-error-stack tldouble.h5
+TOOLTEST tfloatsattrs.ddl -p --enable-error-stack tfloatsattrs.h5
+TOOLTEST tldouble.ddl --enable-error-stack tldouble.h5
+TOOLTEST tldouble_scalar.ddl -p --enable-error-stack tldouble_scalar.h5
# test for vms
TOOLTEST tvms.ddl --enable-error-stack tvms.h5
@@ -1445,6 +1482,10 @@ TOOLTEST err_attr_dspace.ddl err_attr_dspace.h5
# test to verify HDFFV-9407: long double full precision
#GREPTEST OUTTXT "1.123456789012345" t128bit_float.ddl -m %.35Lf t128bit_float.h5
+# test to verify HDFFV-10480: out of bounds read in H5O_fill_new[old]_decode
+TOOLTEST_FAIL tCVE_2018_11206_fill_old.h5
+TOOLTEST_FAIL tCVE_2018_11206_fill_new.h5
+
# Clean up temporary files/directories
CLEAN_TESTFILES_AND_TESTDIR
diff --git a/tools/test/h5import/h5importtest.c b/tools/test/h5import/h5importtest.c
index 340e31b..e49125b 100644
--- a/tools/test/h5import/h5importtest.c
+++ b/tools/test/h5import/h5importtest.c
@@ -64,8 +64,8 @@ main(void)
double b64r3[5][3][4];
double row8[3], col8[4], pln8[5];
- double rowo8 = 11.0F, colo8 = 21.0F, plno8 = 51.0F;
- double rowi8 = 1.0F, coli8 = 2.0F, plni8 = 5.0F;
+ double rowo8 = 11.0, colo8 = 21.0, plno8 = 51.0;
+ double rowi8 = 1.0, coli8 = 2.0, plni8 = 5.0;
/* Initialize machine endian */
volatile uint32_t ibyte = 0x01234567;
diff --git a/tools/test/h5jam/getub.c b/tools/test/h5jam/getub.c
index a9b4437..fd21d6c 100644
--- a/tools/test/h5jam/getub.c
+++ b/tools/test/h5jam/getub.c
@@ -21,9 +21,9 @@ void parse_command_line(int argc, const char *argv[]);
#define PROGRAM_NAME "getub"
char *nbytes = NULL;
-static const char * s_opts = "c:"; /* add more later ? */
-static struct long_options l_opts[] = {{"c", require_arg, 'c'}, /* input file */
- {NULL, 0, '\0'}};
+static const char * s_opts = "c:"; /* add more later ? */
+static struct h5_long_options l_opts[] = {{"c", require_arg, 'c'}, /* input file */
+ {NULL, 0, '\0'}};
/*-------------------------------------------------------------------------
* Function: usage
@@ -57,10 +57,10 @@ parse_command_line(int argc, const char *argv[])
int opt;
/* parse command line options */
- while ((opt = get_option(argc, argv, s_opts, l_opts)) != EOF) {
+ while ((opt = H5_get_option(argc, argv, s_opts, l_opts)) != EOF) {
switch ((char)opt) {
case 'c':
- nbytes = HDstrdup(opt_arg);
+ nbytes = HDstrdup(H5_optarg);
break;
case '?':
default:
@@ -69,7 +69,7 @@ parse_command_line(int argc, const char *argv[])
} /* end switch */
} /* end while */
- if (argc <= opt_ind) {
+ if (argc <= H5_optind) {
error_msg("missing file name\n");
usage(h5tools_getprogname());
HDexit(EXIT_FAILURE);
@@ -100,16 +100,16 @@ main(int argc, const char *argv[])
goto error;
} /* end if */
- if (argc <= (opt_ind)) {
+ if (argc <= (H5_optind)) {
error_msg("missing file name\n");
usage(h5tools_getprogname());
goto error;
} /* end if */
- filename = HDstrdup(argv[opt_ind]);
+ filename = HDstrdup(argv[H5_optind]);
size = 0;
- if (EOF == (res = sscanf(nbytes, "%u", &size))) {
+ if (EOF == (res = HDsscanf(nbytes, "%u", &size))) {
/* fail */
error_msg("missing file name\n");
usage(h5tools_getprogname());
diff --git a/tools/test/h5jam/h5jamgentest.c b/tools/test/h5jam/h5jamgentest.c
index 45ff0b0..5632cc0 100644
--- a/tools/test/h5jam/h5jamgentest.c
+++ b/tools/test/h5jam/h5jamgentest.c
@@ -31,24 +31,7 @@
#define UBTXT3 "u511.txt"
#define UBTXT4 "u512.txt"
#define UBTXT5 "u513.txt"
-/* not used yet
-#define UBTXT6 "u1023.txt"
-#define UBTXT7 "u1024.txt"
-#define UBTXT8 "u1025.txt"
-#define UBTXT9 "u2047.txt"
-#define UBTXT10 "u2048.txt"
-#define UBTXT11 "u2049.txt"
-#define UBBIN1 "u0.dat"
-#define UBBIN2 "u10.dat"
-#define UBBIN3 "u511.dat"
-#define UBBIN4 "u512.dat"
-#define UBBIN5 "u513.dat"
-*/
-/* not used yet
-#define FILE1 "tnull.h5"
-#define FILE2 "tnullwithub.h5"
-*/
/* tall is same as dumper test */
#define FILE7 "tall.h5"
#define FILE8 "twithub.h5"
@@ -66,24 +49,13 @@ char pattern[11] = "abcdefghij";
#define BUF_SIZE 1024
-/* Element selection information */
-
-typedef enum { RED, GREEN, BLUE, WHITE, BLACK } enumtype;
-
-/* Compound datatype */
-typedef struct s1_t {
- unsigned int a;
- unsigned int b;
- float c;
-} s1_t;
-
/* A UD link traversal function. Shouldn't actually be called. */
static hid_t
UD_traverse(const char H5_ATTR_UNUSED *link_name, hid_t H5_ATTR_UNUSED cur_group,
const void H5_ATTR_UNUSED *udata, size_t H5_ATTR_UNUSED udata_size, hid_t H5_ATTR_UNUSED lapl_id,
hid_t H5_ATTR_UNUSED dxpl_id)
{
- return -1;
+ return H5I_INVALID_HID;
}
#define MY_LINKCLASS 187
@@ -115,261 +87,340 @@ g1.2.1 : slink
g2 : dset2.1 dset2.2 udlink
*/
-
-static void
+static herr_t
gent_ub(const char *filename, size_t ub_size, size_t ub_fill)
{
- hid_t fid, group, attr, dataset, space;
- hid_t create_plist;
+ hid_t fid = H5I_INVALID_HID;
+ hid_t group = H5I_INVALID_HID;
+ hid_t attr = H5I_INVALID_HID;
+ hid_t dataset = H5I_INVALID_HID;
+ hid_t space = H5I_INVALID_HID;
+ hid_t create_plist = H5I_INVALID_HID;
hsize_t dims[2];
int data[2][2], dset1[10][10], dset2[20];
char buf[BUF_SIZE];
int i, j;
size_t u;
float dset2_1[10], dset2_2[3][5];
- int fd;
- char * bp;
+ int fd = -1;
if (ub_size > 0) {
- create_plist = H5Pcreate(H5P_FILE_CREATE);
- H5Pset_userblock(create_plist, (hsize_t)ub_size);
- fid = H5Fcreate(filename, H5F_ACC_TRUNC, create_plist, H5P_DEFAULT);
+ if ((create_plist = H5Pcreate(H5P_FILE_CREATE)) < 0)
+ goto error;
+ if (H5Pset_userblock(create_plist, (hsize_t)ub_size) < 0)
+ goto error;
+ if ((fid = H5Fcreate(filename, H5F_ACC_TRUNC, create_plist, H5P_DEFAULT)) < 0)
+ goto error;
}
else {
- fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+ if ((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto error;
}
- /* create groups */
- group = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
- H5Gclose(group);
+ /* Create groups */
+ if ((group = H5Gcreate2(fid, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto error;
+ if (H5Gclose(group) < 0)
+ goto error;
- group = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
- H5Gclose(group);
+ if ((group = H5Gcreate2(fid, "/g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto error;
+ if (H5Gclose(group) < 0)
+ goto error;
- group = H5Gcreate2(fid, "/g1/g1.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
- H5Gclose(group);
+ if ((group = H5Gcreate2(fid, "/g1/g1.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto error;
+ if (H5Gclose(group) < 0)
+ goto error;
- group = H5Gcreate2(fid, "/g1/g1.2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
- H5Gclose(group);
+ if ((group = H5Gcreate2(fid, "/g1/g1.2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto error;
+ if (H5Gclose(group) < 0)
+ goto error;
- group = H5Gcreate2(fid, "/g1/g1.2/g1.2.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
- H5Gclose(group);
+ if ((group = H5Gcreate2(fid, "/g1/g1.2/g1.2.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto error;
+ if (H5Gclose(group) < 0)
+ goto error;
- /* root attributes */
- group = H5Gopen2(fid, "/", H5P_DEFAULT);
+ /* Root attributes */
+ if ((group = H5Gopen2(fid, "/", H5P_DEFAULT)) < 0)
+ goto error;
dims[0] = 10;
- space = H5Screate_simple(1, dims, NULL);
- attr = H5Acreate2(group, "attr1", H5T_STD_I8BE, space, H5P_DEFAULT, H5P_DEFAULT);
- HDsprintf(buf, "abcdefghi");
- H5Awrite(attr, H5T_NATIVE_SCHAR, buf);
- H5Sclose(space);
- H5Aclose(attr);
-
- dims[0] = 2;
- dims[1] = 2;
- space = H5Screate_simple(2, dims, NULL);
- attr = H5Acreate2(group, "attr2", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT);
+ if ((space = H5Screate_simple(1, dims, NULL)) < 0)
+ goto error;
+ if ((attr = H5Acreate2(group, "attr1", H5T_STD_I8BE, space, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto error;
+ if (HDsprintf(buf, "abcdefghi") < 0)
+ goto error;
+ if (H5Awrite(attr, H5T_NATIVE_SCHAR, buf) < 0)
+ goto error;
+ if (H5Sclose(space) < 0)
+ goto error;
+ if (H5Aclose(attr) < 0)
+ goto error;
+
+ dims[0] = 2;
+ dims[1] = 2;
+ if ((space = H5Screate_simple(2, dims, NULL)) < 0)
+ goto error;
+ if ((attr = H5Acreate2(group, "attr2", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto error;
data[0][0] = 0;
data[0][1] = 1;
data[1][0] = 2;
data[1][1] = 3;
- H5Awrite(attr, H5T_NATIVE_INT, data);
- H5Sclose(space);
- H5Aclose(attr);
+ if (H5Awrite(attr, H5T_NATIVE_INT, data) < 0)
+ goto error;
+ if (H5Sclose(space) < 0)
+ goto error;
+ if (H5Aclose(attr) < 0)
+ goto error;
- H5Gclose(group);
+ if (H5Gclose(group) < 0)
+ goto error;
- group = H5Gopen2(fid, "/g1/g1.1", H5P_DEFAULT);
+ if ((group = H5Gopen2(fid, "/g1/g1.1", H5P_DEFAULT)) < 0)
+ goto error;
- /* dset1.1.1 */
+ /* Dataset 1.1.1 */
dims[0] = 10;
dims[1] = 10;
- space = H5Screate_simple(2, dims, NULL);
- dataset = H5Dcreate2(group, "dset1.1.1", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ if ((space = H5Screate_simple(2, dims, NULL)) < 0)
+ goto error;
+ if ((dataset =
+ H5Dcreate2(group, "dset1.1.1", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto error;
for (i = 0; i < 10; i++)
for (j = 0; j < 10; j++)
dset1[i][j] = j * i;
- H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1);
- H5Sclose(space);
+ if (H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset1) < 0)
+ goto error;
+ if (H5Sclose(space) < 0)
+ goto error;
- /* attributes of dset1.1.1 */
+ /* Attributes of dset1.1.1 */
dims[0] = 27;
- space = H5Screate_simple(1, dims, NULL);
- attr = H5Acreate2(dataset, "attr1", H5T_STD_I8BE, space, H5P_DEFAULT, H5P_DEFAULT);
- HDsprintf(buf, "1st attribute of dset1.1.1");
- H5Awrite(attr, H5T_NATIVE_SCHAR, buf);
- H5Sclose(space);
- H5Aclose(attr);
+ if ((space = H5Screate_simple(1, dims, NULL)) < 0)
+ goto error;
+ if ((attr = H5Acreate2(dataset, "attr1", H5T_STD_I8BE, space, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto error;
+ if (HDsprintf(buf, "1st attribute of dset1.1.1") < 0)
+ goto error;
+ if (H5Awrite(attr, H5T_NATIVE_SCHAR, buf) < 0)
+ goto error;
+ if (H5Sclose(space) < 0)
+ goto error;
+ if (H5Aclose(attr) < 0)
+ goto error;
dims[0] = 27;
- space = H5Screate_simple(1, dims, NULL);
- attr = H5Acreate2(dataset, "attr2", H5T_STD_I8BE, space, H5P_DEFAULT, H5P_DEFAULT);
- HDsprintf(buf, "2nd attribute of dset1.1.1");
- H5Awrite(attr, H5T_NATIVE_SCHAR, buf);
- H5Sclose(space);
- H5Aclose(attr);
-
- H5Dclose(dataset);
-
- /* dset1.1.2 */
+ if ((space = H5Screate_simple(1, dims, NULL)) < 0)
+ goto error;
+ if ((attr = H5Acreate2(dataset, "attr2", H5T_STD_I8BE, space, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto error;
+ if (HDsprintf(buf, "2nd attribute of dset1.1.1") < 0)
+ goto error;
+ if (H5Awrite(attr, H5T_NATIVE_SCHAR, buf) < 0)
+ goto error;
+ if (H5Sclose(space) < 0)
+ goto error;
+ if (H5Aclose(attr) < 0)
+ goto error;
+
+ if (H5Dclose(dataset) < 0)
+ goto error;
+
+ /* Dataset 1.1.2 */
dims[0] = 20;
- space = H5Screate_simple(1, dims, NULL);
- dataset = H5Dcreate2(group, "dset1.1.2", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ if ((space = H5Screate_simple(1, dims, NULL)) < 0)
+ goto error;
+ if ((dataset =
+ H5Dcreate2(group, "dset1.1.2", H5T_STD_I32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto error;
for (i = 0; i < 20; i++)
dset2[i] = i;
- H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2);
- H5Sclose(space);
- H5Dclose(dataset);
-
- H5Gclose(group);
-
- /* external link */
- H5Lcreate_external("somefile", "somepath", fid, "/g1/g1.2/extlink", H5P_DEFAULT, H5P_DEFAULT);
-
- /* soft link */
- group = H5Gopen2(fid, "/g1/g1.2/g1.2.1", H5P_DEFAULT);
- H5Lcreate_soft("somevalue", group, "slink", H5P_DEFAULT, H5P_DEFAULT);
- H5Gclose(group);
-
- group = H5Gopen2(fid, "/g2", H5P_DEFAULT);
-
- /* dset2.1 */
+ if (H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2) < 0)
+ goto error;
+ if (H5Sclose(space) < 0)
+ goto error;
+ if (H5Dclose(dataset) < 0)
+ goto error;
+
+ if (H5Gclose(group) < 0)
+ goto error;
+
+ /* External link */
+ if (H5Lcreate_external("somefile", "somepath", fid, "/g1/g1.2/extlink", H5P_DEFAULT, H5P_DEFAULT) < 0)
+ goto error;
+
+ /* Soft link */
+ if ((group = H5Gopen2(fid, "/g1/g1.2/g1.2.1", H5P_DEFAULT)) < 0)
+ goto error;
+ if (H5Lcreate_soft("somevalue", group, "slink", H5P_DEFAULT, H5P_DEFAULT) < 0)
+ goto error;
+ if (H5Gclose(group) < 0)
+ goto error;
+
+ if ((group = H5Gopen2(fid, "/g2", H5P_DEFAULT)) < 0)
+ goto error;
+
+ /* Dataset 2.1 */
dims[0] = 10;
- space = H5Screate_simple(1, dims, NULL);
- dataset = H5Dcreate2(group, "dset2.1", H5T_IEEE_F32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ if ((space = H5Screate_simple(1, dims, NULL)) < 0)
+ goto error;
+ if ((dataset =
+ H5Dcreate2(group, "dset2.1", H5T_IEEE_F32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto error;
for (i = 0; i < 10; i++)
dset2_1[i] = (float)((float)i * 0.1F + 1.0F);
- H5Dwrite(dataset, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2_1);
- H5Sclose(space);
- H5Dclose(dataset);
-
- /* dset2.2 */
+ if (H5Dwrite(dataset, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2_1) < 0)
+ goto error;
+ if (H5Sclose(space) < 0)
+ goto error;
+ if (H5Dclose(dataset) < 0)
+ goto error;
+
+ /* Dataset 2.2 */
dims[0] = 3;
dims[1] = 5;
- space = H5Screate_simple(2, dims, NULL);
- dataset = H5Dcreate2(group, "dset2.2", H5T_IEEE_F32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ if ((space = H5Screate_simple(2, dims, NULL)) < 0)
+ goto error;
+ if ((dataset =
+ H5Dcreate2(group, "dset2.2", H5T_IEEE_F32BE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ goto error;
for (i = 0; i < 3; i++)
for (j = 0; j < 5; j++)
dset2_2[i][j] = (float)(((float)i + 1.0F) * (float)j * 0.1F);
- H5Dwrite(dataset, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2_2);
- H5Sclose(space);
- H5Dclose(dataset);
-
- H5Gclose(group);
-
- /* user-defined link */
- H5Lregister(UD_link_class);
- H5Lcreate_ud(fid, "/g2/udlink", (H5L_type_t)MY_LINKCLASS, NULL, (size_t)0, H5P_DEFAULT, H5P_DEFAULT);
-
- H5Fclose(fid);
+ if (H5Dwrite(dataset, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset2_2) < 0)
+ goto error;
+ if (H5Sclose(space) < 0)
+ goto error;
+ if (H5Dclose(dataset) < 0)
+ goto error;
+
+ if (H5Gclose(group) < 0)
+ goto error;
+
+ /* User-defined link */
+ if (H5Lregister(UD_link_class) < 0)
+ goto error;
+ if (H5Lcreate_ud(fid, "/g2/udlink", (H5L_type_t)MY_LINKCLASS, NULL, (size_t)0, H5P_DEFAULT, H5P_DEFAULT) <
+ 0)
+ goto error;
+
+ /* MUST close the file ID before the user block code or you risk tripping
+ * over file locking issues.
+ */
+ if (H5Fclose(fid) < 0)
+ goto error;
/* If a user block is being used, write to it here */
if (ub_size > 0) {
- HDassert(ub_size <= BUF_SIZE);
+ char *bp;
- fd = HDopen(filename, O_RDWR);
- HDassert(fd >= 0);
+ if (ub_size > BUF_SIZE)
+ goto error;
- /* fill buf with pattern */
+ if ((fd = HDopen(filename, O_RDWR)) < 0)
+ goto error;
+
+ /* Fill buf with pattern */
HDmemset(buf, '\0', ub_size);
bp = buf;
for (u = 0; u < ub_fill; u++)
*bp++ = pattern[u % 10];
- HDwrite(fd, buf, ub_size);
+ if (HDwrite(fd, buf, ub_size) < 0)
+ goto error;
+
+ if (HDclose(fd) < 0)
+ goto error;
+ }
+ return SUCCEED;
+
+error:
+ if (fd >= 0)
HDclose(fd);
+
+ H5E_BEGIN_TRY
+ {
+ H5Fclose(fid);
+ H5Gclose(group);
+ H5Aclose(attr);
+ H5Dclose(dataset);
+ H5Sclose(space);
+ H5Pclose(create_plist);
}
+ H5E_END_TRY;
+
+ return FAIL;
}
-static void
+/* Creates a simple (i.e., not HDF5) text file and fills it with a pattern */
+static herr_t
create_textfile(const char *name, size_t size)
{
- char * buf;
- int fd;
+ char * buf = NULL;
+ int fd = -1;
size_t i;
- char * bp;
+ char * bp = NULL;
- fd = HDcreat(name, 0777);
- HDassert(fd >= 0);
- buf = (char *)HDcalloc(size, (size_t)1);
- HDassert(buf);
+ if ((fd = HDcreat(name, 0777)) < 0)
+ goto error;
+ if (NULL == (buf = (char *)HDcalloc(size, 1)))
+ goto error;
- /* fill buf with pattern */
+ /* Fill buf with pattern */
bp = buf;
for (i = 0; i < size; i++)
*bp++ = pattern[i % 10];
- HDwrite(fd, buf, size);
+ if (HDwrite(fd, buf, size) < 0)
+ goto error;
HDfree(buf);
-
HDclose(fd);
-}
-
-#ifdef notdef
-/* not used yet */
-void
-create_binfile(char *name, off_t size)
-{
- char *buf;
- int fd;
- int i;
- char *bp;
- fd = creat(name, 0777);
- HDassert(fd >= 0);
+ return SUCCEED;
- buf = HDcalloc(size, 1);
- HDassert(buf);
-
- /* fill buf with pattern */
- bp = buf;
- for (i = 0; i < size; i++)
- *bp++ = (char)i & 0xff;
-
- HDwrite(fd, buf, size);
+error:
+ HDfree(buf);
+ if (fd >= 0)
+ HDclose(fd);
- HDclose(fd);
+ return FAIL;
}
-#endif
/*-------------------------------------------------------------------------
* Function: main
*
*-------------------------------------------------------------------------
*/
-
int
main(void)
{
-
- /*
- create_textfile(UBTXT1, (size_t)0);
- */
- create_textfile(UBTXT2, (size_t)10);
- create_textfile(UBTXT3, (size_t)511);
- create_textfile(UBTXT4, (size_t)512);
- create_textfile(UBTXT5, (size_t)513);
- /*
- create_textfile(UBTXT6, (size_t)1023);
- create_textfile(UBTXT7, (size_t)1024);
- create_textfile(UBTXT8, (size_t)1025);
- create_textfile(UBTXT9, (size_t)2047);
- create_textfile(UBTXT10, (size_t)2048);
- create_textfile(UBTXT11, (size_t)2049);
-
- create_binfile(UBBIN1, (off_t)0);
- create_binfile(UBBIN2, (off_t)10);
- create_binfile(UBBIN3, (off_t)511);
- create_binfile(UBBIN4, (off_t)512);
- create_binfile(UBBIN5, (off_t)513);
-
- */
- gent_ub(FILE7, (size_t)0, (size_t)0);
- gent_ub(FILE8, (size_t)512, HDstrlen(pattern));
- gent_ub(FILE9, (size_t)1024, (size_t)513);
-
- return 0;
+ if (create_textfile(UBTXT2, 10) < 0)
+ goto error;
+ if (create_textfile(UBTXT3, 511) < 0)
+ goto error;
+ if (create_textfile(UBTXT4, 512) < 0)
+ goto error;
+ if (create_textfile(UBTXT5, 513) < 0)
+ goto error;
+
+ if (gent_ub(FILE7, 0, 0) < 0)
+ goto error;
+ if (gent_ub(FILE8, 512, HDstrlen(pattern)) < 0)
+ goto error;
+ if (gent_ub(FILE9, 1024, 513) < 0)
+ goto error;
+
+ return EXIT_SUCCESS;
+
+error:
+ HDfprintf(stderr, "h5jam test generator FAILED\n");
+ return EXIT_FAILURE;
}
diff --git a/tools/test/h5jam/tellub.c b/tools/test/h5jam/tellub.c
index 45d4af4..e6769ec 100644
--- a/tools/test/h5jam/tellub.c
+++ b/tools/test/h5jam/tellub.c
@@ -24,8 +24,8 @@
* parameters. The long-named ones can be partially spelled. When
* adding more, make sure that they don't clash with each other.
*/
-static const char * s_opts = "h";
-static struct long_options l_opts[] = {{"help", no_arg, 'h'}, {"hel", no_arg, 'h'}, {NULL, 0, '\0'}};
+static const char * s_opts = "h";
+static struct h5_long_options l_opts[] = {{"help", no_arg, 'h'}, {"hel", no_arg, 'h'}, {NULL, 0, '\0'}};
/*-------------------------------------------------------------------------
* Function: usage
@@ -61,7 +61,7 @@ parse_command_line(int argc, const char *argv[])
int opt;
/* parse command line options */
- while ((opt = get_option(argc, argv, s_opts, l_opts)) != EOF) {
+ while ((opt = H5_get_option(argc, argv, s_opts, l_opts)) != EOF) {
switch ((char)opt) {
case 'h':
usage(h5tools_getprogname());
@@ -75,7 +75,7 @@ parse_command_line(int argc, const char *argv[])
}
/* check for file name to be processed */
- if (argc <= opt_ind) {
+ if (argc <= H5_optind) {
error_msg("missing file name\n");
usage(h5tools_getprogname());
h5tools_setstatus(EXIT_FAILURE);
@@ -118,14 +118,14 @@ main(int argc, const char *argv[])
/* enable error reporting if command line option */
h5tools_error_report();
- if (argc <= (opt_ind)) {
+ if (argc <= (H5_optind)) {
error_msg("missing file name\n");
usage(h5tools_getprogname());
h5tools_setstatus(EXIT_FAILURE);
goto done;
}
- ifname = HDstrdup(argv[opt_ind]);
+ ifname = HDstrdup(argv[H5_optind]);
testval = H5Fis_accessible(ifname, H5P_DEFAULT);
diff --git a/tools/test/h5ls/CMakeLists.txt b/tools/test/h5ls/CMakeLists.txt
index ee223b8..ba6e468 100644
--- a/tools/test/h5ls/CMakeLists.txt
+++ b/tools/test/h5ls/CMakeLists.txt
@@ -12,7 +12,7 @@ if (BUILD_SHARED_LIBS)
add_library (${H5LS_TOOL_PLUGIN_LIB_TARGET} SHARED dynlib_ls.c)
target_include_directories (${H5LS_TOOL_PLUGIN_LIB_TARGET} PRIVATE "${HDF5_SRC_DIR};${HDF5_SRC_BINARY_DIR};$<$<BOOL:${HDF5_ENABLE_PARALLEL}>:${MPI_C_INCLUDE_DIRS}>")
TARGET_C_PROPERTIES (${H5LS_TOOL_PLUGIN_LIB_TARGET} SHARED)
- target_link_libraries (${H5LS_TOOL_PLUGIN_LIB_TARGET} PRIVATE ${HDF5_TEST_LIBSH_TARGET})
+ target_link_libraries (${H5LS_TOOL_PLUGIN_LIB_TARGET} PRIVATE ${HDF5_LIBSH_TARGET})
H5_SET_LIB_OPTIONS (${H5LS_TOOL_PLUGIN_LIB_TARGET} ${H5LS_TOOL_PLUGIN_LIB_NAME} SHARED "LIB")
#-----------------------------------------------------------------------------
diff --git a/tools/test/h5ls/CMakeTests.cmake b/tools/test/h5ls/CMakeTests.cmake
index 98435ce..cd2f764 100644
--- a/tools/test/h5ls/CMakeTests.cmake
+++ b/tools/test/h5ls/CMakeTests.cmake
@@ -139,7 +139,7 @@
if (HDF5_ENABLE_USING_MEMCHECKER)
add_test (NAME H5LS-${resultfile} COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $<TARGET_FILE:h5ls${tgt_file_ext}> ${ARGN})
set_tests_properties (H5LS-${resultfile} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
- if (${resultcode} EQUAL 1)
+ if ("${resultcode}" STREQUAL "1")
set_tests_properties (H5LS-${resultfile} PROPERTIES WILL_FAIL "true")
endif ()
else ()
@@ -164,7 +164,7 @@
if (HDF5_ENABLE_USING_MEMCHECKER)
add_test (NAME H5LS-${resultfile} COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $<TARGET_FILE:h5ls${tgt_file_ext}> ${ARGN})
set_tests_properties (H5LS-${resultfile} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
- if (${resultcode} EQUAL 1)
+ if ("${resultcode}" STREQUAL "1")
set_tests_properties (H5LS-${resultfile} PROPERTIES WILL_FAIL "true")
endif ()
else ()
diff --git a/tools/test/h5ls/CMakeTestsVDS.cmake b/tools/test/h5ls/CMakeTestsVDS.cmake
index e8b11bf..e93e7e7 100644
--- a/tools/test/h5ls/CMakeTestsVDS.cmake
+++ b/tools/test/h5ls/CMakeTestsVDS.cmake
@@ -85,7 +85,7 @@
if (HDF5_ENABLE_USING_MEMCHECKER)
add_test (NAME H5LS-${resultfile} COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $<TARGET_FILE:h5ls${tgt_file_ext}> ${ARGN})
set_tests_properties (H5LS-${resultfile} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/vds")
- if (${resultcode} EQUAL 1)
+ if ("${resultcode}" STREQUAL "1")
set_tests_properties (H5LS-${resultfile} PROPERTIES WILL_FAIL "true")
endif ()
else ()
@@ -112,7 +112,7 @@
ENVIRONMENT "HDF5_VDS_PREFIX=\${ORIGIN}"
WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles"
)
- if (${resultcode} EQUAL 1)
+ if ("${resultcode}" STREQUAL "1")
set_tests_properties (H5LS_PREFIX-${resultfile} PROPERTIES WILL_FAIL "true")
endif ()
else ()
diff --git a/tools/test/h5ls/dynlib_ls.c b/tools/test/h5ls/dynlib_ls.c
index 4568ca1..433522d 100644
--- a/tools/test/h5ls/dynlib_ls.c
+++ b/tools/test/h5ls/dynlib_ls.c
@@ -25,13 +25,13 @@ static size_t H5Z_filter_dynlibud(unsigned int flags, size_t cd_nelmts, const un
/* This message derives from H5Z */
const H5Z_class2_t H5Z_DYNLIBUD[1] = {{
- H5Z_CLASS_T_VERS, /* H5Z_class_t version */
- H5Z_FILTER_DYNLIBUD, /* Filter id number */
- 1, 1, /* Encoding and decoding enabled */
- "dynlibud", /* Filter name for debugging */
- NULL, /* The "can apply" callback */
- NULL, /* The "set local" callback */
- (H5Z_func_t)H5Z_filter_dynlibud, /* The actual filter function */
+ H5Z_CLASS_T_VERS, /* H5Z_class_t version */
+ H5Z_FILTER_DYNLIBUD, /* Filter id number */
+ 1, 1, /* Encoding and decoding enabled */
+ "dynlibud", /* Filter name for debugging */
+ NULL, /* The "can apply" callback */
+ NULL, /* The "set local" callback */
+ H5Z_filter_dynlibud, /* The actual filter function */
}};
H5PL_type_t
@@ -70,7 +70,7 @@ H5Z_filter_dynlibud(unsigned int flags, size_t cd_nelmts, const unsigned int *cd
return (0);
/* Assignment to eliminate unused parameter warning. */
- cd_values = cd_values;
+ (void)cd_values;
if (flags & H5Z_FLAG_REVERSE) { /*read*/
/* Subtract the original value with MULTIPLIER */
diff --git a/tools/test/h5repack/CMakeLists.txt b/tools/test/h5repack/CMakeLists.txt
index 26db85a..0b90750 100644
--- a/tools/test/h5repack/CMakeLists.txt
+++ b/tools/test/h5repack/CMakeLists.txt
@@ -54,13 +54,13 @@ if (BUILD_SHARED_LIBS)
add_library (${H5REPACK_TOOL_PLUGIN_LIB_TARGET} SHARED dynlib_rpk.c)
target_include_directories (${H5REPACK_TOOL_PLUGIN_LIB_TARGET} PRIVATE "${HDF5_SRC_DIR};${HDF5_SRC_BINARY_DIR};$<$<BOOL:${HDF5_ENABLE_PARALLEL}>:${MPI_C_INCLUDE_DIRS}>")
TARGET_C_PROPERTIES (${H5REPACK_TOOL_PLUGIN_LIB_TARGET} SHARED)
- target_link_libraries (${H5REPACK_TOOL_PLUGIN_LIB_TARGET} PRIVATE ${HDF5_TEST_LIBSH_TARGET})
+ target_link_libraries (${H5REPACK_TOOL_PLUGIN_LIB_TARGET} PRIVATE ${HDF5_LIBSH_TARGET})
H5_SET_LIB_OPTIONS (${H5REPACK_TOOL_PLUGIN_LIB_TARGET} ${H5REPACK_TOOL_PLUGIN_LIB_NAME} SHARED "LIB")
add_library (${H5REPACK_TOOL_PLUGIN_LIB_VTARGET} SHARED dynlib_vrpk.c)
target_include_directories (${H5REPACK_TOOL_PLUGIN_LIB_VTARGET} PRIVATE "${HDF5_SRC_DIR};${HDF5_SRC_BINARY_DIR};$<$<BOOL:${HDF5_ENABLE_PARALLEL}>:${MPI_C_INCLUDE_DIRS}>")
TARGET_C_PROPERTIES (${H5REPACK_TOOL_PLUGIN_LIB_VTARGET} SHARED)
- target_link_libraries (${H5REPACK_TOOL_PLUGIN_LIB_VTARGET} PRIVATE ${HDF5_TEST_LIBSH_TARGET})
+ target_link_libraries (${H5REPACK_TOOL_PLUGIN_LIB_VTARGET} PRIVATE ${HDF5_LIBSH_TARGET})
H5_SET_LIB_OPTIONS (${H5REPACK_TOOL_PLUGIN_LIB_VTARGET} ${H5REPACK_TOOL_PLUGIN_LIB_VNAME} SHARED "LIB")
#-----------------------------------------------------------------------------
diff --git a/tools/test/h5repack/CMakeTests.cmake b/tools/test/h5repack/CMakeTests.cmake
index 528ee1c..037287d 100644
--- a/tools/test/h5repack/CMakeTests.cmake
+++ b/tools/test/h5repack/CMakeTests.cmake
@@ -51,7 +51,8 @@
${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_named_dtypes.h5
${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_nested_8bit_enum.h5
${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_nested_8bit_enum_deflated.h5
- ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_HDFFV-10590_CVE-2018-17432.h5
+ ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_CVE-2018-17432.h5
+ ${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_CVE-2018-14460.h5
${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_nbit.h5
${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_objs.h5
${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_refs.h5
@@ -1551,10 +1552,15 @@
ADD_H5_TEST (HDFFV-7840 "TEST" h5diff_attr1.h5)
# test CVE-2018-17432 fix
- set (arg h5repack_HDFFV-10590_CVE-2018-17432.h5 h5repack_HDFFV-10590_CVE-2018-17432_out.h5 --low=1 --high=2 -f GZIP=8 -l dset1:CHUNK=5x6)
+ set (arg h5repack_CVE-2018-17432.h5 h5repack__CVE-2018-17432_out.h5 --low=1 --high=2 -f GZIP=8 -l dset1:CHUNK=5x6)
set (TESTTYPE "TEST")
ADD_H5_FILTER_TEST (HDFFV-10590 "" ${TESTTYPE} 1 ${arg})
+# test CVE-2018-14460 fix
+ set (arg h5repack_CVE-2018-14460.h5 h5repack_CVE-2018-14460_out.h5)
+ set (TESTTYPE "TEST")
+ ADD_H5_FILTER_TEST (HDFFV-11223 "" ${TESTTYPE} 1 ${arg})
+
# tests for metadata block size option ('-M')
ADD_H5_TEST_META (meta_short h5repack_layout.h5 -M 8192)
ADD_H5_TEST_META (meta_long h5repack_layout.h5 --metadata_block_size=8192)
diff --git a/tools/test/h5repack/CMakeVFDTests.cmake b/tools/test/h5repack/CMakeVFDTests.cmake
index 74471f8..4f6e51d 100644
--- a/tools/test/h5repack/CMakeVFDTests.cmake
+++ b/tools/test/h5repack/CMakeVFDTests.cmake
@@ -24,11 +24,28 @@ set (VFD_LIST
split
multi
family
+ splitter
+ #log - log VFD currently has file space allocation bugs
)
-if (DIRECT_VFD)
+if (H5_HAVE_DIRECT)
set (VFD_LIST ${VFD_LIST} direct)
endif ()
+if (H5_HAVE_PARALLEL)
+ set (VFD_LIST ${VFD_LIST} mpio)
+endif ()
+if (H5_HAVE_MIRROR_VFD)
+ set (VFD_LIST ${VFD_LIST} mirror)
+endif ()
+if (H5_HAVE_ROS3_VFD)
+ set (VFD_LIST ${VFD_LIST} ros3)
+endif ()
+if (H5_HAVE_LIBHDFS)
+ set (VFD_LIST ${VFD_LIST} hdfs)
+endif ()
+if (H5_HAVE_WINDOWS)
+ set (VFD_LIST ${VFD_LIST} windows)
+endif ()
##############################################################################
##############################################################################
diff --git a/tools/test/h5repack/dynlib_rpk.c b/tools/test/h5repack/dynlib_rpk.c
index e64e67b..b228344 100644
--- a/tools/test/h5repack/dynlib_rpk.c
+++ b/tools/test/h5repack/dynlib_rpk.c
@@ -27,13 +27,13 @@ static size_t H5Z_filter_dynlib1(unsigned int flags, size_t cd_nelmts, const uns
/* This message derives from H5Z */
const H5Z_class2_t H5Z_DYNLIB1[1] = {{
- H5Z_CLASS_T_VERS, /* H5Z_class_t version */
- H5Z_FILTER_DYNLIB1, /* Filter id number */
- 1, 1, /* Encoding and decoding enabled */
- "dynlib1", /* Filter name for debugging */
- NULL, /* The "can apply" callback */
- NULL, /* The "set local" callback */
- (H5Z_func_t)H5Z_filter_dynlib1, /* The actual filter function */
+ H5Z_CLASS_T_VERS, /* H5Z_class_t version */
+ H5Z_FILTER_DYNLIB1, /* Filter id number */
+ 1, 1, /* Encoding and decoding enabled */
+ "dynlib1", /* Filter name for debugging */
+ NULL, /* The "can apply" callback */
+ NULL, /* The "set local" callback */
+ H5Z_filter_dynlib1, /* The actual filter function */
}};
H5PL_type_t
diff --git a/tools/test/h5repack/dynlib_vrpk.c b/tools/test/h5repack/dynlib_vrpk.c
index 2db97da..5eac4f2 100644
--- a/tools/test/h5repack/dynlib_vrpk.c
+++ b/tools/test/h5repack/dynlib_vrpk.c
@@ -27,13 +27,13 @@ static size_t H5Z_filter_dynlib4(unsigned int flags, size_t cd_nelmts, const uns
/* This message derives from H5Z */
const H5Z_class2_t H5Z_DYNLIB4[1] = {{
- H5Z_CLASS_T_VERS, /* H5Z_class_t version */
- H5Z_FILTER_DYNLIB4, /* Filter id number */
- 1, 1, /* Encoding and decoding enabled */
- "dynlib4", /* Filter name for debugging */
- NULL, /* The "can apply" callback */
- NULL, /* The "set local" callback */
- (H5Z_func_t)H5Z_filter_dynlib4, /* The actual filter function */
+ H5Z_CLASS_T_VERS, /* H5Z_class_t version */
+ H5Z_FILTER_DYNLIB4, /* Filter id number */
+ 1, 1, /* Encoding and decoding enabled */
+ "dynlib4", /* Filter name for debugging */
+ NULL, /* The "can apply" callback */
+ NULL, /* The "set local" callback */
+ H5Z_filter_dynlib4, /* The actual filter function */
}};
H5PL_type_t
diff --git a/tools/test/h5repack/h5repack.sh.in b/tools/test/h5repack/h5repack.sh.in
index f881b0a..3756a95 100644
--- a/tools/test/h5repack/h5repack.sh.in
+++ b/tools/test/h5repack/h5repack.sh.in
@@ -129,7 +129,8 @@ $SRC_H5REPACK_TESTFILES/h5repack_paged_persist.h5
########h5diff/testfile########
$SRC_H5DIFF_TESTFILES/h5diff_attr1.h5
########test#HDFFV-10590########
-$SRC_H5REPACK_TESTFILES/h5repack_HDFFV-10590_CVE-2018-17432.h5
+$SRC_H5REPACK_TESTFILES/h5repack_CVE-2018-17432.h5
+$SRC_H5REPACK_TESTFILES/h5repack_CVE-2018-14460.h5
########tools/testfiles#for#external#links########
$SRC_TOOLS_TESTFILES/tsoftlinks.h5
$SRC_TOOLS_TESTFILES/textlinkfar.h5
@@ -1712,7 +1713,11 @@ TOOLTEST HDFFV-5932 h5repack_attr_refs.h5
TOOLTEST HDFFV-7840 h5diff_attr1.h5
# test HDFFV-10590
-arg="h5repack_HDFFV-10590_CVE-2018-17432.h5 h5repack_HDFFV-10590_CVE-2018-17432_out.h5 --low=1 --high=2 -f GZIP=8 -l dset1:CHUNK=5x6"
+arg="h5repack_CVE-2018-17432.h5 h5repack_CVE-2018-17432_out.h5 --low=1 --high=2 -f GZIP=8 -l dset1:CHUNK=5x6"
+TOOLTEST_FAIL $arg
+
+# test HDFFV-11223
+arg="h5repack_CVE-2018-14460.h5 h5repack_CVE-2018-14460_out.h5"
TOOLTEST_FAIL $arg
# tests for metadata block size option
diff --git a/tools/test/h5repack/h5repackgentest.c b/tools/test/h5repack/h5repackgentest.c
index 2b94422..576b1c7 100644
--- a/tools/test/h5repack/h5repackgentest.c
+++ b/tools/test/h5repack/h5repackgentest.c
@@ -72,8 +72,8 @@ struct external_def {
* Returns 0 on success, -1 on failure.
*/
static int
-__make_dataset(hid_t file_id, const char *dset_name, hid_t mem_type_id, hid_t space_id, hid_t dcpl_id,
- void *wdata)
+make_dataset(hid_t file_id, const char *dset_name, hid_t mem_type_id, hid_t space_id, hid_t dcpl_id,
+ void *wdata)
{
hid_t dset_id = H5I_INVALID_HID;
int ret_value = 0;
@@ -90,7 +90,7 @@ done:
(void)H5Dclose(dset_id);
return ret_value;
-} /* end __make_dataset() */
+} /* end make_dataset() */
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Helper function to populate the DCPL external storage list.
@@ -101,8 +101,8 @@ done:
* Returns 0 on success, -1 on failure.
*/
static int
-__set_dcpl_external_list(hid_t dcpl, const char *filename, unsigned n_elts_per_file, unsigned n_elts_total,
- hsize_t elt_size)
+set_dcpl_external_list(hid_t dcpl, const char *filename, unsigned n_elts_per_file, unsigned n_elts_total,
+ hsize_t elt_size)
{
char name[MAX_NAME_SIZE];
unsigned n_external_files = 0;
@@ -123,7 +123,7 @@ __set_dcpl_external_list(hid_t dcpl, const char *filename, unsigned n_elts_per_f
return -1;
}
return 0;
-} /* end __set_dcpl_external_list() */
+} /* end set_dcpl_external_list() */
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Generalized utility function to write a file with the specified data and
@@ -132,8 +132,8 @@ __set_dcpl_external_list(hid_t dcpl, const char *filename, unsigned n_elts_per_f
* Returns 0 on success, -1 on failure.
*/
static int
-__make_file(const char *basename, struct external_def *ext, hid_t type_id, hsize_t rank, hsize_t *dims,
- void *wdata)
+make_file(const char *basename, struct external_def *ext, hid_t type_id, hsize_t rank, hsize_t *dims,
+ void *wdata)
{
char filename[MAX_NAME_SIZE];
hid_t file_id = H5I_INVALID_HID;
@@ -149,8 +149,8 @@ __make_file(const char *basename, struct external_def *ext, hid_t type_id, hsize
if (dcpl_id == H5I_INVALID_HID)
H5REPACKGENTEST_OOPS;
- if (__set_dcpl_external_list(dcpl_id, basename, ext->n_elts_per_file, ext->n_elts_total,
- ext->type_size) < 0)
+ if (set_dcpl_external_list(dcpl_id, basename, ext->n_elts_per_file, ext->n_elts_total,
+ ext->type_size) < 0)
H5REPACKGENTEST_OOPS;
}
@@ -162,13 +162,13 @@ __make_file(const char *basename, struct external_def *ext, hid_t type_id, hsize
if (file_id == H5I_INVALID_HID)
H5REPACKGENTEST_OOPS;
- if (__make_dataset(file_id, "dset", type_id, space_id, dcpl_id, wdata) < 0)
+ if (make_dataset(file_id, "dset", type_id, space_id, dcpl_id, wdata) < 0)
H5REPACKGENTEST_OOPS;
done:
H5REPACKGENTEST_COMMON_CLEANUP(dcpl_id, file_id, space_id);
return ret_value;
-} /* end __make_file() */
+} /* end make_file() */
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Returns 0 on success, -1 on failure.
@@ -190,7 +190,7 @@ generate_int32le_1d(hbool_t external)
}
def_ptr = (TRUE == external) ? (&def) : NULL;
- if (__make_file(FILE_INT32LE_1, def_ptr, H5T_STD_I32LE, 1, dims, wdata) < 0)
+ if (make_file(FILE_INT32LE_1, def_ptr, H5T_STD_I32LE, 1, dims, wdata) < 0)
ret_value = -1;
return ret_value;
@@ -216,7 +216,7 @@ generate_int32le_2d(hbool_t external)
}
def_ptr = (TRUE == external) ? (&def) : NULL;
- if (__make_file(FILE_INT32LE_2, def_ptr, H5T_STD_I32LE, 2, dims, wdata) < 0)
+ if (make_file(FILE_INT32LE_2, def_ptr, H5T_STD_I32LE, 2, dims, wdata) < 0)
ret_value = -1;
return ret_value;
@@ -249,7 +249,7 @@ generate_int32le_3d(hbool_t external)
}
def_ptr = (TRUE == external) ? (&def) : NULL;
- if (__make_file(FILE_INT32LE_3, def_ptr, H5T_STD_I32LE, 3, dims, wdata) < 0)
+ if (make_file(FILE_INT32LE_3, def_ptr, H5T_STD_I32LE, 3, dims, wdata) < 0)
ret_value = -1;
return ret_value;
@@ -282,7 +282,7 @@ generate_uint8be(hbool_t external)
}
def_ptr = (TRUE == external) ? (&def) : NULL;
- if (__make_file(FILE_UINT8BE, def_ptr, H5T_STD_U8BE, 3, dims, wdata) < 0)
+ if (make_file(FILE_UINT8BE, def_ptr, H5T_STD_U8BE, 3, dims, wdata) < 0)
ret_value = -1;
return ret_value;
@@ -312,7 +312,7 @@ generate_f32le(hbool_t external)
}
def_ptr = (TRUE == external) ? (&def) : NULL;
- if (__make_file(FILE_F32LE, def_ptr, H5T_IEEE_F32LE, 2, dims, wdata) < 0)
+ if (make_file(FILE_F32LE, def_ptr, H5T_IEEE_F32LE, 2, dims, wdata) < 0)
ret_value = -1;
return ret_value;
diff --git a/tools/test/h5repack/h5repacktst.c b/tools/test/h5repack/h5repacktst.c
index c4ed074..ed3fedd 100644
--- a/tools/test/h5repack/h5repacktst.c
+++ b/tools/test/h5repack/h5repacktst.c
@@ -111,8 +111,8 @@ const char *H5REPACK_FILENAMES[] = {"h5repack_big_out", NULL};
#define DIM1 40
#define DIM2 20
-#define CDIM1 DIM1 / 2
-#define CDIM2 DIM2 / 2
+#define CDIM1 (DIM1 / 2)
+#define CDIM2 (DIM2 / 2)
#define RANK 2
/* Size of userblock (for userblock test) */
@@ -272,98 +272,100 @@ main(void)
GOERROR;
PASSED();
- TESTING(" files with file space info setting-- options -S and -P are set & -L");
- ++j; /* #3 */
- HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
- fname = H5REPACK_FSPACE_FNAMES[j];
- if (h5repack_init(&pack_options, 0, TRUE) < 0)
- GOERROR;
- pack_options.fs_strategy = H5F_FSPACE_STRATEGY_PAGE; /* "PAGE" specified via -S */
- pack_options.fs_persist = TRUE;
- if (h5repack(fname, FSPACE_OUT, &pack_options) < 0)
- GOERROR;
- if (h5diff(fname, FSPACE_OUT, NULL, NULL, &diff_options) > 0)
- GOERROR;
- if (h5repack_verify(fname, FSPACE_OUT, &pack_options) <= 0)
- GOERROR;
- if (h5repack_end(&pack_options) < 0)
- GOERROR;
- PASSED();
+ if (h5_using_default_driver(NULL)) {
+ TESTING(" files with file space info setting-- options -S and -P are set & -L");
+ ++j; /* #3 */
+ HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
+ fname = H5REPACK_FSPACE_FNAMES[j];
+ if (h5repack_init(&pack_options, 0, TRUE) < 0)
+ GOERROR;
+ pack_options.fs_strategy = H5F_FSPACE_STRATEGY_PAGE; /* "PAGE" specified via -S */
+ pack_options.fs_persist = TRUE;
+ if (h5repack(fname, FSPACE_OUT, &pack_options) < 0)
+ GOERROR;
+ if (h5diff(fname, FSPACE_OUT, NULL, NULL, &diff_options) > 0)
+ GOERROR;
+ if (h5repack_verify(fname, FSPACE_OUT, &pack_options) <= 0)
+ GOERROR;
+ if (h5repack_end(&pack_options) < 0)
+ GOERROR;
+ PASSED();
- TESTING(" files with file space info setting-- options -P and -T are set & -L");
- ++j; /* #4 */
- HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
- fname = H5REPACK_FSPACE_FNAMES[j];
- if (h5repack_init(&pack_options, 0, TRUE) < 0)
- GOERROR;
- pack_options.fs_persist = -1; /* "FALSE" is set via -P 0 */
- pack_options.fs_threshold = 2;
- if (h5repack(fname, FSPACE_OUT, &pack_options) < 0)
- GOERROR;
- if (h5diff(fname, FSPACE_OUT, NULL, NULL, &diff_options) > 0)
- GOERROR;
- if (h5repack_verify(fname, FSPACE_OUT, &pack_options) <= 0)
- GOERROR;
- if (h5repack_end(&pack_options) < 0)
- GOERROR;
- PASSED();
+ TESTING(" files with file space info setting-- options -P and -T are set & -L");
+ ++j; /* #4 */
+ HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
+ fname = H5REPACK_FSPACE_FNAMES[j];
+ if (h5repack_init(&pack_options, 0, TRUE) < 0)
+ GOERROR;
+ pack_options.fs_persist = -1; /* "FALSE" is set via -P 0 */
+ pack_options.fs_threshold = 2;
+ if (h5repack(fname, FSPACE_OUT, &pack_options) < 0)
+ GOERROR;
+ if (h5diff(fname, FSPACE_OUT, NULL, NULL, &diff_options) > 0)
+ GOERROR;
+ if (h5repack_verify(fname, FSPACE_OUT, &pack_options) <= 0)
+ GOERROR;
+ if (h5repack_end(&pack_options) < 0)
+ GOERROR;
+ PASSED();
- TESTING(" files with file space info setting-- options -S and -G are set & -L");
- ++j; /* #5 */
- HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
- fname = H5REPACK_FSPACE_FNAMES[j];
- if (h5repack_init(&pack_options, 0, TRUE) < 0)
- GOERROR;
- pack_options.fs_strategy = H5F_FSPACE_STRATEGY_PAGE;
- pack_options.fs_pagesize = 8192;
- if (h5repack(fname, FSPACE_OUT, &pack_options) < 0)
- GOERROR;
- if (h5diff(fname, FSPACE_OUT, NULL, NULL, &diff_options) > 0)
- GOERROR;
- if (h5repack_verify(fname, FSPACE_OUT, &pack_options) <= 0)
- GOERROR;
- if (h5repack_end(&pack_options) < 0)
- GOERROR;
- PASSED();
+ TESTING(" files with file space info setting-- options -S and -G are set & -L");
+ ++j; /* #5 */
+ HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
+ fname = H5REPACK_FSPACE_FNAMES[j];
+ if (h5repack_init(&pack_options, 0, TRUE) < 0)
+ GOERROR;
+ pack_options.fs_strategy = H5F_FSPACE_STRATEGY_PAGE;
+ pack_options.fs_pagesize = 8192;
+ if (h5repack(fname, FSPACE_OUT, &pack_options) < 0)
+ GOERROR;
+ if (h5diff(fname, FSPACE_OUT, NULL, NULL, &diff_options) > 0)
+ GOERROR;
+ if (h5repack_verify(fname, FSPACE_OUT, &pack_options) <= 0)
+ GOERROR;
+ if (h5repack_end(&pack_options) < 0)
+ GOERROR;
+ PASSED();
- TESTING(" files with file space info setting-- options -S, -P, -T, -G are set");
- ++j; /* #6 */
- HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
- fname = H5REPACK_FSPACE_FNAMES[j];
- if (h5repack_init(&pack_options, 0, FALSE) < 0)
- GOERROR;
- pack_options.fs_strategy = H5F_FSPACE_STRATEGY_NONE;
- pack_options.fs_persist = -1; /* "FALSE" is set via -P 0 */
- pack_options.fs_threshold = 1;
- pack_options.fs_pagesize = 8192;
- if (h5repack(fname, FSPACE_OUT, &pack_options) < 0)
- GOERROR;
- if (h5diff(fname, FSPACE_OUT, NULL, NULL, &diff_options) > 0)
- GOERROR;
- if (h5repack_verify(fname, FSPACE_OUT, &pack_options) <= 0)
- GOERROR;
- if (h5repack_end(&pack_options) < 0)
- GOERROR;
- PASSED();
+ TESTING(" files with file space info setting-- options -S, -P, -T, -G are set");
+ ++j; /* #6 */
+ HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
+ fname = H5REPACK_FSPACE_FNAMES[j];
+ if (h5repack_init(&pack_options, 0, FALSE) < 0)
+ GOERROR;
+ pack_options.fs_strategy = H5F_FSPACE_STRATEGY_NONE;
+ pack_options.fs_persist = -1; /* "FALSE" is set via -P 0 */
+ pack_options.fs_threshold = 1;
+ pack_options.fs_pagesize = 8192;
+ if (h5repack(fname, FSPACE_OUT, &pack_options) < 0)
+ GOERROR;
+ if (h5diff(fname, FSPACE_OUT, NULL, NULL, &diff_options) > 0)
+ GOERROR;
+ if (h5repack_verify(fname, FSPACE_OUT, &pack_options) <= 0)
+ GOERROR;
+ if (h5repack_end(&pack_options) < 0)
+ GOERROR;
+ PASSED();
- TESTING(" files with file space info setting-- options -S, -T, -G are set & -L");
- ++j; /* #7 */
- HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
- fname = H5REPACK_FSPACE_FNAMES[j];
- if (h5repack_init(&pack_options, 0, TRUE) < 0)
- GOERROR;
- pack_options.fs_strategy = H5F_FSPACE_STRATEGY_AGGR;
- pack_options.fs_threshold = 1;
- pack_options.fs_pagesize = 4096;
- if (h5repack(fname, FSPACE_OUT, &pack_options) < 0)
- GOERROR;
- if (h5diff(fname, FSPACE_OUT, NULL, NULL, &diff_options) > 0)
- GOERROR;
- if (h5repack_verify(fname, FSPACE_OUT, &pack_options) <= 0)
- GOERROR;
- if (h5repack_end(&pack_options) < 0)
- GOERROR;
- PASSED();
+ TESTING(" files with file space info setting-- options -S, -T, -G are set & -L");
+ ++j; /* #7 */
+ HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
+ fname = H5REPACK_FSPACE_FNAMES[j];
+ if (h5repack_init(&pack_options, 0, TRUE) < 0)
+ GOERROR;
+ pack_options.fs_strategy = H5F_FSPACE_STRATEGY_AGGR;
+ pack_options.fs_threshold = 1;
+ pack_options.fs_pagesize = 4096;
+ if (h5repack(fname, FSPACE_OUT, &pack_options) < 0)
+ GOERROR;
+ if (h5diff(fname, FSPACE_OUT, NULL, NULL, &diff_options) > 0)
+ GOERROR;
+ if (h5repack_verify(fname, FSPACE_OUT, &pack_options) <= 0)
+ GOERROR;
+ if (h5repack_end(&pack_options) < 0)
+ GOERROR;
+ PASSED();
+ }
/*-------------------------------------------------------------------------
* file with fill values
@@ -389,20 +391,22 @@ main(void)
* file with all kinds of dataset datatypes
*-------------------------------------------------------------------------
*/
- TESTING(" copy of datasets (all datatypes)");
- if (h5repack_init(&pack_options, 0, FALSE) < 0)
- GOERROR;
- if (h5repack(FNAME1, FNAME1OUT, &pack_options) < 0)
- GOERROR;
- if (h5diff(FNAME1, FNAME1OUT, NULL, NULL, &diff_options) > 0)
- GOERROR;
- if (h5repack_verify(FNAME1, FNAME1OUT, &pack_options) <= 0)
- GOERROR;
- if (h5repack_cmp_pl(FNAME1, pack_options.fin_fapl, FNAME1OUT, pack_options.fout_fapl) <= 0)
- GOERROR;
- if (h5repack_end(&pack_options) < 0)
- GOERROR;
- PASSED();
+ if (!h5_using_parallel_driver(NULL)) {
+ TESTING(" copy of datasets (all datatypes)");
+ if (h5repack_init(&pack_options, 0, FALSE) < 0)
+ GOERROR;
+ if (h5repack(FNAME1, FNAME1OUT, &pack_options) < 0)
+ GOERROR;
+ if (h5diff(FNAME1, FNAME1OUT, NULL, NULL, &diff_options) > 0)
+ GOERROR;
+ if (h5repack_verify(FNAME1, FNAME1OUT, &pack_options) <= 0)
+ GOERROR;
+ if (h5repack_cmp_pl(FNAME1, pack_options.fin_fapl, FNAME1OUT, pack_options.fout_fapl) <= 0)
+ GOERROR;
+ if (h5repack_end(&pack_options) < 0)
+ GOERROR;
+ PASSED();
+ }
/*-------------------------------------------------------------------------
* file with attributes
@@ -1487,49 +1491,53 @@ main(void)
GOERROR;
PASSED();
- /*-------------------------------------------------------------------------
- * test file with userblock
- *-------------------------------------------------------------------------
- */
- TESTING(" file with userblock");
- if (h5repack_init(&pack_options, 0, FALSE) < 0)
- GOERROR;
- if (h5repack(FNAME16, FNAME16OUT, &pack_options) < 0)
- GOERROR;
- if (h5diff(FNAME16, FNAME16OUT, NULL, NULL, &diff_options) > 0)
- GOERROR;
- if (h5repack_verify(FNAME16, FNAME16OUT, &pack_options) <= 0)
- GOERROR;
- if (verify_userblock(FNAME16OUT) < 0)
- GOERROR;
- if (h5repack_end(&pack_options) < 0)
- GOERROR;
- PASSED();
+ if (h5_using_default_driver(NULL)) {
+ /*-------------------------------------------------------------------------
+ * test file with userblock
+ *-------------------------------------------------------------------------
+ */
+ TESTING(" file with userblock");
+ if (h5repack_init(&pack_options, 0, FALSE) < 0)
+ GOERROR;
+ if (h5repack(FNAME16, FNAME16OUT, &pack_options) < 0)
+ GOERROR;
+ if (h5diff(FNAME16, FNAME16OUT, NULL, NULL, &diff_options) > 0)
+ GOERROR;
+ if (h5repack_verify(FNAME16, FNAME16OUT, &pack_options) <= 0)
+ GOERROR;
+ if (verify_userblock(FNAME16OUT) < 0)
+ GOERROR;
+ if (h5repack_end(&pack_options) < 0)
+ GOERROR;
+ PASSED();
+ }
/*-------------------------------------------------------------------------
* test --latest options
*-------------------------------------------------------------------------
*/
- TESTING(" latest file format options");
- if (h5repack_init(&pack_options, 0, FALSE) < 0)
- GOERROR;
- pack_options.latest = 1;
- pack_options.grp_compact = 10;
- pack_options.grp_indexed = 5;
- pack_options.msg_size[0] = 10;
- pack_options.msg_size[1] = 20;
- pack_options.msg_size[2] = 30;
- pack_options.msg_size[3] = 40;
- pack_options.msg_size[4] = 50;
- if (h5repack(FNAME1, FNAME1OUT, &pack_options) < 0)
- GOERROR;
- if (h5diff(FNAME1, FNAME1OUT, NULL, NULL, &diff_options) > 0)
- GOERROR;
- if (h5repack_verify(FNAME1, FNAME1OUT, &pack_options) <= 0)
- GOERROR;
- if (h5repack_end(&pack_options) < 0)
- GOERROR;
- PASSED();
+ if (!h5_using_parallel_driver(NULL)) {
+ TESTING(" latest file format options");
+ if (h5repack_init(&pack_options, 0, FALSE) < 0)
+ GOERROR;
+ pack_options.latest = 1;
+ pack_options.grp_compact = 10;
+ pack_options.grp_indexed = 5;
+ pack_options.msg_size[0] = 10;
+ pack_options.msg_size[1] = 20;
+ pack_options.msg_size[2] = 30;
+ pack_options.msg_size[3] = 40;
+ pack_options.msg_size[4] = 50;
+ if (h5repack(FNAME1, FNAME1OUT, &pack_options) < 0)
+ GOERROR;
+ if (h5diff(FNAME1, FNAME1OUT, NULL, NULL, &diff_options) > 0)
+ GOERROR;
+ if (h5repack_verify(FNAME1, FNAME1OUT, &pack_options) <= 0)
+ GOERROR;
+ if (h5repack_end(&pack_options) < 0)
+ GOERROR;
+ PASSED();
+ }
/*-------------------------------------------------------------------------
* test several global filters
@@ -1560,36 +1568,38 @@ main(void)
SKIPPED();
#endif
- /*-------------------------------------------------------------------------
- * test file with userblock
- *-------------------------------------------------------------------------
- */
- TESTING(" file with added userblock");
+ if (h5_using_default_driver(NULL)) {
+ /*-------------------------------------------------------------------------
+ * test file with userblock
+ *-------------------------------------------------------------------------
+ */
+ TESTING(" file with added userblock");
#ifdef H5_HAVE_FILTER_DEFLATE
- if (h5repack_init(&pack_options, 0, FALSE) < 0)
- GOERROR;
+ if (h5repack_init(&pack_options, 0, FALSE) < 0)
+ GOERROR;
- /* add the options for a user block size and user block filename */
- pack_options.ublock_size = USERBLOCK_SIZE;
- pack_options.ublock_filename = FNAME_UB;
+ /* add the options for a user block size and user block filename */
+ pack_options.ublock_size = USERBLOCK_SIZE;
+ pack_options.ublock_filename = FNAME_UB;
- if (h5repack(FNAME8, FNAME8OUT, &pack_options) < 0)
- GOERROR;
- if (h5diff(FNAME8, FNAME8OUT, NULL, NULL, &diff_options) > 0)
- GOERROR;
- if (h5repack_verify(FNAME8, FNAME8OUT, &pack_options) <= 0)
- GOERROR;
- if (verify_userblock(FNAME8OUT) < 0)
- GOERROR;
- if (h5repack_end(&pack_options) < 0)
- GOERROR;
+ if (h5repack(FNAME8, FNAME8OUT, &pack_options) < 0)
+ GOERROR;
+ if (h5diff(FNAME8, FNAME8OUT, NULL, NULL, &diff_options) > 0)
+ GOERROR;
+ if (h5repack_verify(FNAME8, FNAME8OUT, &pack_options) <= 0)
+ GOERROR;
+ if (verify_userblock(FNAME8OUT) < 0)
+ GOERROR;
+ if (h5repack_end(&pack_options) < 0)
+ GOERROR;
- PASSED();
+ PASSED();
#else
- SKIPPED();
+ SKIPPED();
#endif
+ }
/*-------------------------------------------------------------------------
* test file with aligment
@@ -1664,48 +1674,50 @@ main(void)
PASSED();
- /*-------------------------------------------------------------------------
- * test --metadata_block_size option
- * Also verify that output file using the metadata_block_size option is
- * larger than the output file one not using it.
- * FNAME4 is used because it is the same as the test file used for the
- * shell script version of this test (h5repack.sh).
- *-------------------------------------------------------------------------
- */
- TESTING(" metadata block size option");
- /* First run without metadata option. No need to verify the correctness */
- /* since this has been verified by earlier tests. Just record the file */
- /* size of the output file. */
- if (h5repack_init(&pack_options, 0, FALSE) < 0)
- GOERROR;
- if (h5repack(FNAME4, FNAME4OUT, &pack_options) < 0)
- GOERROR;
- if (HDstat(FNAME4OUT, &file_stat) < 0)
- GOERROR;
- fsize1 = file_stat.st_size;
- if (h5repack_end(&pack_options) < 0)
- GOERROR;
+ if (h5_using_default_driver(NULL)) {
+ /*-------------------------------------------------------------------------
+ * test --metadata_block_size option
+ * Also verify that output file using the metadata_block_size option is
+ * larger than the output file one not using it.
+ * FNAME4 is used because it is the same as the test file used for the
+ * shell script version of this test (h5repack.sh).
+ *-------------------------------------------------------------------------
+ */
+ TESTING(" metadata block size option");
+ /* First run without metadata option. No need to verify the correctness */
+ /* since this has been verified by earlier tests. Just record the file */
+ /* size of the output file. */
+ if (h5repack_init(&pack_options, 0, FALSE) < 0)
+ GOERROR;
+ if (h5repack(FNAME4, FNAME4OUT, &pack_options) < 0)
+ GOERROR;
+ if (HDstat(FNAME4OUT, &file_stat) < 0)
+ GOERROR;
+ fsize1 = file_stat.st_size;
+ if (h5repack_end(&pack_options) < 0)
+ GOERROR;
- /* run it again with metadata option */
- if (h5repack_init(&pack_options, 0, FALSE) < 0)
- GOERROR;
- pack_options.meta_block_size = 8192;
- if (h5repack(FNAME4, FNAME4OUT, &pack_options) < 0)
- GOERROR;
- if (h5diff(FNAME4, FNAME4OUT, NULL, NULL, &diff_options) > 0)
- GOERROR;
- if (h5repack_verify(FNAME4, FNAME4OUT, &pack_options) <= 0)
- GOERROR;
- /* record the file size of the output file */
- if (HDstat(FNAME4OUT, &file_stat) < 0)
- GOERROR;
- fsize2 = file_stat.st_size;
- /* verify second file size is larger than the first one */
- if (fsize2 <= fsize1)
- GOERROR;
- if (h5repack_end(&pack_options) < 0)
- GOERROR;
- PASSED();
+ /* run it again with metadata option */
+ if (h5repack_init(&pack_options, 0, FALSE) < 0)
+ GOERROR;
+ pack_options.meta_block_size = 8192;
+ if (h5repack(FNAME4, FNAME4OUT, &pack_options) < 0)
+ GOERROR;
+ if (h5diff(FNAME4, FNAME4OUT, NULL, NULL, &diff_options) > 0)
+ GOERROR;
+ if (h5repack_verify(FNAME4, FNAME4OUT, &pack_options) <= 0)
+ GOERROR;
+ /* record the file size of the output file */
+ if (HDstat(FNAME4OUT, &file_stat) < 0)
+ GOERROR;
+ fsize2 = file_stat.st_size;
+ /* verify second file size is larger than the first one */
+ if (fsize2 <= fsize1)
+ GOERROR;
+ if (h5repack_end(&pack_options) < 0)
+ GOERROR;
+ PASSED();
+ }
/*-------------------------------------------------------------------------
* clean temporary test files
@@ -1725,7 +1737,10 @@ main(void)
return 0;
error:
+ h5tools_close();
+
puts("***** H5REPACK TESTS FAILED *****");
+
return 1;
}
@@ -1760,12 +1775,14 @@ make_testfiles(void)
* create another file for general copy test (all datatypes)
*-------------------------------------------------------------------------
*/
- if ((fid = H5Fcreate(FNAME1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
- return -1;
- if (make_all_objects(fid) < 0)
- goto out;
- if (H5Fclose(fid) < 0)
- return -1;
+ if (!h5_using_parallel_driver(NULL)) {
+ if ((fid = H5Fcreate(FNAME1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ return -1;
+ if (make_all_objects(fid) < 0)
+ goto out;
+ if (H5Fclose(fid) < 0)
+ return -1;
+ }
/*-------------------------------------------------------------------------
* create a file for attributes copy test
@@ -1934,19 +1951,21 @@ make_testfiles(void)
if (H5Fclose(fid) < 0)
return -1;
- /*-------------------------------------------------------------------------
- * create a file with userblock
- *-------------------------------------------------------------------------
- */
- if (make_userblock() < 0)
- goto out;
+ if (h5_using_default_driver(NULL)) {
+ /*-------------------------------------------------------------------------
+ * create a file with userblock
+ *-------------------------------------------------------------------------
+ */
+ if (make_userblock() < 0)
+ goto out;
- /*-------------------------------------------------------------------------
- * create a userblock file
- *-------------------------------------------------------------------------
- */
- if (make_userblock_file() < 0)
- goto out;
+ /*-------------------------------------------------------------------------
+ * create a userblock file
+ *-------------------------------------------------------------------------
+ */
+ if (make_userblock_file() < 0)
+ goto out;
+ }
/*-------------------------------------------------------------------------
* create a file with named datatypes
@@ -1959,30 +1978,32 @@ make_testfiles(void)
if (H5Fclose(fid) < 0)
return -1;
- /*-------------------------------------------------------------------------
- * create obj and region reference type datasets (bug1814)
- * add attribute with int type (bug1726)
- * add attribute with obj and region reference type (bug1726)
- *-------------------------------------------------------------------------
- */
- if ((fid = H5Fcreate(FNAME_REF, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
- return -1;
- /* create reference type datasets */
- if (make_references(fid) < 0)
- goto out;
- if (H5Fclose(fid) < 0)
- return -1;
+ if (!h5_using_parallel_driver(NULL)) {
+ /*-------------------------------------------------------------------------
+ * create obj and region reference type datasets (bug1814)
+ * add attribute with int type (bug1726)
+ * add attribute with obj and region reference type (bug1726)
+ *-------------------------------------------------------------------------
+ */
+ if ((fid = H5Fcreate(FNAME_REF, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ return -1;
+ /* create reference type datasets */
+ if (make_references(fid) < 0)
+ goto out;
+ if (H5Fclose(fid) < 0)
+ return -1;
- /*-------------------------------------------------------------------------
- * create a file with obj and region references in attribute of compound and
- * vlen datatype
- *-------------------------------------------------------------------------*/
- if ((fid = H5Fcreate(FNAME_ATTR_REF, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
- return -1;
- if (make_complex_attr_references(fid) < 0)
- goto out;
- if (H5Fclose(fid) < 0)
- return -1;
+ /*-------------------------------------------------------------------------
+ * create a file with obj and region references in attribute of compound and
+ * vlen datatype
+ *-------------------------------------------------------------------------*/
+ if ((fid = H5Fcreate(FNAME_ATTR_REF, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ return -1;
+ if (make_complex_attr_references(fid) < 0)
+ goto out;
+ if (H5Fclose(fid) < 0)
+ return -1;
+ }
/*-------------------------------------------------------------------------
* create 8 files with combinations ???
@@ -2018,111 +2039,113 @@ make_testfiles(void)
if (H5Fclose(fid) < 0)
return -1;
- /*
- * #2 -- h5repack_page_persist.h5
- * Setting:
- * strategy=PAGE, persist=TRUE, threshold=1
- * inpage=512
- * latest format
- */
- /* Create file creation property list */
- if ((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
- return -1;
- if (H5Pset_file_space_page_size(fcpl, (hsize_t)512) < 0)
- return -1;
- if (H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, TRUE, (hsize_t)1) < 0)
- return -1;
- HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
- if ((fid = H5Fcreate(H5REPACK_FSPACE_FNAMES[++j], H5F_ACC_TRUNC, fcpl, fapl)) < 0)
- return -1;
- if (H5Fclose(fid) < 0)
- return -1;
- if (H5Pclose(fcpl) < 0)
- return -1;
-
- /*
- * #3 -- h5repack_fsm_aggr_persist.h5
- * Setting:
- * strategy=FSM_AGGR, persist=TRUE, threshold=1
- * default: inpage=4096
- */
- /* Create file creation property list */
- if ((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
- return -1;
- if (H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_FSM_AGGR, TRUE, (hsize_t)1) < 0)
- return -1;
- HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
- if ((fid = H5Fcreate(H5REPACK_FSPACE_FNAMES[++j], H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0)
- return -1;
- if (H5Fclose(fid) < 0)
- return -1;
- if (H5Pclose(fcpl) < 0)
- return -1;
-
- /*
- * #4 -- h5repack_page_threshold.h5
- * Setting:
- * strategy=PAGE, persist=FALSE, threshold=3
- * inpage=8192
- * latest format
- */
-
- /* Create file creation property list */
- if ((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
- return -1;
- if (H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, FALSE, (hsize_t)3) < 0)
- return -1;
- if (H5Pset_file_space_page_size(fcpl, (hsize_t)8192) < 0)
- return -1;
- HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
- if ((fid = H5Fcreate(H5REPACK_FSPACE_FNAMES[++j], H5F_ACC_TRUNC, fcpl, fapl)) < 0)
- return -1;
- if (H5Fclose(fid) < 0)
- return -1;
- if (H5Pclose(fcpl) < 0)
- return -1;
-
- /*
- * #5 -- h5repack_fsm_aggr_threshold.h5
- * Setting:
- * strategy=FSM_AGGR, persist=FALSE, threshold=3
- * inpage=4096
- */
+ if (h5_using_default_driver(NULL)) {
+ /*
+ * #2 -- h5repack_page_persist.h5
+ * Setting:
+ * strategy=PAGE, persist=TRUE, threshold=1
+ * inpage=512
+ * latest format
+ */
+ /* Create file creation property list */
+ if ((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+ return -1;
+ if (H5Pset_file_space_page_size(fcpl, (hsize_t)512) < 0)
+ return -1;
+ if (H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, TRUE, (hsize_t)1) < 0)
+ return -1;
+ HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
+ if ((fid = H5Fcreate(H5REPACK_FSPACE_FNAMES[++j], H5F_ACC_TRUNC, fcpl, fapl)) < 0)
+ return -1;
+ if (H5Fclose(fid) < 0)
+ return -1;
+ if (H5Pclose(fcpl) < 0)
+ return -1;
+
+ /*
+ * #3 -- h5repack_fsm_aggr_persist.h5
+ * Setting:
+ * strategy=FSM_AGGR, persist=TRUE, threshold=1
+ * default: inpage=4096
+ */
+ /* Create file creation property list */
+ if ((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+ return -1;
+ if (H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_FSM_AGGR, TRUE, (hsize_t)1) < 0)
+ return -1;
+ HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
+ if ((fid = H5Fcreate(H5REPACK_FSPACE_FNAMES[++j], H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0)
+ return -1;
+ if (H5Fclose(fid) < 0)
+ return -1;
+ if (H5Pclose(fcpl) < 0)
+ return -1;
+
+ /*
+ * #4 -- h5repack_page_threshold.h5
+ * Setting:
+ * strategy=PAGE, persist=FALSE, threshold=3
+ * inpage=8192
+ * latest format
+ */
- /* Create file creation property list */
- if ((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
- return -1;
- if (H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_FSM_AGGR, FALSE, (hsize_t)3) < 0)
- return -1;
- if (H5Pset_file_space_page_size(fcpl, (hsize_t)FS_PAGESIZE_DEF) < 0)
- return -1;
- HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
- if ((fid = H5Fcreate(H5REPACK_FSPACE_FNAMES[++j], H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0)
- return -1;
- if (H5Fclose(fid) < 0)
- return -1;
- if (H5Pclose(fcpl) < 0)
- return -1;
+ /* Create file creation property list */
+ if ((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+ return -1;
+ if (H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, FALSE, (hsize_t)3) < 0)
+ return -1;
+ if (H5Pset_file_space_page_size(fcpl, (hsize_t)8192) < 0)
+ return -1;
+ HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
+ if ((fid = H5Fcreate(H5REPACK_FSPACE_FNAMES[++j], H5F_ACC_TRUNC, fcpl, fapl)) < 0)
+ return -1;
+ if (H5Fclose(fid) < 0)
+ return -1;
+ if (H5Pclose(fcpl) < 0)
+ return -1;
+
+ /*
+ * #5 -- h5repack_fsm_aggr_threshold.h5
+ * Setting:
+ * strategy=FSM_AGGR, persist=FALSE, threshold=3
+ * inpage=4096
+ */
- /*
- * #6 -- h5repack_aggr.h5
- * Setting:
- * strategy=AGGR, persist=FALSE, threshold=1
- * latest format
- */
+ /* Create file creation property list */
+ if ((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+ return -1;
+ if (H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_FSM_AGGR, FALSE, (hsize_t)3) < 0)
+ return -1;
+ if (H5Pset_file_space_page_size(fcpl, (hsize_t)FS_PAGESIZE_DEF) < 0)
+ return -1;
+ HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
+ if ((fid = H5Fcreate(H5REPACK_FSPACE_FNAMES[++j], H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0)
+ return -1;
+ if (H5Fclose(fid) < 0)
+ return -1;
+ if (H5Pclose(fcpl) < 0)
+ return -1;
+
+ /*
+ * #6 -- h5repack_aggr.h5
+ * Setting:
+ * strategy=AGGR, persist=FALSE, threshold=1
+ * latest format
+ */
- /* Create file creation property list */
- if ((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
- return -1;
- if (H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_AGGR, FALSE, (hsize_t)1) < 0)
- return -1;
- HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
- if ((fid = H5Fcreate(H5REPACK_FSPACE_FNAMES[++j], H5F_ACC_TRUNC, fcpl, fapl)) < 0)
- return -1;
- if (H5Fclose(fid) < 0)
- return -1;
- if (H5Pclose(fcpl) < 0)
- return -1;
+ /* Create file creation property list */
+ if ((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+ return -1;
+ if (H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_AGGR, FALSE, (hsize_t)1) < 0)
+ return -1;
+ HDassert(j < NELMTS(H5REPACK_FSPACE_FNAMES));
+ if ((fid = H5Fcreate(H5REPACK_FSPACE_FNAMES[++j], H5F_ACC_TRUNC, fcpl, fapl)) < 0)
+ return -1;
+ if (H5Fclose(fid) < 0)
+ return -1;
+ if (H5Pclose(fcpl) < 0)
+ return -1;
+ }
/*
* #7 -- h5repack_none.h5
@@ -2726,6 +2749,7 @@ make_nbit(hid_t loc_id)
hid_t sid = H5I_INVALID_HID; /* dataspace ID */
hid_t dtid = H5I_INVALID_HID;
hid_t dsid = H5I_INVALID_HID;
+ hid_t dxpl = H5P_DEFAULT;
hsize_t dims[RANK] = {DIM1, DIM2};
hsize_t chunk_dims[RANK] = {CDIM1, CDIM2};
int ** buf = NULL;
@@ -2746,6 +2770,16 @@ make_nbit(hid_t loc_id)
if (H5Pset_chunk(dcpl, RANK, chunk_dims) < 0)
goto error;
+#ifdef H5_HAVE_PARALLEL
+ /* Set up collective writes for parallel driver */
+ if (h5_using_parallel_driver(NULL)) {
+ if ((dxpl = H5Pcreate(H5P_DATASET_XFER)) < 0)
+ goto error;
+ if (H5Pset_dxpl_mpio(dxpl, H5FD_MPIO_COLLECTIVE) < 0)
+ goto error;
+ }
+#endif
+
dtid = H5Tcopy(H5T_NATIVE_INT);
if (H5Tset_precision(dtid, (H5Tget_precision(dtid) - 1)) < 0)
goto error;
@@ -2757,7 +2791,7 @@ make_nbit(hid_t loc_id)
goto error;
if ((dsid = H5Dcreate2(loc_id, "dset_nbit", dtid, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
goto error;
- if (H5Dwrite(dsid, dtid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+ if (H5Dwrite(dsid, dtid, H5S_ALL, H5S_ALL, dxpl, buf[0]) < 0)
goto error;
H5Dclose(dsid);
@@ -2765,7 +2799,7 @@ make_nbit(hid_t loc_id)
goto error;
if ((dsid = H5Dcreate2(loc_id, "dset_int31", dtid, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
goto error;
- if (H5Dwrite(dsid, dtid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+ if (H5Dwrite(dsid, dtid, H5S_ALL, H5S_ALL, dxpl, buf[0]) < 0)
goto error;
H5Dclose(dsid);
@@ -2773,6 +2807,8 @@ make_nbit(hid_t loc_id)
* close
*-------------------------------------------------------------------------
*/
+ if (dxpl != H5P_DEFAULT && H5Pclose(dxpl) < 0)
+ goto error;
if (H5Sclose(sid) < 0)
goto error;
if (H5Pclose(dcpl) < 0)
@@ -2788,6 +2824,7 @@ error:
H5E_BEGIN_TRY
{
H5Tclose(dtid);
+ H5Pclose(dxpl);
H5Pclose(dcpl);
H5Sclose(sid);
H5Dclose(dsid);
@@ -2813,6 +2850,7 @@ make_scaleoffset(hid_t loc_id)
hid_t sid = H5I_INVALID_HID; /* dataspace ID */
hid_t dtid = H5I_INVALID_HID;
hid_t dsid = H5I_INVALID_HID;
+ hid_t dxpl = H5P_DEFAULT;
hsize_t dims[RANK] = {DIM1, DIM2};
hsize_t chunk_dims[RANK] = {CDIM1, CDIM2};
int ** buf = NULL;
@@ -2833,6 +2871,16 @@ make_scaleoffset(hid_t loc_id)
if (H5Pset_chunk(dcpl, RANK, chunk_dims) < 0)
goto error;
+#ifdef H5_HAVE_PARALLEL
+ /* Set up collective writes for parallel driver */
+ if (h5_using_parallel_driver(NULL)) {
+ if ((dxpl = H5Pcreate(H5P_DATASET_XFER)) < 0)
+ goto error;
+ if (H5Pset_dxpl_mpio(dxpl, H5FD_MPIO_COLLECTIVE) < 0)
+ goto error;
+ }
+#endif
+
dtid = H5Tcopy(H5T_NATIVE_INT);
/* remove the filters from the dcpl */
@@ -2842,20 +2890,22 @@ make_scaleoffset(hid_t loc_id)
goto error;
if ((dsid = H5Dcreate2(loc_id, "dset_scaleoffset", dtid, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
goto error;
- if (H5Dwrite(dsid, dtid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+ if (H5Dwrite(dsid, dtid, H5S_ALL, H5S_ALL, dxpl, buf[0]) < 0)
goto error;
H5Dclose(dsid);
if ((dsid = H5Dcreate2(loc_id, "dset_none", dtid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
goto error;
- if (H5Dwrite(dsid, dtid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+ if (H5Dwrite(dsid, dtid, H5S_ALL, H5S_ALL, dxpl, buf[0]) < 0)
goto error;
H5Tclose(dtid);
H5Dclose(dsid);
/*-------------------------------------------------------------------------
- * close space and dcpl
+ * close space, dxpl and dcpl
*-------------------------------------------------------------------------
*/
+ if (dxpl != H5P_DEFAULT && H5Pclose(dxpl) < 0)
+ goto error;
if (H5Sclose(sid) < 0)
goto error;
if (H5Pclose(dcpl) < 0)
@@ -2868,6 +2918,7 @@ make_scaleoffset(hid_t loc_id)
error:
H5E_BEGIN_TRY
{
+ H5Pclose(dxpl);
H5Dclose(dsid);
H5Tclose(dtid);
H5Pclose(dcpl);
@@ -2894,6 +2945,7 @@ make_all_filters(hid_t loc_id)
hid_t sid = H5I_INVALID_HID; /* dataspace ID */
hid_t dtid = H5I_INVALID_HID;
hid_t dsid = H5I_INVALID_HID;
+ hid_t dxpl = H5P_DEFAULT;
#if defined(H5_HAVE_FILTER_SZIP)
unsigned szip_options_mask = H5_SZIP_ALLOW_K13_OPTION_MASK | H5_SZIP_NN_OPTION_MASK;
unsigned szip_pixels_per_block = 8;
@@ -2921,6 +2973,16 @@ make_all_filters(hid_t loc_id)
if (H5Pset_chunk(dcpl, RANK, chunk_dims) < 0)
goto error;
+#ifdef H5_HAVE_PARALLEL
+ /* Set up collective writes for parallel driver */
+ if (h5_using_parallel_driver(NULL)) {
+ if ((dxpl = H5Pcreate(H5P_DATASET_XFER)) < 0)
+ goto error;
+ if (H5Pset_dxpl_mpio(dxpl, H5FD_MPIO_COLLECTIVE) < 0)
+ goto error;
+ }
+#endif
+
/* set the shuffle filter */
if (H5Pset_shuffle(dcpl) < 0)
goto error;
@@ -3010,7 +3072,7 @@ make_all_filters(hid_t loc_id)
goto error;
if ((dsid = H5Dcreate2(loc_id, "dset_nbit", dtid, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
goto error;
- if (H5Dwrite(dsid, dtid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+ if (H5Dwrite(dsid, dtid, H5S_ALL, H5S_ALL, dxpl, buf[0]) < 0)
goto error;
/* close */
@@ -3021,6 +3083,8 @@ make_all_filters(hid_t loc_id)
if (H5Sclose(sid) < 0)
goto error;
+ if (dxpl != H5P_DEFAULT && H5Pclose(dxpl) < 0)
+ goto error;
if (H5Pclose(dcpl) < 0)
goto error;
@@ -3033,6 +3097,7 @@ error:
{
H5Tclose(dtid);
H5Dclose(dsid);
+ H5Pclose(dxpl);
H5Pclose(dcpl);
H5Sclose(sid);
}
@@ -5802,18 +5867,35 @@ out:
static int
make_dset(hid_t loc_id, const char *name, hid_t sid, hid_t dcpl, void *buf)
{
- hid_t did = H5I_INVALID_HID;
+ hid_t did = H5I_INVALID_HID;
+ hid_t dxpl_id = H5P_DEFAULT;
if ((did = H5Dcreate2(loc_id, name, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
return -1;
- if (H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+
+#ifdef H5_HAVE_PARALLEL
+ /* Set up collective writes for parallel driver */
+ if (h5_using_parallel_driver(NULL)) {
+ if ((dxpl_id = H5Pcreate(H5P_DATASET_XFER)) < 0)
+ goto out;
+ if (H5Pset_dxpl_mpio(dxpl_id, H5FD_MPIO_COLLECTIVE) < 0)
+ goto out;
+ }
+#endif
+
+ if (H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, dxpl_id, buf) < 0)
+ goto out;
+ if (dxpl_id != H5P_DEFAULT && H5Pclose(dxpl_id) < 0)
goto out;
if (H5Dclose(did) < 0)
return -1;
return 0;
out:
- H5E_BEGIN_TRY { H5Dclose(did); }
+ H5E_BEGIN_TRY
+ {
+ H5Dclose(did);
+ }
H5E_END_TRY;
return -1;
}
@@ -5832,17 +5914,30 @@ out:
static int
write_dset(hid_t loc_id, int rank, hsize_t *dims, const char *dset_name, hid_t tid, void *buf)
{
- hid_t did = H5I_INVALID_HID;
- hid_t sid = H5I_INVALID_HID;
+ hid_t did = H5I_INVALID_HID;
+ hid_t sid = H5I_INVALID_HID;
+ hid_t dxpl_id = H5P_DEFAULT;
if ((sid = H5Screate_simple(rank, dims, NULL)) < 0)
return -1;
if ((did = H5Dcreate2(loc_id, dset_name, tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
goto out;
if (buf) {
- if (H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+#ifdef H5_HAVE_PARALLEL
+ /* Set up collective writes for parallel driver */
+ if (h5_using_parallel_driver(NULL)) {
+ if ((dxpl_id = H5Pcreate(H5P_DATASET_XFER)) < 0)
+ goto out;
+ if (H5Pset_dxpl_mpio(dxpl_id, H5FD_MPIO_COLLECTIVE) < 0)
+ goto out;
+ }
+#endif
+
+ if (H5Dwrite(did, tid, H5S_ALL, H5S_ALL, dxpl_id, buf) < 0)
goto out;
}
+ if (dxpl_id != H5P_DEFAULT && H5Pclose(dxpl_id) < 0)
+ goto out;
if (H5Dclose(did) < 0)
goto out;
if (H5Sclose(sid) < 0)
@@ -5853,6 +5948,7 @@ write_dset(hid_t loc_id, int rank, hsize_t *dims, const char *dset_name, hid_t t
out:
H5E_BEGIN_TRY
{
+ H5Pclose(dxpl_id);
H5Dclose(did);
H5Sclose(sid);
}
@@ -6055,7 +6151,7 @@ add_attr_with_objref(hid_t file_id, hid_t obj_id)
/* ref to dset */
status = H5Rcreate(&data_attr_objref[0], file_id, NAME_OBJ_DS1, H5R_OBJECT, (hid_t)-1);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6063,7 +6159,7 @@ add_attr_with_objref(hid_t file_id, hid_t obj_id)
/* ref to group */
status = H5Rcreate(&data_attr_objref[1], file_id, NAME_OBJ_GRP, H5R_OBJECT, (hid_t)-1);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6071,7 +6167,7 @@ add_attr_with_objref(hid_t file_id, hid_t obj_id)
/* ref to datatype */
status = H5Rcreate(&data_attr_objref[2], file_id, NAME_OBJ_NDTYPE, H5R_OBJECT, (hid_t)-1);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6079,7 +6175,7 @@ add_attr_with_objref(hid_t file_id, hid_t obj_id)
/* create attr with obj ref type */
status = make_attr(obj_id, 1, dim_attr_objref, "Attr_OBJREF", H5T_STD_REF_OBJ, data_attr_objref);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> make_attr failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> make_attr failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6119,7 +6215,7 @@ add_attr_with_regref(hid_t file_id, hid_t obj_id)
*/
sid_regrefed_dset = H5Screate_simple(2, dim_regrefed_dset, NULL);
if (sid_regrefed_dset < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6127,7 +6223,7 @@ add_attr_with_regref(hid_t file_id, hid_t obj_id)
/* select elements space for reference */
status = H5Sselect_elements(sid_regrefed_dset, H5S_SELECT_SET, (size_t)3, coords_regrefed_dset[0]);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Sselect_elements failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Sselect_elements failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6135,7 +6231,7 @@ add_attr_with_regref(hid_t file_id, hid_t obj_id)
/* create region reference from elements space */
status = H5Rcreate(&data_attr_regref[0], file_id, NAME_OBJ_DS2, H5R_DATASET_REGION, sid_regrefed_dset);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6143,7 +6239,7 @@ add_attr_with_regref(hid_t file_id, hid_t obj_id)
/* create attr with region ref type */
status = make_attr(obj_id, 1, dim_attr_regref, "Attr_REGREF", H5T_STD_REF_DSETREG, data_attr_regref);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> make_attr failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> make_attr failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6188,21 +6284,21 @@ gen_refered_objs(hid_t loc_id)
*/
sid = H5Screate_simple(1, dims1, NULL);
if (sid < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
did1 = H5Dcreate2(loc_id, NAME_OBJ_DS1, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
if (did1 < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
status = H5Dwrite(did1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6213,7 +6309,7 @@ gen_refered_objs(hid_t loc_id)
*/
gid = H5Gcreate2(loc_id, NAME_OBJ_GRP, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
if (gid < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Gcreate2 failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Gcreate2 failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6225,7 +6321,7 @@ gen_refered_objs(hid_t loc_id)
tid = H5Tcopy(H5T_NATIVE_INT);
status = H5Tcommit2(loc_id, NAME_OBJ_NDTYPE, tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Tcommit2 failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Tcommit2 failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6236,7 +6332,7 @@ gen_refered_objs(hid_t loc_id)
*/
sid2 = H5Screate_simple(2, dims2, NULL);
if (sid2 < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6244,7 +6340,7 @@ gen_refered_objs(hid_t loc_id)
/* create normal dataset which is refered */
did2 = H5Dcreate2(loc_id, NAME_OBJ_DS2, H5T_STD_I8LE, sid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
if (did2 < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6252,7 +6348,7 @@ gen_refered_objs(hid_t loc_id)
/* write values to dataset */
status = H5Dwrite(did2, H5T_NATIVE_CHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, data2);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6308,7 +6404,7 @@ gen_obj_ref(hid_t loc_id)
/* obj ref to dataset */
status = H5Rcreate(&objref_buf[0], loc_id, NAME_OBJ_DS1, H5R_OBJECT, (hid_t)-1);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6316,7 +6412,7 @@ gen_obj_ref(hid_t loc_id)
/* obj ref to group */
status = H5Rcreate(&objref_buf[1], loc_id, NAME_OBJ_GRP, H5R_OBJECT, (hid_t)-1);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6324,7 +6420,7 @@ gen_obj_ref(hid_t loc_id)
/* obj ref to named-datatype */
status = H5Rcreate(&objref_buf[2], loc_id, NAME_OBJ_NDTYPE, H5R_OBJECT, (hid_t)-1);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6334,21 +6430,21 @@ gen_obj_ref(hid_t loc_id)
*/
sid = H5Screate_simple(1, dims_dset_objref, NULL);
if (sid < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
oid = H5Dcreate2(loc_id, "Dset_OBJREF", H5T_STD_REF_OBJ, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
if (oid < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
status = H5Dwrite(oid, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, objref_buf);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6360,7 +6456,7 @@ gen_obj_ref(hid_t loc_id)
/* add attribute with obj ref */
status = add_attr_with_objref(loc_id, oid);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> add_attr_with_objref failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> add_attr_with_objref failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6368,7 +6464,7 @@ gen_obj_ref(hid_t loc_id)
/* add attribute with region ref */
status = add_attr_with_regref(loc_id, oid);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> add_attr_with_regref failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> add_attr_with_regref failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6420,7 +6516,7 @@ gen_region_ref(hid_t loc_id)
sid_trg = H5Screate_simple(2, dims_trg, NULL);
if (sid_trg < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6428,7 +6524,7 @@ gen_region_ref(hid_t loc_id)
/* select elements space for reference */
status = H5Sselect_elements(sid_trg, H5S_SELECT_SET, (size_t)4, coords[0]);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Sselect_elements failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Sselect_elements failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6436,7 +6532,7 @@ gen_region_ref(hid_t loc_id)
/* create region reference from elements space */
status = H5Rcreate(&rr_data[0], loc_id, NAME_OBJ_DS2, H5R_DATASET_REGION, sid_trg);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6444,7 +6540,7 @@ gen_region_ref(hid_t loc_id)
/* select hyperslab space for reference */
status = H5Sselect_hyperslab(sid_trg, H5S_SELECT_SET, start, stride, count, block);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Sselect_hyperslab failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Sselect_hyperslab failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6452,7 +6548,7 @@ gen_region_ref(hid_t loc_id)
/* create region reference from hyperslab space */
status = H5Rcreate(&rr_data[1], loc_id, NAME_OBJ_DS2, H5R_DATASET_REGION, sid_trg);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6460,7 +6556,7 @@ gen_region_ref(hid_t loc_id)
/* Create dataspace. */
sid_ref = H5Screate_simple(1, dims1, NULL);
if (sid_ref < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Screate_simple failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6469,7 +6565,7 @@ gen_region_ref(hid_t loc_id)
oid_ref =
H5Dcreate2(loc_id, REG_REF_DS1, H5T_STD_REF_DSETREG, sid_ref, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
if (oid_ref < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Dcreate2 failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6477,7 +6573,7 @@ gen_region_ref(hid_t loc_id)
/* write data as region references */
status = H5Dwrite(oid_ref, H5T_STD_REF_DSETREG, H5S_ALL, H5S_ALL, H5P_DEFAULT, rr_data);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6489,7 +6585,7 @@ gen_region_ref(hid_t loc_id)
/* add attribute with obj ref */
status = add_attr_with_objref(loc_id, oid_ref);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> add_attr_with_objref failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> add_attr_with_objref failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6497,7 +6593,7 @@ gen_region_ref(hid_t loc_id)
/* add attribute with region ref */
status = add_attr_with_regref(loc_id, oid_ref);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> add_attr_with_regref failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> add_attr_with_regref failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6664,7 +6760,7 @@ make_complex_attr_references(hid_t loc_id)
objdid = H5Dcreate2(loc_id, NAME_OBJ_DS1, H5T_NATIVE_INT, objsid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
status = H5Dwrite(objdid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, obj_data[0]);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6673,7 +6769,7 @@ make_complex_attr_references(hid_t loc_id)
objtid = H5Tcopy(H5T_NATIVE_INT);
status = H5Tcommit2(loc_id, NAME_OBJ_NDTYPE, objtid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Tcommit2 failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Tcommit2 failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6684,7 +6780,7 @@ make_complex_attr_references(hid_t loc_id)
* compound type which contain obj and region reference */
main_gid = H5Gcreate2(loc_id, "group_main", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
if (main_gid < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Gcreate2 failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Gcreate2 failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6699,7 +6795,7 @@ make_complex_attr_references(hid_t loc_id)
status = H5Dwrite(main_did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, obj_data[0]);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Dwrite failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6722,7 +6818,7 @@ make_complex_attr_references(hid_t loc_id)
/* references to dataset */
status = H5Rcreate(&(comp_objref_data[0].val_objref), loc_id, NAME_OBJ_DS1, H5R_OBJECT, (hid_t)-1);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6731,7 +6827,7 @@ make_complex_attr_references(hid_t loc_id)
/* references to group */
status = H5Rcreate(&(comp_objref_data[1].val_objref), loc_id, NAME_OBJ_GRP, H5R_OBJECT, (hid_t)-1);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6740,7 +6836,7 @@ make_complex_attr_references(hid_t loc_id)
/* references to datatype */
status = H5Rcreate(&(comp_objref_data[2].val_objref), loc_id, NAME_OBJ_NDTYPE, H5R_OBJECT, (hid_t)-1);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6754,7 +6850,7 @@ make_complex_attr_references(hid_t loc_id)
H5Acreate2(main_did, "Comp_OBJREF", comp_objref_tid, comp_objref_attr_sid, H5P_DEFAULT, H5P_DEFAULT);
status = H5Awrite(comp_objref_aid, comp_objref_tid, comp_objref_data);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Awrite failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Awrite failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6775,13 +6871,13 @@ make_complex_attr_references(hid_t loc_id)
*/
status = H5Sselect_elements(objsid, H5S_SELECT_SET, (size_t)4, coords[0]);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Sselect_elements failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Sselect_elements failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
status = H5Rcreate(&(comp_regref_data[0].val_regref), loc_id, NAME_OBJ_DS1, H5R_DATASET_REGION, objsid);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6795,7 +6891,7 @@ make_complex_attr_references(hid_t loc_id)
H5Acreate2(main_did, "Comp_REGREF", comp_regref_tid, comp_regref_attr_sid, H5P_DEFAULT, H5P_DEFAULT);
status = H5Awrite(comp_regref_aid, comp_regref_tid, comp_regref_data);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Awrite failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Awrite failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6820,7 +6916,7 @@ make_complex_attr_references(hid_t loc_id)
status =
H5Rcreate(&((hobj_ref_t *)vlen_objref_data[0].p)[0], loc_id, NAME_OBJ_DS1, H5R_OBJECT, (hid_t)-1);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6828,7 +6924,7 @@ make_complex_attr_references(hid_t loc_id)
status =
H5Rcreate(&((hobj_ref_t *)vlen_objref_data[1].p)[0], loc_id, NAME_OBJ_GRP, H5R_OBJECT, (hid_t)-1);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6836,7 +6932,7 @@ make_complex_attr_references(hid_t loc_id)
status =
H5Rcreate(&((hobj_ref_t *)vlen_objref_data[2].p)[0], loc_id, NAME_OBJ_NDTYPE, H5R_OBJECT, (hid_t)-1);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6854,7 +6950,7 @@ make_complex_attr_references(hid_t loc_id)
H5P_DEFAULT, H5P_DEFAULT);
status = H5Awrite(vlen_objref_attr_id, vlen_objref_attr_tid, vlen_objref_data);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Awrite failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Awrite failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6862,7 +6958,7 @@ make_complex_attr_references(hid_t loc_id)
/* close resource for vlen data */
status = H5Treclaim(vlen_objref_attr_tid, vlen_objref_attr_sid, H5P_DEFAULT, vlen_objref_data);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Treclaim failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Treclaim failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6882,14 +6978,14 @@ make_complex_attr_references(hid_t loc_id)
*/
status = H5Sselect_elements(objsid, H5S_SELECT_SET, (size_t)4, coords[0]);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Sselect_elements failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Sselect_elements failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
status = H5Rcreate(&((hdset_reg_ref_t *)vlen_regref_data[0].p)[0], loc_id, NAME_OBJ_DS1,
H5R_DATASET_REGION, objsid);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Rcreate failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6907,7 +7003,7 @@ make_complex_attr_references(hid_t loc_id)
H5P_DEFAULT, H5P_DEFAULT);
status = H5Awrite(vlen_regref_attr_id, vlen_regref_attr_tid, vlen_regref_data);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Awrite failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Awrite failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
@@ -6915,7 +7011,7 @@ make_complex_attr_references(hid_t loc_id)
/* close resource for vlen data */
status = H5Treclaim(vlen_regref_attr_tid, vlen_regref_attr_sid, H5P_DEFAULT, vlen_regref_data);
if (status < 0) {
- HDfprintf(stderr, "Error: %s %d> H5Treclaim failed.\n", FUNC, __LINE__);
+ HDfprintf(stderr, "Error: %s %d> H5Treclaim failed.\n", __func__, __LINE__);
ret = FAIL;
goto out;
}
diff --git a/tools/test/h5repack/testfiles/h5repack-help.txt b/tools/test/h5repack/testfiles/h5repack-help.txt
index cb10d22..894f88c 100644
--- a/tools/test/h5repack/testfiles/h5repack-help.txt
+++ b/tools/test/h5repack/testfiles/h5repack-help.txt
@@ -20,6 +20,18 @@ usage: h5repack [OPTIONS] file1 file2
HDF5 file specified
--dst-vol-info VOL-specific info to pass to the VOL connector used for
opening the output HDF5 file specified
+ --src-vfd-value Value (ID) of the VFL driver to use for opening the
+ input HDF5 file specified
+ --src-vfd-name Name of the VFL driver to use for opening the input
+ HDF5 file specified
+ --src-vfd-info VFD-specific info to pass to the VFL driver used for
+ opening the input HDF5 file specified
+ --dst-vfd-value Value (ID) of the VFL driver to use for opening the
+ output HDF5 file specified
+ --dst-vfd-name Name of the VFL driver to use for opening the output
+ HDF5 file specified
+ --dst-vfd-info VFD-specific info to pass to the VFL driver used for
+ opening the output HDF5 file specified
-L, --latest Use latest version of file format
This option will take precedence over the options
--low and --high
diff --git a/tools/test/h5repack/testfiles/h5repack_CVE-2018-14460.h5 b/tools/test/h5repack/testfiles/h5repack_CVE-2018-14460.h5
new file mode 100644
index 0000000..f4093b5
--- /dev/null
+++ b/tools/test/h5repack/testfiles/h5repack_CVE-2018-14460.h5
Binary files differ
diff --git a/tools/test/h5repack/testfiles/h5repack_HDFFV-10590_CVE-2018-17432.h5 b/tools/test/h5repack/testfiles/h5repack_CVE-2018-17432.h5
index 7a815ba..7a815ba 100644
--- a/tools/test/h5repack/testfiles/h5repack_HDFFV-10590_CVE-2018-17432.h5
+++ b/tools/test/h5repack/testfiles/h5repack_CVE-2018-17432.h5
Binary files differ
diff --git a/tools/test/h5stat/CMakeTests.cmake b/tools/test/h5stat/CMakeTests.cmake
index 79de6b9..d4238b5 100644
--- a/tools/test/h5stat/CMakeTests.cmake
+++ b/tools/test/h5stat/CMakeTests.cmake
@@ -207,7 +207,7 @@
# -d --di=15
ADD_H5_ERR_TEST (h5stat_err1_dims 1 -d --dims=-1 h5stat_threshold.h5)
ADD_H5_TEST (h5stat_dims1 0 -gd -m 5 h5stat_threshold.h5)
- ADD_H5_TEST (h5stat_dims2 0 -d --di=15 h5stat_threshold.h5)
+ ADD_H5_TEST (h5stat_dims2 0 -d --dims=15 h5stat_threshold.h5)
#
# Tests for -a option on h5stat_threshold.h5
# -a -2 (incorrect threshold value)
diff --git a/tools/test/h5stat/h5stat_gentest.c b/tools/test/h5stat/h5stat_gentest.c
index b55cd06..c775d6a 100644
--- a/tools/test/h5stat/h5stat_gentest.c
+++ b/tools/test/h5stat/h5stat_gentest.c
@@ -51,7 +51,7 @@
* Generate HDF5 file with latest format with
* NUM_GRPS groups and NUM_ATTRS attributes for the dataset
*/
-static void
+static herr_t
gen_newgrat_file(const char *fname)
{
hid_t fcpl = H5I_INVALID_HID; /* File creation property */
@@ -117,6 +117,21 @@ gen_newgrat_file(const char *fname)
} /* end for */
/* Close dataset, dataspace, datatype, file */
+ if (H5Pclose(fapl) < 0)
+ goto error;
+ if (H5Pclose(fcpl) < 0)
+ goto error;
+ if (H5Dclose(did) < 0)
+ goto error;
+ if (H5Tclose(tid) < 0)
+ goto error;
+ if (H5Sclose(sid) < 0)
+ goto error;
+ if (H5Fclose(fid) < 0)
+ goto error;
+
+ return SUCCEED;
+
error:
H5E_BEGIN_TRY
{
@@ -130,6 +145,8 @@ error:
H5Fclose(fid);
}
H5E_END_TRY;
+
+ return FAIL;
} /* gen_newgrat_file() */
/*
@@ -139,7 +156,7 @@ error:
* datasets. -a N (--numattrs=N): Set the threshold for the # of attributes when printing information for
* small # of attributes.
*/
-static void
+static herr_t
gen_threshold_file(const char *fname)
{
hid_t fid = H5I_INVALID_HID; /* File ID */
@@ -302,6 +319,23 @@ gen_threshold_file(const char *fname)
goto error;
}
+ if (H5Gclose(gid) < 0)
+ goto error;
+ if (H5Sclose(sid0) < 0)
+ goto error;
+ if (H5Sclose(sid1) < 0)
+ goto error;
+ if (H5Sclose(sid2) < 0)
+ goto error;
+ if (H5Sclose(sid3) < 0)
+ goto error;
+ if (H5Sclose(sid4) < 0)
+ goto error;
+ if (H5Fclose(fid) < 0)
+ goto error;
+
+ return SUCCEED;
+
error:
H5E_BEGIN_TRY
{
@@ -317,6 +351,8 @@ error:
}
H5E_END_TRY;
+ return FAIL;
+
} /* gen_threshold_file() */
/*
@@ -327,18 +363,21 @@ error:
* one dataset: fixed dimension, chunked layout, w/ filters
*
*/
-static void
+static herr_t
gen_idx_file(const char *fname)
{
- hid_t fapl = H5I_INVALID_HID; /* file access property id */
- hid_t fid = H5I_INVALID_HID; /* file id */
- hid_t sid = H5I_INVALID_HID; /* space id */
- hid_t dcpl = H5I_INVALID_HID; /* dataset creation property id */
- hid_t did = -1, did2 = H5I_INVALID_HID; /* dataset id */
- hsize_t dims[1] = {10}; /* dataset dimension */
- hsize_t c_dims[1] = {2}; /* chunk dimension */
- int i; /* local index variable */
- int buf[10]; /* data buffer */
+ hid_t fapl = H5I_INVALID_HID; /* file access property id */
+ hid_t fid = H5I_INVALID_HID; /* file id */
+ hid_t sid = H5I_INVALID_HID; /* space id */
+ hid_t dcpl = H5I_INVALID_HID; /* dataset creation property id */
+ hid_t did = H5I_INVALID_HID; /* dataset id */
+#if defined(H5_HAVE_FILTER_DEFLATE)
+ hid_t did2 = H5I_INVALID_HID; /* dataset id (compressed) */
+#endif
+ hsize_t dims[1] = {10}; /* dataset dimension */
+ hsize_t c_dims[1] = {2}; /* chunk dimension */
+ int i; /* local index variable */
+ int buf[10]; /* data buffer */
/* Get a copy of the file access property */
if ((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
@@ -390,6 +429,19 @@ gen_idx_file(const char *fname)
#endif
/* closing: dataspace, dataset, file */
+ if (H5Pclose(fapl) < 0)
+ goto error;
+ if (H5Pclose(dcpl) < 0)
+ goto error;
+ if (H5Sclose(sid) < 0)
+ goto error;
+ if (H5Dclose(did) < 0)
+ goto error;
+ if (H5Fclose(fid) < 0)
+ goto error;
+
+ return SUCCEED;
+
error:
H5E_BEGIN_TRY
{
@@ -404,6 +456,8 @@ error:
}
H5E_END_TRY;
+ return FAIL;
+
} /* gen_idx_file() */
/*
@@ -419,20 +473,21 @@ error:
* H5O_refcount_decode in the jira issue.
*
*/
-static void
+static herr_t
gen_err_refcount(const char *fname)
{
- hid_t fid = H5I_INVALID_HID; /* File identifier */
- hid_t sid = H5I_INVALID_HID; /* Dataspace message */
- hid_t did = H5I_INVALID_HID; /* Dataset identifier */
- hid_t gid = H5I_INVALID_HID; /* Group identifier */
- hid_t aid1 = -1, aid2 = H5I_INVALID_HID; /* Attribute identifier */
- hid_t tid = H5I_INVALID_HID; /* Datatype identifier */
- int i, n; /* Local index variables */
- int buf[10]; /* Data buffer */
- hsize_t dims[1]; /* Dimension size */
- int fd = -1; /* File descriptor */
- unsigned short val = 22; /* The refcount message ID */
+ hid_t fid = H5I_INVALID_HID; /* File identifier */
+ hid_t sid = H5I_INVALID_HID; /* Dataspace message */
+ hid_t did = H5I_INVALID_HID; /* Dataset identifier */
+ hid_t gid = H5I_INVALID_HID; /* Group identifier */
+ hid_t aid1 = H5I_INVALID_HID; /* Attribute identifier */
+ hid_t aid2 = H5I_INVALID_HID; /* Attribute identifier */
+ hid_t tid = H5I_INVALID_HID; /* Datatype identifier */
+ int i, n; /* Local index variables */
+ int buf[10]; /* Data buffer */
+ hsize_t dims[1]; /* Dimension size */
+ int fd = -1; /* File descriptor */
+ unsigned short val = 22; /* The refcount message ID */
/* Initialize data buffer */
n = 0;
@@ -485,6 +540,10 @@ gen_err_refcount(const char *fname)
goto error;
if (H5Tclose(tid) < 0)
goto error;
+
+ /* Be sure to close this before opening the file again via open(), below,
+ * or you'll possibly trip over the file locking.
+ */
if (H5Fclose(fid) < 0)
goto error;
@@ -495,11 +554,16 @@ gen_err_refcount(const char *fname)
with the committed datatype */
/* 24: the offset in the object header containing the version of the
attribute message */
- if ((fd = HDopen(fname, O_RDWR, 0633)) >= 0) {
- HDlseek(fd, 4520 + 24, SEEK_SET);
- HDwrite(fd, &val, 2);
- HDclose(fd);
- }
+ if ((fd = HDopen(fname, O_RDWR, 0633)) < 0)
+ goto error;
+ if (HDlseek(fd, 4520 + 24, SEEK_SET) < 0)
+ goto error;
+ if (HDwrite(fd, &val, 2) < 0)
+ goto error;
+ if (HDclose(fd) < 0)
+ goto error;
+
+ return SUCCEED;
error:
H5E_BEGIN_TRY
@@ -513,6 +577,11 @@ error:
H5Fclose(fid);
}
H5E_END_TRY;
+
+ if (fd >= 0)
+ HDclose(fd);
+
+ return FAIL;
} /* gen_err_refcount() */
/*
@@ -542,14 +611,22 @@ error:
int
main(void)
{
- gen_newgrat_file(NEWGRAT_FILE);
- gen_threshold_file(THRESHOLD_FILE);
+ if (gen_newgrat_file(NEWGRAT_FILE) < 0)
+ goto error;
+ if (gen_threshold_file(THRESHOLD_FILE) < 0)
+ goto error;
/* Generate an HDF file to test for datasets with Fixed Array indexing */
- gen_idx_file(IDX_FILE);
+ if (gen_idx_file(IDX_FILE) < 0)
+ goto error;
/* Generate a file with a refcount message ID */
- gen_err_refcount(ERR_REFCOUNT_FILE);
+ if (gen_err_refcount(ERR_REFCOUNT_FILE) < 0)
+ goto error;
+
+ return EXIT_SUCCESS;
- return 0;
+error:
+ HDfprintf(stderr, "h5stat test generator FAILED\n");
+ return EXIT_FAILURE;
}
diff --git a/tools/test/h5stat/testh5stat.sh.in b/tools/test/h5stat/testh5stat.sh.in
index 470c381..647f06a 100644
--- a/tools/test/h5stat/testh5stat.sh.in
+++ b/tools/test/h5stat/testh5stat.sh.in
@@ -304,7 +304,7 @@ TOOLTEST h5stat_links5.ddl -g -l 40000 h5stat_newgrat.h5
# -d --di=15
TOOLTEST h5stat_err1_dims.ddl -d --dims=-1 h5stat_threshold.h5
TOOLTEST h5stat_dims1.ddl -gd -m 5 h5stat_threshold.h5
-TOOLTEST h5stat_dims2.ddl -d --di=15 h5stat_threshold.h5
+TOOLTEST h5stat_dims2.ddl -d --dims=15 h5stat_threshold.h5
#
# Tests for -a option on h5stat_threshold.h5
# -a -2 (incorrect threshold value)
diff --git a/tools/test/misc/CMakeTestsClear.cmake b/tools/test/misc/CMakeTestsClear.cmake
index ec24a61..198a363 100644
--- a/tools/test/misc/CMakeTestsClear.cmake
+++ b/tools/test/misc/CMakeTestsClear.cmake
@@ -397,7 +397,7 @@
#
# The following are tests to verify the expected exit code from h5clear:
# "h5clear -m h5clear_mdc_image.h5" (valid option, existing file, succeed exit code)
-# "h5clear --vers" (valid option, version #, succeed exit code)
+# "h5clear --version" (valid option, version #, succeed exit code)
# "h5clear -k" (invalid 1 option, no file, fail exit code)
# "h5clear -k junk.h5" (invalid 1 option, nonexisting file, fail exit code)
# "h5clear -l h5clear_sec2_v2.h5" (invalid 1 option, existing file, fail exit code)
@@ -408,7 +408,7 @@
# "h5clear -m -l h5clear_sec2_v0.h5" (valid/invalid 2 options, existing file, fail exit code)
# "h5clear -l -m h5clear_sec2_v0.h5" (invalid/valid 2 options, existing file, fail exit code)
ADD_H5_RETTEST (h5clr_mdc_image "false" "-m" h5clear_mdc_image.h5)
- ADD_H5_RETTEST (h5clr_vers "false" "--vers")
+ ADD_H5_RETTEST (h5clr_vers "false" "--version")
ADD_H5_RETTEST (h5clr_k "true" "-k")
ADD_H5_RETTEST (h5clr_k_junk "true" "-k" junk.h5)
ADD_H5_RETTEST (h5clr_l_sec2 "true" "-l" h5clear_sec2_v2.h5)
diff --git a/tools/test/misc/repart_test.c b/tools/test/misc/repart_test.c
index e081bf0..7aa5ad9 100644
--- a/tools/test/misc/repart_test.c
+++ b/tools/test/misc/repart_test.c
@@ -113,7 +113,10 @@ test_single_h5repart_opens(void)
return SUCCEED;
error:
- H5E_BEGIN_TRY { H5Fclose(fid); }
+ H5E_BEGIN_TRY
+ {
+ H5Fclose(fid);
+ }
H5E_END_TRY;
return FAIL;
diff --git a/tools/test/misc/talign.c b/tools/test/misc/talign.c
index 60e7e15..f214527 100644
--- a/tools/test/misc/talign.c
+++ b/tools/test/misc/talign.c
@@ -63,7 +63,10 @@ main(void)
return 1;
}
- H5E_BEGIN_TRY { (void)H5Ldelete(fil, setname, H5P_DEFAULT); }
+ H5E_BEGIN_TRY
+ {
+ (void)H5Ldelete(fil, setname, H5P_DEFAULT);
+ }
H5E_END_TRY;
cs6 = H5Tcopy(H5T_C_S1);
diff --git a/tools/test/misc/testfiles/h5mkgrp_help.txt b/tools/test/misc/testfiles/h5mkgrp_help.txt
index 9525230..5d81b34 100644
--- a/tools/test/misc/testfiles/h5mkgrp_help.txt
+++ b/tools/test/misc/testfiles/h5mkgrp_help.txt
@@ -11,4 +11,10 @@ usage: h5mkgrp [OPTIONS] FILE GROUP...
HDF5 file specified
--vol-info VOL-specific info to pass to the VOL connector used for
opening the HDF5 file specified
+ --vfd-value Value (ID) of the VFL driver to use for opening the
+ HDF5 file specified
+ --vfd-name Name of the VFL driver to use for opening the
+ HDF5 file specified
+ --vfd-info VFD-specific info to pass to the VFL driver used for
+ opening the HDF5 file specified
diff --git a/tools/test/misc/testh5clear.sh.in b/tools/test/misc/testh5clear.sh.in
index c05e43d..a01fa4a 100644
--- a/tools/test/misc/testh5clear.sh.in
+++ b/tools/test/misc/testh5clear.sh.in
@@ -315,7 +315,7 @@ TOOLTEST_ERR orig_h5clear_sec2_v0.h5 -s -m "" h5clear_no_mdc_image.err
#
# The following are tests to verify the expected exit code from h5clear:
# "h5clear -m h5clear_mdc_image.h5" (valid option, existing file, succeed exit code)
-# "h5clear --vers" (valid option, version #, succeed exit code)
+# "h5clear --version" (valid option, version #, succeed exit code)
# "h5clear -k" (invalid 1 option, no file, fail exit code)
# "h5clear -k junk.h5" (invalid 1 option, nonexisting file, fail exit code)
# "h5clear -l h5clear_sec2_v2.h5" (invalid 1 option, existing file, fail exit code)
@@ -326,7 +326,7 @@ TOOLTEST_ERR orig_h5clear_sec2_v0.h5 -s -m "" h5clear_no_mdc_image.err
# "h5clear -m -l h5clear_sec2_v0.h5" (valid/invalid 2 options, existing file, fail exit code)
# "h5clear -l -m h5clear_sec2_v0.h5" (invalid/valid 2 options, existing file, fail exit code)
TOOLTEST h5clear_mdc_image.h5 -m "" $SUCCEED
-TOOLTEST "" --vers "" $SUCCEED
+TOOLTEST "" --version "" $SUCCEED
TOOLTEST "" -k "" $FAIL
TOOLTEST junk.h5 -k "" $FAIL
TOOLTEST h5clear_sec2_v2.h5 -l "" $FAIL
diff --git a/tools/test/misc/vds/UC_common.h b/tools/test/misc/vds/UC_common.h
index bfa1ed9..d84d545 100644
--- a/tools/test/misc/vds/UC_common.h
+++ b/tools/test/misc/vds/UC_common.h
@@ -14,15 +14,6 @@
#ifndef USE_CASE_COMMON_H
#define USE_CASE_COMMON_H
-/* Use FUNC to safely handle variations of C99 __func__ keyword handling */
-#ifdef H5_HAVE_C99_FUNC
-#define FUNC __func__
-#elif defined(H5_HAVE_FUNCTION)
-#define FUNC __FUNCTION__
-#else
-#error "We need __func__ or __FUNCTION__ to test function names!"
-#endif
-
/******************************************
* Symbols used across multiple use cases *
******************************************/
@@ -41,7 +32,7 @@
#define FALSE 0
/* Testing macros */
-#define AT() printf(" at %s:%d in %s()...\n", __FILE__, __LINE__, FUNC);
+#define AT() printf(" at %s:%d in %s()...\n", __FILE__, __LINE__, __func__);
#define UC_ERROR \
{ \
puts("*ERROR*"); \
diff --git a/tools/test/perform/CMakeLists.txt b/tools/test/perform/CMakeLists.txt
index 7399723..7bf79c5 100644
--- a/tools/test/perform/CMakeLists.txt
+++ b/tools/test/perform/CMakeLists.txt
@@ -4,39 +4,17 @@ project (HDF5_TOOLS_TEST_PERFORM C)
# --------------------------------------------------------------------
# Add the executables
# --------------------------------------------------------------------
-#-- Adding test for h5perf_serial
-set (h5perf_serial_SOURCES
- ${HDF5_TOOLS_TEST_PERFORM_SOURCE_DIR}/sio_perf.c
- ${HDF5_TOOLS_TEST_PERFORM_SOURCE_DIR}/sio_engine.c
-)
-add_executable (h5perf_serial ${h5perf_serial_SOURCES})
-target_include_directories (h5perf_serial PRIVATE "${HDF5_TEST_SRC_DIR};${HDF5_SRC_DIR};${HDF5_SRC_BINARY_DIR};$<$<BOOL:${HDF5_ENABLE_PARALLEL}>:${MPI_C_INCLUDE_DIRS}>")
-if (NOT BUILD_SHARED_LIBS)
- TARGET_C_PROPERTIES (h5perf_serial STATIC)
- target_link_libraries (h5perf_serial PRIVATE ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
-else ()
- TARGET_C_PROPERTIES (h5perf_serial SHARED)
- target_link_libraries (h5perf_serial PRIVATE ${HDF5_TOOLS_LIBSH_TARGET} ${HDF5_LIBSH_TARGET})
-endif ()
-set_target_properties (h5perf_serial PROPERTIES FOLDER perform)
-
-#-----------------------------------------------------------------------------
-# Add Target to clang-format
-#-----------------------------------------------------------------------------
-if (HDF5_ENABLE_FORMATTERS)
- clang_format (HDF5_TOOLS_TEST_PERFORM_h5perf_serial_FORMAT h5perf_serial)
-endif ()
if (HDF5_BUILD_PERFORM_STANDALONE)
#-- Adding test for h5perf_serial_alone - io_timer.c includes
set (h5perf_serial_alone_SOURCES
${HDF5_TOOLS_DIR}/lib/io_timer.c
- ${HDF5_TOOLS_TEST_PERFORM_SOURCE_DIR}/sio_perf.c
- ${HDF5_TOOLS_TEST_PERFORM_SOURCE_DIR}/sio_engine.c
+ ${HDF5_TOOLS_SRC_H5PERF_SOURCE_DIR}/sio_perf.c
+ ${HDF5_TOOLS_SRC_H5PERF_SOURCE_DIR}/sio_engine.c
${HDF5_TOOLS_TEST_PERFORM_SOURCE_DIR}/sio_standalone.c
)
add_executable (h5perf_serial_alone ${h5perf_serial_alone_SOURCES})
- target_include_directories (h5perf_serial_alone PRIVATE "${HDF5_SRC_DIR};${HDF5_SRC_BINARY_DIR};${HDF5_TOOLS_DIR}/lib;$<$<BOOL:${HDF5_ENABLE_PARALLEL}>:${MPI_C_INCLUDE_DIRS}>")
+ target_include_directories (h5perf_serial_alone PRIVATE "${HDF5_SRC_DIR};${HDF5_SRC_BINARY_DIR};${HDF5_TOOLS_DIR}/lib;${HDF5_TOOLS_SRC_H5PERF_SOURCE_DIR};${HDF5_TOOLS_TEST_PERFORM_SOURCE_DIR};$<$<BOOL:${HDF5_ENABLE_PARALLEL}>:${MPI_C_INCLUDE_DIRS}>")
if (NOT BUILD_SHARED_LIBS)
TARGET_C_PROPERTIES (h5perf_serial_alone STATIC)
target_link_libraries (h5perf_serial_alone PRIVATE ${HDF5_LIB_TARGET} "$<$<BOOL:${HDF5_ENABLE_PARALLEL}>:${MPI_C_LIBRARIES}>")
@@ -188,63 +166,16 @@ if (HDF5_ENABLE_FORMATTERS)
endif ()
if (H5_HAVE_PARALLEL AND HDF5_TEST_PARALLEL)
- if (UNIX)
- #-- Adding test for perf - only on unix systems
- set (perf_SOURCES
- ${HDF5_TOOLS_TEST_PERFORM_SOURCE_DIR}/perf.c
- )
- add_executable (perf ${perf_SOURCES})
- target_include_directories (perf PRIVATE "${HDF5_TEST_SRC_DIR};${HDF5_SRC_DIR};${HDF5_SRC_BINARY_DIR};$<$<BOOL:${HDF5_ENABLE_PARALLEL}>:${MPI_C_INCLUDE_DIRS}>")
- if (NOT BUILD_SHARED_LIBS)
- TARGET_C_PROPERTIES (perf STATIC)
- target_link_libraries (perf PRIVATE ${HDF5_TOOLS_LIB_TARGET} ${HDF5_TEST_LIB_TARGET} ${HDF5_LIB_TARGET})
- else ()
- TARGET_C_PROPERTIES (perf SHARED)
- target_link_libraries (perf PRIVATE ${HDF5_TOOLS_LIBSH_TARGET} ${HDF5_TEST_LIBSH_TARGET} ${HDF5_LIBSH_TARGET})
- endif ()
- set_target_properties (perf PROPERTIES FOLDER perform)
-
- #-----------------------------------------------------------------------------
- # Add Target to clang-format
- #-----------------------------------------------------------------------------
- if (HDF5_ENABLE_FORMATTERS)
- clang_format (HDF5_TOOLS_TEST_PERFORM_perf_FORMAT perf)
- endif ()
- endif ()
-
- #-- Adding test for h5perf
- set (h5perf_SOURCES
- ${HDF5_TOOLS_TEST_PERFORM_SOURCE_DIR}/pio_perf.c
- ${HDF5_TOOLS_TEST_PERFORM_SOURCE_DIR}/pio_engine.c
- )
- add_executable (h5perf ${h5perf_SOURCES})
- target_include_directories (h5perf PRIVATE "${HDF5_SRC_DIR};${HDF5_SRC_BINARY_DIR};$<$<BOOL:${HDF5_ENABLE_PARALLEL}>:${MPI_C_INCLUDE_DIRS}>")
- if (NOT BUILD_SHARED_LIBS)
- TARGET_C_PROPERTIES (h5perf STATIC)
- target_link_libraries (h5perf PRIVATE ${HDF5_TOOLS_LIB_TARGET} ${HDF5_TEST_LIB_TARGET} ${HDF5_LIB_TARGET})
- else ()
- TARGET_C_PROPERTIES (h5perf SHARED)
- target_link_libraries (h5perf PRIVATE ${HDF5_TOOLS_LIBSH_TARGET} ${HDF5_TEST_LIBSH_TARGET} ${HDF5_LIBSH_TARGET})
- endif ()
- set_target_properties (h5perf PROPERTIES FOLDER perform)
-
- #-----------------------------------------------------------------------------
- # Add Target to clang-format
- #-----------------------------------------------------------------------------
- if (HDF5_ENABLE_FORMATTERS)
- clang_format (HDF5_TOOLS_TEST_PERFORM_h5perf_FORMAT h5perf)
- endif ()
-
if (HDF5_BUILD_PERFORM_STANDALONE)
#-- Adding test for h5perf
set (h5perf_alone_SOURCES
${HDF5_TOOLS_DIR}/lib/io_timer.c
- ${HDF5_TOOLS_TEST_PERFORM_SOURCE_DIR}/pio_perf.c
- ${HDF5_TOOLS_TEST_PERFORM_SOURCE_DIR}/pio_engine.c
+ ${HDF5_TOOLS_SRC_H5PERF_SOURCE_DIR}/pio_perf.c
+ ${HDF5_TOOLS_SRC_H5PERF_SOURCE_DIR}/pio_engine.c
${HDF5_TOOLS_TEST_PERFORM_SOURCE_DIR}/pio_standalone.c
)
add_executable (h5perf_alone ${h5perf_alone_SOURCES})
- target_include_directories (h5perf_alone PRIVATE "${HDF5_SRC_DIR};${HDF5_SRC_BINARY_DIR};${HDF5_TOOLS_DIR}/lib;$<$<BOOL:${HDF5_ENABLE_PARALLEL}>:${MPI_C_INCLUDE_DIRS}>")
+ target_include_directories (h5perf_alone PRIVATE "${HDF5_SRC_DIR};${HDF5_SRC_BINARY_DIR};${HDF5_TOOLS_DIR}/lib;${HDF5_TOOLS_SRC_H5PERF_SOURCE_DIR};${HDF5_TOOLS_TEST_PERFORM_SOURCE_DIR};$<$<BOOL:${HDF5_ENABLE_PARALLEL}>:${MPI_C_INCLUDE_DIRS}>")
if (NOT BUILD_SHARED_LIBS)
TARGET_C_PROPERTIES (h5perf_alone STATIC)
target_link_libraries (h5perf_alone PRIVATE ${HDF5_LIB_TARGET} ${LINK_LIBS} "$<$<BOOL:${HDF5_ENABLE_PARALLEL}>:${MPI_C_LIBRARIES}>")
diff --git a/tools/test/perform/COPYING b/tools/test/perform/COPYING
deleted file mode 100644
index 97969da..0000000
--- a/tools/test/perform/COPYING
+++ /dev/null
@@ -1,13 +0,0 @@
-
- Copyright by The HDF Group and
- The Board of Trustees of the University of Illinois.
- All rights reserved.
-
- The files and subdirectories in this directory are part of HDF5.
- The full HDF5 copyright notice, including terms governing use,
- modification, and redistribution, is contained in the COPYING file
- which can be found at the root of the source code distribution tree
- or in https://www.hdfgroup.org/licenses. If you do
- not have access to either file, you may request a copy from
- help@hdfgroup.org.
-
diff --git a/tools/test/perform/Makefile.am b/tools/test/perform/Makefile.am
index 244ef3a..10b13fe 100644
--- a/tools/test/perform/Makefile.am
+++ b/tools/test/perform/Makefile.am
@@ -21,17 +21,6 @@ include $(top_srcdir)/config/commence.am
AM_CPPFLAGS+=-I$(top_srcdir)/src -I$(top_srcdir)/test -I$(top_srcdir)/tools/lib
-# bin_PROGRAMS will be installed.
-if BUILD_PARALLEL_CONDITIONAL
- bin_PROGRAMS=h5perf_serial h5perf
-else
- bin_PROGRAMS=h5perf_serial
-endif
-
-# Add h5perf and h5perf_serial specific linker flags here
-h5perf_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
-h5perf_serial_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
-
# Some programs are not built or run by default, but can be built by hand or by
# specifying --enable-build-all at configure time.
# Also, some of these programs should only be built in parallel.
@@ -47,18 +36,15 @@ endif
# List them in the order they should be run.
# Parallel test programs.
if BUILD_PARALLEL_CONDITIONAL
- TEST_PROG_PARA=h5perf perf
+ TEST_PROG_PARA=
endif
# Serial test programs.
-TEST_PROG = iopipe chunk chunk_cache overhead zip_perf perf_meta h5perf_serial $(BUILD_ALL_PROGS)
+TEST_PROG = iopipe chunk chunk_cache overhead zip_perf perf_meta $(BUILD_ALL_PROGS)
# check_PROGRAMS will be built but not installed. Do not any executable
# that is in bin_PROGRAMS already. Otherwise, it will be removed twice in
# "make clean" and some systems, e.g., AIX, do not like it.
-check_PROGRAMS= iopipe chunk chunk_cache overhead zip_perf perf_meta $(BUILD_ALL_PROGS) perf
-
-h5perf_SOURCES=pio_perf.c pio_engine.c
-h5perf_serial_SOURCES=sio_perf.c sio_engine.c
+check_PROGRAMS= $(TEST_PROG) $(BUILD_ALL_PROGS)
# These are the files that `make clean' (and derivatives) will remove from
# this directory.
@@ -67,9 +53,6 @@ CLEANFILES=*.h5 *.raw *.dat x-gnuplot perftest.out
# All of the programs depend on the main hdf5 library, and some of them
# depend on test or tools library.
LDADD=$(LIBHDF5)
-h5perf_LDADD=$(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5)
-h5perf_serial_LDADD=$(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5)
-perf_LDADD=$(LIBH5TEST) $(LIBHDF5)
iopipe_LDADD=$(LIBH5TEST) $(LIBHDF5)
zip_perf_LDADD=$(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5)
perf_meta_LDADD=$(LIBH5TEST) $(LIBHDF5)
diff --git a/tools/test/perform/chunk.c b/tools/test/perform/chunk.c
index ada2ed3..5e2dde2 100644
--- a/tools/test/perform/chunk.c
+++ b/tools/test/perform/chunk.c
@@ -21,15 +21,12 @@
*/
/* See H5private.h for how to include headers */
-#undef NDEBUG
#include "hdf5.h"
-#ifdef H5_STDC_HEADERS
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#endif
/* Solaris Studio defines attribute, but for the attributes we need */
#if !defined(H5_HAVE_ATTRIBUTE) || defined __cplusplus || defined(__SUNPRO_C)
@@ -55,20 +52,20 @@
#define RM_CACHE_STRT 25
#define RM_CACHE_END 25
#define RM_CACHE_DELT 5
-#define RM_START (double)0.50F
-#define RM_END (double)5.00F
-#define RM_DELTA (double)0.50F
-#define RM_W0 0.0F
+#define RM_START 0.50
+#define RM_END 5.00
+#define RM_DELTA 0.50
+#define RM_W0 0.0
#define RM_NRDCC 521
/* Diagonal test */
#define DIAG_CACHE_STRT 25
#define DIAG_CACHE_END 25
#define DIAG_CACHE_DELT 5
-#define DIAG_START (double)0.50F
-#define DIAG_END (double)5.00F
-#define DIAG_DELTA (double)0.50F
-/* #define DIAG_W0 0.65F */
+#define DIAG_START 0.50
+#define DIAG_END 5.00
+#define DIAG_DELTA 0.50
+/* #define DIAG_W0 0.65 */
/* #define DIAG_NRDCC 521 */
static size_t nio_g;
diff --git a/tools/test/perform/chunk_cache.c b/tools/test/perform/chunk_cache.c
index fcaa337..a99334f 100644
--- a/tools/test/perform/chunk_cache.c
+++ b/tools/test/perform/chunk_cache.c
@@ -26,9 +26,9 @@
#define RANK 2
#define DSET1_NAME "partial_chunks"
-#define DSET1_DIM1 9 * 1000
+#define DSET1_DIM1 (9 * 1000)
#define DSET1_DIM2 9
-#define CHUNK1_DIM1 2 * 1000
+#define CHUNK1_DIM1 (2 * 1000)
#define CHUNK1_DIM2 2
#define DSET2_NAME "hash_value"
@@ -38,8 +38,8 @@
#define CHUNK2_DIM2 100
#define RDCC_NSLOTS 5
-#define RDCC_NBYTES 1024 * 1024 * 10
-#define RDCC_W0 0.75F
+#define RDCC_NBYTES (1024 * 1024 * 10)
+#define RDCC_W0 0.75
#define FILTER_COUNTER 306
static size_t nbytes_global;
@@ -81,7 +81,7 @@ counter(unsigned H5_ATTR_UNUSED flags, size_t H5_ATTR_UNUSED cd_nelmts,
static void
cleanup(void)
{
- if (!getenv("HDF5_NOCLEANUP")) {
+ if (!getenv(HDF5_NOCLEANUP)) {
remove(FILENAME);
}
}
@@ -262,13 +262,14 @@ check_partial_chunks_perf(hid_t file)
end_t = H5_get_time();
- if ((end_t - start_t) > (double)0.0f)
- printf("1. Partial chunks: total read time is %lf; number of bytes being read from file is %zu\n",
- (end_t - start_t), nbytes_global);
+ if ((end_t - start_t) > 0.0)
+ HDprintf("1. Partial chunks: total read time is %lf; number of bytes being read from file is %zu\n",
+ (end_t - start_t), nbytes_global);
else
- printf("1. Partial chunks: no total read time because timer is not available; number of bytes being "
- "read from file is %zu\n",
- nbytes_global);
+ HDprintf(
+ "1. Partial chunks: no total read time because timer is not available; number of bytes being "
+ "read from file is %zu\n",
+ nbytes_global);
H5Dclose(dataset);
H5Sclose(filespace);
@@ -340,13 +341,14 @@ check_hash_value_perf(hid_t file)
end_t = H5_get_time();
- if ((end_t - start_t) > (double)0.0f)
- printf("2. Hash value: total read time is %lf; number of bytes being read from file is %zu\n",
- (end_t - start_t), nbytes_global);
+ if ((end_t - start_t) > 0.0)
+ HDprintf("2. Hash value: total read time is %lf; number of bytes being read from file is %zu\n",
+ (end_t - start_t), nbytes_global);
else
- printf("2. Hash value: no total read time because timer is not available; number of bytes being read "
- "from file is %zu\n",
- nbytes_global);
+ HDprintf(
+ "2. Hash value: no total read time because timer is not available; number of bytes being read "
+ "from file is %zu\n",
+ nbytes_global);
H5Dclose(dataset);
H5Sclose(filespace);
@@ -375,7 +377,7 @@ error:
int
main(void)
{
- hid_t file; /* handles */
+ hid_t file = H5I_INVALID_HID; /* file ID */
int nerrors = 0;
/* Create a new file. If file exists its contents will be overwritten. */
@@ -404,6 +406,6 @@ main(void)
return 0;
error:
- fprintf(stderr, "*** ERRORS DETECTED ***\n");
+ HDfprintf(stderr, "*** ERRORS DETECTED ***\n");
return 1;
}
diff --git a/tools/test/perform/direct_write_perf.c b/tools/test/perform/direct_write_perf.c
index b3ae54d..371c4f9 100644
--- a/tools/test/perform/direct_write_perf.c
+++ b/tools/test/perform/direct_write_perf.c
@@ -23,31 +23,27 @@
#if !defined(WIN32) && !defined(__MINGW32__)
-#include <math.h>
-
-#ifdef H5_STDC_HEADERS
#include <errno.h>
#include <fcntl.h>
+#include <math.h>
#include <stdio.h>
#include <stdlib.h>
-#endif
-
-#ifdef H5_HAVE_UNISTD_H
-#include <sys/types.h>
-#include <unistd.h>
-#endif
+#include <time.h>
#ifdef H5_HAVE_SYS_STAT_H
#include <sys/stat.h>
#endif
-#if defined(H5_TIME_WITH_SYS_TIME)
+#ifdef H5_HAVE_SYS_TIME_H
#include <sys/time.h>
-#include <time.h>
-#elif defined(H5_HAVE_SYS_TIME_H)
-#include <sys/time.h>
-#else
-#include <time.h>
+#endif
+
+#ifdef H5_HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef H5_HAVE_UNISTD_H
+#include <unistd.h>
#endif
const char *FILENAME[] = {"direct_write", "unix.raw", NULL};
@@ -55,8 +51,7 @@ const char *FILENAME[] = {"direct_write", "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 AT() printf(" at %s:%d in %s()...\n", __FILE__, __LINE__, __func__);
#define H5_FAILED() \
{ \
puts("*FAILED*"); \
diff --git a/tools/test/perform/iopipe.c b/tools/test/perform/iopipe.c
index 68eaa3a..2aa9e25 100644
--- a/tools/test/perform/iopipe.c
+++ b/tools/test/perform/iopipe.c
@@ -64,11 +64,11 @@ print_stats(const char *prefix,
#ifdef H5_HAVE_GETRUSAGE
double u_time, s_time;
- u_time = ((double)(r_stop->ru_utime.tv_sec) + (double)(r_stop->ru_utime.tv_usec) / (double)1000000.0F) -
- ((double)(r_start->ru_utime.tv_sec) + (double)(r_start->ru_utime.tv_usec) / (double)1000000.0F);
+ u_time = ((double)(r_stop->ru_utime.tv_sec) + (double)(r_stop->ru_utime.tv_usec) / 1000000.0) -
+ ((double)(r_start->ru_utime.tv_sec) + (double)(r_start->ru_utime.tv_usec) / 1000000.0);
- s_time = ((double)(r_stop->ru_stime.tv_sec) + (double)(r_stop->ru_stime.tv_usec) / (double)1000000.0F) -
- ((double)(r_start->ru_stime.tv_sec) + (double)(r_start->ru_stime.tv_usec) / (double)1000000.0F);
+ s_time = ((double)(r_stop->ru_stime.tv_sec) + (double)(r_stop->ru_stime.tv_usec) / 1000000.0) -
+ ((double)(r_start->ru_stime.tv_sec) + (double)(r_start->ru_stime.tv_usec) / 1000000.0);
#endif
e_time = t_stop - t_start;
H5_bandwidth(bw, (double)nbytes, e_time);
@@ -95,7 +95,6 @@ print_stats(const char *prefix,
static void
synchronize(void)
{
-#ifdef H5_HAVE_SYSTEM
#if defined(H5_HAVE_WIN32_API) && !defined(__CYGWIN__)
_flushall();
#else
@@ -107,7 +106,6 @@ synchronize(void)
status = HDsystem("df >/dev/null");
HDassert(status >= 0);
#endif
-#endif
}
/*-------------------------------------------------------------------------
@@ -149,8 +147,7 @@ main(void)
* Win32 version 5.0 compiler.
* 1998-11-06 ptl
*/
- HDprintf("I/O request size is %1.1fMB\n",
- (double)(hssize_t)(size[0] * size[1]) / (double)1024.0F * (double)1024);
+ HDprintf("I/O request size is %1.1fMB\n", (double)(hssize_t)(size[0] * size[1]) / 1024.0 * 1024.0);
/* Open the files */
file = H5Fcreate(HDF5_FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
diff --git a/tools/test/perform/overhead.c b/tools/test/perform/overhead.c
index dba8220..c974928 100644
--- a/tools/test/perform/overhead.c
+++ b/tools/test/perform/overhead.c
@@ -23,17 +23,11 @@
#include "hdf5.h"
#include "H5private.h"
-#ifdef H5_STDC_HEADERS
#include <ctype.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <string.h>
-#endif
-
-#ifdef H5_HAVE_IO_H
-#include <io.h>
-#endif
#ifdef H5_HAVE_UNISTD_H
#include <sys/types.h>
@@ -125,7 +119,7 @@ usage(const char *prog)
static void
cleanup(void)
{
- if (!getenv("HDF5_NOCLEANUP")) {
+ if (!getenv(HDF5_NOCLEANUP)) {
remove(FILE_NAME_1);
}
}
@@ -193,7 +187,7 @@ test(fill_t fill_style, const double splits[], hbool_t verbose, hbool_t use_rdcc
if (!use_rdcc) {
if (H5Pget_cache(fapl, &mdc_nelmts, NULL, NULL, NULL) < 0)
goto error;
- if (H5Pset_cache(fapl, mdc_nelmts, 0, 0, 0.0F) < 0)
+ if (H5Pset_cache(fapl, mdc_nelmts, 0, 0, 0.0) < 0)
goto error;
}
if ((file = H5Fcreate(FILE_NAME_1, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
diff --git a/tools/test/perform/perf.c b/tools/test/perform/perf.c
deleted file mode 100644
index bf4b2a9..0000000
--- a/tools/test/perform/perf.c
+++ /dev/null
@@ -1,476 +0,0 @@
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * 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 COPYING file, which can be found at the root of the source code *
- * distribution tree, or in https://www.hdfgroup.org/licenses. *
- * If you do not have access to either file, you may request a copy from *
- * help@hdfgroup.org. *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * Author: Albert Cheng of NCSA, May 1, 2001.
- * This is derived from code given to me by Robert Ross.
- *
- * NOTE: This code assumes that all command line arguments make it out to all
- * the processes that make up the parallel job, which isn't always the case.
- * So if it doesn't work on some platform, that might be why.
- */
-
-#include "hdf5.h"
-#include "H5private.h"
-#include "h5test.h"
-
-#ifdef H5_HAVE_PARALLEL
-
-#ifdef H5_STDC_HEADERS
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#endif
-
-#ifdef H5_HAVE_UNISTD_H
-#include <sys/types.h>
-#include <unistd.h>
-#endif
-
-#ifdef H5_HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif
-
-#if defined(H5_TIME_WITH_SYS_TIME)
-#include <sys/time.h>
-#include <time.h>
-#elif defined(H5_HAVE_SYS_TIME_H)
-#include <sys/time.h>
-#else
-#include <time.h>
-#endif
-
-#include <mpi.h>
-#ifndef MPI_FILE_NULL /*MPIO may be defined in mpi.h already */
-#include <mpio.h>
-#endif
-
-/* Macro definitions */
-/* Verify:
- * if val is false (0), print mesg and if fatal is true (non-zero), die.
- */
-#define H5FATAL 1
-#define VRFY(val, mesg, fatal) \
- do { \
- if (!val) { \
- printf("Proc %d: ", mynod); \
- printf("*** Assertion failed (%s) at line %4d in %s\n", mesg, (int)__LINE__, __FILE__); \
- if (fatal) { \
- fflush(stdout); \
- goto die_jar_jar_die; \
- } \
- } \
- } while (0)
-#define RANK 1
-#define MAX_PATH 1024
-
-hsize_t dims[RANK]; /* dataset dim sizes */
-hsize_t block[RANK], stride[RANK], count[RANK];
-hsize_t start[RANK];
-hid_t fid; /* HDF5 file ID */
-hid_t acc_tpl; /* File access templates */
-hid_t sid; /* Dataspace ID */
-hid_t file_dataspace; /* File dataspace ID */
-hid_t mem_dataspace; /* memory dataspace ID */
-hid_t dataset; /* Dataset ID */
-hsize_t opt_alignment = 1;
-hsize_t opt_threshold = 1;
-int opt_split_vfd = 0;
-char * meta_ext, *raw_ext; /* holds the meta and raw file extension if */
- /* opt_split_vfd is set */
-
-/* DEFAULT VALUES FOR OPTIONS */
-int64_t opt_block = 1048576 * 16;
-int opt_iter = 1;
-int opt_stripe = -1;
-int opt_correct = 0;
-int amode = O_RDWR | O_CREAT;
-char opt_file[256] = "perftest.out";
-char opt_pvfstab[256] = "notset";
-int opt_pvfstab_set = 0;
-
-const char *FILENAME[] = {opt_file, NULL};
-
-/* function prototypes */
-static int parse_args(int argc, char **argv);
-
-#ifndef H5_HAVE_UNISTD_H
-/* globals needed for getopt */
-extern char *optarg;
-#endif
-
-int
-main(int argc, char **argv)
-{
- char * buf, *tmp, *buf2 = NULL, *tmp2 = NULL, *check;
- int i, j, mynod = 0, nprocs = 1, my_correct = 1, correct, myerrno;
- double stim, etim;
- double write_tim = 0;
- double read_tim = 0;
- double read_bw, write_bw;
- double max_read_tim, max_write_tim;
- double min_read_tim, min_write_tim;
- double ave_read_tim, ave_write_tim;
- int64_t iter_jump = 0;
- char filename[MAX_PATH];
- herr_t ret; /* Generic return value */
-
- /* startup MPI and determine the rank of this process */
- MPI_Init(&argc, &argv);
- MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
- MPI_Comm_rank(MPI_COMM_WORLD, &mynod);
-
- /* parse the command line arguments */
- parse_args(argc, argv);
-
- if (mynod == 0)
- printf("# Using hdf5-io calls.\n");
-
- /* kindof a weird hack- if the location of the pvfstab file was
- * specified on the command line, then spit out this location into
- * the appropriate environment variable: */
-
-#if H5_HAVE_SETENV
- /* no setenv or unsetenv */
- if (opt_pvfstab_set) {
- if ((setenv("PVFSTAB_FILE", opt_pvfstab, 1)) < 0) {
- perror("setenv");
- goto die_jar_jar_die;
- }
- }
-#endif
-
- /* this is how much of the file data is covered on each iteration of
- * the test. used to help determine the seek offset on each
- * iteration */
- iter_jump = nprocs * opt_block;
-
- /* setup a buffer of data to write */
- if (!(tmp = (char *)malloc((size_t)opt_block + 256))) {
- perror("malloc");
- goto die_jar_jar_die;
- }
- buf = tmp + 128 - (((long)tmp) % 128); /* align buffer */
-
- if (opt_correct) {
- /* do the same buffer setup for verifiable data */
- if (!(tmp2 = (char *)malloc((size_t)opt_block + 256))) {
- perror("malloc2");
- goto die_jar_jar_die;
- }
- buf2 = tmp + 128 - (((long)tmp) % 128);
- }
-
- /* setup file access template with parallel IO access. */
- if (opt_split_vfd) {
- hid_t mpio_pl;
-
- mpio_pl = H5Pcreate(H5P_FILE_ACCESS);
- VRFY((acc_tpl >= 0), "", H5FATAL);
- ret = H5Pset_fapl_mpio(mpio_pl, MPI_COMM_WORLD, MPI_INFO_NULL);
- VRFY((ret >= 0), "", H5FATAL);
-
- /* set optional allocation alignment */
- if (opt_alignment * opt_threshold != 1) {
- ret = H5Pset_alignment(acc_tpl, opt_threshold, opt_alignment);
- VRFY((ret >= 0), "H5Pset_alignment succeeded", !H5FATAL);
- }
-
- /* setup file access template */
- acc_tpl = H5Pcreate(H5P_FILE_ACCESS);
- VRFY((acc_tpl >= 0), "", H5FATAL);
- ret = H5Pset_fapl_split(acc_tpl, meta_ext, mpio_pl, raw_ext, mpio_pl);
- VRFY((ret >= 0), "H5Pset_fapl_split succeeded", H5FATAL);
- ret = H5Pclose(mpio_pl);
- VRFY((ret >= 0), "H5Pclose mpio_pl succeeded", H5FATAL);
- }
- else {
- /* setup file access template */
- acc_tpl = H5Pcreate(H5P_FILE_ACCESS);
- VRFY((acc_tpl >= 0), "", H5FATAL);
- ret = H5Pset_fapl_mpio(acc_tpl, MPI_COMM_WORLD, MPI_INFO_NULL);
- VRFY((ret >= 0), "", H5FATAL);
-
- /* set optional allocation alignment */
- if (opt_alignment * opt_threshold != 1) {
- ret = H5Pset_alignment(acc_tpl, opt_threshold, opt_alignment);
- VRFY((ret >= 0), "H5Pset_alignment succeeded", !H5FATAL);
- }
- }
-
- h5_fixname_no_suffix(FILENAME[0], acc_tpl, filename, sizeof filename);
-
- /* create the parallel file */
- fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, acc_tpl);
- VRFY((fid >= 0), "H5Fcreate succeeded", H5FATAL);
-
- /* define a contiquous dataset of opt_iter*nprocs*opt_block chars */
- dims[0] = (hsize_t)opt_iter * (hsize_t)nprocs * (hsize_t)opt_block;
- sid = H5Screate_simple(RANK, dims, NULL);
- VRFY((sid >= 0), "H5Screate_simple succeeded", H5FATAL);
- dataset = H5Dcreate2(fid, "Dataset1", H5T_NATIVE_CHAR, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
- VRFY((dataset >= 0), "H5Dcreate2 succeeded", H5FATAL);
-
- /* create the memory dataspace and the file dataspace */
- dims[0] = (hsize_t)opt_block;
- mem_dataspace = H5Screate_simple(RANK, dims, NULL);
- VRFY((mem_dataspace >= 0), "", H5FATAL);
- file_dataspace = H5Dget_space(dataset);
- VRFY((file_dataspace >= 0), "H5Dget_space succeeded", H5FATAL);
-
- /* now each process writes a block of opt_block chars in round robbin
- * fashion until the whole dataset is covered.
- */
- for (j = 0; j < opt_iter; j++) {
- /* setup a file dataspace selection */
- start[0] = (hsize_t)((j * iter_jump) + (mynod * opt_block));
- stride[0] = block[0] = (hsize_t)opt_block;
- count[0] = 1;
- ret = H5Sselect_hyperslab(file_dataspace, H5S_SELECT_SET, start, stride, count, block);
- VRFY((ret >= 0), "H5Sset_hyperslab succeeded", H5FATAL);
-
- if (opt_correct) /* fill in buffer for iteration */ {
- for (i = mynod + j, check = buf; i < opt_block; i++, check++)
- *check = (char)i;
- }
-
- /* discover the starting time of the operation */
- MPI_Barrier(MPI_COMM_WORLD);
- stim = MPI_Wtime();
-
- /* write data */
- ret = H5Dwrite(dataset, H5T_NATIVE_CHAR, mem_dataspace, file_dataspace, H5P_DEFAULT, buf);
- VRFY((ret >= 0), "H5Dwrite dataset1 succeeded", !H5FATAL);
-
- /* discover the ending time of the operation */
- etim = MPI_Wtime();
-
- write_tim += (etim - stim);
-
- /* we are done with this "write" iteration */
- }
-
- /* close dataset and file */
- ret = H5Dclose(dataset);
- VRFY((ret >= 0), "H5Dclose succeeded", H5FATAL);
- ret = H5Fclose(fid);
- VRFY((ret >= 0), "H5Fclose succeeded", H5FATAL);
-
- /* wait for everyone to synchronize at this point */
- MPI_Barrier(MPI_COMM_WORLD);
-
- /* reopen the file for reading */
- fid = H5Fopen(filename, H5F_ACC_RDONLY, acc_tpl);
- VRFY((fid >= 0), "", H5FATAL);
-
- /* open the dataset */
- dataset = H5Dopen2(fid, "Dataset1", H5P_DEFAULT);
- VRFY((dataset >= 0), "H5Dopen succeeded", H5FATAL);
-
- /* we can re-use the same mem_dataspace and file_dataspace
- * the H5Dwrite used since the dimension size is the same.
- */
-
- /* we are going to repeat the read the same pattern the write used */
- for (j = 0; j < opt_iter; j++) {
- /* setup a file dataspace selection */
- start[0] = (hsize_t)((j * iter_jump) + (mynod * opt_block));
- stride[0] = block[0] = (hsize_t)opt_block;
- count[0] = 1;
- ret = H5Sselect_hyperslab(file_dataspace, H5S_SELECT_SET, start, stride, count, block);
- VRFY((ret >= 0), "H5Sset_hyperslab succeeded", H5FATAL);
- /* seek to the appropriate spot give the current iteration and
- * rank within the MPI processes */
-
- /* discover the start time */
- MPI_Barrier(MPI_COMM_WORLD);
- stim = MPI_Wtime();
-
- /* read in the file data */
- if (!opt_correct) {
- ret = H5Dread(dataset, H5T_NATIVE_CHAR, mem_dataspace, file_dataspace, H5P_DEFAULT, buf);
- }
- else {
- ret = H5Dread(dataset, H5T_NATIVE_CHAR, mem_dataspace, file_dataspace, H5P_DEFAULT, buf2);
- }
- myerrno = errno;
-
- /* discover the end time */
- etim = MPI_Wtime();
- read_tim += (etim - stim);
- VRFY((ret >= 0), "H5Dwrite dataset1 succeeded", !H5FATAL);
-
- if (ret < 0)
- HDfprintf(stderr, "node %d, read error, loc = %" PRId64 ": %s\n", mynod, mynod * opt_block,
- strerror(myerrno));
-
- /* if the user wanted to check correctness, compare the write
- * buffer to the read buffer */
- if (opt_correct && memcmp(buf, buf2, (size_t)opt_block)) {
- HDfprintf(stderr, "node %d, correctness test failed\n", mynod);
- my_correct = 0;
- MPI_Allreduce(&my_correct, &correct, 1, MPI_INT, MPI_MIN, MPI_COMM_WORLD);
- }
-
- /* we are done with this read iteration */
- }
-
- /* close dataset and file */
- ret = H5Dclose(dataset);
- VRFY((ret >= 0), "H5Dclose succeeded", H5FATAL);
- ret = H5Fclose(fid);
- VRFY((ret >= 0), "H5Fclose succeeded", H5FATAL);
- ret = H5Pclose(acc_tpl);
- VRFY((ret >= 0), "H5Pclose succeeded", H5FATAL);
-
- /* compute the read and write times */
- MPI_Allreduce(&read_tim, &max_read_tim, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD);
- MPI_Allreduce(&read_tim, &min_read_tim, 1, MPI_DOUBLE, MPI_MIN, MPI_COMM_WORLD);
- MPI_Allreduce(&read_tim, &ave_read_tim, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
-
- /* calculate the average from the sum */
- ave_read_tim = ave_read_tim / nprocs;
-
- MPI_Allreduce(&write_tim, &max_write_tim, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD);
- MPI_Allreduce(&write_tim, &min_write_tim, 1, MPI_DOUBLE, MPI_MIN, MPI_COMM_WORLD);
- MPI_Allreduce(&write_tim, &ave_write_tim, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
-
- /* calculate the average from the sum */
- ave_write_tim = ave_write_tim / nprocs;
-
- /* print out the results on one node */
- if (mynod == 0) {
- read_bw = (double)((int64_t)(opt_block * nprocs * opt_iter)) / (max_read_tim * 1000000.0);
- write_bw = (double)((int64_t)(opt_block * nprocs * opt_iter)) / (max_write_tim * 1000000.0);
-
- printf("nr_procs = %d, nr_iter = %d, blk_sz = %ld\n", nprocs, opt_iter, (long)opt_block);
-
- printf("# total_size = %ld\n", (long)(opt_block * nprocs * opt_iter));
-
- printf("# Write: min_time = %f, max_time = %f, mean_time = %f\n", min_write_tim, max_write_tim,
- ave_write_tim);
- printf("# Read: min_time = %f, max_time = %f, mean_time = %f\n", min_read_tim, max_read_tim,
- ave_read_tim);
-
- printf("Write bandwidth = %f Mbytes/sec\n", write_bw);
- printf("Read bandwidth = %f Mbytes/sec\n", read_bw);
-
- if (opt_correct) {
- printf("Correctness test %s.\n", correct ? "passed" : "failed");
- }
- }
-
-die_jar_jar_die:
-
-#if H5_HAVE_SETENV
- /* no setenv or unsetenv */
- /* clear the environment variable if it was set earlier */
- if (opt_pvfstab_set) {
- unsetenv("PVFSTAB_FILE");
- }
-#endif
-
- free(tmp);
- if (opt_correct)
- free(tmp2);
-
- MPI_Finalize();
-
- return (0);
-}
-
-static int
-parse_args(int argc, char **argv)
-{
- int c;
-
- while ((c = getopt(argc, argv, "s:b:i:f:p:a:2:c")) != EOF) {
- switch (c) {
- case 's': /* stripe */
- opt_stripe = atoi(optarg);
- break;
- case 'b': /* block size */
- opt_block = atoi(optarg);
- break;
- case 'i': /* iterations */
- opt_iter = atoi(optarg);
- break;
- case 'f': /* filename */
- strncpy(opt_file, optarg, 255);
- FILENAME[0] = opt_file;
- break;
- case 'p': /* pvfstab file */
- strncpy(opt_pvfstab, optarg, 255);
- opt_pvfstab_set = 1;
- break;
- case 'a': /* aligned allocation.
- * syntax: -a<alignment>/<threshold>
- * e.g., -a4096/512 allocate at 4096 bytes
- * boundary if request size >= 512.
- */
- {
- char *p;
-
- opt_alignment = (hsize_t)HDatoi(optarg);
- if (NULL != (p = (char *)HDstrchr(optarg, '/')))
- opt_threshold = (hsize_t)HDatoi(p + 1);
- }
- HDfprintf(stdout, "alignment/threshold=%" PRIuHSIZE "/%" PRIuHSIZE "\n", opt_alignment,
- opt_threshold);
- break;
- case '2': /* use 2-files, i.e., split file driver */
- opt_split_vfd = 1;
- /* get meta and raw file extension. */
- /* syntax is <raw_ext>,<meta_ext> */
- meta_ext = raw_ext = optarg;
- while (*raw_ext != '\0') {
- if (*raw_ext == ',') {
- *raw_ext = '\0';
- raw_ext++;
- break;
- }
- raw_ext++;
- }
- printf("split-file-vfd used: %s,%s\n", meta_ext, raw_ext);
- break;
- case 'c': /* correctness */
- opt_correct = 1;
- break;
- case '?': /* unknown */
- default:
- break;
- }
- }
-
- return (0);
-}
-
-/*
- * Local variables:
- * c-indent-level: 3
- * c-basic-offset: 3
- * tab-width: 3
- * End:
- */
-
-#else /* H5_HAVE_PARALLEL */
-/* dummy program since H5_HAVE_PARALLEL is not configured in */
-int
-main(int H5_ATTR_UNUSED argc, char H5_ATTR_UNUSED **argv)
-{
- printf("No parallel performance because parallel is not configured in\n");
- return (0);
-}
-#endif /* H5_HAVE_PARALLEL */
diff --git a/tools/test/perform/perf_meta.c b/tools/test/perform/perf_meta.c
index a93d673..d8ed9ec 100644
--- a/tools/test/perform/perf_meta.c
+++ b/tools/test/perform/perf_meta.c
@@ -818,8 +818,10 @@ main(int argc, char **argv)
goto error;
#ifdef H5_HAVE_PARALLEL
if (facc_type != FACC_DEFAULT && MAINPROCESS)
-#endif /*H5_HAVE_PARALLEL*/
printf("All metadata performance tests passed.\n");
+#else
+ printf("All metadata performance tests passed.\n");
+#endif /*H5_HAVE_PARALLEL*/
return 0;
diff --git a/tools/test/perform/pio_engine.c b/tools/test/perform/pio_engine.c
deleted file mode 100644
index 65194b0..0000000
--- a/tools/test/perform/pio_engine.c
+++ /dev/null
@@ -1,2747 +0,0 @@
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Copyright by The HDF Group. *
- * 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 COPYING file, which can be found at the root of the source code *
- * distribution tree, or in https://www.hdfgroup.org/licenses. *
- * If you do not have access to either file, you may request a copy from *
- * help@hdfgroup.org. *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * Author: Albert Cheng of NCSA, Oct 24, 2001.
- */
-
-#include "hdf5.h"
-
-#ifdef H5_STDC_HEADERS
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#endif
-
-#ifdef H5_HAVE_UNISTD_H
-#include <sys/types.h>
-#include <unistd.h>
-#endif
-
-#ifdef H5_HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif
-
-#ifdef H5_HAVE_PARALLEL
-
-#include <mpi.h>
-
-#ifndef MPI_FILE_NULL /*MPIO may be defined in mpi.h already */
-#include <mpio.h>
-#endif /* !MPI_FILE_NULL */
-
-#include "pio_perf.h"
-
-/* Macro definitions */
-
-#if H5_VERS_MAJOR == 1 && H5_VERS_MINOR == 6
-#define H5DCREATE(fd, name, type, space, dcpl) H5Dcreate(fd, name, type, space, dcpl)
-#define H5DOPEN(fd, name) H5Dopen(fd, name)
-#else
-#define H5DCREATE(fd, name, type, space, dcpl) \
- H5Dcreate2(fd, name, type, space, H5P_DEFAULT, dcpl, H5P_DEFAULT)
-#define H5DOPEN(fd, name) H5Dopen2(fd, name, H5P_DEFAULT)
-#endif
-
-/* sizes of various items. these sizes won't change during program execution */
-/* The following three must have the same type */
-#define ELMT_H5_TYPE H5T_NATIVE_UCHAR
-
-#define GOTOERROR(errcode) \
- { \
- ret_code = errcode; \
- goto done; \
- }
-#define ERRMSG(mesg) \
- { \
- HDfprintf(stderr, "Proc %d: ", pio_mpi_rank_g); \
- HDfprintf(stderr, "*** Assertion failed (%s) at line %4d in %s\n", mesg, (int)__LINE__, __FILE__); \
- }
-
-/* verify: if val is false (0), print mesg. */
-#define VRFY(val, mesg) \
- do { \
- if (!val) { \
- ERRMSG(mesg); \
- GOTOERROR(FAIL); \
- } \
- } while (0)
-
-/* POSIX I/O macros */
-#ifdef H5_HAVE_WIN32_API
-/* Can't link against the library, so this test will use the older, non-Unicode
- * _open() call on Windows.
- */
-#define HDopen(S, F, ...) _open(S, F | _O_BINARY, __VA_ARGS__)
-#endif /* H5_HAVE_WIN32_API */
-#define POSIXCREATE(fn) HDopen(fn, O_CREAT | O_TRUNC | O_RDWR, 0600)
-#define POSIXOPEN(fn, F) HDopen(fn, F, 0600)
-#define POSIXCLOSE(F) HDclose(F)
-#define POSIXSEEK(F, L) HDlseek(F, L, SEEK_SET)
-#define POSIXWRITE(F, B, S) HDwrite(F, B, S)
-#define POSIXREAD(F, B, S) HDread(F, B, S)
-
-enum { PIO_CREATE = 1, PIO_WRITE = 2, PIO_READ = 4 };
-
-/* Global variables */
-static int clean_file_g = -1; /*whether to cleanup temporary test */
-/*files. -1 is not defined; */
-/*0 is no cleanup; 1 is do cleanup */
-
-/*
- * In a parallel machine, the filesystem suitable for compiling is
- * unlikely a parallel file system that is suitable for parallel I/O.
- * There is no standard pathname for the parallel file system. /tmp
- * is about the best guess.
- */
-#ifndef HDF5_PARAPREFIX
-#define HDF5_PARAPREFIX ""
-#endif /* !HDF5_PARAPREFIX */
-
-#ifndef MIN
-#define MIN(a, b) ((a) < (b) ? (a) : (b))
-#endif /* !MIN */
-
-/* the different types of file descriptors we can expect */
-typedef union _file_descr {
- int posixfd; /* POSIX file handle*/
- MPI_File mpifd; /* MPI file */
- hid_t h5fd; /* HDF5 file */
-} file_descr;
-
-/* local functions */
-static char * pio_create_filename(iotype iot, const char *base_name, char *fullname, size_t size);
-static herr_t do_write(results *res, file_descr *fd, parameters *parms, long ndsets, off_t nelmts,
- size_t buf_size, void *buffer);
-static herr_t do_read(results *res, file_descr *fd, parameters *parms, long ndsets, off_t nelmts,
- size_t buf_size, void *buffer /*out*/);
-static herr_t do_fopen(parameters *param, char *fname, file_descr *fd /*out*/, int flags);
-static herr_t do_fclose(iotype iot, file_descr *fd);
-static void do_cleanupfile(iotype iot, char *fname);
-static off_t sqrto(off_t);
-
-/*
- * Function: do_pio
- * Purpose: PIO Engine where Parallel IO are executed.
- * Return: results
- * Programmer: Albert Cheng, Bill Wendling 2001/12/12
- * Modifications:
- * Added 2D testing (Christian Chilan, 10. August 2005)
- */
-results
-do_pio(parameters param)
-{
- /* return codes */
- herr_t ret_code = 0; /*return code */
- results res;
-
- file_descr fd;
- iotype iot;
-
- char fname[FILENAME_MAX];
- long nf;
- long ndsets;
- off_t nbytes; /*number of bytes per dataset */
- off_t snbytes; /*general dataset size */
- /*for 1D, it is the actual dataset size */
- /*for 2D, it is the size of a side of the dataset square */
- char * buffer = NULL; /*data buffer pointer */
- size_t buf_size; /*general buffer size in bytes */
- /*for 1D, it is the actual buffer size */
- /*for 2D, it is the length of the buffer rectangle */
- size_t blk_size; /*data block size in bytes */
- size_t bsize; /*actual buffer size */
-
- /* HDF5 variables */
- herr_t hrc; /*HDF5 return code */
-
- /* Sanity check parameters */
-
- /* IO type */
- iot = param.io_type;
-
- switch (iot) {
- case MPIO:
- fd.mpifd = MPI_FILE_NULL;
- res.timers = io_time_new(MPI_CLOCK);
- break;
- case POSIXIO:
- fd.posixfd = -1;
- res.timers = io_time_new(MPI_CLOCK);
- break;
- case PHDF5:
- fd.h5fd = -1;
- res.timers = io_time_new(MPI_CLOCK);
- break;
- default:
- /* unknown request */
- HDfprintf(stderr, "Unknown IO type request (%d)\n", iot);
- GOTOERROR(FAIL);
- }
-
- ndsets = param.num_dsets; /* number of datasets per file */
- nbytes = param.num_bytes; /* number of bytes per dataset */
- buf_size = param.buf_size;
- blk_size = param.blk_size;
-
- if (!param.dim2d) {
- snbytes = nbytes; /* General dataset size */
- bsize = buf_size; /* Actual buffer size */
- }
- else {
- snbytes = sqrto(nbytes); /* General dataset size */
- bsize = buf_size * blk_size; /* Actual buffer size */
- }
-
- if (param.num_files < 0) {
- HDfprintf(stderr, "number of files must be >= 0 (%ld)\n", param.num_files);
- GOTOERROR(FAIL);
- }
-
- if (ndsets < 0) {
- HDfprintf(stderr, "number of datasets per file must be >= 0 (%ld)\n", ndsets);
- GOTOERROR(FAIL);
- }
-
- if (param.num_procs <= 0) {
- HDfprintf(stderr, "maximum number of process to use must be > 0 (%d)\n", param.num_procs);
- GOTOERROR(FAIL);
- }
-
- /* Validate transfer buffer size & block size*/
- if (blk_size <= 0) {
- HDfprintf(stderr, "Transfer block size (%zu) must be > 0\n", blk_size);
- GOTOERROR(FAIL);
- }
- if (buf_size <= 0) {
- HDfprintf(stderr, "Transfer buffer size (%zu) must be > 0\n", buf_size);
- GOTOERROR(FAIL);
- }
- if ((buf_size % blk_size) != 0) {
- HDfprintf(stderr,
- "Transfer buffer size (%zu) must be a multiple of the "
- "interleaved I/O block size (%zu)\n",
- buf_size, blk_size);
- GOTOERROR(FAIL);
- }
- if ((snbytes % pio_mpi_nprocs_g) != 0) {
- HDfprintf(stderr,
- "Dataset size (%" H5_PRINTF_LL_WIDTH "d) must be a multiple of the "
- "number of processes (%d)\n",
- (long long)snbytes, pio_mpi_nprocs_g);
- GOTOERROR(FAIL);
- }
-
- if (!param.dim2d) {
- if (((size_t)(snbytes / pio_mpi_nprocs_g) % buf_size) != 0) {
- HDfprintf(stderr,
- "Dataset size/process (%" H5_PRINTF_LL_WIDTH "d) must be a multiple of the "
- "trasfer buffer size (%zu)\n",
- (long long)(snbytes / pio_mpi_nprocs_g), buf_size);
- GOTOERROR(FAIL);
- }
- }
- else {
- if (((size_t)snbytes % buf_size) != 0) {
- HDfprintf(stderr,
- "Dataset side size (%" H5_PRINTF_LL_WIDTH "d) must be a multiple of the "
- "trasfer buffer size (%zu)\n",
- (long long)snbytes, buf_size);
- GOTOERROR(FAIL);
- }
- }
-
- /* Allocate transfer buffer */
- if ((buffer = malloc(bsize)) == NULL) {
- HDfprintf(stderr, "malloc for transfer buffer size (%zu) failed\n", bsize);
- GOTOERROR(FAIL);
- }
-
- if (pio_debug_level >= 4) {
- int myrank;
-
- MPI_Comm_rank(pio_comm_g, &myrank);
-
- /* output all of the times for all iterations */
- if (myrank == 0)
- HDfprintf(output, "Timer details:\n");
- }
-
- for (nf = 1; nf <= param.num_files; nf++) {
- /*
- * Write performance measurement
- */
- /* Open file for write */
- char base_name[256];
-
- HDsprintf(base_name, "#pio_tmp_%lu", nf);
- pio_create_filename(iot, base_name, fname, sizeof(fname));
- if (pio_debug_level > 0)
- HDfprintf(output, "rank %d: data filename=%s\n", pio_mpi_rank_g, fname);
-
- /* Need barrier to make sure everyone starts at the same time */
- MPI_Barrier(pio_comm_g);
-
- io_time_set(res.timers, HDF5_GROSS_WRITE_FIXED_DIMS, TSTART);
- hrc = do_fopen(&param, fname, &fd, PIO_CREATE | PIO_WRITE);
-
- VRFY((hrc == SUCCESS), "do_fopen failed");
-
- io_time_set(res.timers, HDF5_FINE_WRITE_FIXED_DIMS, TSTART);
- hrc = do_write(&res, &fd, &param, ndsets, nbytes, buf_size, buffer);
- io_time_set(res.timers, HDF5_FINE_WRITE_FIXED_DIMS, TSTOP);
-
- VRFY((hrc == SUCCESS), "do_write failed");
-
- /* Close file for write */
- hrc = do_fclose(iot, &fd);
-
- io_time_set(res.timers, HDF5_GROSS_WRITE_FIXED_DIMS, TSTOP);
- VRFY((hrc == SUCCESS), "do_fclose failed");
-
- if (!param.h5_write_only) {
- /*
- * Read performance measurement
- */
- /* Need barrier to make sure everyone is done writing and has
- * closed the file. Also to make sure everyone starts reading
- * at the same time.
- */
- MPI_Barrier(pio_comm_g);
-
- /* Open file for read */
- io_time_set(res.timers, HDF5_GROSS_READ_FIXED_DIMS, TSTART);
- hrc = do_fopen(&param, fname, &fd, PIO_READ);
-
- VRFY((hrc == SUCCESS), "do_fopen failed");
-
- io_time_set(res.timers, HDF5_FINE_READ_FIXED_DIMS, TSTART);
- hrc = do_read(&res, &fd, &param, ndsets, nbytes, buf_size, buffer);
- io_time_set(res.timers, HDF5_FINE_READ_FIXED_DIMS, TSTOP);
- VRFY((hrc == SUCCESS), "do_read failed");
-
- /* Close file for read */
- hrc = do_fclose(iot, &fd);
-
- io_time_set(res.timers, HDF5_GROSS_READ_FIXED_DIMS, TSTOP);
- VRFY((hrc == SUCCESS), "do_fclose failed");
- }
-
- /* Need barrier to make sure everyone is done with the file */
- /* before it may be removed by do_cleanupfile */
- MPI_Barrier(pio_comm_g);
- do_cleanupfile(iot, fname);
- }
-
-done:
- /* clean up */
- /* release HDF5 objects */
-
- /* close any opened files */
- /* no remove(fname) because that should have happened normally. */
- switch (iot) {
- case POSIXIO:
- if (fd.posixfd != -1)
- hrc = do_fclose(iot, &fd);
- break;
- case MPIO:
- if (fd.mpifd != MPI_FILE_NULL)
- hrc = do_fclose(iot, &fd);
- break;
- case PHDF5:
- if (fd.h5fd != -1)
- hrc = do_fclose(iot, &fd);
- break;
- default:
- break;
- }
-
- /* release generic resources */
- if (buffer)
- HDfree(buffer);
- res.ret_code = ret_code;
- return res;
-}
-
-/*
- * Function: pio_create_filename
- * Purpose: Create a new filename to write to. Determine the correct
- * suffix to append to the filename by the type of I/O we're
- * doing. Also, place in the /tmp/{$USER,$LOGIN} directory if
- * USER or LOGIN are specified in the environment.
- * Return: Pointer to filename or NULL
- * Programmer: Bill Wendling, 21. November 2001
- * Modifications:
- */
-static char *
-pio_create_filename(iotype iot, const char *base_name, char *fullname, size_t size)
-{
- const char *prefix, *suffix = "";
- char * ptr, last = '\0';
- size_t i, j;
-
- if (!base_name || !fullname || size < 1)
- return NULL;
-
- HDmemset(fullname, 0, size);
-
- switch (iot) {
- case POSIXIO:
- suffix = ".posix";
- break;
- case MPIO:
- suffix = ".mpio";
- break;
- case PHDF5:
- suffix = ".h5";
- break;
- default:
- break;
- }
-
- /* First use the environment variable and then try the constant */
- prefix = HDgetenv("HDF5_PARAPREFIX");
-
-#ifdef HDF5_PARAPREFIX
- if (!prefix)
- prefix = HDF5_PARAPREFIX;
-#endif /* HDF5_PARAPREFIX */
-
- /* Prepend the prefix value to the base name */
- if (prefix && *prefix) {
- /* If the prefix specifies the HDF5_PARAPREFIX directory, then
- * default to using the "/tmp/$USER" or "/tmp/$LOGIN"
- * directory instead. */
- register char *user, *login, *subdir;
-
- user = HDgetenv("USER");
- login = HDgetenv("LOGIN");
- subdir = (user ? user : login);
-
- if (subdir) {
- for (i = 0; i < size - 1 && prefix[i]; i++)
- fullname[i] = prefix[i];
-
- fullname[i++] = '/';
-
- for (j = 0; i < size && subdir[j]; i++, j++)
- fullname[i] = subdir[j];
- }
- else {
- /* We didn't append the prefix yet */
- HDstrncpy(fullname, prefix, size);
- fullname[size - 1] = '\0';
- }
-
- if ((HDstrlen(fullname) + HDstrlen(base_name) + 1) < size) {
- /* Append the base_name with a slash first. Multiple slashes are
- * handled below. */
- h5_stat_t buf;
-
- if (HDstat(fullname, &buf) < 0)
- /* The directory doesn't exist just yet */
- if (HDmkdir(fullname, (mode_t)0755) < 0 && errno != EEXIST) {
- /* We couldn't make the "/tmp/${USER,LOGIN}" subdirectory.
- * Default to PREFIX's original prefix value. */
- HDstrcpy(fullname, prefix);
- }
-
- HDstrcat(fullname, "/");
- HDstrcat(fullname, base_name);
- }
- else {
- /* Buffer is too small */
- return NULL;
- }
- }
- else if (HDstrlen(base_name) >= size) {
- /* Buffer is too small */
- return NULL;
- }
- else {
- HDstrcpy(fullname, base_name);
- }
-
- /* Append a suffix */
- if (suffix) {
- if (HDstrlen(fullname) + HDstrlen(suffix) >= size)
- return NULL;
-
- HDstrcat(fullname, suffix);
- }
-
- /* Remove any double slashes in the filename */
- for (ptr = fullname, i = j = 0; ptr && i < size; i++, ptr++) {
- if (*ptr != '/' || last != '/')
- fullname[j++] = *ptr;
-
- last = *ptr;
- }
-
- return fullname;
-}
-
-/*
- * Function: do_write
- * Purpose: Write the required amount of data to the file.
- * Return: SUCCESS or FAIL
- * Programmer: Albert Cheng, Bill Wendling, 2001/12/13
- * Modifications:
- * Added 2D testing (Christian Chilan, 10. August 2005)
- */
-static herr_t
-do_write(results *res, file_descr *fd, parameters *parms, long ndsets, off_t nbytes, size_t buf_size,
- void *buffer)
-{
- int ret_code = SUCCESS;
- int rc; /*routine return code */
- long ndset;
- size_t blk_size; /* The block size to subdivide the xfer buffer into */
- off_t nbytes_xfer; /* Total number of bytes transferred so far */
- size_t nbytes_xfer_advance; /* Number of bytes transferred in a single I/O operation */
- size_t nbytes_toxfer; /* Number of bytes to transfer a particular time */
- char dname[64];
- off_t dset_offset = 0; /*dataset offset in a file */
- off_t bytes_begin[2]; /*first elmt this process transfer */
- off_t bytes_count; /*number of elmts this process transfer */
- off_t snbytes = 0; /*size of a side of the dataset square */
- unsigned char *buf_p; /* Current buffer pointer */
-
- /* POSIX variables */
- off_t file_offset; /* File offset of the next transfer */
- off_t file_offset_advance; /* File offset advance after each I/O operation */
- off_t posix_file_offset; /* Base file offset of the next transfer */
-
- /* MPI variables */
- MPI_Offset mpi_file_offset; /* Base file offset of the next transfer*/
- MPI_Offset mpi_offset; /* Offset in MPI file */
- MPI_Offset mpi_offset_advance; /* Offset advance after each I/O operation */
- MPI_Datatype mpi_file_type; /* MPI derived type for 1D file */
- MPI_Datatype mpi_blk_type; /* MPI derived type for 1D buffer */
- MPI_Datatype mpi_cont_type; /* MPI derived type for 2D contiguous file */
- MPI_Datatype mpi_partial_buffer_cont; /* MPI derived type for partial 2D contiguous buffer */
- MPI_Datatype mpi_inter_type; /* MPI derived type for 2D interleaved file */
- MPI_Datatype mpi_partial_buffer_inter; /* MPI derived type for partial 2D interleaved buffer */
- MPI_Datatype mpi_full_buffer; /* MPI derived type for 2D full buffer */
- MPI_Datatype mpi_full_chunk; /* MPI derived type for 2D full chunk */
- MPI_Datatype mpi_chunk_inter_type; /* MPI derived type for 2D chunk interleaved file */
- MPI_Datatype mpi_collective_type; /* Generic MPI derived type for 2D collective access */
- MPI_Status mpi_status;
- int mrc; /* MPI return code */
-
- /* HDF5 variables */
- herr_t hrc; /*HDF5 return code */
- hsize_t h5dims[2]; /*dataset dim sizes */
- hid_t h5dset_space_id = H5I_INVALID_HID; /*dataset space ID */
- hid_t h5mem_space_id = H5I_INVALID_HID; /*memory dataspace ID */
- hid_t h5ds_id = H5I_INVALID_HID; /*dataset handle */
- hsize_t h5block[2]; /*dataspace selection */
- hsize_t h5stride[2];
- hsize_t h5count[2];
- hsize_t h5start[2];
- hssize_t h5offset[2]; /* Selection offset within dataspace */
- hid_t h5dcpl = H5I_INVALID_HID; /* Dataset creation property list */
- hid_t h5dxpl = H5I_INVALID_HID; /* Dataset transfer property list */
-
- /* Get the parameters from the parameter block */
- blk_size = parms->blk_size;
-
- /* There are two kinds of transfer patterns, contiguous and interleaved.
- * Let 0,1,2,...,n be data accessed by process 0,1,2,...,n
- * where n is rank of the last process.
- * In contiguous pattern, data are accessed as
- * 000...111...222...nnn...
- * In interleaved pattern, data are accessed as
- * 012...n012...n...
- * These are all in the scope of one dataset.
- */
-
- /* 1D dataspace */
- if (!parms->dim2d) {
- /* Contiguous Pattern: */
- if (!parms->interleaved) {
- bytes_begin[0] = (off_t)(((double)nbytes * pio_mpi_rank_g) / pio_mpi_nprocs_g);
- } /* end if */
- /* Interleaved Pattern: */
- else {
- bytes_begin[0] = (off_t)(blk_size * (size_t)pio_mpi_rank_g);
- } /* end else */
-
- /* Prepare buffer for verifying data */
- if (parms->verify)
- memset(buffer, pio_mpi_rank_g + 1, buf_size);
- } /* end if */
- /* 2D dataspace */
- else {
- /* nbytes is always the number of bytes per dataset (1D or 2D). If the
- dataspace is 2D, snbytes is the size of a side of the dataset square.
- */
- snbytes = sqrto(nbytes);
-
- /* Contiguous Pattern: */
- if (!parms->interleaved) {
- bytes_begin[0] = (off_t)((double)snbytes * pio_mpi_rank_g / pio_mpi_nprocs_g);
- bytes_begin[1] = 0;
- } /* end if */
- /* Interleaved Pattern: */
- else {
- bytes_begin[0] = 0;
-
- if (!parms->h5_use_chunks || parms->io_type == PHDF5)
- bytes_begin[1] = (off_t)(blk_size * (size_t)pio_mpi_rank_g);
- else
- bytes_begin[1] = (off_t)(blk_size * blk_size * (size_t)pio_mpi_rank_g);
- } /* end else */
-
- /* Prepare buffer for verifying data */
- if (parms->verify)
- HDmemset(buffer, pio_mpi_rank_g + 1, buf_size * blk_size);
- } /* end else */
-
- /* Calculate the total number of bytes (bytes_count) to be
- * transferred by this process. It may be different for different
- * transfer pattern due to rounding to integral values.
- */
- /*
- * Calculate the beginning bytes of this process and the next.
- * bytes_count is the difference between these two beginnings.
- * This way, it eliminates any rounding errors.
- * (This is tricky, don't mess with the formula, rounding errors
- * can easily get introduced) */
- bytes_count = (off_t)(((double)nbytes * (pio_mpi_rank_g + 1)) / pio_mpi_nprocs_g) -
- (off_t)(((double)nbytes * pio_mpi_rank_g) / pio_mpi_nprocs_g);
-
- /* debug */
- if (pio_debug_level >= 4) {
- HDprint_rank(output);
- if (!parms->dim2d) {
- HDfprintf(output,
- "Debug(do_write): "
- "buf_size=%zu, bytes_begin=%" H5_PRINTF_LL_WIDTH "d, bytes_count=%" H5_PRINTF_LL_WIDTH
- "d\n",
- buf_size, (long long)bytes_begin[0], (long long)bytes_count);
- }
- else {
- HDfprintf(output,
- "Debug(do_write): "
- "linear buf_size=%zu, bytes_begin=(%" H5_PRINTF_LL_WIDTH "d,%" H5_PRINTF_LL_WIDTH
- "d), bytes_count=%" H5_PRINTF_LL_WIDTH "d\n",
- buf_size * blk_size, (long long)bytes_begin[0], (long long)bytes_begin[1],
- (long long)bytes_count);
- }
- }
-
- /* I/O Access specific setup */
- switch (parms->io_type) {
- case POSIXIO:
- /* No extra setup */
- break;
-
- case MPIO: /* MPI-I/O setup */
- /* 1D dataspace */
- if (!parms->dim2d) {
- /* Build block's derived type */
- mrc = MPI_Type_contiguous((int)blk_size, MPI_BYTE, &mpi_blk_type);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
- /* Build file's derived type */
- mrc = MPI_Type_vector((int)(buf_size / blk_size), (int)1, (int)pio_mpi_nprocs_g, mpi_blk_type,
- &mpi_file_type);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
- /* Commit file type */
- mrc = MPI_Type_commit(&mpi_file_type);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-
- /* Commit buffer type */
- mrc = MPI_Type_commit(&mpi_blk_type);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_COMMIT");
- } /* end if */
- /* 2D dataspace */
- else {
- /* Build partial buffer derived type for contiguous access */
-
- mrc = MPI_Type_contiguous((int)buf_size, MPI_BYTE, &mpi_partial_buffer_cont);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
- /* Commit partial buffer derived type */
- mrc = MPI_Type_commit(&mpi_partial_buffer_cont);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-
- /* Build contiguous file's derived type */
- mrc = MPI_Type_vector((int)blk_size, (int)1, (int)((size_t)snbytes / buf_size),
- mpi_partial_buffer_cont, &mpi_cont_type);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
- /* Commit contiguous file type */
- mrc = MPI_Type_commit(&mpi_cont_type);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-
- /* Build partial buffer derived type for interleaved access */
- mrc = MPI_Type_contiguous((int)blk_size, MPI_BYTE, &mpi_partial_buffer_inter);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
- /* Commit partial buffer derived type */
- mrc = MPI_Type_commit(&mpi_partial_buffer_inter);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-
- /* Build interleaved file's derived type */
- mrc = MPI_Type_vector((int)buf_size, (int)1, (int)((size_t)snbytes / blk_size),
- mpi_partial_buffer_inter, &mpi_inter_type);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
- /* Commit interleaved file type */
- mrc = MPI_Type_commit(&mpi_inter_type);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-
- /* Build full buffer derived type */
- mrc = MPI_Type_contiguous((int)(blk_size * buf_size), MPI_BYTE, &mpi_full_buffer);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
- /* Commit full buffer derived type */
- mrc = MPI_Type_commit(&mpi_full_buffer);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-
- /* Build full chunk derived type */
- mrc = MPI_Type_contiguous((int)(blk_size * blk_size), MPI_BYTE, &mpi_full_chunk);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
- /* Commit full chunk derived type */
- mrc = MPI_Type_commit(&mpi_full_chunk);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-
- /* Build chunk interleaved file's derived type */
- mrc = MPI_Type_vector((int)(buf_size / blk_size), (int)1, (int)((size_t)snbytes / blk_size),
- mpi_full_chunk, &mpi_chunk_inter_type);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
- /* Commit chunk interleaved file type */
- mrc = MPI_Type_commit(&mpi_chunk_inter_type);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-
- } /* end else */
- break;
-
- case PHDF5: /* HDF5 setup */
- /* 1D dataspace */
- if (!parms->dim2d) {
- if (nbytes > 0) {
- /* define a contiguous dataset of nbytes native bytes */
- h5dims[0] = (hsize_t)nbytes;
- h5dset_space_id = H5Screate_simple(1, h5dims, NULL);
- VRFY((h5dset_space_id >= 0), "H5Screate_simple");
-
- /* Set up the file dset space id to select the pattern to access */
- if (!parms->interleaved) {
- /* Contiguous pattern */
- h5start[0] = (hsize_t)bytes_begin[0];
- h5stride[0] = h5block[0] = blk_size;
- h5count[0] = buf_size / blk_size;
- } /* end if */
- else {
- /* Interleaved access pattern */
- /* Skip offset over blocks of other processes */
- h5start[0] = (hsize_t)bytes_begin[0];
- h5stride[0] = blk_size * (size_t)pio_mpi_nprocs_g;
- h5block[0] = blk_size;
- h5count[0] = buf_size / blk_size;
- } /* end else */
- hrc = H5Sselect_hyperslab(h5dset_space_id, H5S_SELECT_SET, h5start, h5stride, h5count,
- h5block);
- VRFY((hrc >= 0), "H5Sselect_hyperslab");
- } /* end if */
- else {
- h5dset_space_id = H5Screate(H5S_SCALAR);
- VRFY((h5dset_space_id >= 0), "H5Screate");
- } /* end else */
-
- /* Create the memory dataspace that corresponds to the xfer buffer */
- if (buf_size > 0) {
- h5dims[0] = buf_size;
- h5mem_space_id = H5Screate_simple(1, h5dims, NULL);
- VRFY((h5mem_space_id >= 0), "H5Screate_simple");
- } /* end if */
- else {
- h5mem_space_id = H5Screate(H5S_SCALAR);
- VRFY((h5mem_space_id >= 0), "H5Screate");
- } /* end else */
- } /* end if */
- /* 2D dataspace */
- else {
- if (nbytes > 0) {
- /* define a contiguous dataset of nbytes native bytes */
- h5dims[0] = (hsize_t)snbytes;
- h5dims[1] = (hsize_t)snbytes;
- h5dset_space_id = H5Screate_simple(2, h5dims, NULL);
- VRFY((h5dset_space_id >= 0), "H5Screate_simple");
-
- /* Set up the file dset space id to select the pattern to access */
- if (!parms->interleaved) {
- /* Contiguous pattern */
- h5start[0] = (hsize_t)bytes_begin[0];
- h5start[1] = (hsize_t)bytes_begin[1];
- h5stride[0] = 1;
- h5stride[1] = h5block[0] = h5block[1] = blk_size;
- h5count[0] = 1;
- h5count[1] = buf_size / blk_size;
- } /* end if */
- else {
- /* Interleaved access pattern */
- /* Skip offset over blocks of other processes */
- h5start[0] = (hsize_t)bytes_begin[0];
- h5start[1] = (hsize_t)bytes_begin[1];
- h5stride[0] = blk_size;
- h5stride[1] = blk_size * (size_t)pio_mpi_nprocs_g;
- h5block[0] = h5block[1] = blk_size;
- h5count[0] = buf_size / blk_size;
- h5count[1] = 1;
- } /* end else */
- hrc = H5Sselect_hyperslab(h5dset_space_id, H5S_SELECT_SET, h5start, h5stride, h5count,
- h5block);
- VRFY((hrc >= 0), "H5Sselect_hyperslab");
- } /* end if */
- else {
- h5dset_space_id = H5Screate(H5S_SCALAR);
- VRFY((h5dset_space_id >= 0), "H5Screate");
- } /* end else */
-
- /* Create the memory dataspace that corresponds to the xfer buffer */
- if (buf_size > 0) {
- if (!parms->interleaved) {
- h5dims[0] = blk_size;
- h5dims[1] = buf_size;
- }
- else {
- h5dims[0] = buf_size;
- h5dims[1] = blk_size;
- }
- h5mem_space_id = H5Screate_simple(2, h5dims, NULL);
- VRFY((h5mem_space_id >= 0), "H5Screate_simple");
- } /* end if */
- else {
- h5mem_space_id = H5Screate(H5S_SCALAR);
- VRFY((h5mem_space_id >= 0), "H5Screate");
- } /* end else */
- } /* end else */
-
- /* Create the dataset transfer property list */
- h5dxpl = H5Pcreate(H5P_DATASET_XFER);
- if (h5dxpl < 0) {
- HDfprintf(stderr, "HDF5 Property List Create failed\n");
- GOTOERROR(FAIL);
- }
-
- /* Change to collective I/O, if asked */
- if (parms->collective) {
- hrc = H5Pset_dxpl_mpio(h5dxpl, H5FD_MPIO_COLLECTIVE);
- if (hrc < 0) {
- HDfprintf(stderr, "HDF5 Property List Set failed\n");
- GOTOERROR(FAIL);
- } /* end if */
- } /* end if */
- break;
-
- default:
- break;
- } /* end switch */
-
- for (ndset = 1; ndset <= ndsets; ++ndset) {
-
- /* Calculate dataset offset within a file */
-
- /* create dataset */
- switch (parms->io_type) {
- case POSIXIO:
- case MPIO:
- /* both posix and mpi io just need dataset offset in file*/
- dset_offset = (ndset - 1) * nbytes;
- break;
-
- case PHDF5:
- h5dcpl = H5Pcreate(H5P_DATASET_CREATE);
- if (h5dcpl < 0) {
- HDfprintf(stderr, "HDF5 Property List Create failed\n");
- GOTOERROR(FAIL);
- }
- /* 1D dataspace */
- if (!parms->dim2d) {
- /* Make the dataset chunked if asked */
- if (parms->h5_use_chunks) {
- /* Set the chunk size to be the same as the buffer size */
- h5dims[0] = blk_size;
- hrc = H5Pset_chunk(h5dcpl, 1, h5dims);
- if (hrc < 0) {
- HDfprintf(stderr, "HDF5 Property List Set failed\n");
- GOTOERROR(FAIL);
- } /* end if */
- } /* end if */
- } /* end if */
- else {
- /* 2D dataspace */
- if (parms->h5_use_chunks) {
- /* Set the chunk size to be the same as the block size */
- h5dims[0] = blk_size;
- h5dims[1] = blk_size;
- hrc = H5Pset_chunk(h5dcpl, 2, h5dims);
- if (hrc < 0) {
- HDfprintf(stderr, "HDF5 Property List Set failed\n");
- GOTOERROR(FAIL);
- } /* end if */
- } /* end if */
- } /* end else */
-
- HDsprintf(dname, "Dataset_%ld", ndset);
- h5ds_id = H5DCREATE(fd->h5fd, dname, ELMT_H5_TYPE, h5dset_space_id, h5dcpl);
-
- if (h5ds_id < 0) {
- HDfprintf(stderr, "HDF5 Dataset Create failed\n");
- GOTOERROR(FAIL);
- }
-
- hrc = H5Pclose(h5dcpl);
- /* verifying the close of the dcpl */
- if (hrc < 0) {
- HDfprintf(stderr, "HDF5 Property List Close failed\n");
- GOTOERROR(FAIL);
- }
- break;
-
- default:
- break;
- }
-
- /* The task is to transfer bytes_count bytes, starting at
- * bytes_begin position, using transfer buffer of buf_size bytes.
- * If interleaved, select buf_size at a time, in round robin
- * fashion, according to number of process. Otherwise, select
- * all bytes_count in contiguous.
- */
- nbytes_xfer = 0;
-
- /* 1D dataspace */
- if (!parms->dim2d) {
- /* Set base file offset for all I/O patterns and POSIX access */
- posix_file_offset = dset_offset + bytes_begin[0];
-
- /* Set base file offset for all I/O patterns and MPI access */
- mpi_file_offset = (MPI_Offset)(dset_offset + bytes_begin[0]);
- } /* end if */
- else {
- /* Set base file offset for all I/O patterns and POSIX access */
- posix_file_offset = dset_offset + bytes_begin[0] * snbytes + bytes_begin[1];
-
- /* Set base file offset for all I/O patterns and MPI access */
- mpi_file_offset = (MPI_Offset)(dset_offset + bytes_begin[0] * snbytes + bytes_begin[1]);
- } /* end else */
-
- /* Start "raw data" write timer */
- io_time_set(res->timers, HDF5_RAW_WRITE_FIXED_DIMS, TSTART);
-
- while (nbytes_xfer < bytes_count) {
- /* Write */
- /* Calculate offset of write within a dataset/file */
- switch (parms->io_type) {
- case POSIXIO:
- /* 1D dataspace */
- if (!parms->dim2d) {
- /* Contiguous pattern */
- if (!parms->interleaved) {
- /* Compute file offset */
- file_offset = posix_file_offset + (off_t)nbytes_xfer;
-
- /* only care if seek returns error */
- rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0;
- VRFY((rc == 0), "POSIXSEEK");
-
- /* check if all bytes are written */
- rc = ((ssize_t)buf_size == POSIXWRITE(fd->posixfd, buffer, buf_size));
- VRFY((rc != 0), "POSIXWRITE");
-
- /* Advance global offset in dataset */
- nbytes_xfer += (ssize_t)buf_size;
- } /* end if */
- /* Interleaved access pattern */
- else {
- /* Set the base of user's buffer */
- buf_p = (unsigned char *)buffer;
-
- /* Set the number of bytes to transfer this time */
- nbytes_toxfer = buf_size;
-
- /* Loop over the buffers to write */
- while (nbytes_toxfer > 0) {
- /* Skip offset over blocks of other processes */
- file_offset = posix_file_offset + (off_t)(nbytes_xfer * pio_mpi_nprocs_g);
-
- /* only care if seek returns error */
- rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0;
- VRFY((rc == 0), "POSIXSEEK");
-
- /* check if all bytes are written */
- rc = ((ssize_t)blk_size == POSIXWRITE(fd->posixfd, buf_p, blk_size));
- VRFY((rc != 0), "POSIXWRITE");
-
- /* Advance location in buffer */
- buf_p += blk_size;
-
- /* Advance global offset in dataset */
- nbytes_xfer += (ssize_t)blk_size;
-
- /* Decrement number of bytes left this time */
- nbytes_toxfer -= blk_size;
- } /* end while */
- } /* end else */
- } /* end if */
- /* 2D dataspace */
- else {
- /* Contiguous storage */
- if (!parms->h5_use_chunks) {
- /* Contiguous access pattern */
- if (!parms->interleaved) {
- /* Compute file offset */
- file_offset = posix_file_offset +
- (off_t)((((size_t)nbytes_xfer / blk_size) / (size_t)snbytes) *
- (blk_size * (size_t)snbytes) +
- (((size_t)nbytes_xfer / blk_size) % (size_t)snbytes));
-
- /* Number of bytes to be transferred per I/O operation */
- nbytes_xfer_advance = buf_size;
-
- /* Global offset advance after each I/O operation */
- file_offset_advance = (off_t)snbytes;
- } /* end if */
- /* Interleaved access pattern */
- else {
- /* Compute file offset */
- file_offset =
- posix_file_offset +
- (off_t)(((((size_t)nbytes_xfer / buf_size) * (size_t)pio_mpi_nprocs_g) /
- (size_t)snbytes) *
- (buf_size * (size_t)snbytes) +
- (((size_t)nbytes_xfer / buf_size) * (size_t)pio_mpi_nprocs_g) %
- (size_t)snbytes);
-
- /* Number of bytes to be transferred per I/O operation */
- nbytes_xfer_advance = blk_size;
-
- /* Global offset advance after each I/O operation */
- file_offset_advance = (off_t)snbytes;
- } /* end else */
- } /* end if */
- /* Chunked storage */
- else {
- /*Contiguous access pattern */
- if (!parms->interleaved) {
- /* Compute file offset */
- file_offset = posix_file_offset + (off_t)nbytes_xfer;
-
- /* Number of bytes to be transferred per I/O operation */
- nbytes_xfer_advance = blk_size * buf_size;
-
- /* Global offset advance after each I/O operation */
- file_offset_advance = 0;
- } /* end if */
- /*Interleaved access pattern */
- else {
- /* Compute file offset */
- /* Before simplification */
- /* file_offset=posix_file_offset+(off_t)((nbytes_xfer/(buf_size/blk_size)
- *pio_mpi_nprocs_g)/(snbytes/blk_size*(blk_size*blk_size))*(buf_size/blk_size
- *snbytes/blk_size*(blk_size*blk_size))+((nbytes_xfer/(buf_size/blk_size))
- *pio_mpi_nprocs_g)%(snbytes/blk_size*(blk_size*blk_size))); */
-
- file_offset = posix_file_offset +
- (off_t)((((size_t)nbytes_xfer / (buf_size / blk_size) *
- (size_t)pio_mpi_nprocs_g) /
- ((size_t)snbytes * blk_size)) *
- (buf_size * (size_t)snbytes) +
- (((size_t)nbytes_xfer / (buf_size / blk_size)) *
- (size_t)pio_mpi_nprocs_g) %
- ((size_t)snbytes * blk_size));
-
- /* Number of bytes to be transferred per I/O operation */
- nbytes_xfer_advance = blk_size * blk_size;
-
- /* Global offset advance after each I/O operation */
- /* file_offset_advance = (off_t)(snbytes/blk_size*(blk_size*blk_size)); */
- file_offset_advance = (off_t)snbytes * (off_t)blk_size;
- } /* end else */
- } /* end else */
-
- /* Common code for file access */
-
- /* Set the base of user's buffer */
- buf_p = (unsigned char *)buffer;
-
- /* Set the number of bytes to transfer this time */
- nbytes_toxfer = buf_size * blk_size;
-
- /* Loop over portions of the buffer to write */
- while (nbytes_toxfer > 0) {
- /* only care if seek returns error */
- rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0;
- VRFY((rc == 0), "POSIXSEEK");
-
- /* check if all bytes are written */
- rc = ((ssize_t)nbytes_xfer_advance ==
- POSIXWRITE(fd->posixfd, buf_p, nbytes_xfer_advance));
- VRFY((rc != 0), "POSIXWRITE");
-
- /* Advance location in buffer */
- buf_p += nbytes_xfer_advance;
-
- /* Advance global offset in dataset */
- nbytes_xfer += (ssize_t)nbytes_xfer_advance;
-
- /* Decrement number of bytes left this time */
- nbytes_toxfer -= nbytes_xfer_advance;
-
- /* Partially advance file offset */
- file_offset += file_offset_advance;
- } /* end while */
-
- } /* end else */
-
- break;
-
- case MPIO:
- /* 1D dataspace */
- if (!parms->dim2d) {
- /* Independent file access */
- if (!parms->collective) {
- /* Contiguous pattern */
- if (!parms->interleaved) {
- /* Compute offset in file */
- mpi_offset = mpi_file_offset + nbytes_xfer;
-
- /* Perform independent write */
- mrc =
- MPI_File_write_at(fd->mpifd, mpi_offset, buffer,
- (int)(buf_size / blk_size), mpi_blk_type, &mpi_status);
- VRFY((mrc == MPI_SUCCESS), "MPIO_WRITE");
-
- /* Advance global offset in dataset */
- nbytes_xfer += (ssize_t)buf_size;
- } /* end if */
- /* Interleaved access pattern */
- else {
- /* Set the base of user's buffer */
- buf_p = (unsigned char *)buffer;
-
- /* Set the number of bytes to transfer this time */
- nbytes_toxfer = buf_size;
-
- /* Loop over the buffers to write */
- while (nbytes_toxfer > 0) {
- /* Skip offset over blocks of other processes */
- mpi_offset = mpi_file_offset + (nbytes_xfer * pio_mpi_nprocs_g);
-
- /* Perform independent write */
- mrc = MPI_File_write_at(fd->mpifd, mpi_offset, buf_p, (int)1,
- mpi_blk_type, &mpi_status);
- VRFY((mrc == MPI_SUCCESS), "MPIO_WRITE");
-
- /* Advance location in buffer */
- buf_p += blk_size;
-
- /* Advance global offset in dataset */
- nbytes_xfer += (ssize_t)blk_size;
-
- /* Decrement number of bytes left this time */
- nbytes_toxfer -= blk_size;
- } /* end while */
- } /* end else */
- } /* end if */
- /* Collective file access */
- else {
- /* Contiguous access pattern */
- if (!parms->interleaved) {
- /* Compute offset in file */
- mpi_offset = mpi_file_offset + nbytes_xfer;
-
- /* Perform independent write */
- mrc = MPI_File_write_at_all(fd->mpifd, mpi_offset, buffer,
- (int)(buf_size / blk_size), mpi_blk_type,
- &mpi_status);
- VRFY((mrc == MPI_SUCCESS), "MPIO_WRITE");
-
- /* Advance global offset in dataset */
- nbytes_xfer += (ssize_t)buf_size;
- } /* end if */
- /* Interleaved access pattern */
- else {
- /* Compute offset in file */
- mpi_offset = mpi_file_offset + (nbytes_xfer * pio_mpi_nprocs_g);
-
- /* Set the file view */
- mrc = MPI_File_set_view(fd->mpifd, mpi_offset, mpi_blk_type, mpi_file_type,
- (char *)"native", h5_io_info_g);
- VRFY((mrc == MPI_SUCCESS), "MPIO_VIEW");
-
- /* Perform write */
- mrc = MPI_File_write_at_all(fd->mpifd, 0, buffer, (int)(buf_size / blk_size),
- mpi_blk_type, &mpi_status);
- VRFY((mrc == MPI_SUCCESS), "MPIO_WRITE");
-
- /* Advance global offset in dataset */
- nbytes_xfer += (ssize_t)buf_size;
- } /* end else */
- } /* end else */
- } /* end if */
- /* 2D dataspace */
- else {
- /* Contiguous storage */
- if (!parms->h5_use_chunks) {
- /* Contiguous access pattern */
- if (!parms->interleaved) {
- /* Compute offset in file */
- mpi_offset =
- mpi_file_offset +
- (MPI_Offset)((((size_t)nbytes_xfer / blk_size) / (size_t)snbytes) *
- (blk_size * (size_t)snbytes)) +
- (MPI_Offset)(((size_t)nbytes_xfer / blk_size) % (size_t)snbytes);
-
- /* Number of bytes to be transferred per I/O operation */
- nbytes_xfer_advance = buf_size;
-
- /* Global offset advance after each I/O operation */
- mpi_offset_advance = snbytes;
-
- /* MPI type to be used for collective access */
- mpi_collective_type = mpi_cont_type;
- } /* end if */
- /* Interleaved access pattern */
- else {
- /* Compute offset in file */
- mpi_offset =
- mpi_file_offset +
- (MPI_Offset)(
- ((((size_t)nbytes_xfer / buf_size) * (size_t)pio_mpi_nprocs_g) /
- (size_t)snbytes) *
- (buf_size * (size_t)snbytes)) +
- (MPI_Offset)(
- (((size_t)nbytes_xfer / buf_size) * (size_t)pio_mpi_nprocs_g) %
- (size_t)snbytes);
-
- /* Number of bytes to be transferred per I/O operation */
- nbytes_xfer_advance = blk_size;
-
- /* Global offset advance after each I/O operation */
- mpi_offset_advance = snbytes;
-
- /* MPI type to be used for collective access */
- mpi_collective_type = mpi_inter_type;
- } /* end else */
- } /* end if */
- /* Chunked storage */
- else {
- /*Contiguous access pattern */
- if (!parms->interleaved) {
- /* Compute offset in file */
- mpi_offset = mpi_file_offset + nbytes_xfer;
-
- /* Number of bytes to be transferred per I/O operation */
- nbytes_xfer_advance = blk_size * buf_size;
-
- /* Global offset advance after each I/O operation */
- mpi_offset_advance = 0;
-
- /* MPI type to be used for collective access */
- mpi_collective_type = mpi_full_buffer;
- } /* end if */
- /*Interleaved access pattern */
- else {
- /* Compute offset in file */
- /* Before simplification */
- /* mpi_offset=mpi_file_offset+(nbytes_xfer/(buf_size/blk_size)
- *pio_mpi_nprocs_g)/(snbytes/blk_size*(blk_size*blk_size))*
- (buf_size/blk_size*snbytes/blk_size*(blk_size*blk_size))+
- ((nbytes_xfer/(buf_size/blk_size))*pio_mpi_nprocs_g)%(snbytes
- /blk_size*(blk_size*blk_size)); */
- mpi_offset = mpi_file_offset +
- (MPI_Offset)((((size_t)nbytes_xfer / (buf_size / blk_size) *
- (size_t)pio_mpi_nprocs_g) /
- ((size_t)snbytes * blk_size)) *
- (buf_size * (size_t)snbytes)) +
- (MPI_Offset)((((size_t)nbytes_xfer / (buf_size / blk_size)) *
- (size_t)pio_mpi_nprocs_g) %
- ((size_t)snbytes * blk_size));
-
- /* Number of bytes to be transferred per I/O operation */
- nbytes_xfer_advance = blk_size * blk_size;
-
- /* Global offset advance after each I/O operation */
- /* mpi_offset_advance = (MPI_Offset)(snbytes/blk_size*(blk_size*blk_size)); */
- mpi_offset_advance = (MPI_Offset)((size_t)snbytes * blk_size);
-
- /* MPI type to be used for collective access */
- mpi_collective_type = mpi_chunk_inter_type;
- } /* end else */
- } /* end else */
-
- /* Common code for independent file access */
- if (!parms->collective) {
- /* Set the base of user's buffer */
- buf_p = (unsigned char *)buffer;
-
- /* Set the number of bytes to transfer this time */
- nbytes_toxfer = buf_size * blk_size;
-
- /* Loop over portions of the buffer to write */
- while (nbytes_toxfer > 0) {
- /* Perform independent write */
- mrc = MPI_File_write_at(fd->mpifd, mpi_offset, buf_p,
- (int)nbytes_xfer_advance, MPI_BYTE, &mpi_status);
- VRFY((mrc == MPI_SUCCESS), "MPIO_WRITE");
-
- /* Advance location in buffer */
- buf_p += nbytes_xfer_advance;
-
- /* Advance global offset in dataset */
- nbytes_xfer += (ssize_t)nbytes_xfer_advance;
-
- /* Decrement number of bytes left this time */
- nbytes_toxfer -= nbytes_xfer_advance;
-
- /* Partially advance global offset in dataset */
- mpi_offset += mpi_offset_advance;
- } /* end while */
- } /* end if */
-
- /* Common code for collective file access */
- else {
- /* Set the file view */
- mrc = MPI_File_set_view(fd->mpifd, mpi_offset, MPI_BYTE, mpi_collective_type,
- (char *)"native", h5_io_info_g);
- VRFY((mrc == MPI_SUCCESS), "MPIO_VIEW");
-
- /* Perform write */
- MPI_File_write_at_all(fd->mpifd, 0, buffer, (int)(buf_size * blk_size), MPI_BYTE,
- &mpi_status);
- VRFY((mrc == MPI_SUCCESS), "MPIO_WRITE");
-
- /* Advance global offset in dataset */
- nbytes_xfer += (off_t)buf_size * (off_t)blk_size;
- } /* end else */
-
- } /* end else */
-
- break;
-
- case PHDF5:
- /* 1D dataspace */
- if (!parms->dim2d) {
- /* Set up the file dset space id to move the selection to process */
- if (!parms->interleaved) {
- /* Contiguous pattern */
- h5offset[0] = nbytes_xfer;
- } /* end if */
- else {
- /* Interleaved access pattern */
- /* Skip offset over blocks of other processes */
- h5offset[0] = (nbytes_xfer * pio_mpi_nprocs_g);
- } /* end else */
- hrc = H5Soffset_simple(h5dset_space_id, h5offset);
- VRFY((hrc >= 0), "H5Soffset_simple");
-
- /* Write the buffer out */
- hrc =
- H5Dwrite(h5ds_id, ELMT_H5_TYPE, h5mem_space_id, h5dset_space_id, h5dxpl, buffer);
- VRFY((hrc >= 0), "H5Dwrite");
-
- /* Increment number of bytes transferred */
- nbytes_xfer += (ssize_t)buf_size;
- } /* end if */
- /* 2D dataspace */
- else {
- /* Set up the file dset space id to move the selection to process */
- if (!parms->interleaved) {
- /* Contiguous pattern */
- h5offset[0] =
- (hssize_t)(((size_t)nbytes_xfer / ((size_t)snbytes * blk_size)) * blk_size);
- h5offset[1] =
- (hssize_t)(((size_t)nbytes_xfer % ((size_t)snbytes * blk_size)) / blk_size);
-
- } /* end if */
- else {
- /* Interleaved access pattern */
- /* Skip offset over blocks of other processes */
- h5offset[0] = (hssize_t)((((size_t)nbytes_xfer * (size_t)pio_mpi_nprocs_g) /
- ((size_t)snbytes * buf_size)) *
- buf_size);
- h5offset[1] = (hssize_t)((((size_t)nbytes_xfer * (size_t)pio_mpi_nprocs_g) %
- ((size_t)snbytes * buf_size)) /
- buf_size);
-
- } /* end else */
- hrc = H5Soffset_simple(h5dset_space_id, h5offset);
- VRFY((hrc >= 0), "H5Soffset_simple");
-
- /* Write the buffer out */
- hrc =
- H5Dwrite(h5ds_id, ELMT_H5_TYPE, h5mem_space_id, h5dset_space_id, h5dxpl, buffer);
- VRFY((hrc >= 0), "H5Dwrite");
-
- /* Increment number of bytes transferred */
- nbytes_xfer += (off_t)buf_size * (off_t)blk_size;
-
- } /* end else */
-
- break;
-
- default:
- break;
- } /* switch (parms->io_type) */
- } /* end while */
-
- /* Stop "raw data" write timer */
- io_time_set(res->timers, HDF5_RAW_WRITE_FIXED_DIMS, TSTOP);
-
- /* Calculate write time */
-
- /* Close dataset. Only HDF5 needs to do an explicit close. */
- if (parms->io_type == PHDF5) {
- hrc = H5Dclose(h5ds_id);
-
- if (hrc < 0) {
- HDfprintf(stderr, "HDF5 Dataset Close failed\n");
- GOTOERROR(FAIL);
- }
-
- h5ds_id = H5I_INVALID_HID;
- } /* end if */
- } /* end for */
-
-done:
- /* release MPI-I/O objects */
- if (parms->io_type == MPIO) {
- /* 1D dataspace */
- if (!parms->dim2d) {
- /* Free file type */
- mrc = MPI_Type_free(&mpi_file_type);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_FREE");
-
- /* Free buffer type */
- mrc = MPI_Type_free(&mpi_blk_type);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_FREE");
- } /* end if */
- /* 2D dataspace */
- else {
- /* Free partial buffer type for contiguous access */
- mrc = MPI_Type_free(&mpi_partial_buffer_cont);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_FREE");
-
- /* Free contiguous file type */
- mrc = MPI_Type_free(&mpi_cont_type);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_FREE");
-
- /* Free partial buffer type for interleaved access */
- mrc = MPI_Type_free(&mpi_partial_buffer_inter);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_FREE");
-
- /* Free interleaved file type */
- mrc = MPI_Type_free(&mpi_inter_type);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_FREE");
-
- /* Free full buffer type */
- mrc = MPI_Type_free(&mpi_full_buffer);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_FREE");
-
- /* Free full chunk type */
- mrc = MPI_Type_free(&mpi_full_chunk);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_FREE");
-
- /* Free chunk interleaved file type */
- mrc = MPI_Type_free(&mpi_chunk_inter_type);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_FREE");
- } /* end else */
- } /* end if */
-
- /* release HDF5 objects */
- if (h5dset_space_id != -1) {
- hrc = H5Sclose(h5dset_space_id);
- if (hrc < 0) {
- HDfprintf(stderr, "HDF5 Dataset Space Close failed\n");
- ret_code = FAIL;
- }
- else {
- h5dset_space_id = H5I_INVALID_HID;
- }
- }
-
- if (h5mem_space_id != -1) {
- hrc = H5Sclose(h5mem_space_id);
- if (hrc < 0) {
- HDfprintf(stderr, "HDF5 Memory Space Close failed\n");
- ret_code = FAIL;
- }
- else {
- h5mem_space_id = H5I_INVALID_HID;
- }
- }
-
- if (h5dxpl != -1) {
- hrc = H5Pclose(h5dxpl);
- if (hrc < 0) {
- HDfprintf(stderr, "HDF5 Dataset Transfer Property List Close failed\n");
- ret_code = FAIL;
- }
- else {
- h5dxpl = H5I_INVALID_HID;
- }
- }
-
- return ret_code;
-}
-
-static off_t
-sqrto(off_t x)
-{
- double root_x = sqrt((double)x);
- return (off_t)root_x;
-}
-
-/*
- * Function: do_read
- * Purpose: read the required amount of data from the file.
- * Return: SUCCESS or FAIL
- * Programmer: Albert Cheng 2001/12/13
- * Modifications:
- * Added 2D testing (Christian Chilan, 10. August 2005)
- */
-static herr_t
-do_read(results *res, file_descr *fd, parameters *parms, long ndsets, off_t nbytes, size_t buf_size,
- void *buffer /*out*/)
-{
- int ret_code = SUCCESS;
- int rc; /*routine return code */
- long ndset;
- size_t blk_size; /* The block size to subdivide the xfer buffer into */
- size_t bsize; /* Size of the actual buffer */
- off_t nbytes_xfer; /* Total number of bytes transferred so far */
- size_t nbytes_xfer_advance; /* Number of bytes transferred in a single I/O operation */
- size_t nbytes_toxfer; /* Number of bytes to transfer a particular time */
- char dname[64];
- off_t dset_offset = 0; /*dataset offset in a file */
- off_t bytes_begin[2]; /*first elmt this process transfer */
- off_t bytes_count; /*number of elmts this process transfer */
- off_t snbytes = 0; /*size of a side of the dataset square */
- unsigned char *buf_p; /* Current buffer pointer */
-
- /* POSIX variables */
- off_t file_offset; /* File offset of the next transfer */
- off_t file_offset_advance; /* File offset advance after each I/O operation */
- off_t posix_file_offset; /* Base file offset of the next transfer */
-
- /* MPI variables */
- MPI_Offset mpi_file_offset; /* Base file offset of the next transfer*/
- MPI_Offset mpi_offset; /* Offset in MPI file */
- MPI_Offset mpi_offset_advance; /* Offset advance after each I/O operation */
- MPI_Datatype mpi_file_type; /* MPI derived type for 1D file */
- MPI_Datatype mpi_blk_type; /* MPI derived type for 1D buffer */
- MPI_Datatype mpi_cont_type; /* MPI derived type for 2D contiguous file */
- MPI_Datatype mpi_partial_buffer_cont; /* MPI derived type for partial 2D contiguous buffer */
- MPI_Datatype mpi_inter_type; /* MPI derived type for 2D interleaved file */
- MPI_Datatype mpi_partial_buffer_inter; /* MPI derived type for partial 2D interleaved buffer */
- MPI_Datatype mpi_full_buffer; /* MPI derived type for 2D full buffer */
- MPI_Datatype mpi_full_chunk; /* MPI derived type for 2D full chunk */
- MPI_Datatype mpi_chunk_inter_type; /* MPI derived type for 2D chunk interleaved file */
- MPI_Datatype mpi_collective_type; /* Generic MPI derived type for 2D collective access */
- MPI_Status mpi_status;
- int mrc; /* MPI return code */
-
- /* HDF5 variables */
- herr_t hrc; /*HDF5 return code */
- hsize_t h5dims[2]; /*dataset dim sizes */
- hid_t h5dset_space_id = H5I_INVALID_HID; /*dataset space ID */
- hid_t h5mem_space_id = H5I_INVALID_HID; /*memory dataspace ID */
- hid_t h5ds_id = H5I_INVALID_HID; /*dataset handle */
- hsize_t h5block[2]; /*dataspace selection */
- hsize_t h5stride[2];
- hsize_t h5count[2];
- hsize_t h5start[2];
- hssize_t h5offset[2]; /* Selection offset within dataspace */
- hid_t h5dxpl = H5I_INVALID_HID; /* Dataset transfer property list */
-
- /* Get the parameters from the parameter block */
- blk_size = parms->blk_size;
-
- /* There are two kinds of transfer patterns, contiguous and interleaved.
- * Let 0,1,2,...,n be data accessed by process 0,1,2,...,n
- * where n is rank of the last process.
- * In contiguous pattern, data are accessed as
- * 000...111...222...nnn...
- * In interleaved pattern, data are accessed as
- * 012...n012...n...
- * These are all in the scope of one dataset.
- */
-
- /* 1D dataspace */
- if (!parms->dim2d) {
- bsize = buf_size;
- /* Contiguous Pattern: */
- if (!parms->interleaved) {
- bytes_begin[0] = (off_t)(((double)nbytes * pio_mpi_rank_g) / pio_mpi_nprocs_g);
- } /* end if */
- /* Interleaved Pattern: */
- else {
- bytes_begin[0] = (off_t)blk_size * (off_t)pio_mpi_rank_g;
- } /* end else */
- } /* end if */
- /* 2D dataspace */
- else {
- /* nbytes is always the number of bytes per dataset (1D or 2D). If the
- dataspace is 2D, snbytes is the size of a side of the 'dataset square'.
- */
- snbytes = sqrto(nbytes);
-
- bsize = buf_size * blk_size;
-
- /* Contiguous Pattern: */
- if (!parms->interleaved) {
- bytes_begin[0] = (off_t)((double)snbytes * pio_mpi_rank_g / pio_mpi_nprocs_g);
- bytes_begin[1] = 0;
- } /* end if */
- /* Interleaved Pattern: */
- else {
- bytes_begin[0] = 0;
-
- if (!parms->h5_use_chunks || parms->io_type == PHDF5)
- bytes_begin[1] = (off_t)blk_size * (off_t)pio_mpi_rank_g;
- else
- bytes_begin[1] = (off_t)blk_size * (off_t)blk_size * (off_t)pio_mpi_rank_g;
- } /* end else */
- } /* end else */
-
- /* Calculate the total number of bytes (bytes_count) to be
- * transferred by this process. It may be different for different
- * transfer pattern due to rounding to integral values.
- */
- /*
- * Calculate the beginning bytes of this process and the next.
- * bytes_count is the difference between these two beginnings.
- * This way, it eliminates any rounding errors.
- * (This is tricky, don't mess with the formula, rounding errors
- * can easily get introduced) */
- bytes_count = (off_t)(((double)nbytes * (pio_mpi_rank_g + 1)) / pio_mpi_nprocs_g) -
- (off_t)(((double)nbytes * pio_mpi_rank_g) / pio_mpi_nprocs_g);
-
- /* debug */
- if (pio_debug_level >= 4) {
- HDprint_rank(output);
- if (!parms->dim2d) {
- HDfprintf(output,
- "Debug(do_write): "
- "buf_size=%zu, bytes_begin=%" H5_PRINTF_LL_WIDTH "d, bytes_count=%" H5_PRINTF_LL_WIDTH
- "d\n",
- buf_size, (long long)bytes_begin[0], (long long)bytes_count);
- }
- else {
- HDfprintf(output,
- "Debug(do_write): "
- "linear buf_size=%zu, bytes_begin=(%" H5_PRINTF_LL_WIDTH "d,%" H5_PRINTF_LL_WIDTH
- "d), bytes_count=%" H5_PRINTF_LL_WIDTH "d\n",
- buf_size * blk_size, (long long)bytes_begin[0], (long long)bytes_begin[1],
- (long long)bytes_count);
- }
- }
-
- /* I/O Access specific setup */
- switch (parms->io_type) {
- case POSIXIO:
- /* No extra setup */
- break;
-
- case MPIO: /* MPI-I/O setup */
- /* 1D dataspace */
- if (!parms->dim2d) {
- /* Build block's derived type */
- mrc = MPI_Type_contiguous((int)blk_size, MPI_BYTE, &mpi_blk_type);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
- /* Build file's derived type */
- mrc = MPI_Type_vector((int)(buf_size / blk_size), (int)1, (int)pio_mpi_nprocs_g, mpi_blk_type,
- &mpi_file_type);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
- /* Commit file type */
- mrc = MPI_Type_commit(&mpi_file_type);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-
- /* Commit buffer type */
- mrc = MPI_Type_commit(&mpi_blk_type);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_COMMIT");
- } /* end if */
- /* 2D dataspace */
- else {
- /* Build partial buffer derived type for contiguous access */
- mrc = MPI_Type_contiguous((int)buf_size, MPI_BYTE, &mpi_partial_buffer_cont);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
- /* Commit partial buffer derived type */
- mrc = MPI_Type_commit(&mpi_partial_buffer_cont);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-
- /* Build contiguous file's derived type */
- mrc = MPI_Type_vector((int)blk_size, (int)1, (int)((size_t)snbytes / buf_size),
- mpi_partial_buffer_cont, &mpi_cont_type);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
- /* Commit contiguous file type */
- mrc = MPI_Type_commit(&mpi_cont_type);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-
- /* Build partial buffer derived type for interleaved access */
- mrc = MPI_Type_contiguous((int)blk_size, MPI_BYTE, &mpi_partial_buffer_inter);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
- /* Commit partial buffer derived type */
- mrc = MPI_Type_commit(&mpi_partial_buffer_inter);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-
- /* Build interleaved file's derived type */
- mrc = MPI_Type_vector((int)buf_size, (int)1, (int)((size_t)snbytes / blk_size),
- mpi_partial_buffer_inter, &mpi_inter_type);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
- /* Commit interleaved file type */
- mrc = MPI_Type_commit(&mpi_inter_type);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-
- /* Build full buffer derived type */
- mrc = MPI_Type_contiguous((int)(blk_size * buf_size), MPI_BYTE, &mpi_full_buffer);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
- /* Commit full buffer derived type */
- mrc = MPI_Type_commit(&mpi_full_buffer);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-
- /* Build full chunk derived type */
- mrc = MPI_Type_contiguous((int)(blk_size * blk_size), MPI_BYTE, &mpi_full_chunk);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
- /* Commit full chunk derived type */
- mrc = MPI_Type_commit(&mpi_full_chunk);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_COMMIT");
-
- /* Build chunk interleaved file's derived type */
- mrc = MPI_Type_vector((int)(buf_size / blk_size), (int)1, (int)((size_t)snbytes / blk_size),
- mpi_full_chunk, &mpi_chunk_inter_type);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_CREATE");
-
- /* Commit chunk interleaved file type */
- mrc = MPI_Type_commit(&mpi_chunk_inter_type);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_COMMIT");
- } /* end else */
- break;
-
- case PHDF5: /* HDF5 setup */
- /* 1D dataspace */
- if (!parms->dim2d) {
- if (nbytes > 0) {
- /* define a contiguous dataset of nbytes native bytes */
- h5dims[0] = (hsize_t)nbytes;
- h5dset_space_id = H5Screate_simple(1, h5dims, NULL);
- VRFY((h5dset_space_id >= 0), "H5Screate_simple");
-
- /* Set up the file dset space id to select the pattern to access */
- if (!parms->interleaved) {
- /* Contiguous pattern */
- h5start[0] = (hsize_t)bytes_begin[0];
- h5stride[0] = h5block[0] = blk_size;
- h5count[0] = buf_size / blk_size;
- } /* end if */
- else {
- /* Interleaved access pattern */
- /* Skip offset over blocks of other processes */
- h5start[0] = (hsize_t)bytes_begin[0];
- h5stride[0] = blk_size * (size_t)pio_mpi_nprocs_g;
- h5block[0] = blk_size;
- h5count[0] = buf_size / blk_size;
- } /* end else */
- hrc = H5Sselect_hyperslab(h5dset_space_id, H5S_SELECT_SET, h5start, h5stride, h5count,
- h5block);
- VRFY((hrc >= 0), "H5Sselect_hyperslab");
- } /* end if */
- else {
- h5dset_space_id = H5Screate(H5S_SCALAR);
- VRFY((h5dset_space_id >= 0), "H5Screate");
- } /* end else */
-
- /* Create the memory dataspace that corresponds to the xfer buffer */
- if (buf_size > 0) {
- h5dims[0] = buf_size;
- h5mem_space_id = H5Screate_simple(1, h5dims, NULL);
- VRFY((h5mem_space_id >= 0), "H5Screate_simple");
- } /* end if */
- else {
- h5mem_space_id = H5Screate(H5S_SCALAR);
- VRFY((h5mem_space_id >= 0), "H5Screate");
- } /* end else */
- } /* end if */
- /* 2D dataspace */
- else {
- if (nbytes > 0) {
- /* define a contiguous dataset of nbytes native bytes */
- h5dims[0] = (hsize_t)snbytes;
- h5dims[1] = (hsize_t)snbytes;
- h5dset_space_id = H5Screate_simple(2, h5dims, NULL);
- VRFY((h5dset_space_id >= 0), "H5Screate_simple");
-
- /* Set up the file dset space id to select the pattern to access */
- if (!parms->interleaved) {
- /* Contiguous pattern */
- h5start[0] = (hsize_t)bytes_begin[0];
- h5start[1] = (hsize_t)bytes_begin[1];
- h5stride[0] = 1;
- h5stride[1] = h5block[0] = h5block[1] = blk_size;
- h5count[0] = 1;
- h5count[1] = buf_size / blk_size;
- } /* end if */
- else {
- /* Interleaved access pattern */
- /* Skip offset over blocks of other processes */
- h5start[0] = (hsize_t)bytes_begin[0];
- h5start[1] = (hsize_t)bytes_begin[1];
- h5stride[0] = blk_size;
- h5stride[1] = blk_size * (size_t)pio_mpi_nprocs_g;
- h5block[0] = h5block[1] = blk_size;
- h5count[0] = buf_size / blk_size;
- h5count[1] = 1;
- } /* end else */
- hrc = H5Sselect_hyperslab(h5dset_space_id, H5S_SELECT_SET, h5start, h5stride, h5count,
- h5block);
- VRFY((hrc >= 0), "H5Sselect_hyperslab");
- } /* end if */
- else {
- h5dset_space_id = H5Screate(H5S_SCALAR);
- VRFY((h5dset_space_id >= 0), "H5Screate");
- } /* end else */
-
- /* Create the memory dataspace that corresponds to the xfer buffer */
- if (buf_size > 0) {
- if (!parms->interleaved) {
- h5dims[0] = blk_size;
- h5dims[1] = buf_size;
- }
- else {
- h5dims[0] = buf_size;
- h5dims[1] = blk_size;
- }
- h5mem_space_id = H5Screate_simple(2, h5dims, NULL);
- VRFY((h5mem_space_id >= 0), "H5Screate_simple");
- } /* end if */
- else {
- h5mem_space_id = H5Screate(H5S_SCALAR);
- VRFY((h5mem_space_id >= 0), "H5Screate");
- } /* end else */
- } /* end else */
-
- /* Create the dataset transfer property list */
- h5dxpl = H5Pcreate(H5P_DATASET_XFER);
- if (h5dxpl < 0) {
- HDfprintf(stderr, "HDF5 Property List Create failed\n");
- GOTOERROR(FAIL);
- }
-
- /* Change to collective I/O, if asked */
- if (parms->collective) {
- hrc = H5Pset_dxpl_mpio(h5dxpl, H5FD_MPIO_COLLECTIVE);
- if (hrc < 0) {
- HDfprintf(stderr, "HDF5 Property List Set failed\n");
- GOTOERROR(FAIL);
- } /* end if */
- } /* end if */
- break;
-
- default:
- break;
- } /* end switch */
-
- for (ndset = 1; ndset <= ndsets; ++ndset) {
-
- /* Calculate dataset offset within a file */
-
- /* create dataset */
- switch (parms->io_type) {
- case POSIXIO:
- case MPIO:
- /* both posix and mpi io just need dataset offset in file*/
- dset_offset = (ndset - 1) * nbytes;
- break;
-
- case PHDF5:
- HDsprintf(dname, "Dataset_%ld", ndset);
- h5ds_id = H5DOPEN(fd->h5fd, dname);
- if (h5ds_id < 0) {
- HDfprintf(stderr, "HDF5 Dataset open failed\n");
- GOTOERROR(FAIL);
- }
- break;
-
- default:
- break;
- }
-
- /* The task is to transfer bytes_count bytes, starting at
- * bytes_begin position, using transfer buffer of buf_size bytes.
- * If interleaved, select buf_size at a time, in round robin
- * fashion, according to number of process. Otherwise, select
- * all bytes_count in contiguous.
- */
- nbytes_xfer = 0;
-
- /* 1D dataspace */
- if (!parms->dim2d) {
- /* Set base file offset for all I/O patterns and POSIX access */
- posix_file_offset = dset_offset + bytes_begin[0];
-
- /* Set base file offset for all I/O patterns and MPI access */
- mpi_file_offset = (MPI_Offset)(dset_offset + bytes_begin[0]);
- } /* end if */
- else {
- /* Set base file offset for all I/O patterns and POSIX access */
- posix_file_offset = dset_offset + bytes_begin[0] * snbytes + bytes_begin[1];
-
- /* Set base file offset for all I/O patterns and MPI access */
- mpi_file_offset = (MPI_Offset)(dset_offset + bytes_begin[0] * snbytes + bytes_begin[1]);
- } /* end else */
-
- /* Start "raw data" read timer */
- io_time_set(res->timers, HDF5_RAW_READ_FIXED_DIMS, TSTART);
-
- while (nbytes_xfer < bytes_count) {
- /* Read */
- /* Calculate offset of read within a dataset/file */
- switch (parms->io_type) {
- case POSIXIO:
- /* 1D dataspace */
- if (!parms->dim2d) {
- /* Contiguous pattern */
- if (!parms->interleaved) {
- /* Compute file offset */
- file_offset = posix_file_offset + (off_t)nbytes_xfer;
-
- /* only care if seek returns error */
- rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0;
- VRFY((rc == 0), "POSIXSEEK");
-
- /* check if all bytes are read */
- rc = ((ssize_t)buf_size == POSIXREAD(fd->posixfd, buffer, buf_size));
- VRFY((rc != 0), "POSIXREAD");
-
- /* Advance global offset in dataset */
- nbytes_xfer += (off_t)buf_size;
- } /* end if */
- /* Interleaved access pattern */
- else {
- /* Set the base of user's buffer */
- buf_p = (unsigned char *)buffer;
-
- /* Set the number of bytes to transfer this time */
- nbytes_toxfer = buf_size;
-
- /* Loop over the buffers to read */
- while (nbytes_toxfer > 0) {
- /* Skip offset over blocks of other processes */
- file_offset = posix_file_offset + (off_t)(nbytes_xfer * pio_mpi_nprocs_g);
-
- /* only care if seek returns error */
- rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0;
- VRFY((rc == 0), "POSIXSEEK");
-
- /* check if all bytes are read */
- rc = ((ssize_t)blk_size == POSIXREAD(fd->posixfd, buf_p, blk_size));
- VRFY((rc != 0), "POSIXREAD");
-
- /* Advance location in buffer */
- buf_p += blk_size;
-
- /* Advance global offset in dataset */
- nbytes_xfer += (off_t)blk_size;
-
- /* Decrement number of bytes left this time */
- nbytes_toxfer -= blk_size;
- } /* end while */
- } /* end else */
- } /* end if */
- /* 2D dataspace */
- else {
- /* Contiguous storage */
- if (!parms->h5_use_chunks) {
- /* Contiguous access pattern */
- if (!parms->interleaved) {
- /* Compute file offset */
- file_offset = posix_file_offset +
- (off_t)((((size_t)nbytes_xfer / blk_size) / (size_t)snbytes) *
- (blk_size * (size_t)snbytes) +
- (((size_t)nbytes_xfer / blk_size) % (size_t)snbytes));
-
- /* Number of bytes to be transferred per I/O operation */
- nbytes_xfer_advance = buf_size;
-
- /* Global offset advance after each I/O operation */
- file_offset_advance = (off_t)snbytes;
- } /* end if */
- /* Interleaved access pattern */
- else {
- /* Compute file offset */
- file_offset =
- posix_file_offset +
- (off_t)(((((size_t)nbytes_xfer / buf_size) * (size_t)pio_mpi_nprocs_g) /
- (size_t)snbytes) *
- (buf_size * (size_t)snbytes) +
- (((size_t)nbytes_xfer / buf_size) * (size_t)pio_mpi_nprocs_g) %
- (size_t)snbytes);
-
- /* Number of bytes to be transferred per I/O operation */
- nbytes_xfer_advance = blk_size;
-
- /* Global offset advance after each I/O operation */
- file_offset_advance = (off_t)snbytes;
- } /* end else */
- } /* end if */
- /* Chunked storage */
- else {
- /*Contiguous access pattern */
- if (!parms->interleaved) {
- /* Compute file offset */
- file_offset = posix_file_offset + (off_t)nbytes_xfer;
-
- /* Number of bytes to be transferred per I/O operation */
- nbytes_xfer_advance = blk_size * buf_size;
-
- /* Global offset advance after each I/O operation */
- file_offset_advance = 0;
- } /* end if */
- /*Interleaved access pattern */
- else {
- /* Compute file offset */
- /* Before simplification */
- /* file_offset=posix_file_offset+(off_t)((nbytes_xfer/(buf_size/blk_size)
- *pio_mpi_nprocs_g)/(snbytes/blk_size*(blk_size*blk_size))*(buf_size/blk_size
- *snbytes/blk_size*(blk_size*blk_size))+((nbytes_xfer/(buf_size/blk_size))
- *pio_mpi_nprocs_g)%(snbytes/blk_size*(blk_size*blk_size))); */
-
- file_offset = posix_file_offset +
- (off_t)((((size_t)nbytes_xfer / (buf_size / blk_size) *
- (size_t)pio_mpi_nprocs_g) /
- ((size_t)snbytes * blk_size)) *
- (buf_size * (size_t)snbytes) +
- (((size_t)nbytes_xfer / (buf_size / blk_size)) *
- (size_t)pio_mpi_nprocs_g) %
- ((size_t)snbytes * blk_size));
-
- /* Number of bytes to be transferred per I/O operation */
- nbytes_xfer_advance = blk_size * blk_size;
-
- /* Global offset advance after each I/O operation */
- /* file_offset_advance = (off_t)(snbytes/blk_size*(blk_size*blk_size)); */
- file_offset_advance = (off_t)((size_t)snbytes * blk_size);
- } /* end else */
- } /* end else */
-
- /* Common code for file access */
-
- /* Set the base of user's buffer */
- buf_p = (unsigned char *)buffer;
-
- /* Set the number of bytes to transfer this time */
- nbytes_toxfer = buf_size * blk_size;
-
- /* Loop over portions of the buffer to read */
- while (nbytes_toxfer > 0) {
- /* only care if seek returns error */
- rc = POSIXSEEK(fd->posixfd, file_offset) < 0 ? -1 : 0;
- VRFY((rc == 0), "POSIXSEEK");
-
- /* check if all bytes are read */
- rc = ((ssize_t)nbytes_xfer_advance ==
- POSIXREAD(fd->posixfd, buf_p, nbytes_xfer_advance));
- VRFY((rc != 0), "POSIXREAD");
-
- /* Advance location in buffer */
- buf_p += nbytes_xfer_advance;
-
- /* Advance global offset in dataset */
- nbytes_xfer += (off_t)nbytes_xfer_advance;
-
- /* Decrement number of bytes left this time */
- nbytes_toxfer -= nbytes_xfer_advance;
-
- /* Partially advance file offset */
- file_offset += file_offset_advance;
- } /* end while */
-
- } /* end else */
- break;
-
- case MPIO:
- /* 1D dataspace */
- if (!parms->dim2d) {
- /* Independent file access */
- if (!parms->collective) {
- /* Contiguous pattern */
- if (!parms->interleaved) {
- /* Compute offset in file */
- mpi_offset = mpi_file_offset + nbytes_xfer;
-
- /* Perform independent read */
- mrc = MPI_File_read_at(fd->mpifd, mpi_offset, buffer,
- (int)(buf_size / blk_size), mpi_blk_type, &mpi_status);
- VRFY((mrc == MPI_SUCCESS), "MPIO_READ");
-
- /* Advance global offset in dataset */
- nbytes_xfer += (off_t)buf_size;
- } /* end if */
- /* Interleaved access pattern */
- else {
- /* Set the base of user's buffer */
- buf_p = (unsigned char *)buffer;
-
- /* Set the number of bytes to transfer this time */
- nbytes_toxfer = buf_size;
-
- /* Loop over the buffers to read */
- while (nbytes_toxfer > 0) {
- /* Skip offset over blocks of other processes */
- mpi_offset = mpi_file_offset + (nbytes_xfer * pio_mpi_nprocs_g);
-
- /* Perform independent read */
- mrc = MPI_File_read_at(fd->mpifd, mpi_offset, buf_p, (int)1, mpi_blk_type,
- &mpi_status);
- VRFY((mrc == MPI_SUCCESS), "MPIO_READ");
-
- /* Advance location in buffer */
- buf_p += blk_size;
-
- /* Advance global offset in dataset */
- nbytes_xfer += (off_t)blk_size;
-
- /* Decrement number of bytes left this time */
- nbytes_toxfer -= blk_size;
- } /* end while */
- } /* end else */
- } /* end if */
- /* Collective file access */
- else {
- /* Contiguous access pattern */
- if (!parms->interleaved) {
- /* Compute offset in file */
- mpi_offset = mpi_file_offset + nbytes_xfer;
-
- /* Perform collective read */
- mrc = MPI_File_read_at_all(fd->mpifd, mpi_offset, buffer,
- (int)(buf_size / blk_size), mpi_blk_type,
- &mpi_status);
- VRFY((mrc == MPI_SUCCESS), "MPIO_READ");
-
- /* Advance global offset in dataset */
- nbytes_xfer += (off_t)buf_size;
- } /* end if */
- /* Interleaved access pattern */
- else {
- /* Compute offset in file */
- mpi_offset = mpi_file_offset + (nbytes_xfer * pio_mpi_nprocs_g);
-
- /* Set the file view */
- mrc = MPI_File_set_view(fd->mpifd, mpi_offset, mpi_blk_type, mpi_file_type,
- (char *)"native", h5_io_info_g);
- VRFY((mrc == MPI_SUCCESS), "MPIO_VIEW");
-
- /* Perform collective read */
- mrc = MPI_File_read_at_all(fd->mpifd, 0, buffer, (int)(buf_size / blk_size),
- mpi_blk_type, &mpi_status);
- VRFY((mrc == MPI_SUCCESS), "MPIO_READ");
-
- /* Advance global offset in dataset */
- nbytes_xfer += (off_t)buf_size;
- } /* end else */
- } /* end else */
- } /* end if */
- /* 2D dataspace */
- else {
- /* Contiguous storage */
- if (!parms->h5_use_chunks) {
- /* Contiguous access pattern */
- if (!parms->interleaved) {
- /* Compute offset in file */
- mpi_offset =
- mpi_file_offset +
- (MPI_Offset)((((size_t)nbytes_xfer / blk_size) / (size_t)snbytes) *
- (blk_size * (size_t)snbytes)) +
- (MPI_Offset)(((size_t)nbytes_xfer / blk_size) % (size_t)snbytes);
-
- /* Number of bytes to be transferred per I/O operation */
- nbytes_xfer_advance = buf_size;
-
- /* Global offset advance after each I/O operation */
- mpi_offset_advance = snbytes;
-
- /* MPI type to be used for collective access */
- mpi_collective_type = mpi_cont_type;
- } /* end if */
- /* Interleaved access pattern */
- else {
- /* Compute offset in file */
- mpi_offset =
- mpi_file_offset +
- (MPI_Offset)(
- ((((size_t)nbytes_xfer / buf_size) * (size_t)pio_mpi_nprocs_g) /
- (size_t)snbytes) *
- (buf_size * (size_t)snbytes)) +
- (MPI_Offset)(
- (((size_t)nbytes_xfer / buf_size) * (size_t)pio_mpi_nprocs_g) %
- (size_t)snbytes);
-
- /* Number of bytes to be transferred per I/O operation */
- nbytes_xfer_advance = blk_size;
-
- /* Global offset advance after each I/O operation */
- mpi_offset_advance = snbytes;
-
- /* MPI type to be used for collective access */
- mpi_collective_type = mpi_inter_type;
- } /* end else */
- } /* end if */
- /* Chunked storage */
- else {
- /*Contiguous access pattern */
- if (!parms->interleaved) {
- /* Compute offset in file */
- mpi_offset = mpi_file_offset + nbytes_xfer;
-
- /* Number of bytes to be transferred per I/O operation */
- nbytes_xfer_advance = blk_size * buf_size;
-
- /* Global offset advance after each I/O operation */
- mpi_offset_advance = 0;
-
- /* MPI type to be used for collective access */
- mpi_collective_type = mpi_full_buffer;
- } /* end if */
- /*Interleaved access pattern */
- else {
- /* Compute offset in file */
- /* Before simplification */
- /* mpi_offset=mpi_file_offset+(nbytes_xfer/(buf_size/blk_size)
- *pio_mpi_nprocs_g)/(snbytes/blk_size*(blk_size*blk_size))*
- (buf_size/blk_size*snbytes/blk_size*(blk_size*blk_size))+
- ((nbytes_xfer/(buf_size/blk_size))*pio_mpi_nprocs_g)%(snbytes
- /blk_size*(blk_size*blk_size)); */
- mpi_offset = mpi_file_offset +
- (MPI_Offset)((((size_t)nbytes_xfer / (buf_size / blk_size) *
- (size_t)pio_mpi_nprocs_g) /
- ((size_t)snbytes * blk_size)) *
- (buf_size * (size_t)snbytes)) +
- (MPI_Offset)((((size_t)nbytes_xfer / (buf_size / blk_size)) *
- (size_t)pio_mpi_nprocs_g) %
- ((size_t)snbytes * blk_size));
-
- /* Number of bytes to be transferred per I/O operation */
- nbytes_xfer_advance = blk_size * blk_size;
-
- /* Global offset advance after each I/O operation */
- /* mpi_offset_advance = (MPI_Offset)(snbytes/blk_size*(blk_size*blk_size)); */
- mpi_offset_advance = (MPI_Offset)((size_t)snbytes * blk_size);
-
- /* MPI type to be used for collective access */
- mpi_collective_type = mpi_chunk_inter_type;
- } /* end else */
- } /* end else */
-
- /* Common code for independent file access */
- if (!parms->collective) {
- /* Set the base of user's buffer */
- buf_p = (unsigned char *)buffer;
-
- /* Set the number of bytes to transfer this time */
- nbytes_toxfer = buf_size * blk_size;
-
- /* Loop over portions of the buffer to read */
- while (nbytes_toxfer > 0) {
- /* Perform independent read */
- mrc = MPI_File_read_at(fd->mpifd, mpi_offset, buf_p, (int)nbytes_xfer_advance,
- MPI_BYTE, &mpi_status);
- VRFY((mrc == MPI_SUCCESS), "MPIO_READ");
-
- /* Advance location in buffer */
- buf_p += nbytes_xfer_advance;
-
- /* Advance global offset in dataset */
- nbytes_xfer += (off_t)nbytes_xfer_advance;
-
- /* Decrement number of bytes left this time */
- nbytes_toxfer -= nbytes_xfer_advance;
-
- /* Partially advance global offset in dataset */
- mpi_offset += mpi_offset_advance;
- } /* end while */
- } /* end if */
-
- /* Common code for collective file access */
- else {
- /* Set the file view */
- mrc = MPI_File_set_view(fd->mpifd, mpi_offset, MPI_BYTE, mpi_collective_type,
- (char *)"native", h5_io_info_g);
- VRFY((mrc == MPI_SUCCESS), "MPIO_VIEW");
-
- /* Perform read */
- MPI_File_read_at_all(fd->mpifd, 0, buffer, (int)(buf_size * blk_size), MPI_BYTE,
- &mpi_status);
- VRFY((mrc == MPI_SUCCESS), "MPIO_READ");
-
- /* Advance global offset in dataset */
- nbytes_xfer += (off_t)buf_size * (off_t)blk_size;
- } /* end else */
-
- } /* end else */
- break;
-
- case PHDF5:
- /* 1D dataspace */
- if (!parms->dim2d) {
- /* Set up the file dset space id to move the selection to process */
- if (!parms->interleaved) {
- /* Contiguous pattern */
- h5offset[0] = nbytes_xfer;
- } /* end if */
- else {
- /* Interleaved access pattern */
- /* Skip offset over blocks of other processes */
- h5offset[0] = (nbytes_xfer * pio_mpi_nprocs_g);
- } /* end else */
- hrc = H5Soffset_simple(h5dset_space_id, h5offset);
- VRFY((hrc >= 0), "H5Soffset_simple");
-
- /* Read the buffer in */
- hrc = H5Dread(h5ds_id, ELMT_H5_TYPE, h5mem_space_id, h5dset_space_id, h5dxpl, buffer);
- VRFY((hrc >= 0), "H5Dread");
-
- /* Increment number of bytes transferred */
- nbytes_xfer += (off_t)buf_size;
- } /* end if */
- /* 2D dataspace */
- else {
- /* Set up the file dset space id to move the selection to process */
- if (!parms->interleaved) {
- /* Contiguous pattern */
- h5offset[0] =
- (hssize_t)(((size_t)nbytes_xfer / ((size_t)snbytes * blk_size)) * blk_size);
- h5offset[1] =
- (hssize_t)(((size_t)nbytes_xfer % ((size_t)snbytes * blk_size)) / blk_size);
- } /* end if */
- else {
- /* Interleaved access pattern */
- /* Skip offset over blocks of other processes */
- h5offset[0] = (hssize_t)((((size_t)nbytes_xfer * (size_t)pio_mpi_nprocs_g) /
- ((size_t)snbytes * buf_size)) *
- buf_size);
- h5offset[1] = (hssize_t)((((size_t)nbytes_xfer * (size_t)pio_mpi_nprocs_g) %
- ((size_t)snbytes * buf_size)) /
- buf_size);
-
- } /* end else */
- hrc = H5Soffset_simple(h5dset_space_id, h5offset);
- VRFY((hrc >= 0), "H5Soffset_simple");
-
- /* Write the buffer out */
- hrc = H5Dread(h5ds_id, ELMT_H5_TYPE, h5mem_space_id, h5dset_space_id, h5dxpl, buffer);
- VRFY((hrc >= 0), "H5Dread");
-
- /* Increment number of bytes transferred */
- nbytes_xfer += (off_t)buf_size * (off_t)blk_size;
-
- } /* end else */
- break;
-
- default:
- break;
- } /* switch (parms->io_type) */
-
- /* Verify raw data, if asked */
- if (parms->verify) {
- /* Verify data read */
- unsigned char *ucharptr = (unsigned char *)buffer;
- size_t i;
- int nerror = 0;
-
- for (i = 0; i < bsize; ++i) {
- if (*ucharptr++ != pio_mpi_rank_g + 1) {
- if (++nerror < 20) {
- /* report at most 20 errors */
- HDprint_rank(output);
- HDfprintf(output,
- "read data error, expected (%d), "
- "got (%d)\n",
- pio_mpi_rank_g + 1, (int)*(ucharptr - 1));
- } /* end if */
- } /* end if */
- } /* end for */
- if (nerror >= 20) {
- HDprint_rank(output);
- HDfprintf(output, "...");
- HDfprintf(output, "total read data errors=%d\n", nerror);
- } /* end if */
- } /* if (parms->verify) */
-
- } /* end while */
-
- /* Stop "raw data" read timer */
- io_time_set(res->timers, HDF5_RAW_READ_FIXED_DIMS, TSTOP);
-
- /* Calculate read time */
-
- /* Close dataset. Only HDF5 needs to do an explicit close. */
- if (parms->io_type == PHDF5) {
- hrc = H5Dclose(h5ds_id);
-
- if (hrc < 0) {
- HDfprintf(stderr, "HDF5 Dataset Close failed\n");
- GOTOERROR(FAIL);
- }
-
- h5ds_id = H5I_INVALID_HID;
- } /* end if */
- } /* end for */
-
-done:
- /* release MPI-I/O objects */
- if (parms->io_type == MPIO) {
- /* 1D dataspace */
- if (!parms->dim2d) {
- /* Free file type */
- mrc = MPI_Type_free(&mpi_file_type);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_FREE");
-
- /* Free buffer type */
- mrc = MPI_Type_free(&mpi_blk_type);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_FREE");
- } /* end if */
- /* 2D dataspace */
- else {
- /* Free partial buffer type for contiguous access */
- mrc = MPI_Type_free(&mpi_partial_buffer_cont);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_FREE");
-
- /* Free contiguous file type */
- mrc = MPI_Type_free(&mpi_cont_type);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_FREE");
-
- /* Free partial buffer type for interleaved access */
- mrc = MPI_Type_free(&mpi_partial_buffer_inter);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_FREE");
-
- /* Free interleaved file type */
- mrc = MPI_Type_free(&mpi_inter_type);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_FREE");
-
- /* Free full buffer type */
- mrc = MPI_Type_free(&mpi_full_buffer);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_FREE");
-
- /* Free full chunk type */
- mrc = MPI_Type_free(&mpi_full_chunk);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_FREE");
-
- /* Free chunk interleaved file type */
- mrc = MPI_Type_free(&mpi_chunk_inter_type);
- VRFY((mrc == MPI_SUCCESS), "MPIO_TYPE_FREE");
- } /* end else */
- } /* end if */
-
- /* release HDF5 objects */
- if (h5dset_space_id != -1) {
- hrc = H5Sclose(h5dset_space_id);
- if (hrc < 0) {
- HDfprintf(stderr, "HDF5 Dataset Space Close failed\n");
- ret_code = FAIL;
- }
- else {
- h5dset_space_id = H5I_INVALID_HID;
- }
- }
-
- if (h5mem_space_id != -1) {
- hrc = H5Sclose(h5mem_space_id);
- if (hrc < 0) {
- HDfprintf(stderr, "HDF5 Memory Space Close failed\n");
- ret_code = FAIL;
- }
- else {
- h5mem_space_id = H5I_INVALID_HID;
- }
- }
-
- if (h5dxpl != -1) {
- hrc = H5Pclose(h5dxpl);
- if (hrc < 0) {
- HDfprintf(stderr, "HDF5 Dataset Transfer Property List Close failed\n");
- ret_code = FAIL;
- }
- else {
- h5dxpl = H5I_INVALID_HID;
- }
- }
-
- return ret_code;
-}
-
-/*
- * Function: do_fopen
- * Purpose: Open the specified file.
- * Return: SUCCESS or FAIL
- * Programmer: Albert Cheng, Bill Wendling, 2001/12/13
- * Modifications:
- */
-static herr_t
-do_fopen(parameters *param, char *fname, file_descr *fd /*out*/, int flags)
-{
- int ret_code = SUCCESS, mrc;
- hid_t acc_tpl = H5I_INVALID_HID; /* file access templates */
-
- switch (param->io_type) {
- case POSIXIO:
- if (flags & (PIO_CREATE | PIO_WRITE))
- fd->posixfd = POSIXCREATE(fname);
- else
- fd->posixfd = POSIXOPEN(fname, O_RDONLY);
-
- if (fd->posixfd < 0) {
- HDfprintf(stderr, "POSIX File Open failed(%s)\n", fname);
- GOTOERROR(FAIL);
- }
-
- /* The perils of POSIX I/O in a parallel environment. The problem is:
- *
- * - Process n opens a file with truncation and then starts
- * writing to the file.
- * - Process m also opens the file with truncation, but after
- * process n has already started to write to the file. Thus,
- * all of the stuff process n wrote is now lost.
- */
- MPI_Barrier(pio_comm_g);
-
- break;
-
- case MPIO:
- if (flags & (PIO_CREATE | PIO_WRITE)) {
- MPI_File_delete(fname, h5_io_info_g);
- mrc = MPI_File_open(pio_comm_g, fname, MPI_MODE_CREATE | MPI_MODE_RDWR, h5_io_info_g,
- &fd->mpifd);
-
- if (mrc != MPI_SUCCESS) {
- HDfprintf(stderr, "MPI File Open failed(%s)\n", fname);
- GOTOERROR(FAIL);
- }
-
- /*since MPI_File_open with MPI_MODE_CREATE does not truncate */
- /*filesize , set size to 0 explicitedly. */
- mrc = MPI_File_set_size(fd->mpifd, (MPI_Offset)0);
- if (mrc != MPI_SUCCESS) {
- HDfprintf(stderr, "MPI_File_set_size failed\n");
- GOTOERROR(FAIL);
- }
- }
- else {
- mrc = MPI_File_open(pio_comm_g, fname, MPI_MODE_RDONLY, h5_io_info_g, &fd->mpifd);
- if (mrc != MPI_SUCCESS) {
- HDfprintf(stderr, "MPI File Open failed(%s)\n", fname);
- GOTOERROR(FAIL);
- }
- }
-
- break;
-
- case PHDF5:
- if ((acc_tpl = H5Pcreate(H5P_FILE_ACCESS)) < 0) {
- HDfprintf(stderr, "HDF5 Property List Create failed\n");
- GOTOERROR(FAIL);
- }
-
- /* Set the file driver to the MPI-IO driver */
- if (H5Pset_fapl_mpio(acc_tpl, pio_comm_g, h5_io_info_g) < 0) {
- HDfprintf(stderr, "HDF5 Property List Set failed\n");
- GOTOERROR(FAIL);
- }
-
- /* Set the alignment of objects in HDF5 file */
- if (H5Pset_alignment(acc_tpl, param->h5_thresh, param->h5_align) < 0) {
- HDfprintf(stderr, "HDF5 Property List Set failed\n");
- GOTOERROR(FAIL);
- }
-
- /* create the parallel file */
- if (flags & (PIO_CREATE | PIO_WRITE))
- fd->h5fd = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, acc_tpl);
- else
- fd->h5fd = H5Fopen(fname, H5F_ACC_RDONLY, acc_tpl);
- if (fd->h5fd < 0) {
- HDfprintf(stderr, "HDF5 File Create failed(%s)\n", fname);
- GOTOERROR(FAIL);
- }
-
- /* verifying the close of the acc_tpl */
- if (H5Pclose(acc_tpl) < 0) {
- HDfprintf(stderr, "HDF5 Property List Close failed\n");
- GOTOERROR(FAIL);
- }
-
- break;
-
- default:
- break;
- }
-
-done:
- return ret_code;
-}
-
-/*
- * Function: do_fclose
- * Purpose: Close the specified file descriptor.
- * Return: SUCCESS or FAIL
- * Programmer: Albert Cheng, Bill Wendling, 2001/12/13
- * Modifications:
- */
-static herr_t
-do_fclose(iotype iot, file_descr *fd /*out*/)
-{
- herr_t ret_code = SUCCESS, hrc;
- int mrc = 0, rc = 0;
-
- switch (iot) {
- case POSIXIO:
- rc = POSIXCLOSE(fd->posixfd);
-
- if (rc != 0) {
- HDfprintf(stderr, "POSIX File Close failed\n");
- GOTOERROR(FAIL);
- }
-
- fd->posixfd = -1;
- break;
-
- case MPIO:
- mrc = MPI_File_close(&fd->mpifd);
-
- if (mrc != MPI_SUCCESS) {
- HDfprintf(stderr, "MPI File close failed\n");
- GOTOERROR(FAIL);
- }
-
- fd->mpifd = MPI_FILE_NULL;
- break;
-
- case PHDF5:
- hrc = H5Fclose(fd->h5fd);
-
- if (hrc < 0) {
- HDfprintf(stderr, "HDF5 File Close failed\n");
- GOTOERROR(FAIL);
- }
-
- fd->h5fd = -1;
- break;
-
- default:
- break;
- }
-
-done:
- return ret_code;
-}
-
-/*
- * Function: do_fclose
- * Purpose: Cleanup temporary file unless HDF5_NOCLEANUP is set.
- * Only Proc 0 of the PIO communicator will do the cleanup.
- * Other processes just return.
- * Return: void
- * Programmer: Albert Cheng 2001/12/12
- * Modifications:
- */
-static void
-do_cleanupfile(iotype iot, char *fname)
-{
- if (pio_mpi_rank_g != 0)
- return;
-
- if (clean_file_g == -1)
- clean_file_g = (getenv("HDF5_NOCLEANUP") == NULL) ? 1 : 0;
-
- if (clean_file_g) {
- switch (iot) {
- case POSIXIO:
- HDremove(fname);
- break;
- case MPIO:
- case PHDF5:
- MPI_File_delete(fname, h5_io_info_g);
- break;
- default:
- break;
- }
- }
-}
-
-#ifdef TIME_MPI
-/* instrument the MPI_File_wrirte_xxx and read_xxx calls to measure
- * pure time spent in MPI_File code.
- */
-int
-MPI_File_read_at(MPI_File fh, MPI_Offset offset, void *buf, int count, MPI_Datatype datatype,
- MPI_Status *status)
-{
- int err;
- io_time_set(timer_g, HDF5_MPI_READ, TSTART);
- err = PMPI_File_read_at(fh, offset, buf, count, datatype, status);
- io_time_set(timer_g, HDF5_MPI_READ, TSTOP);
- return err;
-}
-
-int
-MPI_File_read_at_all(MPI_File fh, MPI_Offset offset, void *buf, int count, MPI_Datatype datatype,
- MPI_Status *status)
-{
- int err;
- io_time_set(timer_g, HDF5_MPI_READ, TSTART);
- err = PMPI_File_read_at_all(fh, offset, buf, count, datatype, status);
- io_time_set(timer_g, HDF5_MPI_READ, TSTOP);
- return err;
-}
-
-int
-MPI_File_write_at(MPI_File fh, MPI_Offset offset, void *buf, int count, MPI_Datatype datatype,
- MPI_Status *status)
-{
- int err;
- io_time_set(timer_g, HDF5_MPI_WRITE, TSTART);
- err = PMPI_File_write_at(fh, offset, buf, count, datatype, status);
- io_time_set(timer_g, HDF5_MPI_WRITE, TSTOP);
- return err;
-}
-
-int
-MPI_File_write_at_all(MPI_File fh, MPI_Offset offset, void *buf, int count, MPI_Datatype datatype,
- MPI_Status *status)
-{
- int err;
- io_time_set(timer_g, HDF5_MPI_WRITE, TSTART);
- err = PMPI_File_write_at_all(fh, offset, buf, count, datatype, status);
- io_time_set(timer_g, HDF5_MPI_WRITE, TSTOP);
- return err;
-}
-
-#endif /* TIME_MPI */
-#endif /* H5_HAVE_PARALLEL */
diff --git a/tools/test/perform/pio_perf.c b/tools/test/perform/pio_perf.c
deleted file mode 100644
index 6fb5043..0000000
--- a/tools/test/perform/pio_perf.c
+++ /dev/null
@@ -1,1699 +0,0 @@
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Copyright by The HDF Group. *
- * 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 COPYING file, which can be found at the root of the source code *
- * distribution tree, or in https://www.hdfgroup.org/licenses. *
- * If you do not have access to either file, you may request a copy from *
- * help@hdfgroup.org. *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * Parallel HDF5 Performance Testing Code
- * --------------------------------------
- *
- * Portable code to test performance on the different platforms we support.
- * This is what the report should look like:
- *
- * nprocs = Max#Procs
- * IO API = POSIXIO
- * # Files = 1, # of dsets = 1000, Elements per dset = 37000
- * Write Results = x MB/s
- * Read Results = x MB/s
- * # Files = 1, # of dsets = 3000, Elements per dset = 37000
- * Write Results = x MB/s
- * Read Results = x MB/s
- *
- * . . .
- *
- * IO API = MPIO
- * # Files = 1, # of dsets = 1000, Elements per dset = 37000
- * Write Results = x MB/s
- * Read Results = x MB/s
- * # Files = 1, # of dsets = 3000, Elements per dset = 37000
- * Write Results = x MB/s
- * Read Results = x MB/s
- *
- * . . .
- *
- * IO API = PHDF5
- * # Files = 1, # of dsets = 1000, Elements per dset = 37000
- * Write Results = x MB/s
- * Read Results = x MB/s
- * # Files = 1, # of dsets = 3000, Elements per dset = 37000
- * Write Results = x MB/s
- * Read Results = x MB/s
- *
- * . . .
- *
- * nprocs = Max#Procs / 2
- *
- * . . .
- *
- */
-
-/* system header files */
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "hdf5.h"
-
-#ifdef H5_HAVE_PARALLEL
-
-/* library header files */
-#include <mpi.h>
-
-/* our header files */
-#include "pio_perf.h"
-
-/* useful macros */
-#define TAB_SPACE 4
-
-#define ONE_KB 1024
-#define ONE_MB (ONE_KB * ONE_KB)
-#define ONE_GB (ONE_MB * ONE_KB)
-
-#define PIO_POSIX 0x1
-#define PIO_MPI 0x2
-#define PIO_HDF5 0x4
-
-#ifdef STANDALONE
-#define DBL_EPSILON 2.2204460492503131e-16
-#define H5_DBL_ABS_EQUAL(X, Y) (fabs((X) - (Y)) < DBL_EPSILON)
-#endif
-
-/* report 0.0 in case t is zero too */
-#define MB_PER_SEC(bytes, t) (H5_DBL_ABS_EQUAL((t), 0.0) ? 0.0 : ((((double)bytes) / ONE_MB) / (t)))
-
-#ifndef TRUE
-#define TRUE 1
-#endif /* TRUE */
-#ifndef FALSE
-#define FALSE (!TRUE)
-#endif /* FALSE */
-
-/* global variables */
-FILE * output; /* output file */
-int comm_world_rank_g; /* my rank in MPI_COMM_RANK */
-int comm_world_nprocs_g; /* num. of processes of MPI_COMM_WORLD */
-MPI_Comm pio_comm_g; /* Communicator to run the PIO */
-int pio_mpi_rank_g; /* MPI rank of pio_comm_g */
-int pio_mpi_nprocs_g; /* Number of processes of pio_comm_g */
-int pio_debug_level = 0; /* The debug level:
- * 0 - Off
- * 1 - Minimal
- * 2 - Some more
- * 3 - Maximal
- * 4 - Maximal & then some
- */
-
-/* local variables */
-static const char *progname = "h5perf";
-
-/*
- * Command-line options: The user can specify short or long-named
- * parameters. The long-named ones can be partially spelled. When
- * adding more, make sure that they don't clash with each other.
- */
-#if 1
-static const char *s_opts = "a:A:B:cCd:D:e:F:ghi:Imno:p:P:stT:wx:X:";
-#else
-static const char *s_opts = "a:A:bB:cCd:D:e:F:ghi:Imno:p:P:stT:wx:X:";
-#endif /* 1 */
-static struct long_options l_opts[] = {{"align", require_arg, 'a'},
- {"alig", require_arg, 'a'},
- {"ali", require_arg, 'a'},
- {"al", require_arg, 'a'},
- {"api", require_arg, 'A'},
- {"ap", require_arg, 'A'},
-#if 0
- /* a sighting of the elusive binary option */
- { "binary", no_arg, 'b' },
- { "binar", no_arg, 'b' },
- { "bina", no_arg, 'b' },
- { "bin", no_arg, 'b' },
- { "bi", no_arg, 'b' },
-#endif /* 0 */
- {"block-size", require_arg, 'B'},
- {"block-siz", require_arg, 'B'},
- {"block-si", require_arg, 'B'},
- {"block-s", require_arg, 'B'},
- {"block-", require_arg, 'B'},
- {"block", require_arg, 'B'},
- {"bloc", require_arg, 'B'},
- {"blo", require_arg, 'B'},
- {"bl", require_arg, 'B'},
- {"chunk", no_arg, 'c'},
- {"chun", no_arg, 'c'},
- {"chu", no_arg, 'c'},
- {"ch", no_arg, 'c'},
- {"collective", no_arg, 'C'},
- {"collectiv", no_arg, 'C'},
- {"collecti", no_arg, 'C'},
- {"collect", no_arg, 'C'},
- {"collec", no_arg, 'C'},
- {"colle", no_arg, 'C'},
- {"coll", no_arg, 'C'},
- {"col", no_arg, 'C'},
- {"co", no_arg, 'C'},
- {"debug", require_arg, 'D'},
- {"debu", require_arg, 'D'},
- {"deb", require_arg, 'D'},
- {"de", require_arg, 'D'},
- {"geometry", no_arg, 'g'},
- {"geometr", no_arg, 'g'},
- {"geomet", no_arg, 'g'},
- {"geome", no_arg, 'g'},
- {"geom", no_arg, 'g'},
- {"geo", no_arg, 'g'},
- {"ge", no_arg, 'g'},
- {"help", no_arg, 'h'},
- {"hel", no_arg, 'h'},
- {"he", no_arg, 'h'},
- {"interleaved", require_arg, 'I'},
- {"interleave", require_arg, 'I'},
- {"interleav", require_arg, 'I'},
- {"interlea", require_arg, 'I'},
- {"interle", require_arg, 'I'},
- {"interl", require_arg, 'I'},
- {"inter", require_arg, 'I'},
- {"inte", require_arg, 'I'},
- {"int", require_arg, 'I'},
- {"in", require_arg, 'I'},
- {"max-num-processes", require_arg, 'P'},
- {"max-num-processe", require_arg, 'P'},
- {"max-num-process", require_arg, 'P'},
- {"max-num-proces", require_arg, 'P'},
- {"max-num-proce", require_arg, 'P'},
- {"max-num-proc", require_arg, 'P'},
- {"max-num-pro", require_arg, 'P'},
- {"max-num-pr", require_arg, 'P'},
- {"max-num-p", require_arg, 'P'},
- {"min-num-processes", require_arg, 'p'},
- {"min-num-processe", require_arg, 'p'},
- {"min-num-process", require_arg, 'p'},
- {"min-num-proces", require_arg, 'p'},
- {"min-num-proce", require_arg, 'p'},
- {"min-num-proc", require_arg, 'p'},
- {"min-num-pro", require_arg, 'p'},
- {"min-num-pr", require_arg, 'p'},
- {"min-num-p", require_arg, 'p'},
- {"max-xfer-size", require_arg, 'X'},
- {"max-xfer-siz", require_arg, 'X'},
- {"max-xfer-si", require_arg, 'X'},
- {"max-xfer-s", require_arg, 'X'},
- {"max-xfer", require_arg, 'X'},
- {"max-xfe", require_arg, 'X'},
- {"max-xf", require_arg, 'X'},
- {"max-x", require_arg, 'X'},
- {"min-xfer-size", require_arg, 'x'},
- {"min-xfer-siz", require_arg, 'x'},
- {"min-xfer-si", require_arg, 'x'},
- {"min-xfer-s", require_arg, 'x'},
- {"min-xfer", require_arg, 'x'},
- {"min-xfe", require_arg, 'x'},
- {"min-xf", require_arg, 'x'},
- {"min-x", require_arg, 'x'},
- {"num-bytes", require_arg, 'e'},
- {"num-byte", require_arg, 'e'},
- {"num-byt", require_arg, 'e'},
- {"num-by", require_arg, 'e'},
- {"num-b", require_arg, 'e'},
- {"num-dsets", require_arg, 'd'},
- {"num-dset", require_arg, 'd'},
- {"num-dse", require_arg, 'd'},
- {"num-ds", require_arg, 'd'},
- {"num-d", require_arg, 'd'},
- {"num-files", require_arg, 'F'},
- {"num-file", require_arg, 'F'},
- {"num-fil", require_arg, 'F'},
- {"num-fi", require_arg, 'F'},
- {"num-f", require_arg, 'F'},
- {"num-iterations", require_arg, 'i'},
- {"num-iteration", require_arg, 'i'},
- {"num-iteratio", require_arg, 'i'},
- {"num-iterati", require_arg, 'i'},
- {"num-iterat", require_arg, 'i'},
- {"num-itera", require_arg, 'i'},
- {"num-iter", require_arg, 'i'},
- {"num-ite", require_arg, 'i'},
- {"num-it", require_arg, 'i'},
- {"num-i", require_arg, 'i'},
- {"output", require_arg, 'o'},
- {"outpu", require_arg, 'o'},
- {"outp", require_arg, 'o'},
- {"out", require_arg, 'o'},
- {"ou", require_arg, 'o'},
- {"threshold", require_arg, 'T'},
- {"threshol", require_arg, 'T'},
- {"thresho", require_arg, 'T'},
- {"thresh", require_arg, 'T'},
- {"thres", require_arg, 'T'},
- {"thre", require_arg, 'T'},
- {"thr", require_arg, 'T'},
- {"th", require_arg, 'T'},
- {"write-only", require_arg, 'w'},
- {"write-onl", require_arg, 'w'},
- {"write-on", require_arg, 'w'},
- {"write-o", require_arg, 'w'},
- {"write", require_arg, 'w'},
- {"writ", require_arg, 'w'},
- {"wri", require_arg, 'w'},
- {"wr", require_arg, 'w'},
- {NULL, 0, '\0'}};
-
-struct options {
- long io_types; /* bitmask of which I/O types to test */
- const char *output_file; /* file to print report to */
- long num_dsets; /* number of datasets */
- long num_files; /* number of files */
- off_t num_bpp; /* number of bytes per proc per dset */
- int num_iters; /* number of iterations */
- int max_num_procs; /* maximum number of processes to use */
- int min_num_procs; /* minimum number of processes to use */
- size_t max_xfer_size; /* maximum transfer buffer size */
- size_t min_xfer_size; /* minimum transfer buffer size */
- size_t blk_size; /* Block size */
- unsigned interleaved; /* Interleaved vs. contiguous blocks */
- unsigned collective; /* Collective vs. independent I/O */
- unsigned dim2d; /* 1D vs. 2D geometry */
- int print_times; /* print times as well as throughputs */
- int print_raw; /* print raw data throughput info */
- off_t h5_alignment; /* alignment in HDF5 file */
- off_t h5_threshold; /* threshold for alignment in HDF5 file */
- int h5_use_chunks; /* Make HDF5 dataset chunked */
- int h5_write_only; /* Perform the write tests only */
- int verify; /* Verify data correctness */
-};
-
-typedef struct _minmax {
- double min;
- double max;
- double sum;
- int num;
-} minmax;
-
-/* local functions */
-static off_t parse_size_directive(const char *size);
-static struct options *parse_command_line(int argc, char *argv[]);
-static void run_test_loop(struct options *options);
-static int run_test(iotype iot, parameters parms, struct options *opts);
-static void output_all_info(minmax *mm, int count, int indent_level);
-static void get_minmax(minmax *mm, double val);
-static minmax accumulate_minmax_stuff(minmax *mm, int count);
-static int create_comm_world(int num_procs, int *doing_pio);
-static int destroy_comm_world(void);
-static void output_results(const struct options *options, const char *name, minmax *table, int table_size,
- off_t data_size);
-static void output_times(const struct options *options, const char *name, minmax *table, int table_size);
-static void output_report(const char *fmt, ...);
-static void print_indent(register int indent);
-static void usage(const char *prog);
-static void report_parameters(struct options *opts);
-static off_t squareo(off_t);
-
-/*
- * Function: main
- * Purpose: Start things up. Initialize MPI and then call the test looping
- * function.
- * Return: EXIT_SUCCESS or EXIT_FAILURE
- * Programmer: Bill Wendling, 30. October 2001
- * Modifications:
- */
-int
-main(int argc, char *argv[])
-{
- int ret;
- int exit_value = EXIT_SUCCESS;
- struct options *opts = NULL;
-
-#ifndef STANDALONE
- /* Initialize h5tools lib */
- h5tools_init();
-#endif
-
- output = stdout;
-
- /* initialize MPI and get the maximum num of processors we started with */
- MPI_Init(&argc, &argv);
- ret = MPI_Comm_size(MPI_COMM_WORLD, &comm_world_nprocs_g);
-
- if (ret != MPI_SUCCESS) {
- HDfprintf(stderr, "%s: MPI_Comm_size call failed\n", progname);
-
- if (ret == MPI_ERR_COMM)
- HDfprintf(stderr, "invalid MPI communicator\n");
- else
- HDfprintf(stderr, "invalid argument\n");
-
- exit_value = EXIT_FAILURE;
- goto finish;
- }
-
- ret = MPI_Comm_rank(MPI_COMM_WORLD, &comm_world_rank_g);
-
- if (ret != MPI_SUCCESS) {
- HDfprintf(stderr, "%s: MPI_Comm_rank call failed\n", progname);
-
- if (ret == MPI_ERR_COMM)
- HDfprintf(stderr, "invalid MPI communicator\n");
- else
- HDfprintf(stderr, "invalid argument\n");
-
- exit_value = EXIT_FAILURE;
- goto finish;
- }
-
- pio_comm_g = MPI_COMM_WORLD;
-
- h5_set_info_object();
- opts = parse_command_line(argc, argv);
-
- if (!opts) {
- exit_value = EXIT_FAILURE;
- goto finish;
- }
-
- if (opts->output_file) {
- if ((output = HDfopen(opts->output_file, "w")) == NULL) {
- HDfprintf(stderr, "%s: cannot open output file\n", progname);
- perror(opts->output_file);
- goto finish;
- }
- }
-
- if ((pio_debug_level == 0 && comm_world_rank_g == 0) || pio_debug_level > 0)
- report_parameters(opts);
-
- run_test_loop(opts);
-
-finish:
- MPI_Finalize();
- free(opts);
- return exit_value;
-}
-
-off_t
-squareo(off_t x)
-{
- return x * x;
-}
-
-/*
- * Function: run_test_loop
- * Purpose: Run the I/O tests. Write the results to OUTPUT.
- *
- * - The slowest changing part of the test is the number of
- * processors to use. For each loop iteration, we divide that
- * number by 2 and rerun the test.
- *
- * - The second slowest is what type of IO API to perform. We have
- * three choices: POSIXIO, MPI-IO, and PHDF5.
- *
- * - Then we change the size of the buffer. This information is
- * inferred from the number of datasets to create and the number
- * of integers to put into each dataset. The backend code figures
- * this out.
- *
- * Return: Nothing
- * Programmer: Bill Wendling, 30. October 2001
- * Modifications:
- * Added 2D testing (Christian Chilan, 10. August 2005)
- */
-static void
-run_test_loop(struct options *opts)
-{
- parameters parms;
- int num_procs;
- int doing_pio; /* if this process is doing PIO */
-
- parms.num_files = opts->num_files;
- parms.num_dsets = opts->num_dsets;
- parms.num_iters = opts->num_iters;
- parms.blk_size = opts->blk_size;
- parms.interleaved = opts->interleaved;
- parms.collective = opts->collective;
- parms.dim2d = opts->dim2d;
- parms.h5_align = (hsize_t)opts->h5_alignment;
- parms.h5_thresh = (hsize_t)opts->h5_threshold;
- parms.h5_use_chunks = opts->h5_use_chunks;
- parms.h5_write_only = opts->h5_write_only;
- parms.verify = opts->verify;
-
- /* start with max_num_procs and decrement it by half for each loop. */
- /* if performance needs restart, fewer processes may be needed. */
- for (num_procs = opts->max_num_procs; num_procs >= opts->min_num_procs; num_procs >>= 1) {
- register size_t buf_size;
-
- parms.num_procs = num_procs;
-
- if (create_comm_world(parms.num_procs, &doing_pio) != SUCCESS) {
- /* do something harsh */
- }
-
- /* only processes doing PIO will run the tests */
- if (doing_pio) {
- output_report("Number of processors = %ld\n", parms.num_procs);
-
- /* multiply the xfer buffer size by 2 for each loop iteration */
- for (buf_size = opts->min_xfer_size; buf_size <= opts->max_xfer_size; buf_size <<= 1) {
- parms.buf_size = buf_size;
-
- if (parms.dim2d) {
- parms.num_bytes = squareo(opts->num_bpp * parms.num_procs);
- if (parms.interleaved)
- output_report("Transfer Buffer Size: %ldx%ld bytes, File size: %.2f MB\n", buf_size,
- opts->blk_size,
- ((double)parms.num_dsets * (double)parms.num_bytes) / ONE_MB);
- else
- output_report("Transfer Buffer Size: %ldx%ld bytes, File size: %.2f MB\n",
- opts->blk_size, buf_size,
- ((double)parms.num_dsets * (double)parms.num_bytes) / ONE_MB);
-
- print_indent(1);
- output_report(" # of files: %ld, # of datasets: %ld, dataset size: %.2fx%.2f KB\n",
- parms.num_files, parms.num_dsets,
- (double)(opts->num_bpp * parms.num_procs) / ONE_KB,
- (double)(opts->num_bpp * parms.num_procs) / ONE_KB);
- }
- else {
- parms.num_bytes = (off_t)opts->num_bpp * parms.num_procs;
- output_report("Transfer Buffer Size: %ld bytes, File size: %.2f MB\n", buf_size,
- ((double)parms.num_dsets * (double)parms.num_bytes) / ONE_MB);
-
- print_indent(1);
- output_report(" # of files: %ld, # of datasets: %ld, dataset size: %.2f MB\n",
- parms.num_files, parms.num_dsets,
- (double)(opts->num_bpp * parms.num_procs) / ONE_MB);
- }
-
- if (opts->io_types & PIO_POSIX)
- run_test(POSIXIO, parms, opts);
-
- if (opts->io_types & PIO_MPI)
- run_test(MPIO, parms, opts);
-
- if (opts->io_types & PIO_HDF5)
- run_test(PHDF5, parms, opts);
-
- /* Run the tests once if buf_size==0, but then break out */
- if (buf_size == 0)
- break;
- }
-
- if (destroy_comm_world() != SUCCESS) {
- /* do something harsh */
- }
- }
- }
-}
-
-/*
- * Function: run_test
- * Purpose: Inner loop call to actually run the I/O test.
- * Return: Nothing
- * Programmer: Bill Wendling, 18. December 2001
- * Modifications:
- */
-static int
-run_test(iotype iot, parameters parms, struct options *opts)
-{
- results res;
- register int i, ret_value = SUCCESS;
- int comm_size;
- off_t raw_size;
- minmax * write_mpi_mm_table = NULL;
- minmax * write_mm_table = NULL;
- minmax * write_gross_mm_table = NULL;
- minmax * write_raw_mm_table = NULL;
- minmax * read_mpi_mm_table = NULL;
- minmax * read_mm_table = NULL;
- minmax * read_gross_mm_table = NULL;
- minmax * read_raw_mm_table = NULL;
- minmax * read_open_mm_table = NULL;
- minmax * read_close_mm_table = NULL;
- minmax * write_open_mm_table = NULL;
- minmax * write_close_mm_table = NULL;
- minmax write_mpi_mm = {0.0, 0.0, 0.0, 0};
- minmax write_mm = {0.0, 0.0, 0.0, 0};
- minmax write_gross_mm = {0.0, 0.0, 0.0, 0};
- minmax write_raw_mm = {0.0, 0.0, 0.0, 0};
- minmax read_mpi_mm = {0.0, 0.0, 0.0, 0};
- minmax read_mm = {0.0, 0.0, 0.0, 0};
- minmax read_gross_mm = {0.0, 0.0, 0.0, 0};
- minmax read_raw_mm = {0.0, 0.0, 0.0, 0};
- minmax read_open_mm = {0.0, 0.0, 0.0, 0};
- minmax read_close_mm = {0.0, 0.0, 0.0, 0};
- minmax write_open_mm = {0.0, 0.0, 0.0, 0};
- minmax write_close_mm = {0.0, 0.0, 0.0, 0};
-
- raw_size = parms.num_files * (off_t)parms.num_dsets * (off_t)parms.num_bytes;
- parms.io_type = iot;
- print_indent(2);
- output_report("IO API = ");
-
- switch (iot) {
- case POSIXIO:
- output_report("POSIX\n");
- break;
- case MPIO:
- output_report("MPIO\n");
- break;
- case PHDF5:
- output_report("PHDF5 (w/MPI-IO driver)\n");
- break;
- default:
- break;
- }
-
- MPI_Comm_size(pio_comm_g, &comm_size);
-
- /* allocate space for tables minmax and that it is sufficient */
- /* to initialize all elements to zeros by calloc. */
- write_mpi_mm_table = calloc((size_t)parms.num_iters, sizeof(minmax));
- write_mm_table = calloc((size_t)parms.num_iters, sizeof(minmax));
- write_gross_mm_table = calloc((size_t)parms.num_iters, sizeof(minmax));
- write_raw_mm_table = calloc((size_t)parms.num_iters, sizeof(minmax));
- write_open_mm_table = calloc((size_t)parms.num_iters, sizeof(minmax));
- write_close_mm_table = calloc((size_t)parms.num_iters, sizeof(minmax));
- if (!parms.h5_write_only) {
- read_mpi_mm_table = calloc((size_t)parms.num_iters, sizeof(minmax));
- read_mm_table = calloc((size_t)parms.num_iters, sizeof(minmax));
- read_gross_mm_table = calloc((size_t)parms.num_iters, sizeof(minmax));
- read_raw_mm_table = calloc((size_t)parms.num_iters, sizeof(minmax));
- read_open_mm_table = calloc((size_t)parms.num_iters, sizeof(minmax));
- read_close_mm_table = calloc((size_t)parms.num_iters, sizeof(minmax));
- }
-
- /* Do IO iteration times, collecting statistics each time */
- for (i = 0; i < parms.num_iters; ++i) {
- double t;
-
- MPI_Barrier(pio_comm_g);
- res = do_pio(parms);
-
- /* gather all of the "mpi write" times */
- t = io_time_get(res.timers, HDF5_MPI_WRITE);
- get_minmax(&write_mpi_mm, t);
-
- write_mpi_mm_table[i] = write_mpi_mm;
-
- /* gather all of the "write" times */
- t = io_time_get(res.timers, HDF5_FINE_WRITE_FIXED_DIMS);
- get_minmax(&write_mm, t);
-
- write_mm_table[i] = write_mm;
-
- /* gather all of the "write" times from open to close */
- t = io_time_get(res.timers, HDF5_GROSS_WRITE_FIXED_DIMS);
- get_minmax(&write_gross_mm, t);
-
- write_gross_mm_table[i] = write_gross_mm;
-
- /* gather all of the raw "write" times */
- t = io_time_get(res.timers, HDF5_RAW_WRITE_FIXED_DIMS);
- get_minmax(&write_raw_mm, t);
-
- write_raw_mm_table[i] = write_raw_mm;
-
- /* gather all of the file open times (time from open to first write) */
- t = io_time_get(res.timers, HDF5_FILE_WRITE_OPEN);
- get_minmax(&write_open_mm, t);
-
- write_open_mm_table[i] = write_open_mm;
-
- /* gather all of the file close times (time from last write to close) */
- t = io_time_get(res.timers, HDF5_FILE_WRITE_CLOSE);
- get_minmax(&write_close_mm, t);
-
- write_close_mm_table[i] = write_close_mm;
-
- if (!parms.h5_write_only) {
- /* gather all of the "mpi read" times */
- t = io_time_get(res.timers, HDF5_MPI_READ);
- get_minmax(&read_mpi_mm, t);
-
- read_mpi_mm_table[i] = read_mpi_mm;
-
- /* gather all of the "read" times */
- t = io_time_get(res.timers, HDF5_FINE_READ_FIXED_DIMS);
- get_minmax(&read_mm, t);
-
- read_mm_table[i] = read_mm;
-
- /* gather all of the "read" times from open to close */
- t = io_time_get(res.timers, HDF5_GROSS_READ_FIXED_DIMS);
- get_minmax(&read_gross_mm, t);
-
- read_gross_mm_table[i] = read_gross_mm;
-
- /* gather all of the raw "read" times */
- t = io_time_get(res.timers, HDF5_RAW_READ_FIXED_DIMS);
- get_minmax(&read_raw_mm, t);
-
- read_raw_mm_table[i] = read_raw_mm;
-
- /* gather all of the file open times (time from open to first read) */
- t = io_time_get(res.timers, HDF5_FILE_READ_OPEN);
- get_minmax(&read_open_mm, t);
-
- read_open_mm_table[i] = read_open_mm;
-
- /* gather all of the file close times (time from last read to close) */
- t = io_time_get(res.timers, HDF5_FILE_READ_CLOSE);
- get_minmax(&read_close_mm, t);
-
- read_close_mm_table[i] = read_close_mm;
- }
-
- io_time_destroy(res.timers);
- }
-
- /*
- * Show various statistics
- */
- /* Write statistics */
- /* Print the raw data throughput if desired */
- if (opts->print_raw) {
- /* accumulate and output the max, min, and average "raw write" times */
- if (pio_debug_level >= 3) {
- /* output all of the times for all iterations */
- print_indent(3);
- output_report("Raw Data Write details:\n");
- output_all_info(write_raw_mm_table, parms.num_iters, 4);
- }
-
- output_results(opts, "Raw Data Write", write_raw_mm_table, parms.num_iters, raw_size);
- } /* end if */
-
- /* show mpi write statics */
- if (pio_debug_level >= 3) {
- /* output all of the times for all iterations */
- print_indent(3);
- output_report("MPI Write details:\n");
- output_all_info(write_mpi_mm_table, parms.num_iters, 4);
- }
-
- /* We don't currently output the MPI write results */
-
- /* accumulate and output the max, min, and average "write" times */
- if (pio_debug_level >= 3) {
- /* output all of the times for all iterations */
- print_indent(3);
- output_report("Write details:\n");
- output_all_info(write_mm_table, parms.num_iters, 4);
- }
-
- output_results(opts, "Write", write_mm_table, parms.num_iters, raw_size);
-
- /* accumulate and output the max, min, and average "gross write" times */
- if (pio_debug_level >= 3) {
- /* output all of the times for all iterations */
- print_indent(3);
- output_report("Write Open-Close details:\n");
- output_all_info(write_gross_mm_table, parms.num_iters, 4);
- }
-
- output_results(opts, "Write Open-Close", write_gross_mm_table, parms.num_iters, raw_size);
-
- if (opts->print_times) {
- output_times(opts, "Write File Open", write_open_mm_table, parms.num_iters);
- output_times(opts, "Write File Close", write_close_mm_table, parms.num_iters);
- }
-
- /* Print out time from open to first write */
- if (pio_debug_level >= 3) {
- /* output all of the times for all iterations */
- print_indent(3);
- output_report("Write file open details:\n");
- output_all_info(write_open_mm_table, parms.num_iters, 4);
- }
-
- /* Print out time from last write to close */
- if (pio_debug_level >= 3) {
- /* output all of the times for all iterations */
- print_indent(3);
- output_report("Write file close details:\n");
- output_all_info(write_close_mm_table, parms.num_iters, 4);
- }
-
- if (!parms.h5_write_only) {
- /* Read statistics */
- /* Print the raw data throughput if desired */
- if (opts->print_raw) {
- /* accumulate and output the max, min, and average "raw read" times */
- if (pio_debug_level >= 3) {
- /* output all of the times for all iterations */
- print_indent(3);
- output_report("Raw Data Read details:\n");
- output_all_info(read_raw_mm_table, parms.num_iters, 4);
- }
-
- output_results(opts, "Raw Data Read", read_raw_mm_table, parms.num_iters, raw_size);
- } /* end if */
-
- /* show mpi read statics */
- if (pio_debug_level >= 3) {
- /* output all of the times for all iterations */
- print_indent(3);
- output_report("MPI Read details:\n");
- output_all_info(read_mpi_mm_table, parms.num_iters, 4);
- }
-
- /* We don't currently output the MPI read results */
-
- /* accumulate and output the max, min, and average "read" times */
- if (pio_debug_level >= 3) {
- /* output all of the times for all iterations */
- print_indent(3);
- output_report("Read details:\n");
- output_all_info(read_mm_table, parms.num_iters, 4);
- }
-
- output_results(opts, "Read", read_mm_table, parms.num_iters, raw_size);
-
- /* accumulate and output the max, min, and average "gross read" times */
- if (pio_debug_level >= 3) {
- /* output all of the times for all iterations */
- print_indent(3);
- output_report("Read Open-Close details:\n");
- output_all_info(read_gross_mm_table, parms.num_iters, 4);
- }
-
- output_results(opts, "Read Open-Close", read_gross_mm_table, parms.num_iters, raw_size);
-
- if (opts->print_times) {
- output_times(opts, "Read File Open", read_open_mm_table, parms.num_iters);
- output_times(opts, "Read File Close", read_close_mm_table, parms.num_iters);
- }
-
- /* Print out time from open to first read */
- if (pio_debug_level >= 3) {
- /* output all of the times for all iterations */
- print_indent(3);
- output_report("Read file open details:\n");
- output_all_info(read_open_mm_table, parms.num_iters, 4);
- }
-
- /* Print out time from last read to close */
- if (pio_debug_level >= 3) {
- /* output all of the times for all iterations */
- print_indent(3);
- output_report("Read file close details:\n");
- output_all_info(read_close_mm_table, parms.num_iters, 4);
- }
- }
-
- /* clean up our mess */
- free(write_mpi_mm_table);
- free(write_mm_table);
- free(write_gross_mm_table);
- free(write_raw_mm_table);
- free(write_open_mm_table);
- free(write_close_mm_table);
-
- if (!parms.h5_write_only) {
- free(read_mpi_mm_table);
- free(read_mm_table);
- free(read_gross_mm_table);
- free(read_raw_mm_table);
- free(read_open_mm_table);
- free(read_close_mm_table);
- }
-
- return ret_value;
-}
-
-/*
- * Function: output_all_info
- * Purpose:
- * Return: Nothing
- * Programmer: Bill Wendling, 29. January 2002
- * Modifications:
- */
-static void
-output_all_info(minmax *mm, int count, int indent_level)
-{
- int i;
-
- for (i = 0; i < count; ++i) {
- print_indent(indent_level);
- output_report("Iteration %d:\n", i + 1);
- print_indent(indent_level + 1);
- output_report("Minimum Time: %.2fs\n", mm[i].min);
- print_indent(indent_level + 1);
- output_report("Maximum Time: %.2fs\n", mm[i].max);
- }
-}
-
-/*
- * Function: get_minmax
- * Purpose: Gather all the min, max and total of val.
- * Return: Nothing
- * Programmer: Bill Wendling, 21. December 2001
- * Modifications:
- * Use MPI_Allreduce to do it. -akc, 2002/01/11
- */
-static void
-get_minmax(minmax *mm, double val)
-{
- int myrank;
-
- MPI_Comm_rank(pio_comm_g, &myrank);
- MPI_Comm_size(pio_comm_g, &mm->num);
-
- MPI_Allreduce(&val, &mm->max, 1, MPI_DOUBLE, MPI_MAX, pio_comm_g);
- MPI_Allreduce(&val, &mm->min, 1, MPI_DOUBLE, MPI_MIN, pio_comm_g);
- MPI_Allreduce(&val, &mm->sum, 1, MPI_DOUBLE, MPI_SUM, pio_comm_g);
-}
-
-/*
- * Function: accumulate_minmax_stuff
- * Purpose: Accumulate the minimum, maximum, and average of the times
- * across all processes.
- * Return: TOTAL_MM - the total of all of these.
- * Programmer: Bill Wendling, 21. December 2001
- * Modifications:
- * Changed to use seconds instead of MB/s - QAK, 5/9/02
- */
-static minmax
-accumulate_minmax_stuff(minmax *mm, int count)
-{
- int i;
- minmax total_mm;
-
- total_mm.sum = 0.0f;
- total_mm.max = -DBL_MAX;
- total_mm.min = DBL_MAX;
- total_mm.num = count;
-
- for (i = 0; i < count; ++i) {
- double m = mm[i].max;
-
- total_mm.sum += m;
-
- if (m < total_mm.min)
- total_mm.min = m;
-
- if (m > total_mm.max)
- total_mm.max = m;
- }
-
- return total_mm;
-}
-
-/*
- * Function: create_comm_world
- * Purpose: Create an MPI Comm world and store it in pio_comm_g, which
- * is a global variable.
- * Return: SUCCESS on success.
- * FAIL otherwise.
- * Programmer: Bill Wendling, 19. December 2001
- * Modifications:
- */
-static int
-create_comm_world(int num_procs, int *doing_pio)
-{
- /* MPI variables */
- int mrc; /* return values */
- int color; /* for communicator creation */
- int myrank, nprocs;
-
- pio_comm_g = MPI_COMM_NULL;
-
- /*
- * Create a sub communicator for this PIO run. Easier to use the first N
- * processes.
- */
- MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
-
- if (num_procs > nprocs) {
- HDfprintf(stderr, "number of process(%d) must be <= number of processes in MPI_COMM_WORLD(%d)\n",
- num_procs, nprocs);
- goto error_done;
- }
-
- MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
- color = (myrank < num_procs);
- mrc = MPI_Comm_split(MPI_COMM_WORLD, color, myrank, &pio_comm_g);
-
- if (mrc != MPI_SUCCESS) {
- HDfprintf(stderr, "MPI_Comm_split failed\n");
- goto error_done;
- }
-
- if (!color) {
- /* not involved in this run */
- mrc = destroy_comm_world();
- goto done;
- }
-
- /* determine the MPI rank in the PIO communicator */
- MPI_Comm_size(pio_comm_g, &pio_mpi_nprocs_g);
- MPI_Comm_rank(pio_comm_g, &pio_mpi_rank_g);
-
-done:
- *doing_pio = color;
- return SUCCESS;
-
-error_done:
- destroy_comm_world();
- return FAIL;
-}
-
-/*
- * Function: destroy_comm_world
- * Purpose: Destroy the created MPI Comm world which is stored in the
- * pio_comm_g global variable.
- * Return: SUCCESS on success.
- * FAIL otherwise.
- * Programmer: Bill Wendling, 19. December 2001
- * Modifications:
- */
-static int
-destroy_comm_world(void)
-{
- int mrc = SUCCESS; /* return code */
-
- /* release MPI resources */
- if (pio_comm_g != MPI_COMM_NULL)
- mrc = (MPI_Comm_free(&pio_comm_g) == MPI_SUCCESS ? SUCCESS : FAIL);
-
- return mrc;
-}
-
-/*
- * Function: output_results
- * Purpose: Print information about the time & bandwidth for a given
- * minmax & # of iterations.
- * Return: Nothing
- * Programmer: Quincey Koziol, 9. May 2002
- * Modifications:
- */
-static void
-output_results(const struct options *opts, const char *name, minmax *table, int table_size, off_t data_size)
-{
- minmax total_mm;
-
- total_mm = accumulate_minmax_stuff(table, table_size);
-
- print_indent(3);
- output_report("%s (%d iteration(s)):\n", name, table_size);
-
- /* Note: The maximum throughput uses the minimum amount of time & vice versa */
-
- print_indent(4);
- output_report("Maximum Throughput: %6.2f MB/s", MB_PER_SEC(data_size, total_mm.min));
- if (opts->print_times)
- output_report(" (%7.3f s)\n", total_mm.min);
- else
- output_report("\n");
-
- print_indent(4);
- output_report("Average Throughput: %6.2f MB/s", MB_PER_SEC(data_size, total_mm.sum / total_mm.num));
- if (opts->print_times)
- output_report(" (%7.3f s)\n", (total_mm.sum / total_mm.num));
- else
- output_report("\n");
-
- print_indent(4);
- output_report("Minimum Throughput: %6.2f MB/s", MB_PER_SEC(data_size, total_mm.max));
- if (opts->print_times)
- output_report(" (%7.3f s)\n", total_mm.max);
- else
- output_report("\n");
-}
-
-static void
-output_times(const struct options *opts, const char *name, minmax *table, int table_size)
-{
- minmax total_mm;
-
- total_mm = accumulate_minmax_stuff(table, table_size);
-
- print_indent(3);
- output_report("%s (%d iteration(s)):\n", name, table_size);
-
- /* Note: The maximum throughput uses the minimum amount of time & vice versa */
-
- print_indent(4);
- output_report("Minimum Accumulated Time using %d file(s): %7.5f s\n", opts->num_files, (total_mm.min));
-
- print_indent(4);
- output_report("Average Accumulated Time using %d file(s): %7.5f s\n", opts->num_files,
- (total_mm.sum / total_mm.num));
-
- print_indent(4);
- output_report("Maximum Accumulated Time using %d file(s): %7.5f s\n", opts->num_files, (total_mm.max));
-}
-
-/*
- * Function: output_report
- * Purpose: Print a line of the report. Only do so if I'm the 0 process.
- * Return: Nothing
- * Programmer: Bill Wendling, 19. December 2001
- * Modifications:
- */
-static void
-output_report(const char *fmt, ...)
-{
- int myrank;
-
- MPI_Comm_rank(pio_comm_g, &myrank);
-
- if (myrank == 0) {
- va_list ap;
-
- HDva_start(ap, fmt);
- HDvfprintf(output, fmt, ap);
- HDva_end(ap);
- }
-}
-
-/*
- * Function: print_indent
- * Purpose: Print spaces to indent a new line of text for pretty printing
- * things.
- * Return: Nothing
- * Programmer: Bill Wendling, 29. October 2001
- * Modifications:
- */
-static void
-print_indent(register int indent)
-{
- int myrank;
-
- MPI_Comm_rank(pio_comm_g, &myrank);
-
- if (myrank == 0) {
- indent *= TAB_SPACE;
-
- for (; indent > 0; --indent)
- HDfputc(' ', output);
- }
-}
-
-static void
-recover_size_and_print(long long val, const char *end)
-{
- if (val >= ONE_KB && (val % ONE_KB) == 0) {
- if (val >= ONE_MB && (val % ONE_MB) == 0) {
- if (val >= ONE_GB && (val % ONE_GB) == 0)
- HDfprintf(output,
- "%" H5_PRINTF_LL_WIDTH "d"
- "GB%s",
- val / ONE_GB, end);
- else
- HDfprintf(output,
- "%" H5_PRINTF_LL_WIDTH "d"
- "MB%s",
- val / ONE_MB, end);
- }
- else {
- HDfprintf(output,
- "%" H5_PRINTF_LL_WIDTH "d"
- "KB%s",
- val / ONE_KB, end);
- }
- }
- else {
- HDfprintf(output,
- "%" H5_PRINTF_LL_WIDTH "d"
- "%s",
- val, end);
- }
-}
-
-static void
-print_io_api(long io_types)
-{
- if (io_types & PIO_POSIX)
- HDfprintf(output, "posix ");
- if (io_types & PIO_MPI)
- HDfprintf(output, "mpiio ");
- if (io_types & PIO_HDF5)
- HDfprintf(output, "phdf5 ");
- HDfprintf(output, "\n");
-}
-
-static void
-report_parameters(struct options *opts)
-{
- int rank = comm_world_rank_g;
-
- print_version("HDF5 Library"); /* print library version */
- HDfprintf(output, "rank %d: ==== Parameters ====\n", rank);
-
- HDfprintf(output, "rank %d: IO API=", rank);
- print_io_api(opts->io_types);
-
- HDfprintf(output, "rank %d: Number of files=%ld\n", rank, opts->num_files);
- HDfprintf(output, "rank %d: Number of datasets=%ld\n", rank, opts->num_dsets);
- HDfprintf(output, "rank %d: Number of iterations=%d\n", rank, opts->num_iters);
- HDfprintf(output, "rank %d: Number of processes=%d:%d\n", rank, opts->min_num_procs, opts->max_num_procs);
-
- if (opts->dim2d) {
- HDfprintf(output, "rank %d: Number of bytes per process per dataset=", rank);
- recover_size_and_print((long long)(opts->num_bpp * opts->num_bpp * opts->min_num_procs), ":");
- recover_size_and_print((long long)(opts->num_bpp * opts->num_bpp * opts->max_num_procs), "\n");
-
- HDfprintf(output, "rank %d: Size of dataset(s)=", rank);
- recover_size_and_print((long long)(opts->num_bpp * opts->min_num_procs), "x");
- recover_size_and_print((long long)(opts->num_bpp * opts->min_num_procs), ":");
- recover_size_and_print((long long)(opts->num_bpp * opts->max_num_procs), "x");
- recover_size_and_print((long long)(opts->num_bpp * opts->max_num_procs), "\n");
-
- HDfprintf(output, "rank %d: File size=", rank);
- recover_size_and_print((long long)(squareo(opts->num_bpp * opts->min_num_procs) * opts->num_dsets),
- ":");
- recover_size_and_print((long long)(squareo(opts->num_bpp * opts->max_num_procs) * opts->num_dsets),
- "\n");
-
- HDfprintf(output, "rank %d: Transfer buffer size=", rank);
- if (opts->interleaved) {
- recover_size_and_print((long long)opts->min_xfer_size, "x");
- recover_size_and_print((long long)opts->blk_size, ":");
- recover_size_and_print((long long)opts->max_xfer_size, "x");
- recover_size_and_print((long long)opts->blk_size, "\n");
- }
- else {
- recover_size_and_print((long long)opts->blk_size, "x");
- recover_size_and_print((long long)opts->min_xfer_size, ":");
- recover_size_and_print((long long)opts->blk_size, "x");
- recover_size_and_print((long long)opts->max_xfer_size, "\n");
- }
- HDfprintf(output, "rank %d: Block size=", rank);
- recover_size_and_print((long long)opts->blk_size, "x");
- recover_size_and_print((long long)opts->blk_size, "\n");
- }
- else {
- HDfprintf(output, "rank %d: Number of bytes per process per dataset=", rank);
- recover_size_and_print((long long)opts->num_bpp, "\n");
-
- HDfprintf(output, "rank %d: Size of dataset(s)=", rank);
- recover_size_and_print((long long)(opts->num_bpp * opts->min_num_procs), ":");
- recover_size_and_print((long long)(opts->num_bpp * opts->max_num_procs), "\n");
-
- HDfprintf(output, "rank %d: File size=", rank);
- recover_size_and_print((long long)(opts->num_bpp * opts->min_num_procs * opts->num_dsets), ":");
- recover_size_and_print((long long)(opts->num_bpp * opts->max_num_procs * opts->num_dsets), "\n");
-
- HDfprintf(output, "rank %d: Transfer buffer size=", rank);
- recover_size_and_print((long long)opts->min_xfer_size, ":");
- recover_size_and_print((long long)opts->max_xfer_size, "\n");
- HDfprintf(output, "rank %d: Block size=", rank);
- recover_size_and_print((long long)opts->blk_size, "\n");
- }
-
- HDfprintf(output, "rank %d: Block Pattern in Dataset=", rank);
- if (opts->interleaved)
- HDfprintf(output, "Interleaved\n");
- else
- HDfprintf(output, "Contiguous\n");
-
- HDfprintf(output, "rank %d: I/O Method for MPI and HDF5=", rank);
- if (opts->collective)
- HDfprintf(output, "Collective\n");
- else
- HDfprintf(output, "Independent\n");
-
- HDfprintf(output, "rank %d: Geometry=", rank);
- if (opts->dim2d)
- HDfprintf(output, "2D\n");
- else
- HDfprintf(output, "1D\n");
-
- HDfprintf(output, "rank %d: VFL used for HDF5 I/O=%s\n", rank, "MPI-IO driver");
-
- HDfprintf(output, "rank %d: Data storage method in HDF5=", rank);
- if (opts->h5_use_chunks)
- HDfprintf(output, "Chunked\n");
- else
- HDfprintf(output, "Contiguous\n");
-
- {
- char *prefix = HDgetenv("HDF5_PARAPREFIX");
-
- HDfprintf(output, "rank %d: Env HDF5_PARAPREFIX=%s\n", rank, (prefix ? prefix : "not set"));
- }
-
- HDfprintf(output, "rank %d: ", rank);
- h5_dump_info_object(h5_io_info_g);
-
- HDfprintf(output, "rank %d: ==== End of Parameters ====\n", rank);
- HDfprintf(output, "\n");
-}
-
-/*
- * Function: parse_command_line
- * Purpose: Parse the command line options and return a STRUCT OPTIONS
- * structure which will need to be freed by the calling function.
- * Return: Pointer to an OPTIONS structure
- * Programmer: Bill Wendling, 31. October 2001
- * Modifications:
- * Added 2D testing (Christian Chilan, 10. August 2005)
- */
-static struct options *
-parse_command_line(int argc, char *argv[])
-{
- register int opt;
- struct options *cl_opts;
-
- cl_opts = (struct options *)malloc(sizeof(struct options));
-
- cl_opts->output_file = NULL;
- cl_opts->io_types = 0; /* will set default after parsing options */
- cl_opts->num_dsets = 1;
- cl_opts->num_files = 1;
- cl_opts->num_bpp = 0;
- cl_opts->num_iters = 1;
- cl_opts->max_num_procs = comm_world_nprocs_g;
- cl_opts->min_num_procs = 1;
- cl_opts->max_xfer_size = 0;
- cl_opts->min_xfer_size = 0;
- cl_opts->blk_size = 0;
- cl_opts->interleaved = 0; /* Default to contiguous blocks in dataset */
- cl_opts->collective = 0; /* Default to independent I/O access */
- cl_opts->dim2d = 0; /* Default to 1D */
- cl_opts->print_times = FALSE; /* Printing times is off by default */
- cl_opts->print_raw = FALSE; /* Printing raw data throughput is off by default */
- cl_opts->h5_alignment = 1; /* No alignment for HDF5 objects by default */
- cl_opts->h5_threshold = 1; /* No threshold for aligning HDF5 objects by default */
- cl_opts->h5_use_chunks = FALSE; /* Don't chunk the HDF5 dataset by default */
- cl_opts->h5_write_only = FALSE; /* Do both read and write by default */
- cl_opts->verify = FALSE; /* No Verify data correctness by default */
-
- while ((opt = get_option(argc, (const char **)argv, s_opts, l_opts)) != EOF) {
- switch ((char)opt) {
- case 'a':
- cl_opts->h5_alignment = parse_size_directive(opt_arg);
- break;
- case 'A': {
- const char *end = opt_arg;
-
- while (end && *end != '\0') {
- char buf[10];
- int i;
-
- HDmemset(buf, '\0', sizeof(buf));
-
- for (i = 0; *end != '\0' && *end != ','; ++end)
- if (isalnum(*end) && i < 10)
- buf[i++] = *end;
-
- if (!HDstrcasecmp(buf, "phdf5")) {
- cl_opts->io_types |= PIO_HDF5;
- }
- else if (!HDstrcasecmp(buf, "mpiio")) {
- cl_opts->io_types |= PIO_MPI;
- }
- else if (!HDstrcasecmp(buf, "posix")) {
- cl_opts->io_types |= PIO_POSIX;
- }
- else {
- HDfprintf(stderr, "pio_perf: invalid --api option %s\n", buf);
- HDexit(EXIT_FAILURE);
- }
-
- if (*end == '\0')
- break;
-
- end++;
- }
- }
-
- break;
-#if 0
- case 'b':
- /* the future "binary" option */
- break;
-#endif /* 0 */
- case 'B':
- cl_opts->blk_size = (size_t)parse_size_directive(opt_arg);
- break;
- case 'c':
- /* Turn on chunked HDF5 dataset creation */
- cl_opts->h5_use_chunks = TRUE;
- break;
- case 'C':
- cl_opts->collective = 1;
- break;
- case 'd':
- cl_opts->num_dsets = atoi(opt_arg);
- break;
- case 'D': {
- const char *end = opt_arg;
-
- while (end && *end != '\0') {
- char buf[10];
- int i;
-
- HDmemset(buf, '\0', sizeof(buf));
-
- for (i = 0; *end != '\0' && *end != ','; ++end)
- if (HDisalnum(*end) && i < 10)
- buf[i++] = *end;
-
- if (HDstrlen(buf) > 1 || HDisdigit(buf[0])) {
- size_t j;
-
- for (j = 0; j < 10 && buf[j] != '\0'; ++j)
- if (!isdigit(buf[j])) {
- HDfprintf(stderr, "pio_perf: invalid --debug option %s\n", buf);
- HDexit(EXIT_FAILURE);
- }
-
- pio_debug_level = atoi(buf);
-
- if (pio_debug_level > 4)
- pio_debug_level = 4;
- else if (pio_debug_level < 0)
- pio_debug_level = 0;
- }
- else {
- switch (*buf) {
- case 'r':
- /* Turn on raw data throughput info */
- cl_opts->print_raw = TRUE;
- break;
- case 't':
- /* Turn on time printing */
- cl_opts->print_times = TRUE;
- break;
- case 'v':
- /* Turn on verify data correctness*/
- cl_opts->verify = TRUE;
- break;
- default:
- HDfprintf(stderr, "pio_perf: invalid --debug option %s\n", buf);
- HDexit(EXIT_FAILURE);
- }
- }
-
- if (*end == '\0')
- break;
-
- end++;
- }
- }
-
- break;
- case 'e':
- cl_opts->num_bpp = parse_size_directive(opt_arg);
- break;
- case 'F':
- cl_opts->num_files = HDatoi(opt_arg);
- break;
- case 'g':
- cl_opts->dim2d = 1;
- break;
- case 'i':
- cl_opts->num_iters = HDatoi(opt_arg);
- break;
- case 'I':
- cl_opts->interleaved = 1;
- break;
- case 'o':
- cl_opts->output_file = opt_arg;
- break;
- case 'p':
- cl_opts->min_num_procs = HDatoi(opt_arg);
- break;
- case 'P':
- cl_opts->max_num_procs = HDatoi(opt_arg);
- break;
- case 'T':
- cl_opts->h5_threshold = parse_size_directive(opt_arg);
- break;
- case 'w':
- cl_opts->h5_write_only = TRUE;
- break;
- case 'x':
- cl_opts->min_xfer_size = (size_t)parse_size_directive(opt_arg);
- break;
- case 'X':
- cl_opts->max_xfer_size = (size_t)parse_size_directive(opt_arg);
- break;
- case 'h':
- case '?':
- default:
- usage(progname);
- HDfree(cl_opts);
- return NULL;
- }
- }
-
- if (cl_opts->num_bpp == 0) {
- if (cl_opts->dim2d == 0)
- cl_opts->num_bpp = 256 * ONE_KB;
- else
- cl_opts->num_bpp = 8 * ONE_KB;
- }
-
- if (cl_opts->max_xfer_size == 0)
- cl_opts->max_xfer_size = (size_t)cl_opts->num_bpp;
-
- if (cl_opts->min_xfer_size == 0)
- cl_opts->min_xfer_size = (size_t)(cl_opts->num_bpp) / 2;
-
- if (cl_opts->blk_size == 0)
- cl_opts->blk_size = (size_t)(cl_opts->num_bpp) / 2;
-
- /* set default if none specified yet */
- if (!cl_opts->io_types)
- cl_opts->io_types = PIO_HDF5 | PIO_MPI | PIO_POSIX; /* run all API */
-
- /* verify parameters sanity. Adjust if needed. */
- /* cap xfer_size with bytes per process */
- if (!cl_opts->dim2d) {
- if (cl_opts->min_xfer_size > (size_t)cl_opts->num_bpp)
- cl_opts->min_xfer_size = (size_t)cl_opts->num_bpp;
- if (cl_opts->max_xfer_size > (size_t)cl_opts->num_bpp)
- cl_opts->max_xfer_size = (size_t)cl_opts->num_bpp;
- }
- if (cl_opts->min_xfer_size > cl_opts->max_xfer_size)
- cl_opts->min_xfer_size = cl_opts->max_xfer_size;
- if (cl_opts->blk_size > (size_t)cl_opts->num_bpp)
- cl_opts->blk_size = (size_t)cl_opts->num_bpp;
- /* check range of number of processes */
- if (cl_opts->min_num_procs <= 0)
- cl_opts->min_num_procs = 1;
- if (cl_opts->max_num_procs <= 0)
- cl_opts->max_num_procs = 1;
- if (cl_opts->min_num_procs > cl_opts->max_num_procs)
- cl_opts->min_num_procs = cl_opts->max_num_procs;
- /* check iteration */
- if (cl_opts->num_iters <= 0)
- cl_opts->num_iters = 1;
-
- return cl_opts;
-}
-
-/*
- * Function: parse_size_directive
- * Purpose: Parse the size directive passed on the commandline. The size
- * directive is an integer followed by a size indicator:
- *
- * K, k - Kilobyte
- * M, m - Megabyte
- * G, g - Gigabyte
- *
- * Return: The size as a off_t because this is related to file size.
- * If an unknown size indicator is used, then the program will
- * exit with EXIT_FAILURE as the return value.
- * Programmer: Bill Wendling, 18. December 2001
- * Modifications:
- */
-static off_t
-parse_size_directive(const char *size)
-{
- off_t s;
- char *endptr;
-
- s = HDstrtol(size, &endptr, 10);
-
- if (endptr && *endptr) {
- while (*endptr != '\0' && (*endptr == ' ' || *endptr == '\t'))
- ++endptr;
-
- switch (*endptr) {
- case 'K':
- case 'k':
- s *= ONE_KB;
- break;
- case 'M':
- case 'm':
- s *= ONE_MB;
- break;
- case 'G':
- case 'g':
- s *= ONE_GB;
- break;
- default:
- HDfprintf(stderr, "Illegal size specifier '%c'\n", *endptr);
- HDexit(EXIT_FAILURE);
- }
- }
-
- return s;
-}
-
-/*
- * Function: usage
- * Purpose: Print a usage message and then exit.
- * Return: Nothing
- * Programmer: Bill Wendling, 31. October 2001
- * Modifications:
- * Added 2D testing (Christian Chilan, 10. August 2005)
- */
-static void
-usage(const char *prog)
-{
- int myrank;
-
- MPI_Comm_rank(pio_comm_g, &myrank);
-
- if (myrank == 0) {
- print_version(prog);
- HDprintf("usage: %s [OPTIONS]\n", prog);
- HDprintf(" OPTIONS\n");
- HDprintf(" -h, --help Print a usage message and exit\n");
- HDprintf(" -a S, --align=S Alignment of objects in HDF5 file [default: 1]\n");
- HDprintf(" -A AL, --api=AL Which APIs to test [default: all of them]\n");
-#if 0
- HDprintf(" -b, --binary The elusive binary option\n");
-#endif /* 0 */
- HDprintf(" -B S, --block-size=S Block size within transfer buffer\n");
- HDprintf(" (see below for description)\n");
- HDprintf(" [default: half the number of bytes per process\n");
- HDprintf(" per dataset]\n");
- HDprintf(" -c, --chunk Create HDF5 datasets using chunked storage\n");
- HDprintf(" [default: contiguous storage]\n");
- HDprintf(" -C, --collective Use collective I/O for MPI and HDF5 APIs\n");
- HDprintf(" [default: independent I/O)\n");
- HDprintf(" -d N, --num-dsets=N Number of datasets per file [default: 1]\n");
- HDprintf(" -D DL, --debug=DL Indicate the debugging level\n");
- HDprintf(" [default: no debugging]\n");
- HDprintf(" -e S, --num-bytes=S Number of bytes per process per dataset\n");
- HDprintf(" (see below for description)\n");
- HDprintf(" [default: 256K for 1D, 8K for 2D]\n");
- HDprintf(" -F N, --num-files=N Number of files [default: 1]\n");
- HDprintf(" -g, --geometry Use 2D geometry [default: 1D geometry]\n");
- HDprintf(" -i N, --num-iterations=N Number of iterations to perform [default: 1]\n");
- HDprintf(" -I, --interleaved Interleaved access pattern\n");
- HDprintf(" (see below for example)\n");
- HDprintf(" [default: Contiguous access pattern]\n");
- HDprintf(" -o F, --output=F Output raw data into file F [default: none]\n");
- HDprintf(" -p N, --min-num-processes=N Minimum number of processes to use [default: 1]\n");
- HDprintf(" -P N, --max-num-processes=N Maximum number of processes to use\n");
- HDprintf(" [default: all MPI_COMM_WORLD processes ]\n");
- HDprintf(" -T S, --threshold=S Threshold for alignment of objects in HDF5 file\n");
- HDprintf(" [default: 1]\n");
- HDprintf(" -w, --write-only Perform write tests not the read tests\n");
- HDprintf(" -x S, --min-xfer-size=S Minimum transfer buffer size\n");
- HDprintf(" (see below for description)\n");
- HDprintf(" [default: half the number of bytes per process\n");
- HDprintf(" per dataset]\n");
- HDprintf(" -X S, --max-xfer-size=S Maximum transfer buffer size\n");
- HDprintf(" [default: the number of bytes per process per\n");
- HDprintf(" dataset]\n");
- HDprintf("\n");
- HDprintf(" F - is a filename.\n");
- HDprintf(" N - is an integer >=0.\n");
- HDprintf(" S - is a size specifier, an integer >=0 followed by a size indicator:\n");
- HDprintf(" K - Kilobyte (%d)\n", ONE_KB);
- HDprintf(" M - Megabyte (%d)\n", ONE_MB);
- HDprintf(" G - Gigabyte (%d)\n", ONE_GB);
- HDprintf("\n");
- HDprintf(" Example: '37M' is 37 megabytes or %d bytes\n", 37 * ONE_MB);
- HDprintf("\n");
- HDprintf(" AL - is an API list. Valid values are:\n");
- HDprintf(" phdf5 - Parallel HDF5\n");
- HDprintf(" mpiio - MPI-I/O\n");
- HDprintf(" posix - POSIX\n");
- HDprintf("\n");
- HDprintf(" Example: --api=mpiio,phdf5\n");
- HDprintf("\n");
- HDprintf(" Dataset size:\n");
- HDprintf(" Depending on the selected geometry, each test dataset is either a linear\n");
- HDprintf(" array of size bytes-per-process * num-processes, or a square array of size\n");
- HDprintf(" (bytes-per-process * num-processes) x (bytes-per-process * num-processes).\n");
- HDprintf("\n");
- HDprintf(" Block size vs. Transfer buffer size:\n");
- HDprintf(" buffer-size controls the size of the memory buffer, which is broken into\n");
- HDprintf(" blocks and written to the file. Depending on the selected geometry, each\n");
- HDprintf(" block can be a linear array of size block-size or a square array of size\n");
- HDprintf(" block-size x block-size. The arrangement in which blocks are written is\n");
- HDprintf(" determined by the access pattern.\n");
- HDprintf("\n");
- HDprintf(" In 1D geometry, the transfer buffer is a linear array of size buffer-size.\n");
- HDprintf(" In 2D geometry, it is a rectangular array of size block-size x buffer-size\n");
- HDprintf(" or buffer-size x block-size if interleaved pattern is selected.\n");
- HDprintf("\n");
- HDprintf(" Interleaved and Contiguous patterns in 1D geometry:\n");
- HDprintf(" When contiguous access pattern is chosen, the dataset is evenly divided\n");
- HDprintf(" into num-processes regions and each process writes data to its own region.\n");
- HDprintf(" When interleaved blocks are written to a dataset, space for the first\n");
- HDprintf(" block of the first process is allocated in the dataset, then space is\n");
- HDprintf(" allocated for the first block of the second process, etc. until space is\n");
- HDprintf(" allocated for the first block of each process, then space is allocated for\n");
- HDprintf(" the second block of the first process, the second block of the second\n");
- HDprintf(" process, etc.\n");
- HDprintf("\n");
- HDprintf(" For example, with a 3 process run, 512KB bytes-per-process, 256KB transfer\n");
- HDprintf(" buffer size, and 64KB block size, each process must issue 2 transfer\n");
- HDprintf(" requests to complete access to the dataset.\n");
- HDprintf(" Contiguous blocks of the first transfer request are written like so:\n");
- HDprintf(" 1111----2222----3333----\n");
- HDprintf(" Interleaved blocks of the first transfer request are written like so:\n");
- HDprintf(" 123123123123------------\n");
- HDprintf(" The actual number of I/O operations involved in a transfer request\n");
- HDprintf(" depends on the access pattern and communication mode.\n");
- HDprintf(" When using independent I/O with interleaved pattern, each process\n");
- HDprintf(" performs 4 small non-contiguous I/O operations per transfer request.\n");
- HDprintf(" If collective I/O is turned on, the combined content of the buffers of\n");
- HDprintf(" the 3 processes will be written using one collective I/O operation\n");
- HDprintf(" per transfer request.\n");
- HDprintf("\n");
- HDprintf(" For information about access patterns in 2D geometry, please refer to the\n");
- HDprintf(" HDF5 Reference Manual.\n");
- HDprintf("\n");
- HDprintf(" DL - is a list of debugging flags. Valid values are:\n");
- HDprintf(" 1 - Minimal\n");
- HDprintf(" 2 - Not quite everything\n");
- HDprintf(" 3 - Everything\n");
- HDprintf(" 4 - The kitchen sink\n");
- HDprintf(" r - Raw data I/O throughput information\n");
- HDprintf(" t - Times as well as throughputs\n");
- HDprintf(" v - Verify data correctness\n");
- HDprintf("\n");
- HDprintf(" Example: --debug=2,r,t\n");
- HDprintf("\n");
- HDprintf(" Environment variables:\n");
- HDprintf(" HDF5_NOCLEANUP Do not remove data files if set [default remove]\n");
- HDprintf(" HDF5_MPI_INFO MPI INFO object key=value separated by ;\n");
- HDprintf(" HDF5_PARAPREFIX Paralllel data files prefix\n");
- fflush(stdout);
- } /* end if */
-} /* end usage() */
-
-#else /* H5_HAVE_PARALLEL */
-
-/*
- * Function: main
- * Purpose: Dummy main() function for if HDF5 was configured without
- * parallel stuff.
- * Return: EXIT_SUCCESS
- * Programmer: Bill Wendling, 14. November 2001
- */
-int
-main(void)
-{
- HDprintf("No parallel IO performance because parallel is not configured\n");
- return EXIT_SUCCESS;
-} /* end main */
-
-#endif /* !H5_HAVE_PARALLEL */
diff --git a/tools/test/perform/pio_perf.h b/tools/test/perform/pio_perf.h
deleted file mode 100644
index 027b553..0000000
--- a/tools/test/perform/pio_perf.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Copyright by The HDF Group. *
- * 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 COPYING file, which can be found at the root of the source code *
- * distribution tree, or in https://www.hdfgroup.org/licenses. *
- * If you do not have access to either file, you may request a copy from *
- * help@hdfgroup.org. *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#ifndef PIO_PERF_H__
-#define PIO_PERF_H__
-
-#ifndef STANDALONE
-#include "io_timer.h"
-#include "h5test.h"
-#include "h5tools.h"
-#include "h5tools_utils.h"
-#else
-#include "io_timer.h"
-#include "pio_standalone.h"
-#endif
-
-/* setup the dataset no fill option if this is v1.5 or more */
-#if H5_VERS_MAJOR > 1 || H5_VERS_MINOR > 4
-#define H5_HAVE_NOFILL 1
-#endif
-
-typedef enum iotype_ {
- POSIXIO,
- MPIO,
- PHDF5
- /*NUM_TYPES*/
-} iotype;
-
-typedef struct parameters_ {
- iotype io_type; /* The type of IO test to perform */
- int num_procs; /* Maximum number of processes to use */
- long num_files; /* Number of files to create */
- long num_dsets; /* Number of datasets to create */
- off_t num_bytes; /* Number of bytes in each dset */
- int num_iters; /* Number of times to loop doing the IO */
- size_t buf_size; /* Buffer size */
- size_t blk_size; /* Block size */
- unsigned interleaved; /* Interleaved vs. contiguous blocks */
- unsigned collective; /* Collective vs. independent I/O */
- unsigned dim2d; /* 1D vs. 2D */
- hsize_t h5_align; /* HDF5 object alignment */
- hsize_t h5_thresh; /* HDF5 object alignment threshold */
- int h5_use_chunks; /* Make HDF5 dataset chunked */
- int h5_write_only; /* Perform the write tests only */
- int verify; /* Verify data correctness */
-} parameters;
-
-typedef struct results_ {
- herr_t ret_code;
- io_time_t *timers;
-} results;
-
-#ifndef SUCCESS
-#define SUCCESS 0
-#endif /* !SUCCESS */
-
-#ifndef FAIL
-#define FAIL -1
-#endif /* !FAIL */
-
-extern FILE * output; /* output file */
-extern io_time_t *timer_g; /* timer: global for stub functions */
-extern int comm_world_rank_g; /* my rank in MPI_COMM_RANK */
-extern int comm_world_nprocs_g; /* num. of processes of MPI_COMM_WORLD */
-extern MPI_Comm pio_comm_g; /* Communicator to run the PIO */
-extern int pio_mpi_rank_g; /* MPI rank of pio_comm_g */
-extern int pio_mpi_nprocs_g; /* number of processes of pio_comm_g */
-extern int pio_debug_level; /* The debug level:
- * 0 - Off
- * 1 - Minimal
- * 2 - Some more
- * 3 - Maximal
- * 4 - Even More Debugging (timer stuff)
- */
-
-#define HDprint_rank(f) /* print rank in MPI_COMM_WORLD */ HDfprintf(f, "%d: ", comm_world_rank_g);
-#define HDprint_size(f) /* print size of MPI_COMM_WORLD */ HDfprintf(f, "%d", comm_world_nprocs_g);
-#define HDprint_rank_size(f) /* print rank/size of MPI_COMM_WORLD */ \
- HDfprintf(f, "%d/%d: ", comm_world_rank_g, comm_world_nprocs_g);
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-extern results do_pio(parameters param);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* PIO_PERF_H__ */
diff --git a/tools/test/perform/pio_standalone.c b/tools/test/perform/pio_standalone.c
index 0a9bfc0..032bfba 100644
--- a/tools/test/perform/pio_standalone.c
+++ b/tools/test/perform/pio_standalone.c
@@ -17,40 +17,31 @@
#include "pio_perf.h"
-#ifdef STANDALONE
-MPI_Info h5_io_info_g = MPI_INFO_NULL; /* MPI INFO object for IO */
-#endif
-
/** From h5tools_utils.c **/
/* global variables */
int nCols = 80;
-/* ``get_option'' variables */
-int opt_err = 1; /*get_option prints errors if this is on */
-int opt_ind = 1; /*token pointer */
-const char *opt_arg; /*flag argument (or value) */
-
int
-get_option(int argc, const char **argv, const char *opts, const struct long_options *l_opts)
+get_option(int argc, const char **argv, const char *opts, const struct h5_long_options *l_opts)
{
static int sp = 1; /* character index in current token */
int opt_opt = '?'; /* option character passed back to user */
if (sp == 1) {
/* check for more flag-like tokens */
- if (opt_ind >= argc || argv[opt_ind][0] != '-' || argv[opt_ind][1] == '\0') {
+ if (H5_optind >= argc || argv[H5_optind][0] != '-' || argv[H5_optind][1] == '\0') {
return EOF;
}
- else if (HDstrcmp(argv[opt_ind], "--") == 0) {
- opt_ind++;
+ else if (HDstrcmp(argv[H5_optind], "--") == 0) {
+ H5_optind++;
return EOF;
}
}
- if (sp == 1 && argv[opt_ind][0] == '-' && argv[opt_ind][1] == '-') {
+ if (sp == 1 && argv[H5_optind][0] == '-' && argv[H5_optind][1] == '-') {
/* long command line option */
- const char *arg = &argv[opt_ind][2];
+ const char *arg = &argv[H5_optind][2];
int i;
for (i = 0; l_opts && l_opts[i].name; i++) {
@@ -62,13 +53,13 @@ get_option(int argc, const char **argv, const char *opts, const struct long_opti
if (l_opts[i].has_arg != no_arg) {
if (arg[len] == '=') {
- opt_arg = &arg[len + 1];
+ H5_optarg = &arg[len + 1];
}
- else if (opt_ind < (argc - 1) && argv[opt_ind + 1][0] != '-') {
- opt_arg = argv[++opt_ind];
+ else if (H5_optind < (argc - 1) && argv[H5_optind + 1][0] != '-') {
+ H5_optarg = argv[++H5_optind];
}
else if (l_opts[i].has_arg == require_arg) {
- if (opt_err)
+ if (H5_opterr)
HDfprintf(stderr, "%s: option required for \"--%s\" flag\n", argv[0], arg);
opt_opt = '?';
@@ -76,13 +67,13 @@ get_option(int argc, const char **argv, const char *opts, const struct long_opti
}
else {
if (arg[len] == '=') {
- if (opt_err)
+ if (H5_opterr)
HDfprintf(stderr, "%s: no option required for \"%s\" flag\n", argv[0], arg);
opt_opt = '?';
}
- opt_arg = NULL;
+ H5_optarg = NULL;
}
break;
@@ -91,29 +82,29 @@ get_option(int argc, const char **argv, const char *opts, const struct long_opti
if (l_opts[i].name == NULL) {
/* exhausted all of the l_opts we have and still didn't match */
- if (opt_err)
+ if (H5_opterr)
HDfprintf(stderr, "%s: unknown option \"%s\"\n", argv[0], arg);
opt_opt = '?';
}
- opt_ind++;
+ H5_optind++;
sp = 1;
}
else {
register char *cp; /* pointer into current token */
/* short command line option */
- opt_opt = argv[opt_ind][sp];
+ opt_opt = argv[H5_optind][sp];
if (opt_opt == ':' || (cp = strchr(opts, opt_opt)) == 0) {
- if (opt_err)
+ if (H5_opterr)
HDfprintf(stderr, "%s: unknown option \"%c\"\n", argv[0], opt_opt);
/* if no chars left in this token, move to next token */
- if (argv[opt_ind][++sp] == '\0') {
- opt_ind++;
+ if (argv[H5_optind][++sp] == '\0') {
+ H5_optind++;
sp = 1;
}
@@ -122,32 +113,32 @@ get_option(int argc, const char **argv, const char *opts, const struct long_opti
if (*++cp == ':') {
/* if a value is expected, get it */
- if (argv[opt_ind][sp + 1] != '\0') {
+ if (argv[H5_optind][sp + 1] != '\0') {
/* flag value is rest of current token */
- opt_arg = &argv[opt_ind++][sp + 1];
+ H5_optarg = &argv[H5_optind++][sp + 1];
}
- else if (++opt_ind >= argc) {
- if (opt_err)
+ else if (++H5_optind >= argc) {
+ if (H5_opterr)
HDfprintf(stderr, "%s: value expected for option \"%c\"\n", argv[0], opt_opt);
opt_opt = '?';
}
else {
/* flag value is next token */
- opt_arg = argv[opt_ind++];
+ H5_optarg = argv[H5_optind++];
}
sp = 1;
}
else {
/* set up to look at next char in token, next time */
- if (argv[opt_ind][++sp] == '\0') {
+ if (argv[H5_optind][++sp] == '\0') {
/* no more in current token, so setup next token */
- opt_ind++;
+ H5_optind++;
sp = 1;
}
- opt_arg = NULL;
+ H5_optarg = NULL;
}
}
@@ -161,134 +152,3 @@ print_version(const char *progname)
printf("%s: Version %u.%u.%u%s%s\n", progname, H5_VERS_MAJOR, H5_VERS_MINOR, H5_VERS_RELEASE,
H5_VERS_SUBRELEASE[0] ? "-" : "", H5_VERS_SUBRELEASE);
}
-
-#ifdef STANDALONE
-/*
- * Function: h5_set_info_object
- * Purpose: Process environment variables setting to set up MPI Info
- * object.
- * Return: 0 if all is fine; otherwise non-zero.
- * Programmer: Albert Cheng, 2002/05/21.
- * Modifications:
- * Bill Wendling, 2002/05/31
- * Modified so that the HDF5_MPI_INFO environment variable can
- * be a semicolon separated list of "key=value" pairings. Most
- * of the code is to remove any whitespaces which might be
- * surrounding the "key=value" pairs.
- */
-int
-h5_set_info_object(void)
-{
- char *envp; /* environment pointer */
- int ret_value = 0;
-
- /* handle any MPI INFO hints via $HDF5_MPI_INFO */
- if ((envp = HDgetenv("HDF5_MPI_INFO")) != NULL) {
- char *next, *valp;
-
- valp = envp = next = HDstrdup(envp);
-
- if (!valp)
- return 0;
-
- /* create an INFO object if not created yet */
- if (h5_io_info_g == MPI_INFO_NULL)
- MPI_Info_create(&h5_io_info_g);
-
- do {
- size_t len;
- char * key_val, *endp, *namep;
-
- if (*valp == ';')
- valp++;
-
- /* copy key/value pair into temporary buffer */
- len = strcspn(valp, ";");
- next = &valp[len];
- key_val = (char *)HDcalloc(1, len + 1);
-
- /* increment the next pointer past the terminating semicolon */
- if (*next == ';')
- ++next;
-
- namep = HDstrncpy(key_val, valp, len);
-
- /* pass up any beginning whitespaces */
- while (*namep && (*namep == ' ' || *namep == '\t'))
- namep++;
-
- if (!*namep)
- continue; /* was all white space, so move to next k/v pair */
-
- /* eat up any ending white spaces */
- endp = &namep[HDstrlen(namep) - 1];
-
- while (endp && (*endp == ' ' || *endp == '\t'))
- *endp-- = '\0';
-
- /* find the '=' */
- valp = HDstrchr(namep, '=');
-
- if (valp != NULL) { /* it's a valid key/value pairing */
- char *tmp_val = valp + 1;
-
- /* change '=' to \0, move valp down one */
- *valp-- = '\0';
-
- /* eat up ending whitespace on the "key" part */
- while (*valp == ' ' || *valp == '\t')
- *valp-- = '\0';
-
- valp = tmp_val;
-
- /* eat up beginning whitespace on the "value" part */
- while (*valp == ' ' || *valp == '\t')
- *valp++ = '\0';
-
- /* actually set the darned thing */
- if (MPI_SUCCESS != MPI_Info_set(h5_io_info_g, namep, valp)) {
- HDprintf("MPI_Info_set failed\n");
- ret_value = -1;
- }
- }
-
- valp = next;
- HDfree(key_val);
- } while (next && *next);
-
- HDfree(envp);
- }
-
- return ret_value;
-}
-
-/*
- * Function: h5_dump_info_object
- * Purpose: Display content of an MPI Info object
- * Return: void
- * Programmer: Albert Cheng 2002/05/21
- * Modifications:
- */
-void
-h5_dump_info_object(MPI_Info info)
-{
- char key[MPI_MAX_INFO_KEY + 1];
- char value[MPI_MAX_INFO_VAL + 1];
- int flag;
- int i, nkeys;
-
- HDprintf("Dumping MPI Info Object (up to %d bytes per item):\n", MPI_MAX_INFO_VAL);
- if (info == MPI_INFO_NULL) {
- HDprintf("object is MPI_INFO_NULL\n");
- }
- else {
- MPI_Info_get_nkeys(info, &nkeys);
- HDprintf("object has %d items\n", nkeys);
- for (i = 0; i < nkeys; i++) {
- MPI_Info_get_nthkey(info, i, key);
- MPI_Info_get(info, key, MPI_MAX_INFO_VAL, value, &flag);
- HDprintf("%s=%s\n", key, value);
- }
- }
-}
-#endif /* STANDALONE */
diff --git a/tools/test/perform/pio_standalone.h b/tools/test/perform/pio_standalone.h
index 721addf..f1fb946 100644
--- a/tools/test/perform/pio_standalone.h
+++ b/tools/test/perform/pio_standalone.h
@@ -10,8 +10,8 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-#ifndef PIO_STANDALONE_H__
-#define PIO_PERF_H__
+#ifndef PIO_STANDALONE_H
+#define PIO_STANDALONE_H
/* Header file for building h5perf by standalone mode.
* Created: Christian Chilan, 2005/5/18.
@@ -21,10 +21,6 @@
#include "H5public.h" /* Include Public Definitions */
-/*
- * Include ANSI-C header files.
- */
-#ifdef H5_STDC_HEADERS
#include <assert.h>
#include <ctype.h>
#include <errno.h>
@@ -37,7 +33,6 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#endif
/*
* Redefine all the POSIX functions. We should never see a POSIX
@@ -95,28 +90,20 @@
#define HDctermid(S) ctermid(S)
#define HDctime(T) ctime(T)
#define HDcuserid(S) cuserid(S)
-#ifdef H5_HAVE_DIFFTIME
-#define HDdifftime(X, Y) difftime(X, Y)
-#else
-#define HDdifftime(X, Y) ((double)(X) - (double)(Y))
-#endif
-#define HDdiv(X, Y) div(X, Y)
-#define HDdup(F) dup(F)
-#define HDdup2(F, I) dup2(F, I)
-/* execl() variable arguments */
-/* execle() variable arguments */
-/* execlp() variable arguments */
-#define HDexecv(S, AV) execv(S, AV)
-#define HDexecve(S, AV, E) execve(S, AV, E)
-#define HDexecvp(S, AV) execvp(S, AV)
-#define HDexit(N) exit(N)
-#define HD_exit(N) _exit(N)
-#define HDexp(X) exp(X)
-#define HDfabs(X) fabs(X)
-/* use ABS() because fabsf() fabsl() are not common yet. */
-#define HDfabsf(X) ABS(X)
-#define HDfabsl(X) ABS(X)
-#define HDfclose(F) fclose(F)
+#define HDdifftime(X, Y) difftime(X, Y)
+#define HDdiv(X, Y) div(X, Y)
+#define HDdup(F) dup(F)
+#define HDdup2(F, I) dup2(F, I)
+#define HDexecv(S, AV) execv(S, AV)
+#define HDexecve(S, AV, E) execve(S, AV, E)
+#define HDexecvp(S, AV) execvp(S, AV)
+#define HDexit(N) exit(N)
+#define HD_exit(N) _exit(N)
+#define HDexp(X) exp(X)
+#define HDfabs(X) fabs(X)
+#define HDfabsf(X) fabsf(X)
+#define HDfabsl(X) fabsl(X)
+#define HDfclose(F) fclose(F)
/* fcntl() variable arguments */
#define HDfdopen(N, S) fdopen(N, S)
#define HDfeof(F) feof(F)
@@ -142,17 +129,8 @@
#define HDfree(M) free(M)
#define HDfreopen(S, M, F) freopen(S, M, F)
#define HDfrexp(X, N) frexp(X, N)
-/* Check for Cray-specific 'frexpf()' and 'frexpl()' routines */
-#ifdef H5_HAVE_FREXPF
-#define HDfrexpf(X, N) frexpf(X, N)
-#else /* H5_HAVE_FREXPF */
-#define HDfrexpf(X, N) frexp(X, N)
-#endif /* H5_HAVE_FREXPF */
-#ifdef H5_HAVE_FREXPL
-#define HDfrexpl(X, N) frexpl(X, N)
-#else /* H5_HAVE_FREXPL */
-#define HDfrexpl(X, N) frexp(X, N)
-#endif /* H5_HAVE_FREXPL */
+#define HDfrexpf(X, N) frexpf(X, N)
+#define HDfrexpl(X, N) frexpl(X, N)
/* fscanf() variable arguments */
#ifdef H5_HAVE_FSEEKO
#define HDfseek(F, O, W) fseeko(F, O, W)
@@ -348,15 +326,9 @@ H5_DLL int HDrand(void);
#define HDsin(X) sin(X)
#define HDsinh(X) sinh(X)
#define HDsleep(N) sleep(N)
-#ifdef H5_HAVE_WIN32_API
-H5_DLL int c99_snprintf(char *str, size_t size, const char *format, ...);
-#define HDsnprintf c99_snprintf /*varargs*/
-#else
-#define HDsnprintf snprintf /*varargs*/
-#endif
-/* sprintf() variable arguments */
-#define HDsprintf sprintf /*varargs*/
-#define HDsqrt(X) sqrt(X)
+#define HDsnprintf snprintf /*varargs*/
+#define HDsprintf sprintf /*varargs*/
+#define HDsqrt(X) sqrt(X)
#ifdef H5_HAVE_RAND_R
H5_DLL void HDsrand(unsigned int seed);
#define HDsrandom(S) HDsrand(S)
@@ -367,7 +339,6 @@ H5_DLL void HDsrand(unsigned int seed);
#define HDsrand(S) srand(S)
#define HDsrandom(S) srand(S)
#endif
-/* sscanf() variable arguments */
#ifdef H5_HAVE_WIN32_API
#define HDstrcasecmp(A, B) _stricmp(A, B)
@@ -429,25 +400,20 @@ H5_DLL int64_t HDstrtoll(const char *s, const char **rest, int base);
#else
#define HDunlink(S) unlink(S)
#endif
-#define HDutime(S, T) utime(S, T)
-#define HDva_arg(A, T) va_arg(A, T)
-#define HDva_end(A) va_end(A)
-#define HDva_start(A, P) va_start(A, P)
-#define HDvasprintf(RET, FMT, A) vasprintf(RET, FMT, A)
-#define HDvfprintf(F, FMT, A) vfprintf(F, FMT, A)
-#define HDvprintf(FMT, A) vprintf(FMT, A)
-#define HDvsprintf(S, FMT, A) vsprintf(S, FMT, A)
-#ifdef H5_HAVE_WIN32_API
-H5_DLL int c99_vsnprintf(char *str, size_t size, const char *format, va_list ap);
-#define HDvsnprintf c99_vsnprintf
-#else
+#define HDutime(S, T) utime(S, T)
+#define HDva_arg(A, T) va_arg(A, T)
+#define HDva_end(A) va_end(A)
+#define HDva_start(A, P) va_start(A, P)
+#define HDvasprintf(RET, FMT, A) vasprintf(RET, FMT, A)
+#define HDvfprintf(F, FMT, A) vfprintf(F, FMT, A)
+#define HDvprintf(FMT, A) vprintf(FMT, A)
+#define HDvsprintf(S, FMT, A) vsprintf(S, FMT, A)
#define HDvsnprintf(S, N, FMT, A) vsnprintf(S, N, FMT, A)
-#endif
-#define HDwait(W) wait(W)
-#define HDwaitpid(P, W, O) waitpid(P, W, O)
-#define HDwcstombs(S, P, Z) wcstombs(S, P, Z)
-#define HDwctomb(S, C) wctomb(S, C)
-#define HDwrite(F, M, Z) write(F, M, Z)
+#define HDwait(W) wait(W)
+#define HDwaitpid(P, W, O) waitpid(P, W, O)
+#define HDwcstombs(S, P, Z) wcstombs(S, P, Z)
+#define HDwctomb(S, C) wctomb(S, C)
+#define HDwrite(F, M, Z) write(F, M, Z)
/*
* And now for a couple non-Posix functions... Watch out for systems that
@@ -475,37 +441,27 @@ extern char * strdup(const char *s);
#define TRUE true
#endif
-/** From h5test.h **/
-
-#ifdef H5_HAVE_PARALLEL
-extern MPI_Info h5_io_info_g; /* MPI INFO object for IO */
-#endif
-
-#ifdef H5_HAVE_PARALLEL
-int h5_set_info_object(void);
-void h5_dump_info_object(MPI_Info info);
-#endif
-
/** From h5tools_utils.h **/
-extern int opt_err; /* getoption prints errors if this is on */
-extern int opt_ind; /* token pointer */
-extern const char *opt_arg; /* flag argument (or value) */
+H5_DLLVAR int H5_opterr; /* getoption prints errors if this is on */
+H5_DLLVAR int H5_optind; /* token pointer */
+H5_DLLVAR const char *H5_optarg; /* flag argument (or value) */
-enum {
+enum h5_arg_level {
no_arg = 0, /* doesn't take an argument */
require_arg, /* requires an argument */
optional_arg /* argument is optional */
};
-typedef struct long_options {
- const char *name; /* name of the long option */
- int has_arg; /* whether we should look for an arg */
- char shortval; /* the shortname equivalent of long arg
- * this gets returned from get_option */
-} long_options;
+struct h5_long_options {
+ const char * name; /* Name of the long option */
+ enum h5_arg_level has_arg; /* Whether we should look for an arg */
+ char shortval; /* The shortname equivalent of long arg
+ * this gets returned from get_option
+ */
+};
-extern int get_option(int argc, const char **argv, const char *opt, const struct long_options *l_opt);
+extern int H5_get_option(int argc, const char **argv, const char *opt, const struct h5_long_options *l_opt);
extern int nCols; /*max number of columns for outputting */
diff --git a/tools/test/perform/sio_engine.c b/tools/test/perform/sio_engine.c
deleted file mode 100644
index f8061d4..0000000
--- a/tools/test/perform/sio_engine.c
+++ /dev/null
@@ -1,1338 +0,0 @@
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Copyright by The HDF Group. *
- * 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 COPYING file, which can be found at the root of the source code *
- * distribution tree, or in https://www.hdfgroup.org/licenses. *
- * If you do not have access to either file, you may request a copy from *
- * help@hdfgroup.org. *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * Author: Christian Chilan, April 2008
- */
-
-#include "hdf5.h"
-
-#ifdef H5_STDC_HEADERS
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#endif
-
-#ifdef H5_HAVE_UNISTD_H
-#include <sys/types.h>
-#include <unistd.h>
-#endif
-
-#ifdef H5_HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif
-
-#include "sio_perf.h"
-
-/* Macro definitions */
-
-/* sizes of various items. these sizes won't change during program execution */
-#define ELMT_H5_TYPE H5T_NATIVE_UCHAR
-
-#define GOTOERROR(errcode) \
- { \
- ret_code = errcode; \
- goto done; \
- }
-#define ERRMSG(mesg) \
- { \
- HDfprintf(stderr, "*** Assertion failed (%s) at line %4d in %s\n", mesg, (int)__LINE__, __FILE__); \
- }
-
-/* verify: if val is false (0), print mesg. */
-#define VRFY(val, mesg) \
- do { \
- if (!val) { \
- ERRMSG(mesg); \
- GOTOERROR(FAIL); \
- } \
- } while (0)
-
-/* POSIX I/O macros */
-#ifdef H5_HAVE_WIN32_API
-/* Can't link against the library, so this test will use the older, non-Unicode
- * _open() call on Windows.
- */
-#define HDopen(S, F, ...) _open(S, F | _O_BINARY, __VA_ARGS__)
-#endif /* H5_HAVE_WIN32_API */
-#define POSIXCREATE(fn) HDopen(fn, O_CREAT | O_TRUNC | O_RDWR, 0600)
-#define POSIXOPEN(fn, F) HDopen(fn, F, 0600)
-#define POSIXCLOSE(F) HDclose(F)
-#define POSIXSEEK(F, L) HDlseek(F, L, SEEK_SET)
-#define POSIXWRITE(F, B, S) HDwrite(F, B, S)
-#define POSIXREAD(F, B, S) HDread(F, B, S)
-
-enum { SIO_CREATE = 1, SIO_WRITE = 2, SIO_READ = 4 };
-
-/* Global variables */
-static int clean_file_g = -1; /*whether to cleanup temporary test */
-/*files. -1 is not defined; */
-/*0 is no cleanup; 1 is do cleanup */
-
-/* the different types of file descriptors we can expect */
-typedef union _file_descr {
- int posixfd; /* POSIX file handle*/
- hid_t h5fd; /* HDF5 file */
-} file_descr;
-
-/* local functions */
-static char * sio_create_filename(iotype iot, const char *base_name, char *fullname, size_t size,
- parameters *param);
-static herr_t do_write(results *res, file_descr *fd, parameters *parms, void *buffer);
-static herr_t do_read(results *res, file_descr *fd, parameters *parms, void *buffer);
-static herr_t dset_write(int local_dim, file_descr *fd, parameters *parms, void *buffer);
-static herr_t posix_buffer_write(int local_dim, file_descr *fd, parameters *parms, void *buffer);
-static herr_t dset_read(int localrank, file_descr *fd, parameters *parms, void *buffer, const char *buffer2);
-static herr_t posix_buffer_read(int local_dim, file_descr *fd, parameters *parms, void *buffer);
-static herr_t do_fopen(parameters *param, char *fname, file_descr *fd /*out*/, int flags);
-hid_t set_vfd(parameters *param);
-static herr_t do_fclose(iotype iot, file_descr *fd);
-static void do_cleanupfile(iotype iot, char *fname);
-
-/* global variables */
-static HDoff_t offset[MAX_DIMS]; /* dataset size in bytes */
-static size_t buf_offset[MAX_DIMS]; /* dataset size in bytes */
-static int order[MAX_DIMS]; /* dimension access order */
-static size_t linear_buf_size; /* linear buffer size */
-static int cont_dim; /* lowest dimension for contiguous POSIX
- access */
-static size_t cont_size; /* size of contiguous POSIX access */
-static hid_t fapl; /* file access list */
-static unsigned char *buf_p; /* buffer pointer */
-static const char * multi_letters = "msbrglo"; /* string for multi driver */
-
-/* HDF5 global variables */
-static hsize_t h5count[MAX_DIMS]; /*selection count */
-static hssize_t h5offset[MAX_DIMS]; /* Selection offset within dataspace */
-static hid_t h5dset_space_id = H5I_INVALID_HID; /*dataset space ID */
-static hid_t h5mem_space_id = H5I_INVALID_HID; /*memory dataspace ID */
-static hid_t h5ds_id = H5I_INVALID_HID; /*dataset handle */
-static hid_t h5dcpl = H5I_INVALID_HID; /* Dataset creation property list */
-static hid_t h5dxpl = H5I_INVALID_HID; /* Dataset transfer property list */
-
-/*
- * Function: do_sio
- * Purpose: SIO Engine where IO are executed.
- * Return: results
- * Programmer: Christian Chilan, April, 2008
- * Modifications:
- */
-void
-do_sio(parameters param, results *res)
-{
- char * buffer = NULL; /*data buffer pointer */
- size_t buf_size[MAX_DIMS]; /* general buffer size in bytes */
- file_descr fd; /* file handles */
- iotype iot; /* API type */
- char base_name[256]; /* test file base name */
- /* return codes */
- herr_t ret_code = 0; /*return code */
-
- char fname[FILENAME_MAX]; /* test file name */
- int i;
- /* HDF5 variables */
- herr_t hrc; /*HDF5 return code */
-
- /* Sanity check parameters */
-
- /* IO type */
- iot = param.io_type;
-
- switch (iot) {
- case POSIXIO:
- fd.posixfd = -1;
- res->timers = io_time_new(SYS_CLOCK);
- break;
- case HDF5:
- fd.h5fd = -1;
- res->timers = io_time_new(SYS_CLOCK);
- break;
- default:
- /* unknown request */
- HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)iot);
- GOTOERROR(FAIL);
- }
-
- linear_buf_size = 1;
-
- for (i = 0; i < param.rank; i++) {
- buf_size[i] = param.buf_size[i];
- order[i] = param.order[i];
- linear_buf_size *= buf_size[i];
- buf_offset[i] = 0;
- offset[i] = 0;
-
- /* Validate transfer buffer size */
- if (param.buf_size[i] <= 0) {
- HDfprintf(stderr, "Transfer buffer size[%d] (%zu) must be > 0\n", i, buf_size[i]);
- GOTOERROR(FAIL);
- }
-
- if ((param.dset_size[i] % param.buf_size[i]) != 0) {
- HDfprintf(stderr,
- "Dataset size[%d] (%" H5_PRINTF_LL_WIDTH "d) must be a multiple of the "
- "trasfer buffer size[%d] (%zu)\n",
- param.rank, (long long)param.dset_size[i], param.rank, param.buf_size[i]);
- GOTOERROR(FAIL);
- }
- }
-
- /* Allocate transfer buffer */
- if ((buffer = (char *)malloc(linear_buf_size)) == NULL) {
- HDfprintf(stderr, "malloc for transfer buffer size (%zu) failed\n", linear_buf_size);
- GOTOERROR(FAIL);
- }
-
- if (sio_debug_level >= 4)
-
- /* output all of the times for all iterations */
- HDfprintf(output, "Timer details:\n");
-
- /*
- * Write performance measurement
- */
- /* Open file for write */
-
- HDstrcpy(base_name, "#sio_tmp");
- sio_create_filename(iot, base_name, fname, sizeof(fname), &param);
-
- if (sio_debug_level > 0)
- HDfprintf(output, "data filename=%s\n", fname);
-
- io_time_set(res->timers, HDF5_GROSS_WRITE_FIXED_DIMS, TSTART);
- hrc = do_fopen(&param, fname, &fd, SIO_CREATE | SIO_WRITE);
- VRFY((hrc == SUCCESS), "do_fopen failed");
-
- io_time_set(res->timers, HDF5_FINE_WRITE_FIXED_DIMS, TSTART);
- hrc = do_write(res, &fd, &param, buffer);
- io_time_set(res->timers, HDF5_FINE_WRITE_FIXED_DIMS, TSTOP);
- VRFY((hrc == SUCCESS), "do_write failed");
-
- /* Close file for write */
- hrc = do_fclose(iot, &fd);
- io_time_set(res->timers, HDF5_GROSS_WRITE_FIXED_DIMS, TSTOP);
- VRFY((hrc == SUCCESS), "do_fclose failed");
-
- if (!param.h5_write_only) {
- /*
- * Read performance measurement
- */
-
- /* Open file for read */
- io_time_set(res->timers, HDF5_GROSS_READ_FIXED_DIMS, TSTART);
- hrc = do_fopen(&param, fname, &fd, SIO_READ);
- VRFY((hrc == SUCCESS), "do_fopen failed");
-
- io_time_set(res->timers, HDF5_FINE_READ_FIXED_DIMS, TSTART);
- hrc = do_read(res, &fd, &param, buffer);
- io_time_set(res->timers, HDF5_FINE_READ_FIXED_DIMS, TSTOP);
- VRFY((hrc == SUCCESS), "do_read failed");
-
- /* Close file for read */
- hrc = do_fclose(iot, &fd);
-
- io_time_set(res->timers, HDF5_GROSS_READ_FIXED_DIMS, TSTOP);
- VRFY((hrc == SUCCESS), "do_fclose failed");
- }
-
- do_cleanupfile(iot, fname);
-
-done:
- /* clean up */
- /* release HDF5 objects */
-
- /* close any opened files */
- /* no remove(fname) because that should have happened normally. */
- switch (iot) {
- case POSIXIO:
- if (fd.posixfd != -1)
- hrc = do_fclose(iot, &fd);
- break;
- case HDF5:
- if (fd.h5fd != -1)
- hrc = do_fclose(iot, &fd);
- break;
- default:
- /* unknown request */
- HDassert(0 && "Unknown IO type");
- break;
- }
-
- /* release generic resources */
- if (buffer)
- free(buffer);
-
- res->ret_code = ret_code;
-}
-
-/*
- * Function: sio_create_filename
- * Purpose: Create a new filename to write to. Determine the correct
- * suffix to append to the filename by the type of I/O we're
- * doing. Also, place in the /tmp/{$USER,$LOGIN} directory if
- * USER or LOGIN are specified in the environment.
- * Return: Pointer to filename or NULL
- * Programmer: Bill Wendling, 21. November 2001
- * Modifications: Support for file drivers. Christian Chilan, April, 2008
- */
-static char *
-sio_create_filename(iotype iot, const char *base_name, char *fullname, size_t size, parameters *param)
-{
- const char *prefix, *suffix = "";
- char * ptr, last = '\0';
- size_t i, j;
- vfdtype vfd;
- vfd = param->vfd;
-
- if (!base_name || !fullname || size < 1)
- return NULL;
-
- memset(fullname, 0, size);
-
- switch (iot) {
- case POSIXIO:
- suffix = ".posix";
- break;
- case HDF5:
- suffix = ".h5";
- if (vfd == family)
- suffix = "%05d.h5";
- else if (vfd == multi)
- suffix = NULL;
- break;
- default:
- /* unknown request */
- HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)iot);
- HDassert(0 && "Unknown IO type");
- break;
- }
-
- /* First use the environment variable and then try the constant */
- prefix = HDgetenv("HDF5_PREFIX");
-
-#ifdef HDF5_PREFIX
- if (!prefix)
- prefix = HDF5_PREFIX;
-#endif /* HDF5_PREFIX */
-
- /* Prepend the prefix value to the base name */
- if (prefix && *prefix) {
- /* If the prefix specifies the HDF5_PREFIX directory, then
- * default to using the "/tmp/$USER" or "/tmp/$LOGIN"
- * directory instead. */
- register char *user, *login, *subdir;
-
- user = HDgetenv("USER");
- login = HDgetenv("LOGIN");
- subdir = (user ? user : login);
-
- if (subdir) {
- for (i = 0; i < size - 1 && prefix[i]; i++)
- fullname[i] = prefix[i];
-
- fullname[i++] = '/';
-
- for (j = 0; i < size && subdir[j]; i++, j++)
- fullname[i] = subdir[j];
- }
- else {
- /* We didn't append the prefix yet */
- HDstrncpy(fullname, prefix, size);
- fullname[size - 1] = '\0';
- }
-
- if ((HDstrlen(fullname) + HDstrlen(base_name) + 1) < size) {
- /* Append the base_name with a slash first. Multiple slashes are
- * handled below. */
- h5_stat_t buf;
-
- if (HDstat(fullname, &buf) < 0)
- /* The directory doesn't exist just yet */
- if (HDmkdir(fullname, 0755) < 0 && errno != EEXIST) {
- /* We couldn't make the "/tmp/${USER,LOGIN}" subdirectory.
- * Default to PREFIX's original prefix value. */
- HDstrcpy(fullname, prefix);
- }
-
- HDstrcat(fullname, "/");
- HDstrcat(fullname, base_name);
- }
- else {
- /* Buffer is too small */
- return NULL;
- }
- }
- else if (strlen(base_name) >= size) {
- /* Buffer is too small */
- return NULL;
- }
- else {
- HDstrcpy(fullname, base_name);
- }
-
- /* Append a suffix */
- if (suffix) {
- if (HDstrlen(fullname) + HDstrlen(suffix) >= size)
- return NULL;
-
- HDstrcat(fullname, suffix);
- }
-
- /* Remove any double slashes in the filename */
- for (ptr = fullname, i = j = 0; ptr && (i < size); i++, ptr++) {
- if (*ptr != '/' || last != '/')
- fullname[j++] = *ptr;
-
- last = *ptr;
- }
-
- return fullname;
-}
-
-/*
- * Function: do_write
- * Purpose: Write the required amount of data to the file.
- * Return: SUCCESS or FAIL
- * Programmer: Christian Chilan, April, 2008
- * Modifications:
- */
-static herr_t
-do_write(results *res, file_descr *fd, parameters *parms, void *buffer)
-{
- int ret_code = SUCCESS;
- char dname[64];
- int i;
- size_t u;
- /* HDF5 variables */
- herr_t hrc; /*HDF5 return code */
- hsize_t h5dims[MAX_DIMS]; /*dataset dim sizes */
- hsize_t h5chunk[MAX_DIMS]; /*dataset dim sizes */
- hsize_t h5block[MAX_DIMS]; /*dataspace selection */
- hsize_t h5stride[MAX_DIMS]; /*selection stride */
- hsize_t h5start[MAX_DIMS]; /*selection start */
- hsize_t h5maxdims[MAX_DIMS];
- int rank; /*rank of dataset */
-
- /* Prepare buffer for verifying data */
- /* if (parms->verify)
- memset(buffer,1,linear_buf_size); */
-
- buf_p = (unsigned char *)buffer;
-
- for (u = 0; u < linear_buf_size; u++)
- buf_p[u] = u % 128;
-
- rank = parms->rank;
-
- for (i = 0; i < rank; i++)
- h5offset[i] = offset[i] = 0;
-
- /* I/O Access specific setup */
- switch (parms->io_type) {
- case POSIXIO:
-
- /* determine lowest dimension for contiguous POSIX access */
- cont_dim = rank;
-
- for (i = rank - 1; i >= 0; i--) {
- if (parms->buf_size[i] == parms->dset_size[i])
- cont_dim = i;
- else
- break;
- }
-
- /* determine size of the contiguous POSIX access */
- cont_size = (!cont_dim) ? 1 : parms->buf_size[cont_dim - 1];
- for (i = cont_dim; i < rank; i++)
- cont_size *= parms->buf_size[i];
-
- break;
-
- case HDF5: /* HDF5 setup */
-
- for (i = 0; i < rank; i++) {
- h5dims[i] = parms->dset_size[i];
- h5start[i] = 0;
- h5stride[i] = 1;
- h5block[i] = 1;
- h5count[i] = parms->buf_size[i];
- h5chunk[i] = parms->chk_size[i];
- h5maxdims[i] = H5S_UNLIMITED;
- }
-
- if (parms->h5_use_chunks && parms->h5_extendable) {
- h5dset_space_id = H5Screate_simple(rank, h5count, h5maxdims);
- VRFY((h5dset_space_id >= 0), "H5Screate_simple");
- }
- else {
- h5dset_space_id = H5Screate_simple(rank, h5dims, NULL);
- VRFY((h5dset_space_id >= 0), "H5Screate_simple");
- }
-
- hrc = H5Sselect_hyperslab(h5dset_space_id, H5S_SELECT_SET, h5start, h5stride, h5count, h5block);
- VRFY((hrc >= 0), "H5Sselect_hyperslab");
-
- /* Create the memory dataspace that corresponds to the xfer buffer */
- h5mem_space_id = H5Screate_simple(rank, h5count, NULL);
- VRFY((h5mem_space_id >= 0), "H5Screate_simple");
-
- /* Create the dataset transfer property list */
- h5dxpl = H5Pcreate(H5P_DATASET_XFER);
- if (h5dxpl < 0) {
- HDfprintf(stderr, "HDF5 Property List Create failed\n");
- GOTOERROR(FAIL);
- }
-
- break;
-
- default:
- HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)parms->io_type);
- GOTOERROR(FAIL);
- break;
- } /* end switch */
-
- /* create dataset */
- switch (parms->io_type) {
- case POSIXIO:
- break;
-
- case HDF5:
- h5dcpl = H5Pcreate(H5P_DATASET_CREATE);
-
- if (h5dcpl < 0) {
- HDfprintf(stderr, "HDF5 Property List Create failed\n");
- GOTOERROR(FAIL);
- }
-
- if (parms->h5_use_chunks) {
- /* Set the chunk size to be the same as the buffer size */
- hrc = H5Pset_chunk(h5dcpl, rank, h5chunk);
- if (hrc < 0) {
- HDfprintf(stderr, "HDF5 Property List Set failed\n");
- GOTOERROR(FAIL);
- } /* end if */
- } /* end if */
-
- HDsprintf(dname, "Dataset_%ld", (unsigned long)parms->num_bytes);
- h5ds_id =
- H5Dcreate2(fd->h5fd, dname, ELMT_H5_TYPE, h5dset_space_id, H5P_DEFAULT, h5dcpl, H5P_DEFAULT);
-
- if (h5ds_id < 0) {
- HDfprintf(stderr, "HDF5 Dataset Create failed\n");
- GOTOERROR(FAIL);
- }
-
- hrc = H5Pclose(h5dcpl);
- /* verifying the close of the dcpl */
- if (hrc < 0) {
- HDfprintf(stderr, "HDF5 Property List Close failed\n");
- GOTOERROR(FAIL);
- }
- break;
-
- default:
- /* unknown request */
- HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)parms->io_type);
- GOTOERROR(FAIL);
- break;
- }
-
- /* Start "raw data" write timer */
- io_time_set(res->timers, HDF5_RAW_WRITE_FIXED_DIMS, TSTART);
-
- /* Perform write */
- hrc = dset_write(rank - 1, fd, parms, buffer);
-
- if (hrc < 0) {
- HDfprintf(stderr, "Error in dataset write\n");
- GOTOERROR(FAIL);
- }
-
- /* Stop "raw data" write timer */
- io_time_set(res->timers, HDF5_RAW_WRITE_FIXED_DIMS, TSTOP);
-
- /* Calculate write time */
-
- /* Close dataset. Only HDF5 needs to do an explicit close. */
- if (parms->io_type == HDF5) {
- hrc = H5Dclose(h5ds_id);
-
- if (hrc < 0) {
- HDfprintf(stderr, "HDF5 Dataset Close failed\n");
- GOTOERROR(FAIL);
- }
-
- h5ds_id = H5I_INVALID_HID;
- } /* end if */
-
-done:
-
- /* release HDF5 objects */
- if (h5dset_space_id != -1) {
- hrc = H5Sclose(h5dset_space_id);
- if (hrc < 0) {
- HDfprintf(stderr, "HDF5 Dataset Space Close failed\n");
- ret_code = FAIL;
- }
- else {
- h5dset_space_id = H5I_INVALID_HID;
- }
- }
-
- if (h5mem_space_id != -1) {
- hrc = H5Sclose(h5mem_space_id);
- if (hrc < 0) {
- HDfprintf(stderr, "HDF5 Memory Space Close failed\n");
- ret_code = FAIL;
- }
- else {
- h5mem_space_id = H5I_INVALID_HID;
- }
- }
-
- if (h5dxpl != -1) {
- hrc = H5Pclose(h5dxpl);
- if (hrc < 0) {
- HDfprintf(stderr, "HDF5 Dataset Transfer Property List Close failed\n");
- ret_code = FAIL;
- }
- else {
- h5dxpl = H5I_INVALID_HID;
- }
- }
-
- return ret_code;
-}
-
-/*
- * Function: dset_write
- * Purpose: Write buffer into the dataset.
- * Return: SUCCESS or FAIL
- * Programmer: Christian Chilan, April, 2008
- * Modifications:
- */
-static herr_t
-dset_write(int local_dim, file_descr *fd, parameters *parms, void *buffer)
-{
- int cur_dim = order[local_dim] - 1;
- int ret_code = SUCCESS;
- int k;
- hsize_t dims[MAX_DIMS], maxdims[MAX_DIMS];
- hsize_t i;
- int j;
- herr_t hrc;
-
- /* iterates according to the dimensions in order array */
- for (i = 0; i < parms->dset_size[cur_dim]; i += parms->buf_size[cur_dim]) {
-
- h5offset[cur_dim] = (hssize_t)i;
- offset[cur_dim] = (HDoff_t)i;
-
- if (local_dim > 0) {
-
- dset_write(local_dim - 1, fd, parms, buffer);
- }
- else {
-
- switch (parms->io_type) {
-
- case POSIXIO:
- /* initialize POSIX offset in the buffer */
- for (j = 0; j < parms->rank; j++)
- buf_offset[j] = 0;
- buf_p = (unsigned char *)buffer;
- /* write POSIX buffer */
- posix_buffer_write(0, fd, parms, buffer);
- break;
-
- case HDF5:
- /* if dimensions are extendable, extend them as needed during access */
- if (parms->h5_use_chunks && parms->h5_extendable) {
-
- hrc = H5Sget_simple_extent_dims(h5dset_space_id, dims, maxdims);
- VRFY((hrc >= 0), "H5Sget_simple_extent_dims");
-
- for (k = 0; k < parms->rank; k++) {
-
- HDassert(h5offset[k] >= 0);
- if (dims[k] <= (hsize_t)h5offset[k]) {
- dims[k] = dims[k] + h5count[k];
- hrc = H5Sset_extent_simple(h5dset_space_id, parms->rank, dims, maxdims);
- VRFY((hrc >= 0), "H5Sset_extent_simple");
- hrc = H5Dset_extent(h5ds_id, dims);
- VRFY((hrc >= 0), "H5Dextend");
- }
- }
- }
- /* applies offset */
- hrc = H5Soffset_simple(h5dset_space_id, h5offset);
- VRFY((hrc >= 0), "H5Soffset_simple");
-
- /* Write the buffer out */
- hrc = H5Sget_simple_extent_dims(h5dset_space_id, dims, maxdims);
- hrc = H5Dwrite(h5ds_id, ELMT_H5_TYPE, h5mem_space_id, h5dset_space_id, h5dxpl, buffer);
- VRFY((hrc >= 0), "H5Dwrite");
-
- break;
-
- default:
- /* unknown request */
- HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)parms->io_type);
- HDassert(0 && "Unknown IO type");
- break;
- } /* switch (parms->io_type) */
- }
- }
-done:
- return ret_code;
-}
-
-/*
- * Function: posix_buffer_write
- * Purpose: Write buffer into the POSIX file considering contiguity.
- * Return: SUCCESS or FAIL
- * Programmer: Christian Chilan, April, 2008
- * Modifications:
- */
-
-static herr_t
-posix_buffer_write(int local_dim, file_descr *fd, parameters *parms, void *buffer)
-{
- int ret_code = SUCCESS;
-
- /* if dimension is not contiguous, call recursively */
- if (local_dim < parms->rank - 1 && local_dim != cont_dim) {
- size_t u;
-
- for (u = 0; u < parms->buf_size[local_dim]; u++) {
- buf_offset[local_dim] = u;
- posix_buffer_write(local_dim + 1, fd, parms, buffer);
-
- /* if next dimension is cont_dim, it will fill out the buffer
- traversing the entire dimension local_dim without the need
- of performing iteration */
- if (local_dim + 1 == cont_dim)
- break;
- }
- /* otherwise, perform contiguous POSIX access */
- }
- else {
- HDoff_t d_offset;
- HDoff_t linear_dset_offset = 0;
- int i, j, rc;
-
- buf_offset[local_dim] = 0;
-
- /* determine offset in the buffer */
- for (i = 0; i < parms->rank; i++) {
- d_offset = 1;
-
- for (j = i + 1; j < parms->rank; j++)
- d_offset *= (HDoff_t)parms->dset_size[j];
-
- linear_dset_offset += (offset[i] + (HDoff_t)buf_offset[i]) * d_offset;
- }
-
- /* only care if seek returns error */
- rc = POSIXSEEK(fd->posixfd, linear_dset_offset) < 0 ? -1 : 0;
- VRFY((rc == 0), "POSIXSEEK");
- /* check if all bytes are written */
- rc = ((ssize_t)cont_size == POSIXWRITE(fd->posixfd, buf_p, cont_size));
- VRFY((rc != 0), "POSIXWRITE");
-
- /* Advance location in buffer */
- buf_p += cont_size;
- }
-
-done:
- return ret_code;
-}
-
-/*
- * Function: do_read
- * Purpose: Read the required amount of data to the file.
- * Return: SUCCESS or FAIL
- * Programmer: Christian Chilan, April, 2008
- * Modifications:
- */
-static herr_t
-do_read(results *res, file_descr *fd, parameters *parms, void *buffer)
-{
- char * buffer2 = NULL; /* Buffer for data verification */
- int ret_code = SUCCESS;
- char dname[64];
- int i;
- size_t u;
- /* HDF5 variables */
- herr_t hrc; /*HDF5 return code */
- hsize_t h5dims[MAX_DIMS]; /*dataset dim sizes */
- hsize_t h5block[MAX_DIMS]; /*dataspace selection */
- hsize_t h5stride[MAX_DIMS]; /*selection stride */
- hsize_t h5start[MAX_DIMS]; /*selection start */
- int rank;
-
- /* Allocate data verification buffer */
- if (NULL == (buffer2 = (char *)malloc(linear_buf_size))) {
- HDfprintf(stderr, "malloc for data verification buffer size (%zu) failed\n", linear_buf_size);
- GOTOERROR(FAIL);
- } /* end if */
-
- /* Prepare buffer for verifying data */
- for (u = 0; u < linear_buf_size; u++)
- buffer2[u] = (char)(u % 128);
-
- rank = parms->rank;
- for (i = 0; i < rank; i++)
- h5offset[i] = offset[i] = 0;
-
- /* I/O Access specific setup */
- switch (parms->io_type) {
- case POSIXIO:
- cont_dim = rank;
-
- for (i = rank - 1; i >= 0; i--) {
- if (parms->buf_size[i] == parms->dset_size[i])
- cont_dim = i;
- else
- break;
- }
- cont_size = (!cont_dim) ? 1 : parms->buf_size[cont_dim - 1];
- for (i = cont_dim; i < rank; i++)
- cont_size *= parms->buf_size[i];
-
- break;
-
- case HDF5: /* HDF5 setup */
- for (i = 0; i < rank; i++) {
- h5dims[i] = parms->dset_size[i];
- h5start[i] = 0;
- h5stride[i] = 1;
- h5block[i] = 1;
- h5count[i] = parms->buf_size[i];
- }
-
- h5dset_space_id = H5Screate_simple(rank, h5dims, NULL);
- VRFY((h5dset_space_id >= 0), "H5Screate_simple");
-
- hrc = H5Sselect_hyperslab(h5dset_space_id, H5S_SELECT_SET, h5start, h5stride, h5count, h5block);
- VRFY((hrc >= 0), "H5Sselect_hyperslab");
-
- /* Create the memory dataspace that corresponds to the xfer buffer */
- h5mem_space_id = H5Screate_simple(rank, h5count, NULL);
- VRFY((h5mem_space_id >= 0), "H5Screate_simple");
-
- /* Create the dataset transfer property list */
- h5dxpl = H5Pcreate(H5P_DATASET_XFER);
- if (h5dxpl < 0) {
- HDfprintf(stderr, "HDF5 Property List Create failed\n");
- GOTOERROR(FAIL);
- }
- break;
-
- default:
- /* unknown request */
- HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)parms->io_type);
- GOTOERROR(FAIL);
- break;
- } /* end switch */
-
- /* create dataset */
- switch (parms->io_type) {
- case POSIXIO:
- break;
-
- case HDF5:
- HDsprintf(dname, "Dataset_%ld", (long)parms->num_bytes);
- h5ds_id = H5Dopen2(fd->h5fd, dname, H5P_DEFAULT);
- if (h5ds_id < 0) {
- HDfprintf(stderr, "HDF5 Dataset open failed\n");
- GOTOERROR(FAIL);
- }
- break;
-
- default:
- /* unknown request */
- HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)parms->io_type);
- GOTOERROR(FAIL);
- break;
- } /* end switch */
-
- /* Start "raw data" read timer */
- io_time_set(res->timers, HDF5_RAW_READ_FIXED_DIMS, TSTART);
- hrc = dset_read(rank - 1, fd, parms, buffer, buffer2);
-
- if (hrc < 0) {
- HDfprintf(stderr, "Error in dataset read\n");
- GOTOERROR(FAIL);
- }
-
- /* Stop "raw data" read timer */
- io_time_set(res->timers, HDF5_RAW_READ_FIXED_DIMS, TSTOP);
-
- /* Calculate read time */
-
- /* Close dataset. Only HDF5 needs to do an explicit close. */
- if (parms->io_type == HDF5) {
- hrc = H5Dclose(h5ds_id);
-
- if (hrc < 0) {
- HDfprintf(stderr, "HDF5 Dataset Close failed\n");
- GOTOERROR(FAIL);
- }
-
- h5ds_id = H5I_INVALID_HID;
- } /* end if */
-
-done:
-
- /* release HDF5 objects */
- if (h5dset_space_id != -1) {
- hrc = H5Sclose(h5dset_space_id);
- if (hrc < 0) {
- HDfprintf(stderr, "HDF5 Dataset Space Close failed\n");
- ret_code = FAIL;
- }
- else {
- h5dset_space_id = H5I_INVALID_HID;
- }
- }
-
- if (h5mem_space_id != -1) {
- hrc = H5Sclose(h5mem_space_id);
- if (hrc < 0) {
- HDfprintf(stderr, "HDF5 Memory Space Close failed\n");
- ret_code = FAIL;
- }
- else {
- h5mem_space_id = H5I_INVALID_HID;
- }
- }
-
- if (h5dxpl != -1) {
- hrc = H5Pclose(h5dxpl);
- if (hrc < 0) {
- HDfprintf(stderr, "HDF5 Dataset Transfer Property List Close failed\n");
- ret_code = FAIL;
- }
- else {
- h5dxpl = H5I_INVALID_HID;
- }
- }
-
- /* release generic resources */
- if (buffer2)
- free(buffer2);
-
- return ret_code;
-}
-
-/*
- * Function: dset_read
- * Purpose: Read buffer into the dataset.
- * Return: SUCCESS or FAIL
- * Programmer: Christian Chilan, April, 2008
- * Modifications:
- */
-
-static herr_t
-dset_read(int local_dim, file_descr *fd, parameters *parms, void *buffer, const char *buffer2)
-{
- int cur_dim = order[local_dim] - 1;
- hsize_t i;
- int j;
- herr_t hrc;
- int ret_code = SUCCESS;
-
- /* iterate on the current dimension */
- for (i = 0; i < parms->dset_size[cur_dim]; i += parms->buf_size[cur_dim]) {
-
- h5offset[cur_dim] = (hssize_t)i;
- offset[cur_dim] = (HDoff_t)i;
-
- /* if traverse in order array is incomplete, recurse */
- if (local_dim > 0) {
-
- ret_code = dset_read(local_dim - 1, fd, parms, buffer, buffer2);
-
- /* otherwise, write buffer into dataset */
- }
- else {
-
- switch (parms->io_type) {
-
- case POSIXIO:
- for (j = 0; j < parms->rank; j++) {
- buf_offset[j] = 0;
- }
- buf_p = (unsigned char *)buffer;
- posix_buffer_read(0, fd, parms, buffer);
- break;
-
- case HDF5:
- hrc = H5Soffset_simple(h5dset_space_id, h5offset);
- VRFY((hrc >= 0), "H5Soffset_simple");
- /* Read the buffer out */
- hrc = H5Dread(h5ds_id, ELMT_H5_TYPE, h5mem_space_id, h5dset_space_id, h5dxpl, buffer);
- VRFY((hrc >= 0), "H5Dread");
- break;
-
- default:
- /* unknown request */
- HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)parms->io_type);
- HDassert(0 && "Unknown IO type");
- break;
- } /* switch (parms->io_type) */
- }
- }
-done:
- return ret_code;
-}
-
-/*
- * Function: posix_buffer_read
- * Purpose: Read buffer into the POSIX file considering contiguity.
- * Return: SUCCESS or FAIL
- * Programmer: Christian Chilan, April, 2008
- * Modifications:
- */
-
-static herr_t
-posix_buffer_read(int local_dim, file_descr *fd, parameters *parms, void *buffer)
-{
- int ret_code = SUCCESS;
-
- /* if local dimension is not contiguous, recurse */
- if (local_dim < parms->rank - 1 && local_dim != cont_dim) {
- size_t u;
-
- for (u = 0; u < parms->buf_size[local_dim]; u++) {
- buf_offset[local_dim] = u;
- ret_code = posix_buffer_read(local_dim + 1, fd, parms, buffer);
- if (local_dim + 1 == cont_dim)
- break;
- }
- /* otherwise, perform contiguous POSIX access */
- }
- else {
- HDoff_t d_offset;
- HDoff_t linear_dset_offset = 0;
- int i, j, rc;
-
- buf_offset[local_dim] = 0;
- /* determine offset in buffer */
- for (i = 0; i < parms->rank; i++) {
- d_offset = 1;
-
- for (j = i + 1; j < parms->rank; j++)
- d_offset *= (HDoff_t)parms->dset_size[j];
-
- linear_dset_offset += (offset[i] + (HDoff_t)buf_offset[i]) * d_offset;
- }
-
- /* only care if seek returns error */
- rc = POSIXSEEK(fd->posixfd, linear_dset_offset) < 0 ? -1 : 0;
- VRFY((rc == 0), "POSIXSEEK");
- /* check if all bytes are read */
- rc = ((ssize_t)cont_size == POSIXREAD(fd->posixfd, buf_p, cont_size));
- VRFY((rc != 0), "POSIXREAD");
-
- /* Advance location in buffer */
- buf_p += cont_size;
- }
-done:
- return ret_code;
-}
-
-/*
- * Function: do_fopen
- * Purpose: Open the specified file.
- * Return: SUCCESS or FAIL
- * Programmer: Albert Cheng, Bill Wendling, 2001/12/13
- * Modifications: Support for file drivers, Christian Chilan, April, 2008
- */
-static herr_t
-do_fopen(parameters *param, char *fname, file_descr *fd /*out*/, int flags)
-{
- int ret_code = SUCCESS;
- hid_t fcpl;
-
- switch (param->io_type) {
- case POSIXIO:
- if (flags & (SIO_CREATE | SIO_WRITE))
- fd->posixfd = POSIXCREATE(fname);
- else
- fd->posixfd = POSIXOPEN(fname, O_RDONLY);
-
- if (fd->posixfd < 0) {
- HDfprintf(stderr, "POSIX File Open failed(%s)\n", fname);
- GOTOERROR(FAIL);
- }
-
- break;
-
- case HDF5:
-
- fapl = set_vfd(param);
-
- if (fapl < 0) {
- HDfprintf(stderr, "HDF5 Property List Create failed\n");
- GOTOERROR(FAIL);
- }
-
- fcpl = H5Pcreate(H5P_FILE_CREATE);
- if (param->page_size) {
- H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, 0, (hsize_t)1);
- H5Pset_file_space_page_size(fcpl, param->page_size);
- if (param->page_buffer_size)
- H5Pset_page_buffer_size(fapl, param->page_buffer_size, 0, 0);
- }
-
- /* create the parallel file */
- if (flags & (SIO_CREATE | SIO_WRITE)) {
- fd->h5fd = H5Fcreate(fname, H5F_ACC_TRUNC, fcpl, fapl);
- }
- else {
- fd->h5fd = H5Fopen(fname, H5F_ACC_RDONLY, fapl);
- }
-
- if (fd->h5fd < 0) {
- HDfprintf(stderr, "HDF5 File Create failed(%s)\n", fname);
- GOTOERROR(FAIL);
- }
- break;
-
- default:
- /* unknown request */
- HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)param->io_type);
- GOTOERROR(FAIL);
- break;
- }
-
-done:
- return ret_code;
-}
-
-/*
- * Function: set_vfd
- * Purpose: Sets file driver.
- * Return: SUCCESS or FAIL
- * Programmer: Christian Chilan, April, 2008
- * Modifications:
- */
-
-hid_t
-set_vfd(parameters *param)
-{
- hid_t my_fapl = H5I_INVALID_HID;
- vfdtype vfd;
-
- vfd = param->vfd;
-
- if ((my_fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
- return -1;
-
- if (vfd == sec2) {
- /* Unix read() and write() system calls */
- if (H5Pset_fapl_sec2(my_fapl) < 0)
- return -1;
- }
- else if (vfd == stdio) {
- /* Standard C fread() and fwrite() system calls */
- if (H5Pset_fapl_stdio(my_fapl) < 0)
- return -1;
- }
- else if (vfd == core) {
- /* In-core temporary file with 1MB increment */
- if (H5Pset_fapl_core(my_fapl, (size_t)1024 * 1024, TRUE) < 0)
- return -1;
- }
- else if (vfd == split) {
- /* Split meta data and raw data each using default driver */
- if (H5Pset_fapl_split(my_fapl, "-m.h5", H5P_DEFAULT, "-r.h5", H5P_DEFAULT) < 0)
- return -1;
- }
- else if (vfd == multi) {
- /* Multi-file driver, general case of the split driver */
- H5FD_mem_t memb_map[H5FD_MEM_NTYPES];
- hid_t memb_fapl[H5FD_MEM_NTYPES];
- const char *memb_name[H5FD_MEM_NTYPES];
- char sv[H5FD_MEM_NTYPES][1024];
- haddr_t memb_addr[H5FD_MEM_NTYPES];
- H5FD_mem_t mt;
-
- HDmemset(memb_map, 0, sizeof memb_map);
- HDmemset(memb_fapl, 0, sizeof memb_fapl);
- HDmemset(memb_name, 0, sizeof memb_name);
- HDmemset(memb_addr, 0, sizeof memb_addr);
-
- HDassert(HDstrlen(multi_letters) == H5FD_MEM_NTYPES);
- for (mt = H5FD_MEM_DEFAULT; mt < H5FD_MEM_NTYPES; mt++) {
- memb_fapl[mt] = H5P_DEFAULT;
- HDsprintf(sv[mt], "%%s-%c.h5", multi_letters[mt]);
- memb_name[mt] = sv[mt];
- memb_addr[mt] = (haddr_t)MAX(mt - 1, 0) * (HADDR_MAX / 10);
- }
-
- if (H5Pset_fapl_multi(my_fapl, memb_map, memb_fapl, memb_name, memb_addr, FALSE) < 0) {
- return -1;
- }
- }
- else if (vfd == family) {
- hsize_t fam_size = 1 * 1024 * 1024; /*100 MB*/
-
- /* Family of files, each 1MB and using the default driver */
- /* if ((val=HDstrtok(NULL, " \t\n\r")))
- fam_size = (hsize_t)(HDstrtod(val, NULL) * 1024*1024); */
- if (H5Pset_fapl_family(my_fapl, fam_size, H5P_DEFAULT) < 0)
- return -1;
- }
- else if (vfd == direct) {
-#ifdef H5_HAVE_DIRECT
- /* Linux direct read() and write() system calls. Set memory boundary, file block size,
- * and copy buffer size to the default values. */
- if (H5Pset_fapl_direct(my_fapl, 1024, 4096, 8 * 4096) < 0)
- return -1;
-#endif
- }
- else {
- /* Unknown driver */
- return -1;
- }
-
- return my_fapl;
-}
-
-/*
- * Function: do_fclose
- * Purpose: Close the specified file descriptor.
- * Return: SUCCESS or FAIL
- * Programmer: Albert Cheng, Bill Wendling, 2001/12/13
- * Modifications:
- */
-static herr_t
-do_fclose(iotype iot, file_descr *fd /*out*/)
-{
- herr_t ret_code = SUCCESS, hrc;
- int rc = 0;
-
- switch (iot) {
- case POSIXIO:
- rc = POSIXCLOSE(fd->posixfd);
-
- if (rc != 0) {
- HDfprintf(stderr, "POSIX File Close failed\n");
- GOTOERROR(FAIL);
- }
-
- fd->posixfd = -1;
- break;
-
- case HDF5:
- hrc = H5Fclose(fd->h5fd);
-
- if (hrc < 0) {
- HDfprintf(stderr, "HDF5 File Close failed\n");
- GOTOERROR(FAIL);
- }
-
- fd->h5fd = -1;
- break;
-
- default:
- /* unknown request */
- HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)iot);
- GOTOERROR(FAIL);
- break;
- }
-
-done:
- return ret_code;
-}
-
-/*
- * Function: do_cleanupfile
- * Purpose: Cleanup temporary file unless HDF5_NOCLEANUP is set.
- * Return: void
- * Programmer: Albert Cheng 2001/12/12
- * Modifications: Support for file drivers. Christian Chilan, April, 2008
- */
-/* Disable warning for "format not a string literal" here -QAK */
-/*
- * This pragma only needs to surround the snprintf() calls with
- * 'temp' in the code below, but early (4.4.7, at least) gcc only
- * allows diagnostic pragmas to be toggled outside of functions.
- */
-H5_GCC_DIAG_OFF("format-nonliteral")
-static void
-do_cleanupfile(iotype iot, char *filename)
-{
- char temp[2048];
- int j;
- hid_t driver;
-
- if (clean_file_g == -1)
- clean_file_g = (HDgetenv("HDF5_NOCLEANUP") == NULL) ? 1 : 0;
-
- if (clean_file_g) {
-
- switch (iot) {
- case POSIXIO:
- HDremove(filename);
- break;
-
- case HDF5:
- driver = H5Pget_driver(fapl);
-
- if (driver == H5FD_FAMILY) {
- for (j = 0; /*void*/; j++) {
- HDsnprintf(temp, sizeof temp, filename, j);
-
- if (HDaccess(temp, F_OK) < 0)
- break;
-
- HDremove(temp);
- }
- }
- else if (driver == H5FD_CORE) {
- hbool_t backing; /* Whether the core file has backing store */
-
- H5Pget_fapl_core(fapl, NULL, &backing);
-
- /* If the file was stored to disk with bacing store, remove it */
- if (backing)
- HDremove(filename);
- }
- else if (driver == H5FD_MULTI) {
- H5FD_mem_t mt;
- assert(HDstrlen(multi_letters) == H5FD_MEM_NTYPES);
-
- for (mt = H5FD_MEM_DEFAULT; mt < H5FD_MEM_NTYPES; mt++) {
- HDsnprintf(temp, sizeof temp, "%s-%c.h5", filename, multi_letters[mt]);
- HDremove(temp); /*don't care if it fails*/
- }
- }
- else {
- HDremove(filename);
- }
- H5Pclose(fapl);
- break;
-
- default:
- /* unknown request */
- HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)iot);
- HDassert(0 && "Unknown IO type");
- break;
- }
- }
-}
-H5_GCC_DIAG_ON("format-nonliteral")
diff --git a/tools/test/perform/sio_perf.c b/tools/test/perform/sio_perf.c
deleted file mode 100644
index 8463ffa..0000000
--- a/tools/test/perform/sio_perf.c
+++ /dev/null
@@ -1,1438 +0,0 @@
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Copyright by The HDF Group. *
- * 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 COPYING file, which can be found at the root of the source code *
- * distribution tree, or in https://www.hdfgroup.org/licenses. *
- * If you do not have access to either file, you may request a copy from *
- * help@hdfgroup.org. *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * Serial HDF5 Performance Testing Code
- * --------------------------------------
- *
- * Portable code to test performance on the different platforms we support.
- * This is what the report should look like:
- *
- * nprocs = Max#Procs
- * IO API = POSIXIO
- * # Files = 1, # of dsets = 1000, Elements per dset = 37000
- * Write Results = x MB/s
- * Read Results = x MB/s
- * # Files = 1, # of dsets = 3000, Elements per dset = 37000
- * Write Results = x MB/s
- * Read Results = x MB/s
- *
- * . . .
- *
- *
- * IO API = HDF5
- * # Files = 1, # of dsets = 1000, Elements per dset = 37000
- * Write Results = x MB/s
- * Read Results = x MB/s
- * # Files = 1, # of dsets = 3000, Elements per dset = 37000
- * Write Results = x MB/s
- * Read Results = x MB/s
- *
- * . . .
- *
- *
- * . . .
- *
- */
-
-/* system header files */
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "hdf5.h"
-
-/* our header files */
-#include "sio_perf.h"
-
-/* useful macros */
-#define TAB_SPACE 4
-
-#define ONE_KB 1024
-#define ONE_MB (ONE_KB * ONE_KB)
-#define ONE_GB (ONE_MB * ONE_KB)
-
-#define SIO_POSIX 0x1
-#define SIO_HDF5 0x4
-
-/* report 0.0 in case t is zero too */
-#define MB_PER_SEC(bytes, t) \
- (H5_DBL_ABS_EQUAL(t, (double)0.0F) ? (double)0.0F : ((((double)bytes) / (double)ONE_MB) / (t)))
-
-#ifndef TRUE
-#define TRUE 1
-#endif /* TRUE */
-#ifndef FALSE
-#define FALSE (!TRUE)
-#endif /* FALSE */
-
-/* global variables */
-FILE *output; /* output file */
-int sio_debug_level = 0; /* The debug level:
- * 0 - Off
- * 1 - Minimal
- * 2 - Some more
- * 3 - Maximal
- * 4 - Maximal & then some
- */
-
-/* local variables */
-static const char *progname = "h5perf_serial";
-
-/*
- * Command-line options: The user can specify short or long-named
- * parameters. The long-named ones can be partially spelled. When
- * adding more, make sure that they don't clash with each other.
- */
-
-/*
- * It seems that only the options that accept additional information
- * such as dataset size (-e) require the colon next to it.
- */
-static const char * s_opts = "a:A:B:c:Cd:D:e:F:ghi:Imno:p:P:r:stT:v:wx:X:";
-static struct long_options l_opts[] = {{"align", require_arg, 'a'},
- {"alig", require_arg, 'a'},
- {"ali", require_arg, 'a'},
- {"al", require_arg, 'a'},
- {"api", require_arg, 'A'},
- {"ap", require_arg, 'A'},
-#if 0
- /* a sighting of the elusive binary option */
- { "binary", no_arg, 'b' },
- { "binar", no_arg, 'b' },
- { "bina", no_arg, 'b' },
- { "bin", no_arg, 'b' },
- { "bi", no_arg, 'b' },
-#endif /* 0 */
- {"block-size", require_arg, 'B'},
- {"block-siz", require_arg, 'B'},
- {"block-si", require_arg, 'B'},
- {"block-s", require_arg, 'B'},
- {"block-", require_arg, 'B'},
- {"block", require_arg, 'B'},
- {"bloc", require_arg, 'B'},
- {"blo", require_arg, 'B'},
- {"bl", require_arg, 'B'},
- {"chunk", no_arg, 'c'},
- {"chun", no_arg, 'c'},
- {"chu", no_arg, 'c'},
- {"ch", no_arg, 'c'},
- {"collective", no_arg, 'C'},
- {"collectiv", no_arg, 'C'},
- {"collecti", no_arg, 'C'},
- {"collect", no_arg, 'C'},
- {"collec", no_arg, 'C'},
- {"colle", no_arg, 'C'},
- {"coll", no_arg, 'C'},
- {"col", no_arg, 'C'},
- {"co", no_arg, 'C'},
- {"debug", require_arg, 'D'},
- {"debu", require_arg, 'D'},
- {"deb", require_arg, 'D'},
- {"de", require_arg, 'D'},
- {"file-driver", require_arg, 'v'},
- {"file-drive", require_arg, 'v'},
- {"file-driv", require_arg, 'v'},
- {"file-dri", require_arg, 'v'},
- {"file-dr", require_arg, 'v'},
- {"file-d", require_arg, 'v'},
- {"file-", require_arg, 'v'},
- {"file", require_arg, 'v'},
- {"fil", require_arg, 'v'},
- {"fi", require_arg, 'v'},
- {"geometry", no_arg, 'g'},
- {"geometr", no_arg, 'g'},
- {"geomet", no_arg, 'g'},
- {"geome", no_arg, 'g'},
- {"geom", no_arg, 'g'},
- {"geo", no_arg, 'g'},
- {"ge", no_arg, 'g'},
- {"help", no_arg, 'h'},
- {"hel", no_arg, 'h'},
- {"he", no_arg, 'h'},
- {"interleaved", require_arg, 'I'},
- {"interleave", require_arg, 'I'},
- {"interleav", require_arg, 'I'},
- {"interlea", require_arg, 'I'},
- {"interle", require_arg, 'I'},
- {"interl", require_arg, 'I'},
- {"inter", require_arg, 'I'},
- {"inte", require_arg, 'I'},
- {"int", require_arg, 'I'},
- {"in", require_arg, 'I'},
- {"max-num-processes", require_arg, 'P'},
- {"max-num-processe", require_arg, 'P'},
- {"max-num-process", require_arg, 'P'},
- {"max-num-proces", require_arg, 'P'},
- {"max-num-proce", require_arg, 'P'},
- {"max-num-proc", require_arg, 'P'},
- {"max-num-pro", require_arg, 'P'},
- {"max-num-pr", require_arg, 'P'},
- {"max-num-p", require_arg, 'P'},
- {"min-num-processes", require_arg, 'p'},
- {"min-num-processe", require_arg, 'p'},
- {"min-num-process", require_arg, 'p'},
- {"min-num-proces", require_arg, 'p'},
- {"min-num-proce", require_arg, 'p'},
- {"min-num-proc", require_arg, 'p'},
- {"min-num-pro", require_arg, 'p'},
- {"min-num-pr", require_arg, 'p'},
- {"min-num-p", require_arg, 'p'},
- {"max-xfer-size", require_arg, 'X'},
- {"max-xfer-siz", require_arg, 'X'},
- {"max-xfer-si", require_arg, 'X'},
- {"max-xfer-s", require_arg, 'X'},
- {"max-xfer", require_arg, 'X'},
- {"max-xfe", require_arg, 'X'},
- {"max-xf", require_arg, 'X'},
- {"max-x", require_arg, 'X'},
- {"min-xfer-size", require_arg, 'x'},
- {"min-xfer-siz", require_arg, 'x'},
- {"min-xfer-si", require_arg, 'x'},
- {"min-xfer-s", require_arg, 'x'},
- {"min-xfer", require_arg, 'x'},
- {"min-xfe", require_arg, 'x'},
- {"min-xf", require_arg, 'x'},
- {"min-x", require_arg, 'x'},
- {"num-bytes", require_arg, 'e'},
- {"num-byte", require_arg, 'e'},
- {"num-byt", require_arg, 'e'},
- {"num-by", require_arg, 'e'},
- {"num-b", require_arg, 'e'},
- {"num-dsets", require_arg, 'd'},
- {"num-dset", require_arg, 'd'},
- {"num-dse", require_arg, 'd'},
- {"num-ds", require_arg, 'd'},
- {"num-d", require_arg, 'd'},
- {"num-files", require_arg, 'F'},
- {"num-file", require_arg, 'F'},
- {"num-fil", require_arg, 'F'},
- {"num-fi", require_arg, 'F'},
- {"num-f", require_arg, 'F'},
- {"num-iterations", require_arg, 'i'},
- {"num-iteration", require_arg, 'i'},
- {"num-iteratio", require_arg, 'i'},
- {"num-iterati", require_arg, 'i'},
- {"num-iterat", require_arg, 'i'},
- {"num-itera", require_arg, 'i'},
- {"num-iter", require_arg, 'i'},
- {"num-ite", require_arg, 'i'},
- {"num-it", require_arg, 'i'},
- {"num-i", require_arg, 'i'},
- {"order", require_arg, 'r'},
- {"orde", require_arg, 'r'},
- {"ord", require_arg, 'r'},
- {"or", require_arg, 'r'},
- {"output", require_arg, 'o'},
- {"outpu", require_arg, 'o'},
- {"outp", require_arg, 'o'},
- {"out", require_arg, 'o'},
- {"ou", require_arg, 'o'},
- {"extendable", no_arg, 't'},
- {"extendabl", no_arg, 't'},
- {"extendab", no_arg, 't'},
- {"extenda", no_arg, 't'},
- {"extend", no_arg, 't'},
- {"exten", no_arg, 't'},
- {"exte", no_arg, 't'},
- {"ext", no_arg, 't'},
- {"ex", no_arg, 't'},
- {"threshold", require_arg, 'T'},
- {"threshol", require_arg, 'T'},
- {"thresho", require_arg, 'T'},
- {"thresh", require_arg, 'T'},
- {"thres", require_arg, 'T'},
- {"thre", require_arg, 'T'},
- {"thr", require_arg, 'T'},
- {"th", require_arg, 'T'},
- {"write-only", require_arg, 'w'},
- {"write-onl", require_arg, 'w'},
- {"write-on", require_arg, 'w'},
- {"write-o", require_arg, 'w'},
- {"write", require_arg, 'w'},
- {"writ", require_arg, 'w'},
- {"wri", require_arg, 'w'},
- {"wr", require_arg, 'w'},
- {NULL, 0, '\0'}};
-
-struct options {
- long io_types; /* bitmask of which I/O types to test */
- const char *output_file; /* file to print report to */
- long num_dsets; /* number of datasets */
- long num_files; /* number of files */
- off_t num_bpp; /* number of bytes per proc per dset */
- int num_iters; /* number of iterations */
- hsize_t dset_size[MAX_DIMS]; /* Dataset size */
- size_t buf_size[MAX_DIMS]; /* Buffer size */
- size_t chk_size[MAX_DIMS]; /* Chunk size */
- int order[MAX_DIMS]; /* Dimension access order */
- int dset_rank; /* Rank */
- int buf_rank; /* Rank */
- int order_rank; /* Rank */
- int chk_rank; /* Rank */
- int print_times; /* print times as well as throughputs */
- int print_raw; /* print raw data throughput info */
- hsize_t h5_alignment; /* alignment in HDF5 file */
- hsize_t h5_threshold; /* threshold for alignment in HDF5 file */
- int h5_use_chunks; /* Make HDF5 dataset chunked */
- int h5_write_only; /* Perform the write tests only */
- int h5_extendable; /* Perform the write tests only */
- int verify; /* Verify data correctness */
- vfdtype vfd; /* File driver */
- size_t page_buffer_size;
- size_t page_size;
-};
-
-typedef struct _minmax {
- double min;
- double max;
- double sum;
- int num;
-} minmax;
-
-/* local functions */
-static hsize_t parse_size_directive(const char *size);
-static struct options *parse_command_line(int argc, const char *argv[]);
-static void run_test_loop(struct options *options);
-static int run_test(iotype iot, parameters parms, struct options *opts);
-static void output_all_info(minmax *mm, int count, int indent_level);
-static void get_minmax(minmax *mm, double val);
-static void accumulate_minmax_stuff(const minmax *mm, int count, minmax *total_mm);
-static void output_results(const struct options *options, const char *name, minmax *table, int table_size,
- off_t data_size);
-static void output_report(const char *fmt, ...);
-static void print_indent(register int indent);
-static void usage(const char *prog);
-static void report_parameters(struct options *opts);
-
-/*
- * Function: main
- * Purpose: Start things up.
- * Return: EXIT_SUCCESS or EXIT_FAILURE
- * Programmer: Bill Wendling, 30. October 2001
- * Modifications:
- */
-int
-main(int argc, const char *argv[])
-{
- int exit_value = EXIT_SUCCESS;
- struct options *opts = NULL;
-
-#ifndef STANDALONE
- /* Initialize h5tools lib */
- h5tools_init();
-#endif
-
- output = stdout;
-
- opts = parse_command_line(argc, argv);
-
- if (!opts) {
- exit_value = EXIT_FAILURE;
- goto finish;
- }
-
- if (opts->output_file) {
- if ((output = HDfopen(opts->output_file, "w")) == NULL) {
- HDfprintf(stderr, "%s: cannot open output file\n", progname);
- HDperror(opts->output_file);
- goto finish;
- }
- }
-
- report_parameters(opts);
-
- run_test_loop(opts);
-
-finish:
- HDfree(opts);
- return exit_value;
-}
-
-/*
- * Function: run_test_loop
- * Purpose: Run the I/O tests. Write the results to OUTPUT.
- *
- * - The slowest changing part of the test is the number of
- * processors to use. For each loop iteration, we divide that
- * number by 2 and rerun the test.
- *
- * - The second slowest is what type of IO API to perform. We have
- * three choices: POSIXIO, and HDF5.
- *
- * - Then we change the size of the buffer. This information is
- * inferred from the number of datasets to create and the number
- * of integers to put into each dataset. The backend code figures
- * this out.
- *
- * Return: Nothing
- * Programmer: Bill Wendling, 30. October 2001
- * Modifications:
- * Added multidimensional testing (Christian Chilan, April, 2008)
- */
-static void
-run_test_loop(struct options *opts)
-{
- parameters parms;
- int i;
- size_t buf_bytes;
-
- /* load options into parameter structure */
- parms.num_files = opts->num_files;
- parms.num_dsets = opts->num_dsets;
- parms.num_iters = opts->num_iters;
- parms.rank = opts->dset_rank;
- parms.h5_align = opts->h5_alignment;
- parms.h5_thresh = opts->h5_threshold;
- parms.h5_use_chunks = opts->h5_use_chunks;
- parms.h5_extendable = opts->h5_extendable;
- parms.h5_write_only = opts->h5_write_only;
- parms.verify = opts->verify;
- parms.vfd = opts->vfd;
- parms.page_buffer_size = opts->page_buffer_size;
- parms.page_size = opts->page_size;
-
- /* load multidimensional options */
- parms.num_bytes = 1;
- buf_bytes = 1;
- for (i = 0; i < parms.rank; i++) {
- parms.buf_size[i] = opts->buf_size[i];
- parms.dset_size[i] = opts->dset_size[i];
- parms.chk_size[i] = opts->chk_size[i];
- parms.order[i] = opts->order[i];
- parms.num_bytes *= opts->dset_size[i];
- buf_bytes *= opts->buf_size[i];
- }
-
- /* print size information */
- output_report("Transfer Buffer Size (bytes): %d\n", buf_bytes);
- output_report("File Size(MB): %.2f\n", ((double)parms.num_bytes) / ONE_MB);
-
- print_indent(0);
- if (opts->io_types & SIO_POSIX)
- run_test(POSIXIO, parms, opts);
-
- print_indent(0);
- if (opts->io_types & SIO_HDF5)
- run_test(HDF5, parms, opts);
-}
-
-/*
- * Function: run_test
- * Purpose: Inner loop call to actually run the I/O test.
- * Return: Nothing
- * Programmer: Bill Wendling, 18. December 2001
- * Modifications:
- */
-static int
-run_test(iotype iot, parameters parms, struct options *opts)
-{
- results res;
- register int i, ret_value = SUCCESS;
- off_t raw_size;
- minmax * write_sys_mm_table = NULL;
- minmax * write_mm_table = NULL;
- minmax * write_gross_mm_table = NULL;
- minmax * write_raw_mm_table = NULL;
- minmax * read_sys_mm_table = NULL;
- minmax * read_mm_table = NULL;
- minmax * read_gross_mm_table = NULL;
- minmax * read_raw_mm_table = NULL;
- minmax write_sys_mm = {0.0F, 0.0F, 0.0F, 0};
- minmax write_mm = {0.0F, 0.0F, 0.0F, 0};
- minmax write_gross_mm = {0.0F, 0.0F, 0.0F, 0};
- minmax write_raw_mm = {0.0F, 0.0F, 0.0F, 0};
- minmax read_sys_mm = {0.0F, 0.0F, 0.0F, 0};
- minmax read_mm = {0.0F, 0.0F, 0.0F, 0};
- minmax read_gross_mm = {0.0F, 0.0F, 0.0F, 0};
- minmax read_raw_mm = {0.0F, 0.0F, 0.0F, 0};
-
- raw_size = (off_t)parms.num_bytes;
- parms.io_type = iot;
- print_indent(2);
- output_report("IO API = ");
-
- switch (iot) {
- case POSIXIO:
- output_report("POSIX\n");
- break;
- case HDF5:
- output_report("HDF5\n");
- break;
- default:
- /* unknown request */
- HDfprintf(stderr, "Unknown IO type request (%d)\n", (int)iot);
- HDassert(0 && "Unknown IO tpe");
- break;
- }
-
- /* allocate space for tables minmax and that it is sufficient */
- /* to initialize all elements to zeros by calloc. */
- write_sys_mm_table = (minmax *)calloc((size_t)parms.num_iters, sizeof(minmax));
- write_mm_table = (minmax *)calloc((size_t)parms.num_iters, sizeof(minmax));
- write_gross_mm_table = (minmax *)calloc((size_t)parms.num_iters, sizeof(minmax));
- write_raw_mm_table = (minmax *)calloc((size_t)parms.num_iters, sizeof(minmax));
-
- if (!parms.h5_write_only) {
- read_sys_mm_table = (minmax *)calloc((size_t)parms.num_iters, sizeof(minmax));
- read_mm_table = (minmax *)calloc((size_t)parms.num_iters, sizeof(minmax));
- read_gross_mm_table = (minmax *)calloc((size_t)parms.num_iters, sizeof(minmax));
- read_raw_mm_table = (minmax *)calloc((size_t)parms.num_iters, sizeof(minmax));
- }
-
- /* Do IO iteration times, collecting statistics each time */
- for (i = 0; i < parms.num_iters; ++i) {
- double t;
-
- do_sio(parms, &res);
-
- /* gather all of the "sys write" times */
- t = io_time_get(res.timers, HDF5_MPI_WRITE);
- get_minmax(&write_sys_mm, t);
-
- write_sys_mm_table[i] = write_sys_mm;
-
- /* gather all of the "write" times */
- t = io_time_get(res.timers, HDF5_FINE_WRITE_FIXED_DIMS);
- get_minmax(&write_mm, t);
-
- write_mm_table[i] = write_mm;
-
- /* gather all of the "write" times from open to close */
- t = io_time_get(res.timers, HDF5_GROSS_WRITE_FIXED_DIMS);
- get_minmax(&write_gross_mm, t);
-
- write_gross_mm_table[i] = write_gross_mm;
-
- /* gather all of the raw "write" times */
- t = io_time_get(res.timers, HDF5_RAW_WRITE_FIXED_DIMS);
- get_minmax(&write_raw_mm, t);
-
- write_raw_mm_table[i] = write_raw_mm;
-
- if (!parms.h5_write_only) {
- /* gather all of the "mpi read" times */
- t = io_time_get(res.timers, HDF5_MPI_READ);
- get_minmax(&read_sys_mm, t);
-
- read_sys_mm_table[i] = read_sys_mm;
-
- /* gather all of the "read" times */
- t = io_time_get(res.timers, HDF5_FINE_READ_FIXED_DIMS);
- get_minmax(&read_mm, t);
-
- read_mm_table[i] = read_mm;
-
- /* gather all of the "read" times from open to close */
- t = io_time_get(res.timers, HDF5_GROSS_READ_FIXED_DIMS);
- get_minmax(&read_gross_mm, t);
-
- read_gross_mm_table[i] = read_gross_mm;
-
- /* gather all of the raw "read" times */
- t = io_time_get(res.timers, HDF5_RAW_READ_FIXED_DIMS);
- get_minmax(&read_raw_mm, t);
-
- read_raw_mm_table[i] = read_gross_mm;
- }
- io_time_destroy(res.timers);
- }
-
- /*
- * Show various statistics
- */
- /* Write statistics */
- /* Print the raw data throughput if desired */
- if (opts->print_raw) {
- /* accumulate and output the max, min, and average "raw write" times */
- if (sio_debug_level >= 3) {
- /* output all of the times for all iterations */
- print_indent(3);
- output_report("Raw Data Write details:\n");
- output_all_info(write_raw_mm_table, parms.num_iters, 4);
- }
-
- output_results(opts, "Raw Data Write", write_raw_mm_table, parms.num_iters, raw_size);
- } /* end if */
-
- /* show sys write statics */
-#if 0
- if (sio_debug_level >= 3) {
- /* output all of the times for all iterations */
- print_indent(3);
- output_report("MPI Write details:\n");
- output_all_info(write_sys_mm_table, parms.num_iters, 4);
- }
-#endif
- /* We don't currently output the MPI write results */
-
- /* accumulate and output the max, min, and average "write" times */
- if (sio_debug_level >= 3) {
- /* output all of the times for all iterations */
- print_indent(3);
- output_report("Write details:\n");
- output_all_info(write_mm_table, parms.num_iters, 4);
- }
-
- output_results(opts, "Write", write_mm_table, parms.num_iters, raw_size);
-
- /* accumulate and output the max, min, and average "gross write" times */
- if (sio_debug_level >= 3) {
- /* output all of the times for all iterations */
- print_indent(3);
- output_report("Write Open-Close details:\n");
- output_all_info(write_gross_mm_table, parms.num_iters, 4);
- }
-
- output_results(opts, "Write Open-Close", write_gross_mm_table, parms.num_iters, raw_size);
-
- if (!parms.h5_write_only) {
- /* Read statistics */
- /* Print the raw data throughput if desired */
- if (opts->print_raw) {
- /* accumulate and output the max, min, and average "raw read" times */
- if (sio_debug_level >= 3) {
- /* output all of the times for all iterations */
- print_indent(3);
- output_report("Raw Data Read details:\n");
- output_all_info(read_raw_mm_table, parms.num_iters, 4);
- }
-
- output_results(opts, "Raw Data Read", read_raw_mm_table, parms.num_iters, raw_size);
- } /* end if */
-
- /* show mpi read statics */
-#if 0
- if (sio_debug_level >= 3) {
- /* output all of the times for all iterations */
- print_indent(3);
- output_report("MPI Read details:\n");
- output_all_info(read_sys_mm_table, parms.num_iters, 4);
- }
-#endif
- /* We don't currently output the MPI read results */
-
- /* accumulate and output the max, min, and average "read" times */
- if (sio_debug_level >= 3) {
- /* output all of the times for all iterations */
- print_indent(3);
- output_report("Read details:\n");
- output_all_info(read_mm_table, parms.num_iters, 4);
- }
-
- output_results(opts, "Read", read_mm_table, parms.num_iters, raw_size);
-
- /* accumulate and output the max, min, and average "gross read" times */
- if (sio_debug_level >= 3) {
- /* output all of the times for all iterations */
- print_indent(3);
- output_report("Read Open-Close details:\n");
- output_all_info(read_gross_mm_table, parms.num_iters, 4);
- }
-
- output_results(opts, "Read Open-Close", read_gross_mm_table, parms.num_iters, raw_size);
- }
-
- /* clean up our mess */
- HDfree(write_sys_mm_table);
- HDfree(write_mm_table);
- HDfree(write_gross_mm_table);
- HDfree(write_raw_mm_table);
-
- if (!parms.h5_write_only) {
- HDfree(read_sys_mm_table);
- HDfree(read_mm_table);
- HDfree(read_gross_mm_table);
- HDfree(read_raw_mm_table);
- }
-
- return ret_value;
-}
-
-/*
- * Function: output_all_info
- * Purpose:
- * Return: Nothing
- * Programmer: Bill Wendling, 29. January 2002
- * Modifications:
- */
-static void
-output_all_info(minmax *mm, int count, int indent_level)
-{
- int i;
-
- for (i = 0; i < count; ++i) {
- print_indent(indent_level);
- output_report("Iteration %d:\n", i + 1);
- print_indent(indent_level + 1);
- output_report("Minimum Time: %.2fs\n", mm[i].min);
- print_indent(indent_level + 1);
- output_report("Maximum Time: %.2fs\n", mm[i].max);
- }
-}
-
-/*
- * Function: get_minmax
- * Purpose: Gather all the min, max and total of val.
- * Return: Nothing
- * Programmer: Bill Wendling, 21. December 2001
- * Modifications:
- * Use MPI_Allreduce to do it. -akc, 2002/01/11
- */
-
-static void
-get_minmax(minmax *mm, double val)
-{
- mm->max = val;
- mm->min = val;
- mm->sum = val;
-}
-
-/*
- * Function: accumulate_minmax_stuff
- * Purpose: Accumulate the minimum, maximum, and average of the times
- * across all processes.
- * Return: TOTAL_MM - the total of all of these.
- * Programmer: Bill Wendling, 21. December 2001
- * Modifications:
- * Changed to use seconds instead of MB/s - QAK, 5/9/02
- */
-static void
-accumulate_minmax_stuff(const minmax *mm, int count, minmax *total_mm)
-{
- int i;
-
- total_mm->sum = 0.0F;
- total_mm->max = -DBL_MAX;
- total_mm->min = DBL_MAX;
- total_mm->num = count;
-
- for (i = 0; i < count; ++i) {
- double m = mm[i].max;
-
- total_mm->sum += m;
-
- if (m < total_mm->min)
- total_mm->min = m;
-
- if (m > total_mm->max)
- total_mm->max = m;
- }
-}
-
-/*
- * Function: output_results
- * Purpose: Print information about the time & bandwidth for a given
- * minmax & # of iterations.
- * Return: Nothing
- * Programmer: Quincey Koziol, 9. May 2002
- * Modifications:
- */
-static void
-output_results(const struct options *opts, const char *name, minmax *table, int table_size, off_t data_size)
-{
- minmax total_mm;
-
- accumulate_minmax_stuff(table, table_size, &total_mm);
-
- print_indent(3);
- output_report("%s (%d iteration(s)):\n", name, table_size);
-
- /* Note: The maximum throughput uses the minimum amount of time & vice versa */
-
- print_indent(4);
- output_report("Maximum Throughput: %6.2f MB/s", MB_PER_SEC(data_size, total_mm.min));
- if (opts->print_times)
- output_report(" (%7.3f s)\n", total_mm.min);
- else
- output_report("\n");
-
- print_indent(4);
- output_report("Average Throughput: %6.2f MB/s", MB_PER_SEC(data_size, total_mm.sum / total_mm.num));
- if (opts->print_times)
- output_report(" (%7.3f s)\n", (total_mm.sum / total_mm.num));
- else
- output_report("\n");
-
- print_indent(4);
- output_report("Minimum Throughput: %6.2f MB/s", MB_PER_SEC(data_size, total_mm.max));
- if (opts->print_times)
- output_report(" (%7.3f s)\n", total_mm.max);
- else
- output_report("\n");
-}
-
-/*
- * Function: output_report
- * Purpose: Print a line of the report. Only do so if I'm the 0 process.
- * Return: Nothing
- * Programmer: Bill Wendling, 19. December 2001
- * Modifications:
- */
-static void
-output_report(const char *fmt, ...)
-{
- va_list ap;
-
- HDva_start(ap, fmt);
- HDvfprintf(output, fmt, ap);
- HDva_end(ap);
-}
-
-/*
- * Function: print_indent
- * Purpose: Print spaces to indent a new line of text for pretty printing
- * things.
- * Return: Nothing
- * Programmer: Bill Wendling, 29. October 2001
- * Modifications:
- */
-static void
-print_indent(register int indent)
-{
- indent *= TAB_SPACE;
-
- for (; indent > 0; --indent)
- HDfputc(' ', output);
-}
-
-static void
-recover_size_and_print(long long val, const char *end)
-{
- if (val >= ONE_KB && (val % ONE_KB) == 0) {
- if (val >= ONE_MB && (val % ONE_MB) == 0) {
- if (val >= ONE_GB && (val % ONE_GB) == 0)
- HDfprintf(output,
- "%" H5_PRINTF_LL_WIDTH "d"
- "GB%s",
- val / ONE_GB, end);
- else
- HDfprintf(output,
- "%" H5_PRINTF_LL_WIDTH "d"
- "MB%s",
- val / ONE_MB, end);
- }
- else {
- HDfprintf(output,
- "%" H5_PRINTF_LL_WIDTH "d"
- "KB%s",
- val / ONE_KB, end);
- }
- }
- else {
- HDfprintf(output,
- "%" H5_PRINTF_LL_WIDTH "d"
- "%s",
- val, end);
- }
-}
-
-static void
-print_io_api(long io_types)
-{
- if (io_types & SIO_POSIX)
- HDfprintf(output, "posix ");
- if (io_types & SIO_HDF5)
- HDfprintf(output, "hdf5 ");
- HDfprintf(output, "\n");
-}
-
-static void
-report_parameters(struct options *opts)
-{
- int i, rank;
- rank = opts->dset_rank;
-
- print_version("HDF5 Library"); /* print library version */
- HDfprintf(output, "==== Parameters ====\n");
-
- HDfprintf(output, "IO API=");
- print_io_api(opts->io_types);
-
- HDfprintf(output, "Number of iterations=%d\n", opts->num_iters);
-
- HDfprintf(output, "Dataset size=");
-
- for (i = 0; i < rank; i++)
- recover_size_and_print((long long)opts->dset_size[i], " ");
- HDfprintf(output, "\n");
-
- HDfprintf(output, "Transfer buffer size=");
- for (i = 0; i < rank; i++)
- recover_size_and_print((long long)opts->buf_size[i], " ");
- HDfprintf(output, "\n");
-
- if (opts->page_size) {
- HDfprintf(output, "Page Aggregation Enabled. Page size = %zu\n", opts->page_size);
- if (opts->page_buffer_size)
- HDfprintf(output, "Page Buffering Enabled. Page Buffer size = %zu\n", opts->page_buffer_size);
- else
- HDfprintf(output, "Page Buffering Disabled\n");
- }
- else
- HDfprintf(output, "Page Aggregation Disabled\n");
-
- HDfprintf(output, "Dimension access order=");
- for (i = 0; i < rank; i++)
- recover_size_and_print((long long)opts->order[i], " ");
- HDfprintf(output, "\n");
-
- if (opts->io_types & SIO_HDF5) {
-
- HDfprintf(output, "HDF5 data storage method=");
-
- if (opts->h5_use_chunks) {
-
- HDfprintf(output, "Chunked\n");
- HDfprintf(output, "HDF5 chunk size=");
- for (i = 0; i < rank; i++)
- recover_size_and_print((long long)opts->chk_size[i], " ");
- HDfprintf(output, "\n");
-
- HDfprintf(output, "HDF5 dataset dimensions=");
- if (opts->h5_extendable) {
- HDfprintf(output, "Extendable\n");
- }
- else {
- HDfprintf(output, "Fixed\n");
- }
- }
- else {
- HDfprintf(output, "Contiguous\n");
- }
-
- HDfprintf(output, "HDF5 file driver=");
- if (opts->vfd == sec2) {
- HDfprintf(output, "sec2\n");
- }
- else if (opts->vfd == stdio) {
- HDfprintf(output, "stdio\n");
- }
- else if (opts->vfd == core) {
- HDfprintf(output, "core\n");
- }
- else if (opts->vfd == split) {
- HDfprintf(output, "split\n");
- }
- else if (opts->vfd == multi) {
- HDfprintf(output, "multi\n");
- }
- else if (opts->vfd == family) {
- HDfprintf(output, "family\n");
- }
- else if (opts->vfd == direct) {
- HDfprintf(output, "direct\n");
- }
- }
-
- {
- char *prefix = HDgetenv("HDF5_PREFIX");
-
- HDfprintf(output, "Env HDF5_PREFIX=%s\n", (prefix ? prefix : "not set"));
- }
-
- HDfprintf(output, "==== End of Parameters ====\n");
- HDfprintf(output, "\n");
-}
-
-/*
- * Function: parse_command_line
- * Purpose: Parse the command line options and return a STRUCT OPTIONS
- * structure which will need to be freed by the calling function.
- * Return: Pointer to an OPTIONS structure
- * Programmer: Bill Wendling, 31. October 2001
- * Modifications:
- * Added multidimensional testing (Christian Chilan, April, 2008)
- */
-static struct options *
-parse_command_line(int argc, const char *argv[])
-{
- int opt;
- struct options *cl_opts;
- int i, default_rank, actual_rank, ranks[4];
-
- cl_opts = (struct options *)HDmalloc(sizeof(struct options));
-
- cl_opts->page_buffer_size = 0;
- cl_opts->page_size = 0;
-
- cl_opts->output_file = NULL;
- cl_opts->io_types = 0; /* will set default after parsing options */
- cl_opts->num_iters = 1;
-
- default_rank = 2;
-
- cl_opts->dset_rank = 0;
- cl_opts->buf_rank = 0;
- cl_opts->chk_rank = 0;
- cl_opts->order_rank = 0;
-
- for (i = 0; i < MAX_DIMS; i++) {
- cl_opts->buf_size[i] = (size_t)((i + 1) * 10);
- cl_opts->dset_size[i] = (hsize_t)((i + 1) * 100);
- cl_opts->chk_size[i] = (size_t)((i + 1) * 10);
- cl_opts->order[i] = i + 1;
- }
-
- cl_opts->vfd = sec2;
-
- cl_opts->print_times = FALSE; /* Printing times is off by default */
- cl_opts->print_raw = FALSE; /* Printing raw data throughput is off by default */
- cl_opts->h5_alignment = 1; /* No alignment for HDF5 objects by default */
- cl_opts->h5_threshold = 1; /* No threshold for aligning HDF5 objects by default */
- cl_opts->h5_use_chunks = FALSE; /* Don't chunk the HDF5 dataset by default */
- cl_opts->h5_write_only = FALSE; /* Do both read and write by default */
- cl_opts->h5_extendable = FALSE; /* Use extendable dataset */
- cl_opts->verify = FALSE; /* No Verify data correctness by default */
-
- while ((opt = get_option(argc, argv, s_opts, l_opts)) != EOF) {
- switch ((char)opt) {
- case 'a':
- cl_opts->h5_alignment = parse_size_directive(opt_arg);
- break;
- case 'G':
- cl_opts->page_size = parse_size_directive(opt_arg);
- break;
- case 'b':
- cl_opts->page_buffer_size = parse_size_directive(opt_arg);
- break;
- case 'A': {
- const char *end = opt_arg;
- while (end && *end != '\0') {
- char buf[10];
-
- HDmemset(buf, '\0', sizeof(buf));
-
- for (i = 0; *end != '\0' && *end != ','; ++end)
- if (HDisalnum(*end) && i < 10)
- buf[i++] = *end;
-
- if (!HDstrcasecmp(buf, "hdf5")) {
- cl_opts->io_types |= SIO_HDF5;
- }
- else if (!HDstrcasecmp(buf, "posix")) {
- cl_opts->io_types |= SIO_POSIX;
- }
- else {
- HDfprintf(stderr, "sio_perf: invalid --api option %s\n", buf);
- HDexit(EXIT_FAILURE);
- }
-
- if (*end == '\0')
- break;
-
- end++;
- }
- }
-
- break;
-#if 0
- case 'b':
- /* the future "binary" option */
- break;
-#endif /* 0 */
- case 'c':
- /* Turn on chunked HDF5 dataset creation */
- cl_opts->h5_use_chunks = 1;
- {
- const char *end = opt_arg;
- int j = 0;
-
- while (end && *end != '\0') {
- char buf[10];
-
- HDmemset(buf, '\0', sizeof(buf));
-
- for (i = 0; *end != '\0' && *end != ','; ++end)
- if (HDisalnum(*end) && i < 10)
- buf[i++] = *end;
-
- cl_opts->chk_size[j] = parse_size_directive(buf);
-
- j++;
-
- if (*end == '\0')
- break;
-
- end++;
- }
- cl_opts->chk_rank = j;
- }
-
- break;
-
- case 'D': {
- const char *end = opt_arg;
-
- while (end && *end != '\0') {
- char buf[10];
-
- HDmemset(buf, '\0', sizeof(buf));
-
- for (i = 0; *end != '\0' && *end != ','; ++end)
- if (HDisalnum(*end) && i < 10)
- buf[i++] = *end;
-
- if (HDstrlen(buf) > 1 || HDisdigit(buf[0])) {
- size_t j;
-
- for (j = 0; j < 10 && buf[j] != '\0'; ++j)
- if (!HDisdigit(buf[j])) {
- HDfprintf(stderr, "sio_perf: invalid --debug option %s\n", buf);
- HDexit(EXIT_FAILURE);
- }
-
- sio_debug_level = atoi(buf);
-
- if (sio_debug_level > 4)
- sio_debug_level = 4;
- else if (sio_debug_level < 0)
- sio_debug_level = 0;
- }
- else {
- switch (*buf) {
- case 'r':
- /* Turn on raw data throughput info */
- cl_opts->print_raw = TRUE;
- break;
- case 't':
- /* Turn on time printing */
- cl_opts->print_times = TRUE;
- break;
- case 'v':
- /* Turn on verify data correctness*/
- cl_opts->verify = TRUE;
- break;
- default:
- HDfprintf(stderr, "sio_perf: invalid --debug option %s\n", buf);
- HDexit(EXIT_FAILURE);
- }
- }
-
- if (*end == '\0')
- break;
-
- end++;
- }
- }
-
- break;
- case 'e': {
- const char *end = opt_arg;
- int j = 0;
-
- while (end && *end != '\0') {
- char buf[10];
-
- HDmemset(buf, '\0', sizeof(buf));
-
- for (i = 0; *end != '\0' && *end != ','; ++end)
- if (HDisalnum(*end) && i < 10)
- buf[i++] = *end;
-
- cl_opts->dset_size[j] = parse_size_directive(buf);
-
- j++;
-
- if (*end == '\0')
- break;
-
- end++;
- }
- cl_opts->dset_rank = j;
- }
-
- break;
-
- case 'i':
- cl_opts->num_iters = HDatoi(opt_arg);
- break;
- case 'o':
- cl_opts->output_file = opt_arg;
- break;
- case 'T':
- cl_opts->h5_threshold = parse_size_directive(opt_arg);
- break;
- case 'v':
- if (!HDstrcasecmp(opt_arg, "sec2")) {
- cl_opts->vfd = sec2;
- }
- else if (!HDstrcasecmp(opt_arg, "stdio")) {
- cl_opts->vfd = stdio;
- }
- else if (!HDstrcasecmp(opt_arg, "core")) {
- cl_opts->vfd = core;
- }
- else if (!HDstrcasecmp(opt_arg, "split")) {
- cl_opts->vfd = split;
- }
- else if (!HDstrcasecmp(opt_arg, "multi")) {
- cl_opts->vfd = multi;
- }
- else if (!HDstrcasecmp(opt_arg, "family")) {
- cl_opts->vfd = family;
- }
- else if (!HDstrcasecmp(opt_arg, "direct")) {
- cl_opts->vfd = direct;
- }
- else {
- HDfprintf(stderr, "sio_perf: invalid --api option %s\n", opt_arg);
- HDexit(EXIT_FAILURE);
- }
- break;
- case 'w':
- cl_opts->h5_write_only = TRUE;
- break;
- case 't':
- cl_opts->h5_extendable = TRUE;
- break;
- case 'x': {
- const char *end = opt_arg;
- int j = 0;
-
- while (end && *end != '\0') {
- char buf[10];
-
- HDmemset(buf, '\0', sizeof(buf));
-
- for (i = 0; *end != '\0' && *end != ','; ++end)
- if (HDisalnum(*end) && i < 10)
- buf[i++] = *end;
-
- cl_opts->buf_size[j] = parse_size_directive(buf);
-
- j++;
-
- if (*end == '\0')
- break;
-
- end++;
- }
- cl_opts->buf_rank = j;
- }
-
- break;
-
- case 'r': {
- const char *end = opt_arg;
- int j = 0;
-
- while (end && *end != '\0') {
- char buf[10];
-
- HDmemset(buf, '\0', sizeof(buf));
-
- for (i = 0; *end != '\0' && *end != ','; ++end)
- if (HDisalnum(*end) && i < 10)
- buf[i++] = *end;
-
- cl_opts->order[j] = (int)parse_size_directive(buf);
-
- j++;
-
- if (*end == '\0')
- break;
-
- end++;
- }
-
- cl_opts->order_rank = j;
- }
-
- break;
-
- case 'h':
- case '?':
- default:
- usage(progname);
- HDfree(cl_opts);
- return NULL;
- }
- }
-
- /* perform rank consistency analysis */
- actual_rank = 0;
-
- ranks[0] = cl_opts->dset_rank;
- ranks[1] = cl_opts->buf_rank;
- ranks[2] = cl_opts->order_rank;
- ranks[3] = cl_opts->chk_rank;
-
- for (i = 0; i < 4; i++) {
- if (ranks[i] > 0) {
- if (!actual_rank) {
- actual_rank = ranks[i];
- }
- else {
- if (actual_rank != ranks[i])
- exit(EXIT_FAILURE);
- }
- }
- }
-
- if (!actual_rank)
- actual_rank = default_rank;
-
- cl_opts->dset_rank = actual_rank;
- cl_opts->buf_rank = actual_rank;
- cl_opts->order_rank = actual_rank;
- cl_opts->chk_rank = actual_rank;
-
- for (i = 0; i < actual_rank; i++) {
- if (cl_opts->order[i] > actual_rank) {
- exit(EXIT_FAILURE);
- }
- }
-
- /* set default if none specified yet */
- if (!cl_opts->io_types)
- cl_opts->io_types = SIO_HDF5 | SIO_POSIX; /* run all API */
-
- /* verify parameters sanity. Adjust if needed. */
- /* cap xfer_size with bytes per process */
- if (cl_opts->num_iters <= 0)
- cl_opts->num_iters = 1;
-
- return cl_opts;
-}
-
-/*
- * Function: parse_size_directive
- * Purpose: Parse the size directive passed on the commandline. The size
- * directive is an integer followed by a size indicator:
- *
- * K, k - Kilobyte
- * M, m - Megabyte
- * G, g - Gigabyte
- *
- * Return: The size as a off_t because this is related to file size.
- * If an unknown size indicator is used, then the program will
- * exit with EXIT_FAILURE as the return value.
- * Programmer: Bill Wendling, 18. December 2001
- * Modifications:
- */
-
-static hsize_t
-parse_size_directive(const char *size)
-{
- hsize_t s;
- char * endptr;
-
- s = HDstrtoull(size, &endptr, 10);
-
- if (endptr && *endptr) {
- while (*endptr != '\0' && (*endptr == ' ' || *endptr == '\t'))
- ++endptr;
-
- switch (*endptr) {
- case 'K':
- case 'k':
- s *= ONE_KB;
- break;
-
- case 'M':
- case 'm':
- s *= ONE_MB;
- break;
-
- case 'G':
- case 'g':
- s *= ONE_GB;
- break;
-
- default:
- HDfprintf(stderr, "Illegal size specifier '%c'\n", *endptr);
- HDexit(EXIT_FAILURE);
- }
- }
-
- return s;
-}
-
-/*
- * Function: usage
- * Purpose: Print a usage message and then exit.
- * Return: Nothing
- * Programmer: Bill Wendling, 31. October 2001
- * Modifications:
- */
-static void
-usage(const char *prog)
-{
- print_version(prog);
- HDprintf("usage: %s [OPTIONS]\n", prog);
- HDprintf(" OPTIONS\n");
- HDprintf(" -h Print an usage message and exit\n");
- HDprintf(" -A AL Which APIs to test\n");
- HDprintf(" [default: all of them]\n");
- HDprintf(" -c SL Selects chunked storage and defines chunks dimensions\n");
- HDprintf(" and sizes\n");
- HDprintf(" [default: Off]\n");
- HDprintf(" -e SL Dimensions and sizes of dataset\n");
- HDprintf(" [default: 100,200]\n");
- HDprintf(" -i N Number of iterations to perform\n");
- HDprintf(" [default: 1]\n");
- HDprintf(" -r NL Dimension access order (see below for description)\n");
- HDprintf(" [default: 1,2]\n");
- HDprintf(" -t Selects extendable dimensions for HDF5 dataset\n");
- HDprintf(" [default: Off]\n");
- HDprintf(" -v VFD Selects file driver for HDF5 access\n");
- HDprintf(" [default: sec2]\n");
- HDprintf(" -w Perform write tests, not the read tests\n");
- HDprintf(" [default: Off]\n");
- HDprintf(" -x SL Dimensions and sizes of the transfer buffer\n");
- HDprintf(" [default: 10,20]\n");
- HDprintf("\n");
- HDprintf(" N - is an integer > 0.\n");
- HDprintf("\n");
- HDprintf(" S - is a size specifier, an integer > 0 followed by a size indicator:\n");
- HDprintf(" K - Kilobyte (%d)\n", ONE_KB);
- HDprintf(" M - Megabyte (%d)\n", ONE_MB);
- HDprintf(" G - Gigabyte (%d)\n", ONE_GB);
- HDprintf("\n");
- HDprintf(" Example: '37M' is 37 megabytes or %d bytes\n", 37 * ONE_MB);
- HDprintf("\n");
- HDprintf(" AL - is an API list. Valid values are:\n");
- HDprintf(" hdf5 - HDF5\n");
- HDprintf(" posix - POSIX\n");
- HDprintf("\n");
- HDprintf(" Example: -A posix,hdf5\n");
- HDprintf("\n");
- HDprintf(" NL - is list of integers (N) separated by commas.\n");
- HDprintf("\n");
- HDprintf(" Example: 1,2,3\n");
- HDprintf("\n");
- HDprintf(" SL - is list of size specifiers (S) separated by commas.\n");
- HDprintf("\n");
- HDprintf(" Example: 2K,2K,3K\n");
- HDprintf("\n");
- HDprintf(" The example defines an object (dataset, tranfer buffer) with three\n");
- HDprintf(" dimensions. Be aware that as the number of dimensions increases, the\n");
- HDprintf(" the total size of the object increases exponentially.\n");
- HDprintf("\n");
- HDprintf(" VFD - is an HDF5 file driver specifier. Valid values are:\n");
- HDprintf(" sec2, stdio, core, split, multi, family, direct\n");
- HDprintf("\n");
- HDprintf(" Dimension access order:\n");
- HDprintf(" Data access starts at the cardinal origin of the dataset using the\n");
- HDprintf(" transfer buffer. The next access occurs on a dataset region next to\n");
- HDprintf(" the previous one. For a multidimensional dataset, there are several\n");
- HDprintf(" directions as to where to proceed. This can be specified in the dimension\n");
- HDprintf(" access order. For example, -r 1,2 states that the tool should traverse\n");
- HDprintf(" dimension 1 first, and then dimension 2.\n");
- HDprintf("\n");
- HDprintf(" Environment variables:\n");
- HDprintf(" HDF5_NOCLEANUP Do not remove data files if set [default remove]\n");
- HDprintf(" HDF5_PREFIX Data file prefix\n");
- HDprintf("\n");
- HDfflush(stdout);
-} /* end usage() */
diff --git a/tools/test/perform/sio_perf.h b/tools/test/perform/sio_perf.h
deleted file mode 100644
index acdb801..0000000
--- a/tools/test/perform/sio_perf.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Copyright by The HDF Group. *
- * 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 COPYING file, which can be found at the root of the source code *
- * distribution tree, or in https://www.hdfgroup.org/licenses. *
- * If you do not have access to either file, you may request a copy from *
- * help@hdfgroup.org. *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-#ifndef SIO_PERF_H__
-#define SIO_PERF_H__
-
-#ifndef STANDALONE
-#include "io_timer.h"
-#include "h5test.h"
-#include "h5tools.h"
-#include "h5tools_utils.h"
-#else
-#include "io_timer.h"
-#include "sio_standalone.h"
-#endif
-
-/* setup the dataset no fill option if this is v1.5 or more */
-#if H5_VERS_MAJOR > 1 || H5_VERS_MINOR > 4
-#define H5_HAVE_NOFILL 1
-#endif
-
-#define MAX_DIMS 32
-
-typedef enum iotype_ {
- POSIXIO,
- HDF5
- /*NUM_TYPES*/
-} iotype;
-
-typedef enum vfdtype_ {
- sec2,
- stdio,
- core,
- split,
- multi,
- family,
- direct
- /*NUM_TYPES*/
-} vfdtype;
-
-typedef struct parameters_ {
- iotype io_type; /* The type of IO test to perform */
- vfdtype vfd;
- long num_files; /* Number of files to create */
- long num_dsets; /* Number of datasets to create */
- hsize_t num_bytes; /* Number of bytes in each dset */
- int num_iters; /* Number of times to loop doing the IO */
- int rank; /* Rank of dataset */
- hsize_t dset_size[MAX_DIMS]; /* Dataset size */
- size_t buf_size[MAX_DIMS]; /* Buffer size */
- size_t chk_size[MAX_DIMS]; /* Chunk size */
- int order[MAX_DIMS]; /* Buffer size */
- hsize_t h5_align; /* HDF5 object alignment */
- hsize_t h5_thresh; /* HDF5 object alignment threshold */
- int h5_use_chunks; /* Make HDF5 dataset chunked */
- int h5_extendable; /* Make HDF5 dataset chunked */
- int h5_write_only; /* Perform the write tests only */
- int verify; /* Verify data correctness */
- size_t page_size;
- size_t page_buffer_size;
-} parameters;
-
-typedef struct results_ {
- herr_t ret_code;
- io_time_t *timers;
-} results;
-
-#ifndef SUCCESS
-#define SUCCESS 0
-#endif /* !SUCCESS */
-
-#ifndef FAIL
-#define FAIL -1
-#endif /* !FAIL */
-
-extern FILE * output; /* output file */
-extern io_time_t *timer_g; /* timer: global for stub functions */
-extern int sio_debug_level; /* The debug level:
- * 0 - Off
- * 1 - Minimal
- * 2 - Some more
- * 3 - Maximal
- * 4 - Even More Debugging (timer stuff)
- */
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-extern void do_sio(parameters param, results *res);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* PIO_PERF_H__ */
diff --git a/tools/test/perform/sio_standalone.c b/tools/test/perform/sio_standalone.c
index abc0777..7c22b53 100644
--- a/tools/test/perform/sio_standalone.c
+++ b/tools/test/perform/sio_standalone.c
@@ -22,31 +22,26 @@
/* global variables */
int nCols = 80;
-/* ``get_option'' variables */
-int opt_err = 1; /*get_option prints errors if this is on */
-int opt_ind = 1; /*token pointer */
-const char *opt_arg; /*flag argument (or value) */
-
int
-get_option(int argc, const char **argv, const char *opts, const struct long_options *l_opts)
+get_option(int argc, const char **argv, const char *opts, const struct h5_long_options *l_opts)
{
static int sp = 1; /* character index in current token */
int opt_opt = '?'; /* option character passed back to user */
if (sp == 1) {
/* check for more flag-like tokens */
- if (opt_ind >= argc || argv[opt_ind][0] != '-' || argv[opt_ind][1] == '\0') {
+ if (H5_optind >= argc || argv[H5_optind][0] != '-' || argv[H5_optind][1] == '\0') {
return EOF;
}
- else if (HDstrcmp(argv[opt_ind], "--") == 0) {
- opt_ind++;
+ else if (HDstrcmp(argv[H5_optind], "--") == 0) {
+ H5_optind++;
return EOF;
}
}
- if (sp == 1 && argv[opt_ind][0] == '-' && argv[opt_ind][1] == '-') {
+ if (sp == 1 && argv[H5_optind][0] == '-' && argv[H5_optind][1] == '-') {
/* long command line option */
- const char *arg = &argv[opt_ind][2];
+ const char *arg = &argv[H5_optind][2];
int i;
for (i = 0; l_opts && l_opts[i].name; i++) {
@@ -58,13 +53,13 @@ get_option(int argc, const char **argv, const char *opts, const struct long_opti
if (l_opts[i].has_arg != no_arg) {
if (arg[len] == '=') {
- opt_arg = &arg[len + 1];
+ H5_optarg = &arg[len + 1];
}
- else if (opt_ind < (argc - 1) && argv[opt_ind + 1][0] != '-') {
- opt_arg = argv[++opt_ind];
+ else if (H5_optind < (argc - 1) && argv[H5_optind + 1][0] != '-') {
+ H5_optarg = argv[++H5_optind];
}
else if (l_opts[i].has_arg == require_arg) {
- if (opt_err)
+ if (H5_opterr)
HDfprintf(stderr, "%s: option required for \"--%s\" flag\n", argv[0], arg);
opt_opt = '?';
@@ -72,13 +67,13 @@ get_option(int argc, const char **argv, const char *opts, const struct long_opti
}
else {
if (arg[len] == '=') {
- if (opt_err)
+ if (H5_opterr)
HDfprintf(stderr, "%s: no option required for \"%s\" flag\n", argv[0], arg);
opt_opt = '?';
}
- opt_arg = NULL;
+ H5_optarg = NULL;
}
break;
@@ -87,29 +82,29 @@ get_option(int argc, const char **argv, const char *opts, const struct long_opti
if (l_opts[i].name == NULL) {
/* exhausted all of the l_opts we have and still didn't match */
- if (opt_err)
+ if (H5_opterr)
HDfprintf(stderr, "%s: unknown option \"%s\"\n", argv[0], arg);
opt_opt = '?';
}
- opt_ind++;
+ H5_optind++;
sp = 1;
}
else {
register char *cp; /* pointer into current token */
/* short command line option */
- opt_opt = argv[opt_ind][sp];
+ opt_opt = argv[H5_optind][sp];
if (opt_opt == ':' || (cp = strchr(opts, opt_opt)) == 0) {
- if (opt_err)
+ if (H5_opterr)
HDfprintf(stderr, "%s: unknown option \"%c\"\n", argv[0], opt_opt);
/* if no chars left in this token, move to next token */
- if (argv[opt_ind][++sp] == '\0') {
- opt_ind++;
+ if (argv[H5_optind][++sp] == '\0') {
+ H5_optind++;
sp = 1;
}
@@ -118,32 +113,32 @@ get_option(int argc, const char **argv, const char *opts, const struct long_opti
if (*++cp == ':') {
/* if a value is expected, get it */
- if (argv[opt_ind][sp + 1] != '\0') {
+ if (argv[H5_optind][sp + 1] != '\0') {
/* flag value is rest of current token */
- opt_arg = &argv[opt_ind++][sp + 1];
+ H5_optarg = &argv[H5_optind++][sp + 1];
}
- else if (++opt_ind >= argc) {
- if (opt_err)
+ else if (++H5_optind >= argc) {
+ if (H5_opterr)
HDfprintf(stderr, "%s: value expected for option \"%c\"\n", argv[0], opt_opt);
opt_opt = '?';
}
else {
/* flag value is next token */
- opt_arg = argv[opt_ind++];
+ H5_optarg = argv[H5_optind++];
}
sp = 1;
}
else {
/* set up to look at next char in token, next time */
- if (argv[opt_ind][++sp] == '\0') {
+ if (argv[H5_optind][++sp] == '\0') {
/* no more in current token, so setup next token */
- opt_ind++;
+ H5_optind++;
sp = 1;
}
- opt_arg = NULL;
+ H5_optarg = NULL;
}
}
diff --git a/tools/test/perform/sio_standalone.h b/tools/test/perform/sio_standalone.h
index d0e5452..99cca75 100644
--- a/tools/test/perform/sio_standalone.h
+++ b/tools/test/perform/sio_standalone.h
@@ -10,8 +10,8 @@
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-#ifndef SIO_STANDALONE_H__
-#define SIO_PERF_H__
+#ifndef SIO_STANDALONE_H
+#define SIO_STANDALONE_H
/* Header file for building h5perf by standalone mode.
* Created: Christian Chilan, 2005/5/18.
@@ -21,10 +21,6 @@
#include "H5public.h" /* Include Public Definitions */
-/*
- * Include ANSI-C header files.
- */
-#ifdef H5_STDC_HEADERS
#include <assert.h>
#include <ctype.h>
#include <errno.h>
@@ -37,7 +33,6 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#endif
/* maximum of two, three, or four values */
#undef MAX
@@ -110,28 +105,20 @@
#define HDctermid(S) ctermid(S)
#define HDctime(T) ctime(T)
#define HDcuserid(S) cuserid(S)
-#ifdef H5_HAVE_DIFFTIME
-#define HDdifftime(X, Y) difftime(X, Y)
-#else
-#define HDdifftime(X, Y) ((double)(X) - (double)(Y))
-#endif
-#define HDdiv(X, Y) div(X, Y)
-#define HDdup(F) dup(F)
-#define HDdup2(F, I) dup2(F, I)
-/* execl() variable arguments */
-/* execle() variable arguments */
-/* execlp() variable arguments */
-#define HDexecv(S, AV) execv(S, AV)
-#define HDexecve(S, AV, E) execve(S, AV, E)
-#define HDexecvp(S, AV) execvp(S, AV)
-#define HDexit(N) exit(N)
-#define HD_exit(N) _exit(N)
-#define HDexp(X) exp(X)
-#define HDfabs(X) fabs(X)
-/* use ABS() because fabsf() fabsl() are not common yet. */
-#define HDfabsf(X) ABS(X)
-#define HDfabsl(X) ABS(X)
-#define HDfclose(F) fclose(F)
+#define HDdifftime(X, Y) difftime(X, Y)
+#define HDdiv(X, Y) div(X, Y)
+#define HDdup(F) dup(F)
+#define HDdup2(F, I) dup2(F, I)
+#define HDexecv(S, AV) execv(S, AV)
+#define HDexecve(S, AV, E) execve(S, AV, E)
+#define HDexecvp(S, AV) execvp(S, AV)
+#define HDexit(N) exit(N)
+#define HD_exit(N) _exit(N)
+#define HDexp(X) exp(X)
+#define HDfabs(X) fabs(X)
+#define HDfabsf(X) fabsf(X)
+#define HDfabsl(X) fabsl(X)
+#define HDfclose(F) fclose(F)
/* fcntl() variable arguments */
#define HDfdopen(N, S) fdopen(N, S)
#define HDfeof(F) feof(F)
@@ -157,17 +144,8 @@
#define HDfree(M) free(M)
#define HDfreopen(S, M, F) freopen(S, M, F)
#define HDfrexp(X, N) frexp(X, N)
-/* Check for Cray-specific 'frexpf()' and 'frexpl()' routines */
-#ifdef H5_HAVE_FREXPF
-#define HDfrexpf(X, N) frexpf(X, N)
-#else /* H5_HAVE_FREXPF */
-#define HDfrexpf(X, N) frexp(X, N)
-#endif /* H5_HAVE_FREXPF */
-#ifdef H5_HAVE_FREXPL
-#define HDfrexpl(X, N) frexpl(X, N)
-#else /* H5_HAVE_FREXPL */
-#define HDfrexpl(X, N) frexp(X, N)
-#endif /* H5_HAVE_FREXPL */
+#define HDfrexpf(X, N) frexpf(X, N)
+#define HDfrexpl(X, N) frexpl(X, N)
/* fscanf() variable arguments */
#ifdef H5_HAVE_FSEEKO
#define HDfseek(F, O, W) fseeko(F, O, W)
@@ -363,15 +341,9 @@ H5_DLL int HDrand(void);
#define HDsin(X) sin(X)
#define HDsinh(X) sinh(X)
#define HDsleep(N) sleep(N)
-#ifdef H5_HAVE_WIN32_API
-H5_DLL int c99_snprintf(char *str, size_t size, const char *format, ...);
-#define HDsnprintf c99_snprintf /*varargs*/
-#else
-#define HDsnprintf snprintf /*varargs*/
-#endif
-/* sprintf() variable arguments */
-#define HDsprintf sprintf /*varargs*/
-#define HDsqrt(X) sqrt(X)
+#define HDsnprintf snprintf /*varargs*/
+#define HDsprintf sprintf /*varargs*/
+#define HDsqrt(X) sqrt(X)
#ifdef H5_HAVE_RAND_R
H5_DLL void HDsrand(unsigned int seed);
#define HDsrandom(S) HDsrand(S)
@@ -382,7 +354,6 @@ H5_DLL void HDsrand(unsigned int seed);
#define HDsrand(S) srand(S)
#define HDsrandom(S) srand(S)
#endif
-/* sscanf() variable arguments */
#ifdef H5_HAVE_WIN32_API
#define HDstrcasecmp(A, B) _stricmp(A, B)
@@ -444,25 +415,20 @@ H5_DLL int64_t HDstrtoll(const char *s, const char **rest, int base);
#else
#define HDunlink(S) unlink(S)
#endif
-#define HDutime(S, T) utime(S, T)
-#define HDva_arg(A, T) va_arg(A, T)
-#define HDva_end(A) va_end(A)
-#define HDva_start(A, P) va_start(A, P)
-#define HDvasprintf(RET, FMT, A) vasprintf(RET, FMT, A)
-#define HDvfprintf(F, FMT, A) vfprintf(F, FMT, A)
-#define HDvprintf(FMT, A) vprintf(FMT, A)
-#define HDvsprintf(S, FMT, A) vsprintf(S, FMT, A)
-#ifdef H5_HAVE_WIN32_API
-H5_DLL int c99_vsnprintf(char *str, size_t size, const char *format, va_list ap);
-#define HDvsnprintf c99_vsnprintf
-#else
+#define HDutime(S, T) utime(S, T)
+#define HDva_arg(A, T) va_arg(A, T)
+#define HDva_end(A) va_end(A)
+#define HDva_start(A, P) va_start(A, P)
+#define HDvasprintf(RET, FMT, A) vasprintf(RET, FMT, A)
+#define HDvfprintf(F, FMT, A) vfprintf(F, FMT, A)
+#define HDvprintf(FMT, A) vprintf(FMT, A)
+#define HDvsprintf(S, FMT, A) vsprintf(S, FMT, A)
#define HDvsnprintf(S, N, FMT, A) vsnprintf(S, N, FMT, A)
-#endif
-#define HDwait(W) wait(W)
-#define HDwaitpid(P, W, O) waitpid(P, W, O)
-#define HDwcstombs(S, P, Z) wcstombs(S, P, Z)
-#define HDwctomb(S, C) wctomb(S, C)
-#define HDwrite(F, M, Z) write(F, M, Z)
+#define HDwait(W) wait(W)
+#define HDwaitpid(P, W, O) waitpid(P, W, O)
+#define HDwcstombs(S, P, Z) wcstombs(S, P, Z)
+#define HDwctomb(S, C) wctomb(S, C)
+#define HDwrite(F, M, Z) write(F, M, Z)
/*
* And now for a couple non-Posix functions... Watch out for systems that
@@ -490,37 +456,27 @@ extern char * strdup(const char *s);
#define TRUE true
#endif
-/** From h5test.h **/
-
-#ifdef H5_HAVE_PARALLEL
-extern MPI_Info h5_io_info_g; /* MPI INFO object for IO */
-#endif
-
-#ifdef H5_HAVE_PARALLEL
-int h5_set_info_object(void);
-void h5_dump_info_object(MPI_Info info);
-#endif
-
/** From h5tools_utils.h **/
-extern int opt_err; /* getoption prints errors if this is on */
-extern int opt_ind; /* token pointer */
-extern const char *opt_arg; /* flag argument (or value) */
+H5_DLLVAR int H5_opterr; /* getoption prints errors if this is on */
+H5_DLLVAR int H5_optind; /* token pointer */
+H5_DLLVAR const char *H5_optarg; /* flag argument (or value) */
-enum {
+enum h5_arg_level {
no_arg = 0, /* doesn't take an argument */
require_arg, /* requires an argument */
optional_arg /* argument is optional */
};
-typedef struct long_options {
- const char *name; /* name of the long option */
- int has_arg; /* whether we should look for an arg */
- char shortval; /* the shortname equivalent of long arg
- * this gets returned from get_option */
-} long_options;
+struct h5_long_options {
+ const char * name; /* Name of the long option */
+ enum h5_arg_level has_arg; /* Whether we should look for an arg */
+ char shortval; /* The shortname equivalent of long arg
+ * this gets returned from get_option
+ */
+};
-extern int get_option(int argc, const char **argv, const char *opt, const struct long_options *l_opt);
+extern int H5_get_option(int argc, const char **argv, const char *opt, const struct h5_long_options *l_opt);
extern int nCols; /*max number of columns for outputting */
diff --git a/tools/test/perform/zip_perf.c b/tools/test/perform/zip_perf.c
index 6a1e1aa..30eb06e 100644
--- a/tools/test/perform/zip_perf.c
+++ b/tools/test/perform/zip_perf.c
@@ -32,11 +32,10 @@
#define ONE_MB (ONE_KB * ONE_KB)
#define ONE_GB (ONE_MB * ONE_KB)
-#define MICROSECOND 1000000.0F
+#define MICROSECOND 1000000.0
/* report 0.0 in case t is zero too */
-#define MB_PER_SEC(bytes, t) \
- ((fabs(t) < (double)0.0000000001F) ? (double)0.0F : ((((double)bytes) / (double)ONE_MB) / (t)))
+#define MB_PER_SEC(bytes, t) ((fabs(t) < 0.0000000001) ? 0.0 : ((((double)(bytes)) / (double)ONE_MB) / (t)))
#ifndef TRUE
#define TRUE 1
@@ -65,66 +64,15 @@ static void error(const char *fmt, ...);
static void compress_buffer(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);
/* commandline options : long and short form */
-static const char * s_opts = "hB:b:c:p:rs:0123456789";
-static struct long_options l_opts[] = {{"help", no_arg, 'h'},
- {"compressability", require_arg, 'c'},
- {"compressabilit", require_arg, 'c'},
- {"compressabili", require_arg, 'c'},
- {"compressabil", require_arg, 'c'},
- {"compressabi", require_arg, 'c'},
- {"compressab", require_arg, 'c'},
- {"compressa", require_arg, 'c'},
- {"compress", require_arg, 'c'},
- {"compres", require_arg, 'c'},
- {"compre", require_arg, 'c'},
- {"compr", require_arg, 'c'},
- {"comp", require_arg, 'c'},
- {"com", require_arg, 'c'},
- {"co", require_arg, 'c'},
- {"file-size", require_arg, 's'},
- {"file-siz", require_arg, 's'},
- {"file-si", require_arg, 's'},
- {"file-s", require_arg, 's'},
- {"file", require_arg, 's'},
- {"fil", require_arg, 's'},
- {"fi", require_arg, 's'},
- {"max-buffer-size", require_arg, 'B'},
- {"max-buffer-siz", require_arg, 'B'},
- {"max-buffer-si", require_arg, 'B'},
- {"max-buffer-s", require_arg, 'B'},
- {"max-buffer", require_arg, 'B'},
- {"max-buffe", require_arg, 'B'},
- {"max-buff", require_arg, 'B'},
- {"max-buf", require_arg, 'B'},
- {"max-bu", require_arg, 'B'},
- {"max-b", require_arg, 'B'},
- {"max", require_arg, 'B'},
- {"min-buffer-size", require_arg, 'b'},
- {"min-buffer-siz", require_arg, 'b'},
- {"min-buffer-si", require_arg, 'b'},
- {"min-buffer-s", require_arg, 'b'},
- {"min-buffer", require_arg, 'b'},
- {"min-buffe", require_arg, 'b'},
- {"min-buff", require_arg, 'b'},
- {"min-buf", require_arg, 'b'},
- {"min-bu", require_arg, 'b'},
- {"min-b", require_arg, 'b'},
- {"min", require_arg, 'b'},
- {"prefix", require_arg, 'p'},
- {"prefi", require_arg, 'p'},
- {"pref", require_arg, 'p'},
- {"pre", require_arg, 'p'},
- {"pr", require_arg, 'p'},
- {"random-test", no_arg, 'r'},
- {"random-tes", no_arg, 'r'},
- {"random-te", no_arg, 'r'},
- {"random-t", no_arg, 'r'},
- {"random", no_arg, 'r'},
- {"rando", no_arg, 'r'},
- {"rand", no_arg, 'r'},
- {"ran", no_arg, 'r'},
- {"ra", no_arg, 'r'},
- {NULL, 0, '\0'}};
+static const char * s_opts = "hB:b:c:p:rs:0123456789";
+static struct h5_long_options l_opts[] = {{"help", no_arg, 'h'},
+ {"compressability", require_arg, 'c'},
+ {"file-size", require_arg, 's'},
+ {"max-buffer-size", require_arg, 'B'},
+ {"min-buffer-size", require_arg, 'b'},
+ {"prefix", require_arg, 'p'},
+ {"random-test", no_arg, 'r'},
+ {NULL, 0, '\0'}};
/*
* Function: error
@@ -155,7 +103,7 @@ error(const char *fmt, ...)
static void
cleanup(void)
{
- if (!HDgetenv("HDF5_NOCLEANUP"))
+ if (!HDgetenv(HDF5_NOCLEANUP))
HDunlink(filename);
HDfree(filename);
}
@@ -169,7 +117,7 @@ write_file(Bytef *source, uLongf sourceLen)
/* destination buffer needs to be at least 0.1% larger than sourceLen
* plus 12 bytes */
- destLen = (uLongf)((double)sourceLen + ((double)sourceLen * (double)0.1F)) + 12;
+ destLen = (uLongf)((double)sourceLen + ((double)sourceLen * 0.1)) + 12;
dest = (Bytef *)HDmalloc(destLen);
if (!dest)
@@ -179,8 +127,8 @@ write_file(Bytef *source, uLongf sourceLen)
compress_buffer(dest, &destLen, source, sourceLen);
HDgettimeofday(&timer_stop, NULL);
- compression_time += ((double)timer_stop.tv_sec + ((double)timer_stop.tv_usec) / (double)MICROSECOND) -
- ((double)timer_start.tv_sec + ((double)timer_start.tv_usec) / (double)MICROSECOND);
+ compression_time += ((double)timer_stop.tv_sec + ((double)timer_stop.tv_usec) / MICROSECOND) -
+ ((double)timer_start.tv_sec + ((double)timer_start.tv_usec) / MICROSECOND);
if (report_once_flag) {
HDfprintf(stdout, "\tCompression Ratio: %g\n", ((double)destLen) / (double)sourceLen);
@@ -448,7 +396,7 @@ do_write_test(unsigned long file_size, unsigned long min_buf_size, unsigned long
error("out of memory");
}
- compression_time = 0.0F;
+ compression_time = 0.0;
if (random_test)
fill_with_random_data(src, src_len);
@@ -552,7 +500,7 @@ main(int argc, const char *argv[])
/* Initialize h5tools lib */
h5tools_init();
- while ((opt = get_option(argc, argv, s_opts, l_opts)) > 0) {
+ while ((opt = H5_get_option(argc, argv, s_opts, l_opts)) > 0) {
switch ((char)opt) {
case '0':
case '1':
@@ -567,13 +515,13 @@ main(int argc, const char *argv[])
compress_level = opt - '0';
break;
case 'B':
- max_buf_size = parse_size_directive(opt_arg);
+ max_buf_size = parse_size_directive(H5_optarg);
break;
case 'b':
- min_buf_size = parse_size_directive(opt_arg);
+ min_buf_size = parse_size_directive(H5_optarg);
break;
case 'c':
- compress_percent = (int)HDstrtol(opt_arg, NULL, 10);
+ compress_percent = (int)HDstrtol(H5_optarg, NULL, 10);
if (compress_percent < 0)
compress_percent = 0;
@@ -582,13 +530,13 @@ main(int argc, const char *argv[])
break;
case 'p':
- option_prefix = opt_arg;
+ option_prefix = H5_optarg;
break;
case 'r':
random_test = TRUE;
break;
case 's':
- file_size = parse_size_directive(opt_arg);
+ file_size = parse_size_directive(H5_optarg);
break;
case '?':
usage();