mirror of
https://github.com/HDFGroup/hdf5.git
synced 2026-09-25 04:09:44 +03:00
Sync develop changes April 4 -April 22 to hdf5_1_14 (#4437)
* Fixed dead links in docs (#4334) * Revert "Fixed dead links in docs (#4334)" (#4335) This reverts commit408fc66002. * Fix grammar and content in HDF5Examples (#4333) * Remove HD macros for C time functions (#4337) * HDasctime * HDclock * HDctime * HDdifftime * HDgmtime * HDlocaltime * HDmktime * HDtime * HDtzset HDgettimeofday will be done later * Remove HD prefix from toupper/tolower (#4340) * Add VDS and SWMR to documentation (#4336) * Clean up random number generator code (#4338) * Clean up random number generator code Depending on the platform, we use a mix of random, rand, and rand_r to generate pseudo-random numbers, along with a messy set of ifdefs in H5private.h. We are not a cryptographic library, only use random numbers in our test code, and have no need for anything more than the C standard's (s)rand(). There's no point dithering about using rand() vs random() when we're also doing bad things like using mod to restrict the range, which introduces bias. Also removes CMake/configure checks for rand_r and random * Remove random/rand_r checks from build system * Fix missed HDrandom after GitHub merge * Remove the getting started guide (#4339) This was moved to the wiki * Remove noise comment from H5DO.c (#4342) * Add note about H5Iregister_type hash_table param (#4345) The hash_table parameter is unused in HDF5 1.8.13 and later, when we moved from using hash tables to skip lists for storing IDs. The current hash table implementation does not use this parameter. * Remove `#undef ERR` from H5private.h (#4346) This is an old work-around that is no longer necessary. The only place where we defined ERR is in h5import, and that code has been updated (in this PR) to rename ERR to INVALID_TOKEN. * Add NAMECHECK_ONLY to macro list in .clang-format (#4343) This caused H5TS.c functions to be mis-formatted * Remove HD from last non-win32 C89 functions (#4348) Removes the HD prefix from the last C89 functions with no special Windows equilvalent: * rename * rewind * setbuf * signal * tmpfile * Fix dead links cont. (#4349) Added img/images_to_copy.dox as a temporary solution because doxygen didn't copy the images used in the examples/*.html files - will investigate more. This was necessary for the links to intro_SWMR.html and intro_VDS.html. * Fix a typo (#4352) * Fix use of possibly uninitialized memory in h5repack (#4354) * Match content listing with content. (#4357) * Remove obsolete c++ doxygen config files (#4358) * Fix typo VERSIO (#4363) * Removed duplicate entries in compile line for h5* compiler wrappers (#4360) * h5fc remove duplicate args * h5 wrappers remove duplicate args * Added CVE info to RELEASE.txt (#4367) * Change doxygen version from 1.10.0 to 1.9.7 (#4371) * Fix all doxygen versions (#4377) * Change date to data in INSTALL_parallel (#4384) * Fix a broken link for zlib url (#4383) * Fix broken links and references in INSTALL_Auto.txt (#4382) * Remove signature in comment (#4366) * switched from \returns to commonly used \return (#4389) * Add CXX flags (#4359) * Remove TRACE macros (#4341) * Set available CMake build types for non-multi-config generators (#4330) * Correct the high-level library link (#4398) * Correct the high-level library link The link currently used points to 1.13 release. Changed to use the md file instead. * Update Doxyfile for md files * Update to include md files * Add additional terms to the glossary (#4401) Fixes GH #4390 * added missing doxygen \since (#4410) * Update Intel oneAPI version to 2024.1 (#4412) * Update documentation (#4403) - Added File Image Operations to Technical Notes * Use a correct example location * Use aliases for URLs (#4409) * Fix CXX sanitizer by moving marco include to after CXX code. (#4414) * Update and use more URL alias (#4413) * Update documentation (#4415) Added the replacement for https://docs.hdfgroup.org/archive/support/HDF5/doc/TechNotes/Version.html Corrected some minor typos and another deadlink * Remove obsolete file (#4416) * Update oneAPI version to 2024.1 for Daily Build (#4418) * Add training videos page (#4422) * Updates for release_docs/NEWSLETTER.txt. (#4423) * Add release process markdown file (#4312) * Lowercase in File Format Specification (#4424) * Fixing string in RELEASE_PROCESS.md that is causing a doxygen error - (#4430) Unsupported xml/html tag <n> found. * Allow clang-format to format H5Cpkg.h (#4429) Co-authored-by: Larry Knox <lrknox@hdfgroup.org> * Fix broken links in md files needing full URLs. * Add URL for Java examples that was accidentally dropped. Change paths from develop to 1.14 directories for some doxygen generated files. * Correct typo. * Fix 2 more dead URLs. * Revert "Clean up random number generator code (#4338)" This reverts commit58e4d0842a.
This commit is contained in:
+3
-1
@@ -11,7 +11,7 @@ BraceWrapping:
|
||||
BreakBeforeBraces: Stroustrup
|
||||
BreakAfterJavaFieldAnnotations: true
|
||||
BreakStringLiterals: true
|
||||
ColumnLimit: 110 # Update $max_trace_macro_line_len in bin/trace also
|
||||
ColumnLimit: 110
|
||||
IndentWidth: 4
|
||||
---
|
||||
Language: Cpp
|
||||
@@ -68,12 +68,14 @@ StatementMacros:
|
||||
- CATCH
|
||||
- END_MEMBERS
|
||||
- FUNC_ENTER_API
|
||||
- FUNC_ENTER_API_NAMECHECK_ONLY
|
||||
- FUNC_ENTER_NOAPI
|
||||
- FUNC_ENTER_NOAPI_NOERR
|
||||
- FUNC_ENTER_NOAPI_NOINIT
|
||||
- FUNC_ENTER_NOAPI_NOINIT_NOERR
|
||||
- FUNC_ENTER_PACKAGE
|
||||
- FUNC_LEAVE_API
|
||||
- FUNC_LEAVE_API_NAMECHECK_ONLY
|
||||
- FUNC_LEAVE_NOAPI
|
||||
- FUNC_LEAVE_NOAPI_NOFS
|
||||
- H5E_END_TRY
|
||||
|
||||
@@ -411,7 +411,7 @@ jobs:
|
||||
id: setup-fortran
|
||||
with:
|
||||
compiler: intel
|
||||
version: '2023.2'
|
||||
version: '2024.1'
|
||||
|
||||
- name: Enable Developer Command Prompt
|
||||
uses: ilammy/msvc-dev-cmd@v1.13.0
|
||||
@@ -510,7 +510,7 @@ jobs:
|
||||
id: setup-fortran
|
||||
with:
|
||||
compiler: intel
|
||||
version: '2023.2'
|
||||
version: '2024.1'
|
||||
|
||||
- name: Set file base name (Linux_intel)
|
||||
id: set-file-base
|
||||
|
||||
@@ -30,7 +30,7 @@ jobs:
|
||||
id: setup-fortran
|
||||
with:
|
||||
compiler: intel
|
||||
version: '2024.0'
|
||||
version: '2024.1'
|
||||
|
||||
- name: Autotools Configure
|
||||
shell: bash
|
||||
|
||||
@@ -31,7 +31,7 @@ jobs:
|
||||
id: setup-fortran
|
||||
with:
|
||||
compiler: intel
|
||||
version: '2024.0'
|
||||
version: '2024.1'
|
||||
|
||||
- name: CMake Configure (Linux)
|
||||
shell: bash
|
||||
@@ -85,7 +85,7 @@ jobs:
|
||||
id: setup-fortran
|
||||
with:
|
||||
compiler: intel
|
||||
version: '2024.0'
|
||||
version: '2024.1'
|
||||
|
||||
- name: CMake Configure (Windows)
|
||||
shell: pwsh
|
||||
|
||||
+36
-36
@@ -533,42 +533,6 @@ if (BUILD_STATIC_EXECS)
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
option (HDF5_ENABLE_ANALYZER_TOOLS "enable the use of Clang tools" OFF)
|
||||
mark_as_advanced (HDF5_ENABLE_ANALYZER_TOOLS)
|
||||
if (HDF5_ENABLE_ANALYZER_TOOLS)
|
||||
include (${HDF5_SOURCE_DIR}/config/sanitizer/tools.cmake)
|
||||
endif ()
|
||||
option (HDF5_ENABLE_SANITIZERS "execute the Clang sanitizer" OFF)
|
||||
mark_as_advanced (HDF5_ENABLE_SANITIZERS)
|
||||
if (HDF5_ENABLE_SANITIZERS)
|
||||
include (${HDF5_SOURCE_DIR}/config/sanitizer/sanitizers.cmake)
|
||||
endif ()
|
||||
option (HDF5_ENABLE_FORMATTERS "format source files" OFF)
|
||||
mark_as_advanced (HDF5_ENABLE_FORMATTERS)
|
||||
if (HDF5_ENABLE_FORMATTERS)
|
||||
include (${HDF5_SOURCE_DIR}/config/sanitizer/formatting.cmake)
|
||||
endif ()
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# Option to use code coverage
|
||||
#-----------------------------------------------------------------------------
|
||||
option (HDF5_ENABLE_COVERAGE "Enable code coverage for Libraries and Programs" OFF)
|
||||
if (HDF5_ENABLE_COVERAGE)
|
||||
include (${HDF5_SOURCE_DIR}/config/sanitizer/code-coverage.cmake)
|
||||
if(CODE_COVERAGE AND CODE_COVERAGE_ADDED)
|
||||
add_code_coverage () # Adds instrumentation to all targets
|
||||
else ()
|
||||
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 --coverage -fprofile-arcs -ftest-coverage")
|
||||
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g --coverage -O0 -fprofile-arcs -ftest-coverage")
|
||||
if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
|
||||
set (LDFLAGS "${LDFLAGS} -fprofile-arcs -ftest-coverage")
|
||||
link_libraries (gcov)
|
||||
else ()
|
||||
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage")
|
||||
endif ()
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# Option to indicate using a memory checker
|
||||
#-----------------------------------------------------------------------------
|
||||
@@ -1175,4 +1139,40 @@ if (EXISTS "${HDF5_SOURCE_DIR}/HDF5Examples" AND IS_DIRECTORY "${HDF5_SOURCE_DIR
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
option (HDF5_ENABLE_ANALYZER_TOOLS "enable the use of Clang tools" OFF)
|
||||
mark_as_advanced (HDF5_ENABLE_ANALYZER_TOOLS)
|
||||
if (HDF5_ENABLE_ANALYZER_TOOLS)
|
||||
include (${HDF5_SOURCE_DIR}/config/sanitizer/tools.cmake)
|
||||
endif ()
|
||||
option (HDF5_ENABLE_SANITIZERS "execute the Clang sanitizer" OFF)
|
||||
mark_as_advanced (HDF5_ENABLE_SANITIZERS)
|
||||
if (HDF5_ENABLE_SANITIZERS)
|
||||
include (${HDF5_SOURCE_DIR}/config/sanitizer/sanitizers.cmake)
|
||||
endif ()
|
||||
option (HDF5_ENABLE_FORMATTERS "format source files" OFF)
|
||||
mark_as_advanced (HDF5_ENABLE_FORMATTERS)
|
||||
if (HDF5_ENABLE_FORMATTERS)
|
||||
include (${HDF5_SOURCE_DIR}/config/sanitizer/formatting.cmake)
|
||||
endif ()
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# Option to use code coverage
|
||||
#-----------------------------------------------------------------------------
|
||||
option (HDF5_ENABLE_COVERAGE "Enable code coverage for Libraries and Programs" OFF)
|
||||
if (HDF5_ENABLE_COVERAGE)
|
||||
include (${HDF5_SOURCE_DIR}/config/sanitizer/code-coverage.cmake)
|
||||
if(CODE_COVERAGE AND CODE_COVERAGE_ADDED)
|
||||
add_code_coverage () # Adds instrumentation to all targets
|
||||
else ()
|
||||
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 --coverage -fprofile-arcs -ftest-coverage")
|
||||
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g --coverage -O0 -fprofile-arcs -ftest-coverage")
|
||||
if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
|
||||
set (LDFLAGS "${LDFLAGS} -fprofile-arcs -ftest-coverage")
|
||||
link_libraries (gcov)
|
||||
else ()
|
||||
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage")
|
||||
endif ()
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
include (CMakeInstallation.cmake)
|
||||
|
||||
+1
-1
@@ -122,7 +122,7 @@ Please make sure that you check the items applicable to your pull request:
|
||||
* [ ] If changes were done to Autotools build, were they added to CMake and vice versa?
|
||||
* [ ] Is the pull request applicable to any other branches? If yes, which ones? Please document it in the GitHub issue.
|
||||
* [ ] Is the new code sufficiently documented for future maintenance?
|
||||
* [ ] Does the new feature require a change to an existing API? See "API Compatibility Macros" document (https://docs.hdfgroup.org/hdf5/v1_14/api-compat-macros.html)
|
||||
* [ ] Does the new feature require a change to an existing API? See "API Compatibility Macros" document (https://hdfgroup.github.io/hdf5/v1_14/api-compat-macros.html)
|
||||
* Documentation
|
||||
* [ ] Was the change described in the release_docs/RELEASE.txt file?
|
||||
* [ ] Was the new function documented in the corresponding public header file using [Doxygen](https://hdfgroup.github.io/hdf5/v1_14/_r_m_t.html)?
|
||||
|
||||
@@ -21,15 +21,15 @@ DOCUMENTATION
|
||||
-------------
|
||||
This release is fully functional for the API described in the documentation.
|
||||
|
||||
https://docs.hdfgroup.org/hdf5/v1_14/_l_b_a_p_i.html
|
||||
[HDF5 C API](https://hdfgroup.github.io/hdf5/v1_14/_l_b_a_p_i.html)
|
||||
|
||||
Full Documentation and Programming Resources for this release can be found at
|
||||
|
||||
https://docs.hdfgroup.org/hdf5/v1_14/index.html
|
||||
[Full Documentation](https://hdfgroup.github.io/hdf5/v1_14/index.html)
|
||||
|
||||
The latest doxygen documentation generated on changes to HDF5 1.14.x is available at:
|
||||
|
||||
https://hdfgroup.github.io/hdf5/
|
||||
https://hdfgroup.github.io/hdf5/v1_14
|
||||
|
||||
See the [RELEASE.txt](release_docs/RELEASE.txt) file in the [release_docs/](release_docs/) directory for information specific
|
||||
to the features and updates included in this release of the library.
|
||||
|
||||
+2
-3
@@ -44,9 +44,8 @@ echo
|
||||
# compilation.
|
||||
|
||||
# Run trace script
|
||||
# The trace script adds H5TRACE macros to library source files. It should
|
||||
# have no effect on files that don't have HDF5 API macros in them.
|
||||
echo "Running trace script:"
|
||||
# The trace script updates H5ARG_TRACE macros in library source files.
|
||||
echo "Running arg trace script:"
|
||||
bin/trace src/H5*.c || exit 1
|
||||
echo
|
||||
|
||||
|
||||
+1
-1
@@ -21,7 +21,7 @@ Programs run via `autogen.sh` (or the equivalent in CMake) are indicated.
|
||||
|`restore.sh`|Removes files generated by `autogen.sh`|
|
||||
|`runbkprog`|Used by CMake to run test programs in the background|
|
||||
|`switch_maint_mode`|Switches maintainer mode on/off in `configure.ac`|
|
||||
|`trace`|Adds `TRACE` macros to HDF5 C library source files (run by `autogen.sh`)|
|
||||
|`trace`|Updates `H5ARG_TRACE` macros in H5ES\_insert() calls (run by `autogen.sh`)|
|
||||
|`warnhist`|Generates compiler warning statistics for gcc/clang when fed output of make|
|
||||
|
||||
## TODO
|
||||
|
||||
+1
-1
@@ -455,7 +455,7 @@ cp -p Makefile.dist Makefile
|
||||
|
||||
# Update README.md and release_docs/RELEASE.txt with release information in
|
||||
# line 1.
|
||||
for f in README.md release_docs/RELEASE.txt; do
|
||||
for f in README.md release_docs/RELEASE.txt release_docs/NEWSLETTER.txt; do
|
||||
echo "HDF5 version $VERS released on $release_date" >$f.x
|
||||
sed -e 1d $f >>$f.x
|
||||
mv $f.x $f
|
||||
|
||||
@@ -10,6 +10,12 @@
|
||||
# If you do not have access to either file, you may request a copy from
|
||||
# help@hdfgroup.org.
|
||||
##
|
||||
|
||||
##
|
||||
# Process H5ARG_TRACE() macros (defined in H5private.h) used in H5ES_insert(),
|
||||
# updating them with the caller's parameters, etc.
|
||||
##
|
||||
|
||||
require 5.003;
|
||||
use warnings;
|
||||
$Source = "";
|
||||
@@ -26,6 +32,10 @@ $Source = "";
|
||||
# Two-character strings begin with an upper-case letter which is
|
||||
# usually the same as the package name.
|
||||
#
|
||||
# These map to the types in H5trace.c (which should be updated if you add
|
||||
# a type here), so there are more types listed here than are used by the
|
||||
# existing macros.
|
||||
#
|
||||
%TypeString = ("haddr_t" => "a",
|
||||
"H5A_info_t" => "Ai",
|
||||
"H5A_operator1_t" => "Ao",
|
||||
@@ -210,294 +220,180 @@ $Source = "";
|
||||
"H5VL_request_status_t" => "#",
|
||||
);
|
||||
|
||||
|
||||
##############################################################################
|
||||
# Maximum length of H5TRACE macro line
|
||||
# If the ColumnLimit in .clang-format is changed, this value will need to be updated
|
||||
#
|
||||
my $max_trace_macro_line_len = 110;
|
||||
|
||||
|
||||
##############################################################################
|
||||
# Print an error message.
|
||||
#
|
||||
my $found_errors = 0;
|
||||
|
||||
sub errmesg ($$@) {
|
||||
my ($file, $func, @mesg) = @_;
|
||||
my ($mesg) = join "", @mesg;
|
||||
my ($lineno) = 1;
|
||||
if ($Source =~ /(.*?\n)($func)/s) {
|
||||
local $_ = $1;
|
||||
$lineno = tr/\n/\n/;
|
||||
}
|
||||
my ($file, $func, @mesg) = @_;
|
||||
my ($mesg) = join "", @mesg;
|
||||
my ($lineno) = 1;
|
||||
if ($Source =~ /(.*?\n)($func)/s) {
|
||||
local $_ = $1;
|
||||
$lineno = tr/\n/\n/;
|
||||
}
|
||||
|
||||
$found_errors = 1;
|
||||
$found_errors = 1;
|
||||
|
||||
print "$file: in function \`$func\':\n";
|
||||
print "$file:$lineno: $mesg\n";
|
||||
print "$file: in function \`$func\':\n";
|
||||
print "$file:$lineno: $mesg\n";
|
||||
}
|
||||
|
||||
##############################################################################
|
||||
# Given a C data type return the type string that goes with it.
|
||||
# Given a C data type, return the type string that goes with it
|
||||
#
|
||||
sub argstring ($$$) {
|
||||
my ($file, $func, $atype) = @_;
|
||||
my ($ptr, $tstr, $array) = (0, "!", "");
|
||||
my ($fq_atype);
|
||||
my ($file, $func, $atype) = @_;
|
||||
my ($ptr, $tstr, $array) = (0, "!", "");
|
||||
my ($fq_atype);
|
||||
|
||||
# Normalize the data type by removing redundant white space,
|
||||
# certain type qualifiers, and indirection.
|
||||
$atype =~ s/^\bconst\b//; # Leading const
|
||||
$atype =~ s/\s*const\s*//; # const after type, possibly in the middle of '*'s
|
||||
$atype =~ s/^\bstatic\b//;
|
||||
$atype =~ s/\bH5_ATTR_UNUSED\b//g;
|
||||
$atype =~ s/\bH5_ATTR_DEPRECATED_USED\b//g;
|
||||
$atype =~ s/\bH5_ATTR_NDEBUG_UNUSED\b//g;
|
||||
$atype =~ s/\bH5_ATTR_DEBUG_API_USED\b//g;
|
||||
$atype =~ s/\bH5_ATTR_PARALLEL_UNUSED\b//g;
|
||||
$atype =~ s/\bH5_ATTR_PARALLEL_USED\b//g;
|
||||
$atype =~ s/\s+/ /g;
|
||||
$ptr = length $1 if $atype =~ s/(\*+)//;
|
||||
$atype =~ s/^\s+//;
|
||||
$atype =~ s/\s+$//;
|
||||
if ($atype =~ /(.*)\[(.*)\]$/) {
|
||||
($array, $atype) = ($2, $1);
|
||||
# Normalize the data type by removing redundant white space,
|
||||
# certain type qualifiers, and indirection.
|
||||
$atype =~ s/^\bconst\b//; # Leading const
|
||||
$atype =~ s/\s*const\s*//; # const after type, possibly in the middle of '*'s
|
||||
$atype =~ s/^\bstatic\b//;
|
||||
$atype =~ s/\bH5_ATTR_UNUSED\b//g;
|
||||
$atype =~ s/\bH5_ATTR_DEPRECATED_USED\b//g;
|
||||
$atype =~ s/\bH5_ATTR_NDEBUG_UNUSED\b//g;
|
||||
$atype =~ s/\bH5_ATTR_PARALLEL_UNUSED\b//g;
|
||||
$atype =~ s/\bH5_ATTR_PARALLEL_USED\b//g;
|
||||
$atype =~ s/\s+/ /g;
|
||||
$ptr = length $1 if $atype =~ s/(\*+)//;
|
||||
$atype =~ s/^\s+//;
|
||||
$atype =~ s/\s+$//;
|
||||
}
|
||||
$fq_atype = $atype . ('*' x $ptr);
|
||||
if ($atype =~ /(.*)\[(.*)\]$/) {
|
||||
($array, $atype) = ($2, $1);
|
||||
$atype =~ s/\s+$//;
|
||||
}
|
||||
$fq_atype = $atype . ('*' x $ptr);
|
||||
|
||||
if ($ptr>0 && exists $TypeString{$fq_atype}) {
|
||||
$ptr = 0;
|
||||
$tstr = $TypeString{$fq_atype};
|
||||
} elsif ($ptr>0 && exists $TypeString{"$atype*"}) {
|
||||
--$ptr;
|
||||
$tstr = $TypeString{"$atype*"};
|
||||
} elsif (!exists $TypeString{$atype}) {
|
||||
# Defer throwing error until type is actually used
|
||||
# errmesg $file, $func, "untraceable type \`$atype", '*'x$ptr, "\'";
|
||||
} else {
|
||||
$tstr = $TypeString{$atype};
|
||||
}
|
||||
return ("*" x $ptr) . ($array ? "[$array]" : "") . $tstr;
|
||||
if ($ptr>0 && exists $TypeString{$fq_atype}) {
|
||||
$ptr = 0;
|
||||
$tstr = $TypeString{$fq_atype};
|
||||
} elsif ($ptr>0 && exists $TypeString{"$atype*"}) {
|
||||
--$ptr;
|
||||
$tstr = $TypeString{"$atype*"};
|
||||
} elsif (!exists $TypeString{$atype}) {
|
||||
# Defer throwing error until type is actually used
|
||||
# errmesg $file, $func, "untraceable type \`$atype", '*'x$ptr, "\'";
|
||||
} else {
|
||||
$tstr = $TypeString{$atype};
|
||||
}
|
||||
return ("*" x $ptr) . ($array ? "[$array]" : "") . $tstr;
|
||||
}
|
||||
|
||||
##############################################################################
|
||||
# Given information about an API function, rewrite that function with
|
||||
# updated tracing information.
|
||||
#
|
||||
my $file_api = 0;
|
||||
my $file_args = 0;
|
||||
my $total_api = 0;
|
||||
my $total_args = 0;
|
||||
sub rewrite_func ($$$$$) {
|
||||
my ($file, $type, $name, $args, $body) = @_;
|
||||
my ($arg, $trace, $argtrace);
|
||||
my (@arg_name, @arg_str, @arg_type);
|
||||
local $_;
|
||||
my ($file, $type, $name, $args, $body) = @_;
|
||||
my ($arg, $argtrace);
|
||||
my (@arg_name, @arg_str, @arg_type);
|
||||
local $_;
|
||||
|
||||
# Keep copy of original arguments
|
||||
my $orig_args = $args;
|
||||
# Keep copy of original arguments
|
||||
my $orig_args = $args;
|
||||
|
||||
# Parse return value
|
||||
my $rettype = argstring $file, $name, $type;
|
||||
# Parse arguments
|
||||
if ($args eq "void") {
|
||||
$argtrace = "H5ARG_TRACE0(\"\")";
|
||||
} else {
|
||||
# Split arguments
|
||||
#
|
||||
# First remove:
|
||||
# * /*in*/, /*out*/, /*in_out*/, and /*in,out*/ comments
|
||||
# * preprocessor lines that start with #
|
||||
# * H5FL_TRACKING_PARAMS macros (free list code only)
|
||||
#
|
||||
# then split the function arguments on commas
|
||||
$args =~ s/\/\*\s*in\s*\*\///g; # Get rid of /*in*/
|
||||
$args =~ s/\/\*\s*out\s*\*\///g; # Get rid of /*out*/
|
||||
$args =~ s/\/\*\s*in,\s*out\s*\*\///g; # Get rid of /*in,out*/
|
||||
$args =~ s/\/\*\s*in_out\s*\*\///g; # Get rid of /*in_out*/
|
||||
$args =~ s/H5FL_TRACK_PARAMS//g; # Remove free list macro
|
||||
$args =~ s/\n#.*?\n/\n/g; # Remove lines beginning with '#'
|
||||
my @args = split /,[\s\n]*/, $args;
|
||||
my $argno = 0;
|
||||
my %names;
|
||||
|
||||
# Parse arguments
|
||||
if ($args eq "void") {
|
||||
$trace = "H5TRACE0(\"$rettype\", \"\");\n";
|
||||
$argtrace = "H5ARG_TRACE0(\"\")";
|
||||
} else {
|
||||
# Split arguments
|
||||
#
|
||||
# First remove:
|
||||
# * /*in*/, /*out*/, /*in_out*/, and /*in,out*/ comments
|
||||
# * preprocessor lines that start with #
|
||||
# * H5FL_TRACKING_PARAMS macros (free list code only)
|
||||
#
|
||||
# then split the function arguments on commas
|
||||
$args =~ s/\/\*\s*in\s*\*\///g; # Get rid of /*in*/
|
||||
$args =~ s/\/\*\s*out\s*\*\///g; # Get rid of /*out*/
|
||||
$args =~ s/\/\*\s*in,\s*out\s*\*\///g; # Get rid of /*in,out*/
|
||||
$args =~ s/\/\*\s*in_out\s*\*\///g; # Get rid of /*in_out*/
|
||||
$args =~ s/H5FL_TRACK_PARAMS//g; # Remove free list macro
|
||||
$args =~ s/\n#.*?\n/\n/g; # Remove lines beginning with '#'
|
||||
my @args = split /,[\s\n]*/, $args;
|
||||
my $argno = 0;
|
||||
my %names;
|
||||
for $arg (@args) {
|
||||
if($arg=~/\w*\.{3}\w*/){ # Skip "..." for varargs parameter
|
||||
next;
|
||||
}
|
||||
unless ($arg=~/^((\s*[a-z_A-Z](\w|\*)*\s+)+(\s*\*\s*|\s*const\s*|\s*restrict\s*|\s*volatile\s*)*)
|
||||
([a-z_A-Z]\w*)(\[.*?\])?\s*$/x) {
|
||||
errmesg $file, $name, "unable to parse \`$arg\'";
|
||||
goto error;
|
||||
} else {
|
||||
my ($atype, $aname, $array, $adir) = ($1, $5, $6, $8);
|
||||
|
||||
for $arg (@args) {
|
||||
if($arg=~/\w*\.{3}\w*/){ # Skip "..." for varargs parameter
|
||||
next;
|
||||
}
|
||||
unless ($arg=~/^((\s*[a-z_A-Z](\w|\*)*\s+)+(\s*\*\s*|\s*const\s*|\s*volatile\s*)*)
|
||||
([a-z_A-Z]\w*)(\[.*?\])?\s*$/x) {
|
||||
errmesg $file, $name, "unable to parse \`$arg\'";
|
||||
goto error;
|
||||
} else {
|
||||
my ($atype, $aname, $array, $adir) = ($1, $5, $6, $8);
|
||||
$names{$aname} = $argno++;
|
||||
$adir ||= "in";
|
||||
$atype =~ s/\s+$//;
|
||||
push @arg_name, $aname;
|
||||
push @arg_type, $atype;
|
||||
$names{$aname} = $argno++;
|
||||
$adir ||= "in";
|
||||
$atype =~ s/\s+$//;
|
||||
push @arg_name, $aname;
|
||||
push @arg_type, $atype;
|
||||
|
||||
if ($adir eq "out") {
|
||||
push @arg_str, "x";
|
||||
} else {
|
||||
if (defined $array) {
|
||||
$atype .= "*";
|
||||
if ($array =~ /^\[\/\*([a-z_A-Z]\w*)\*\/\]$/) {
|
||||
my $asize = $1;
|
||||
if (exists $names{$asize}) {
|
||||
$atype .= '[a' . $names{$asize} . ']';
|
||||
} else {
|
||||
warn "bad array size: $asize";
|
||||
$atype .= "*";
|
||||
}
|
||||
if ($adir eq "out") {
|
||||
push @arg_str, "x";
|
||||
} else {
|
||||
if (defined $array) {
|
||||
$atype .= "*";
|
||||
if ($array =~ /^\[\/\*([a-z_A-Z]\w*)\*\/\]$/) {
|
||||
my $asize = $1;
|
||||
|
||||
if (exists $names{$asize}) {
|
||||
$atype .= '[a' . $names{$asize} . ']';
|
||||
} else {
|
||||
warn "bad array size: $asize";
|
||||
$atype .= "*";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
push @arg_str, argstring $file, $name, $atype;
|
||||
}
|
||||
}
|
||||
}
|
||||
push @arg_str, argstring $file, $name, $atype;
|
||||
}
|
||||
}
|
||||
|
||||
# Compose the trace macro
|
||||
$argtrace = "H5ARG_TRACE" . scalar(@arg_str) . "(__func__, \"";
|
||||
$argtrace .= join("", @arg_str) . "\"";
|
||||
|
||||
# Append arguments
|
||||
for my $i (0 .. $#arg_name) {
|
||||
$argtrace .= ", $arg_name[$i]";
|
||||
}
|
||||
|
||||
# Append final ')' for macro
|
||||
$argtrace .= ")";
|
||||
}
|
||||
|
||||
# Compose the trace macro
|
||||
$trace = "H5TRACE" . scalar(@arg_str) . "(\"$rettype\", \"";
|
||||
$argtrace = "H5ARG_TRACE" . scalar(@arg_str) . "(__func__, \"";
|
||||
$trace .= join("", @arg_str) . "\"";
|
||||
$argtrace .= join("", @arg_str) . "\"";
|
||||
# Check for H5ARG_TRACE macros to update
|
||||
if ( $body =~ /H5ARG_TRACE/ ) {
|
||||
my $orig_body = $body;
|
||||
|
||||
# Add 4 for indenting the line
|
||||
my $len = 4 + length($trace);
|
||||
|
||||
for my $i (0 .. $#arg_name) {
|
||||
# Handle wrapping
|
||||
|
||||
# Be VERY careful here! clang-format and this script MUST agree
|
||||
# on which lines get wrapped or there will be churn as each tries
|
||||
# to undo the other's output.
|
||||
#
|
||||
# TWO cases must be handled:
|
||||
# 1) The argument is that last one and ');' will be appended
|
||||
# 2) The argument is NOT the last one and ',' will be appended
|
||||
#
|
||||
# NB: clang-format does NOT consider terminal newlines when
|
||||
# counting columns for the ColumnLimit
|
||||
#
|
||||
# The extra '2' added after $len includes the ', ' that would be
|
||||
# added BEFORE the argument.
|
||||
#
|
||||
my $adjust = ($i + 1 == scalar(@arg_str)) ? 2 : 1;
|
||||
my $len_if_added = $len + 2 + length($arg_name[$i]) + $adjust;
|
||||
|
||||
# Wrap lines that will be longer than the limit
|
||||
if ($len_if_added > $max_trace_macro_line_len) {
|
||||
# Wrap line, with indentation
|
||||
$trace .= ",\n ";
|
||||
$len = 13; # Set to 13, for indentation
|
||||
|
||||
# Indent an extra space to account for extra digit in 'H5TRACE' macro
|
||||
if (scalar(@arg_str) >= 10) {
|
||||
$trace .= " ";
|
||||
$len++;
|
||||
# Check for untraceable type (deferred until $argtrace used)
|
||||
if ( $argtrace =~ /(^!)|([^*]!)/ ) {
|
||||
errmesg $file, $name, "untraceable type in args";
|
||||
print "args = '$orig_args'\n";
|
||||
goto error;
|
||||
}
|
||||
} else {
|
||||
$trace .= ", ";
|
||||
$len += 2; # Add 2, for ', '
|
||||
}
|
||||
|
||||
# Append argument
|
||||
$trace .= "$arg_name[$i]";
|
||||
$argtrace .= ", $arg_name[$i]";
|
||||
# Update H5ARG_TRACE macro
|
||||
$body =~ s/(H5ARG_TRACE(\d+\s*\(.*?\))?)/"$argtrace"/esg;
|
||||
|
||||
# Add length of appended argument name
|
||||
$len += length($arg_name[$i]);
|
||||
# Increment # of non-API routines modified if anything changed
|
||||
if ($orig_body ne $body) {
|
||||
$file_args++;
|
||||
}
|
||||
}
|
||||
|
||||
# Append final ');' for macro
|
||||
$trace .= ");\n";
|
||||
$argtrace .= ")";
|
||||
}
|
||||
|
||||
# Check for API / non-API routine name
|
||||
if( $name =~ /H5[A-Z]{0,2}[a-z].*/) {
|
||||
# The H5TRACE() statement, for API routines
|
||||
if ($body =~ /\/\*[ \t]*NO[ \t]*TRACE[ \t]*\*\//) {
|
||||
# Ignored due to NO TRACE comment.
|
||||
} else {
|
||||
# Check for known, but unsupported type
|
||||
if ( $trace =~ /(^#)|([^*]#)/ ) {
|
||||
# Check for unsupported return type
|
||||
if ( $type =~ /(^#)|([^*]#)/ ) {
|
||||
errmesg $file, $name, "unsupported type in return type\nAdd to TypeString hash in trace script and update H5_trace_args()";
|
||||
print "type = '$type'\n";
|
||||
}
|
||||
|
||||
# Check for unsupported argument type
|
||||
$index = 0;
|
||||
for (@arg_str) {
|
||||
if ( $_ =~ /(^#)|([^*]#)/ ) {
|
||||
errmesg $file, $name, "unsupported type in args\nAdd to TypeString hash in trace script and update H5_trace_args()";
|
||||
print "type = $arg_type[$index]\n";
|
||||
}
|
||||
$index++;
|
||||
}
|
||||
goto error;
|
||||
}
|
||||
|
||||
# Check for unknown (and therefore unsupported) type
|
||||
if ( $trace =~ /(^!)|([^*]!)/ ) {
|
||||
# Check for unsupported return type
|
||||
if ( $type =~ /(^!)|([^*]!)/ ) {
|
||||
errmesg $file, $name, "unknown type in return type\nAdd to TypeString hash in trace script and also update H5_trace_args() if used by value";
|
||||
print "type = '$type'\n";
|
||||
}
|
||||
|
||||
# Check for unsupported argument type
|
||||
$index = 0;
|
||||
for (@arg_str) {
|
||||
if ( $_ =~ /(^!)|([^*]!)/ ) {
|
||||
errmesg $file, $name, "unknown type in args\nAdd to TypeString hash in trace script and also update H5_trace_args() if used by value";
|
||||
print "type = $arg_type[$index]\n";
|
||||
}
|
||||
$index++;
|
||||
}
|
||||
goto error;
|
||||
}
|
||||
|
||||
if ($body =~ s/((\n[ \t]*)H5TRACE\d+\s*\(.*?\);)\n/"$2$trace"/es) {
|
||||
# Replaced an H5TRACE macro.
|
||||
} elsif ($body=~s/((\n[ \t]*)FUNC_ENTER\w*[ \t]*(\(.*?\))?;??)\n/"$1$2$trace"/es) {
|
||||
# Added an H5TRACE macro after a FUNC_ENTER macro.
|
||||
} else {
|
||||
errmesg $file, $name, "unable to insert tracing information";
|
||||
print "body = ", $body, "\n";
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
#Increment # of API routines modified
|
||||
$file_api++;
|
||||
}
|
||||
|
||||
# Check for H5ARG_TRACE macros in non-API routines
|
||||
if ( $body =~ /H5ARG_TRACE/ ) {
|
||||
# Check for untraceable type (deferred until $argtrace used)
|
||||
if ( $argtrace =~ /(^!)|([^*]!)/ ) {
|
||||
errmesg $file, $name, "untraceable type in args";
|
||||
print "args = '$orig_args'\n";
|
||||
goto error;
|
||||
}
|
||||
|
||||
# Replace / update H5ARG_TRACE macro.
|
||||
$body =~ s/(H5ARG_TRACE(\d+\s*\(.*?\))?)/"$argtrace"/esg;
|
||||
|
||||
#Increment # of non-API routines modified
|
||||
$file_args++;
|
||||
}
|
||||
|
||||
error:
|
||||
return "\n$type\n$name($orig_args)\n$body";
|
||||
error:
|
||||
return "\n$type\n$name($orig_args)\n$body";
|
||||
}
|
||||
|
||||
##############################################################################
|
||||
@@ -505,41 +401,38 @@ sub rewrite_func ($$$$$) {
|
||||
# tracing information.
|
||||
#
|
||||
for $file (@ARGV) {
|
||||
$file_api = 0;
|
||||
$file_args = 0;
|
||||
$file_args = 0;
|
||||
|
||||
# Ignore some files that do not need tracing macros
|
||||
unless ($file eq "H5FDmulti.c" or $file eq "src/H5FDmulti.c" or $file eq "H5FDstdio.c" or $file eq "src/H5FDstdio.c" or $file eq "src/H5TS.c" or $file eq "src/H5FDperform.c") {
|
||||
# Ignore the "external" source files that don't include H5private.h
|
||||
unless ($file eq "H5FDmulti.c" or $file eq "src/H5FDmulti.c" or $file eq "H5FDstdio.c" or $file eq "src/H5FDstdio.c") {
|
||||
|
||||
# Snarf up the entire file
|
||||
open SOURCE, $file or die "$file: $!\n";
|
||||
$Source = join "", <SOURCE>;
|
||||
close SOURCE;
|
||||
# Snarf up the entire file
|
||||
open SOURCE, $file or die "$file: $!\n";
|
||||
$Source = join "", <SOURCE>;
|
||||
close SOURCE;
|
||||
|
||||
# Make a copy of the original data
|
||||
my $original = $Source;
|
||||
# Make a copy of the original data
|
||||
my $original = $Source;
|
||||
|
||||
# Make modifications
|
||||
$Source =~ s/\n([A-Za-z]\w*(\s+[A-Za-z]\w*)*\s*\**)\n #type
|
||||
(H5[A-Z]{0,2}_?[a-zA-Z0-9_]\w*) #name
|
||||
\s*\((.*?)\)\s* #args
|
||||
(\{.*?\n\}[^\n]*) #body
|
||||
/rewrite_func($file,$1,$3,$4,$5)/segx;
|
||||
# Make modifications
|
||||
$Source =~ s/\n([A-Za-z]\w*(\s+[A-Za-z]\w*)*\s*\**)\n #type
|
||||
(H5[A-Z]{0,2}_?[a-zA-Z0-9_]\w*) #name
|
||||
\s*\((.*?)\)\s* #args
|
||||
(\{.*?\n\}[^\n]*) #body
|
||||
/rewrite_func($file,$1,$3,$4,$5)/segx;
|
||||
|
||||
# If the source changed then print out the new version
|
||||
if ($original ne $Source) {
|
||||
printf "%s: instrumented %d API function%s and %d argument list%s\n",
|
||||
$file, $file_api, (1 == $file_api ? "" : "s"),
|
||||
$file_args, (1 == $file_args ? "" : "s");
|
||||
rename $file, "$file~" or die "unable to make backup";
|
||||
open SOURCE, ">$file" or die "unable to modify source";
|
||||
print SOURCE $Source;
|
||||
close SOURCE;
|
||||
# If the source changed then print out the new version
|
||||
if ($original ne $Source) {
|
||||
printf "%s: Instrumented %d argument list%s\n",
|
||||
$file, $file_args, (1 == $file_args ? "" : "s");
|
||||
rename $file, "$file~" or die "unable to make backup";
|
||||
open SOURCE, ">$file" or die "unable to modify source";
|
||||
print SOURCE $Source;
|
||||
close SOURCE;
|
||||
|
||||
$total_api += $file_api;
|
||||
$total_args += $file_args;
|
||||
$total_args += $file_args;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($found_errors eq 1) {
|
||||
@@ -549,9 +442,8 @@ if ($found_errors eq 1) {
|
||||
printf "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n";
|
||||
exit 1;
|
||||
} else {
|
||||
printf "Finished processing HDF5 API calls:\n";
|
||||
printf "\tinstrumented %d API function%s and %d argument list%s\n",
|
||||
$total_api, (1 == $total_api ? "" : "s"),
|
||||
printf "Finished processing H5ES_insert() calls:\n";
|
||||
printf "\tInstrumented %d argument list%s\n",
|
||||
$total_args, (1 == $total_args ? "" : "s");
|
||||
}
|
||||
|
||||
|
||||
@@ -79,6 +79,9 @@ macro (SET_HDF_BUILD_TYPE)
|
||||
else ()
|
||||
set (HDF_CFG_NAME "Release")
|
||||
endif ()
|
||||
# Set available build types for cmake-gui/ccmake convenience
|
||||
set_property (CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
|
||||
"Debug" "Release" "RelWithDebInfo" "MinSizeRel" "Developer")
|
||||
endif ()
|
||||
endmacro ()
|
||||
|
||||
|
||||
@@ -43,11 +43,17 @@ function(test_san_flags return_var flags)
|
||||
set(FLAGS_BACKUP ${CMAKE_REQUIRED_FLAGS})
|
||||
set(CMAKE_REQUIRED_FLAGS "${flags}")
|
||||
check_c_source_compiles("int main() { return 0; }" ${return_var})
|
||||
if(CMAKE_CXX_COMPILER_LOADED)
|
||||
check_cxx_source_compiles("int main() { return 0; }" ${return_var})
|
||||
endif()
|
||||
set(CMAKE_REQUIRED_FLAGS "${FLAGS_BACKUP}")
|
||||
set(CMAKE_REQUIRED_QUIET "${QUIET_BACKUP}")
|
||||
endfunction()
|
||||
|
||||
message(STATUS "USE_SANITIZER=${USE_SANITIZER}, CMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID}")
|
||||
if(CMAKE_CXX_COMPILER_LOADED)
|
||||
message(STATUS "... CMAKE_CXX_COMPILER_ID=${CMAKE_CXX_COMPILER_ID}")
|
||||
endif()
|
||||
if(USE_SANITIZER)
|
||||
if(CMAKE_C_COMPILER_ID MATCHES "IntelLLVM" OR CMAKE_C_COMPILER_ID MATCHES "[Cc]lang")
|
||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||
@@ -79,9 +85,15 @@ if(USE_SANITIZER)
|
||||
|
||||
if(AFL)
|
||||
append_quoteless(AFL_USE_ASAN=1 CMAKE_C_COMPILER_LAUNCHER)
|
||||
if (CMAKE_CXX_COMPILER_LOADED)
|
||||
append_quoteless(AFL_USE_ASAN=1 CMAKE_CXX_COMPILER_LAUNCHER)
|
||||
endif ()
|
||||
endif()
|
||||
else()
|
||||
message(FATAL_ERROR "Address sanitizer not available for ${CMAKE_C_COMPILER}")
|
||||
if (CMAKE_CXX_COMPILER_LOADED)
|
||||
message(FATAL_ERROR "Address sanitizer not available for ${CMAKE_CXX_COMPILER}")
|
||||
endif ()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
@@ -104,9 +116,15 @@ if(USE_SANITIZER)
|
||||
|
||||
if(AFL)
|
||||
append_quoteless(AFL_USE_MSAN=1 CMAKE_C_COMPILER_LAUNCHER)
|
||||
if (CMAKE_CXX_COMPILER_LOADED)
|
||||
append_quoteless(AFL_USE_MSAN=1 CMAKE_CXX_COMPILER_LAUNCHER)
|
||||
endif ()
|
||||
endif()
|
||||
else()
|
||||
message(FATAL_ERROR "Memory [With Origins] sanitizer not available for ${CMAKE_C_COMPILER}")
|
||||
if (CMAKE_CXX_COMPILER_LOADED)
|
||||
message(FATAL_ERROR "Memory [With Origins] sanitizer not available for ${CMAKE_CXX_COMPILER}")
|
||||
endif ()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
@@ -123,9 +141,15 @@ if(USE_SANITIZER)
|
||||
|
||||
if(AFL)
|
||||
append_quoteless(AFL_USE_UBSAN=1 CMAKE_C_COMPILER_LAUNCHER)
|
||||
if (CMAKE_CXX_COMPILER_LOADED)
|
||||
append_quoteless(AFL_USE_UBSAN=1 CMAKE_CXX_COMPILER_LAUNCHER)
|
||||
endif ()
|
||||
endif()
|
||||
else()
|
||||
message(FATAL_ERROR "Undefined Behaviour sanitizer not available for ${CMAKE_C_COMPILER}")
|
||||
if (CMAKE_CXX_COMPILER_LOADED)
|
||||
message(FATAL_ERROR "Undefined Behaviour sanitizer not available for ${CMAKE_CXX_COMPILER}")
|
||||
endif ()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
@@ -139,9 +163,15 @@ if(USE_SANITIZER)
|
||||
|
||||
if(AFL)
|
||||
append_quoteless(AFL_USE_TSAN=1 CMAKE_C_COMPILER_LAUNCHER)
|
||||
if (CMAKE_CXX_COMPILER_LOADED)
|
||||
append_quoteless(AFL_USE_TSAN=1 CMAKE_CXX_COMPILER_LAUNCHER)
|
||||
endif ()
|
||||
endif()
|
||||
else()
|
||||
message(FATAL_ERROR "Thread sanitizer not available for ${CMAKE_C_COMPILER}")
|
||||
if (CMAKE_CXX_COMPILER_LOADED)
|
||||
message(FATAL_ERROR "Thread sanitizer not available for ${CMAKE_CXX_COMPILER}")
|
||||
endif ()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
@@ -155,9 +185,15 @@ if(USE_SANITIZER)
|
||||
|
||||
if(AFL)
|
||||
append_quoteless(AFL_USE_LSAN=1 CMAKE_C_COMPILER_LAUNCHER)
|
||||
if (CMAKE_CXX_COMPILER_LOADED)
|
||||
append_quoteless(AFL_USE_LSAN=1 CMAKE_CXX_COMPILER_LAUNCHER)
|
||||
endif ()
|
||||
endif()
|
||||
else()
|
||||
message(FATAL_ERROR "Thread sanitizer not available for ${CMAKE_C_COMPILER}")
|
||||
if (CMAKE_CXX_COMPILER_LOADED)
|
||||
message(FATAL_ERROR "Thread sanitizer not available for ${CMAKE_CXX_COMPILER}")
|
||||
endif ()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
@@ -171,9 +207,15 @@ if(USE_SANITIZER)
|
||||
|
||||
if(AFL)
|
||||
append_quoteless(AFL_USE_CFISAN=1 CMAKE_C_COMPILER_LAUNCHER)
|
||||
if (CMAKE_CXX_COMPILER_LOADED)
|
||||
append_quoteless(AFL_USE_CFISAN=1 CMAKE_CXX_COMPILER_LAUNCHER)
|
||||
endif ()
|
||||
endif()
|
||||
else()
|
||||
message(FATAL_ERROR "Control Flow Integrity(CFI) sanitizer not available for ${CMAKE_C_COMPILER}")
|
||||
if (CMAKE_CXX_COMPILER_LOADED)
|
||||
message(FATAL_ERROR "Control Flow Integrity(CFI) sanitizer not available for ${CMAKE_CXX_COMPILER}")
|
||||
endif ()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
@@ -198,6 +240,9 @@ if(USE_SANITIZER)
|
||||
|
||||
if(AFL)
|
||||
append_quoteless(AFL_USE_ASAN=1 CMAKE_C_COMPILER_LAUNCHER)
|
||||
if (CMAKE_CXX_COMPILER_LOADED)
|
||||
append_quoteless(AFL_USE_ASAN=1 CMAKE_CXX_COMPILER_LAUNCHER)
|
||||
endif ()
|
||||
endif()
|
||||
else()
|
||||
message(FATAL_ERROR "This sanitizer not yet supported in the MSVC environment: ${USE_SANITIZER}")
|
||||
|
||||
@@ -9,6 +9,7 @@ if(WIN32)
|
||||
else()
|
||||
set (CMAKE_C_COMPILER clang)
|
||||
set (CMAKE_CXX_COMPILER clang++)
|
||||
#set (CMAKE_Fortran_COMPILER flang-new)
|
||||
endif()
|
||||
set (CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||
|
||||
|
||||
@@ -1,866 +0,0 @@
|
||||
# Getting Started with HDF5 Development
|
||||
|
||||
## Introduction
|
||||
|
||||
The purpose of this document is to introduce new HDF5 developers to some of the
|
||||
quirks of our source code. It's not a style guide (see the forthcoming HDF5
|
||||
style guide for that), but instead describes the most commonly encountered
|
||||
features that are likely to trip up someone who has never worked with the HDF5
|
||||
source code before.
|
||||
|
||||
Corrections and suggestions for improvement should be handled via GitHub pull
|
||||
requests and issues.
|
||||
|
||||
## Getting started
|
||||
|
||||
### Building the library for development
|
||||
|
||||
You don't really need special configuration settings for building the library
|
||||
as a developer.
|
||||
|
||||
Some tips that may be useful:
|
||||
|
||||
* Building in debug mode will turn on additional checks in many packages.
|
||||
You'll probably want to start coding in debug mode.
|
||||
* You can turn symbols on independently of debug/production mode.
|
||||
* If you will be looking at memory issues via tools like valgrind, you will
|
||||
need to turn off the free lists, which recycle memory so we can avoid
|
||||
calling malloc/free. This is done using the `--enable-using-memchecker`
|
||||
configure option. Some developers build with this all the time, as the
|
||||
memory recyclilng can hide problems like use-after-free.
|
||||
* You can enable developer warnings via `--enable-developer-warnings`. These
|
||||
warnings generate a lot of noise, but the output can occasionally be useful.
|
||||
I probably wouldn't turn them on all the time, though, as they can make it
|
||||
harder to spot warnings that we care about.
|
||||
* You can set warnings as errors. We have an older scheme that does this for
|
||||
a subset of errors or you can simply specify `-Werror`, etc. as a part of
|
||||
`CFLAGS`. Configure is smart enough to strip it out when it runs configure
|
||||
checks. We build the C library with -Werror on GitHub, so you'll need to fix
|
||||
your warnings before creating a pull request.
|
||||
* CMake has a developer mode that turns most these settings on.
|
||||
|
||||
|
||||
### Branches
|
||||
|
||||
Please see `doc/branches-explained.md` for an explanation of our branching strategy.
|
||||
|
||||
For new small features, we have developers create feature branches in their own
|
||||
repositories and then create pull requests into the canonical HDF5 repository.
|
||||
For larger work, especially when the work will be done by multiple people, we
|
||||
create feature branches named `feature/<feature>`. If work stops on a feature
|
||||
branch, we rename it to `inactive/<feature>`.
|
||||
|
||||
If you create a feature branch in the canonical HDFGroup repository, please
|
||||
create a `BRANCH.md` text file in the repository root and explain:
|
||||
|
||||
* The branch's purpose
|
||||
* Contact info for someone who can tell us about the branch
|
||||
* Clues about when the branch will be merged or can be considered for retirement
|
||||
|
||||
The purpose of this document is to avoid orphan branches with no clear
|
||||
provenance.
|
||||
|
||||
|
||||
### Pull requests
|
||||
|
||||
The process of creating a pull request is explained in `CONTRIBUTING.md`.
|
||||
|
||||
|
||||
## A brief tour of the source code
|
||||
|
||||
Here's a quick guide to where you can find things in our source tree. Some of these directories have README.md files of their own.
|
||||
|
||||
`bin/`
|
||||
Scripts we use for building the software and misc. tools.
|
||||
|
||||
`c++/`
|
||||
Source, tests, and examples for the C++ language wrapper.
|
||||
|
||||
`config/`
|
||||
Configuration files for both the Autotools and CMake.
|
||||
|
||||
`doc/`
|
||||
Miscellaneous documents, mostly in markdown format.
|
||||
|
||||
`doxygen/`
|
||||
Mainly Doxygen build files and other top-level Doxygen things. The Doxygen content is spread across the library's header files but some content can be found here when it has no other obvious home.
|
||||
|
||||
`examples/`
|
||||
C library examples. Fortran and C++ examples are located in their corresponding wrapper directory.
|
||||
|
||||
`fortran/`
|
||||
Source, tests, and examples for the Fortran language wrapper.
|
||||
|
||||
`hl/`
|
||||
Source, tests, and examples for the high-level library.
|
||||
|
||||
`java/`
|
||||
Source, tests, and examples for the JNI language wrapper and the corresponding OO Java library.
|
||||
|
||||
`m4/`
|
||||
m4 build scripts used by the Autotools. CMake ignores these.
|
||||
|
||||
`release_docs/`
|
||||
Install instructions and release notes.
|
||||
|
||||
`src/`
|
||||
Source code for the C library.
|
||||
|
||||
`test/`
|
||||
C library test code. Described in much more detail below.
|
||||
|
||||
`testpar/`
|
||||
Parallel C library test code. Described in much more detail below.
|
||||
|
||||
`tools/`
|
||||
HDF5 command-line tools code, associated tools tests, and the input test files.
|
||||
|
||||
`utils/`
|
||||
Small utility programs that don't belong anywhere else.
|
||||
|
||||
|
||||
## General Things
|
||||
|
||||
### Necessary software
|
||||
|
||||
In order to do development work on the HDF5 library, you will need to have
|
||||
a few things available.
|
||||
|
||||
* A C99-compatible C compiler (MSVC counts). C11 is required to build the subfiling feature.
|
||||
* Either CMake or the Autotools (Autoconf, Automake, libtool)
|
||||
* Perl is needed to run some scripts, even on Windows
|
||||
* A C++11-compatible compiler if you want to build the C++ wrappers
|
||||
* A Fortran 2003-compatible compiler if you want to build the Fortran wrappers
|
||||
* A Java 8-compatible compiler if you want to build the Java wrappers
|
||||
* flex/lex and bison/yacc if you want to modify the high-level parsers
|
||||
* A development version of zlib is necessary for zlib compression
|
||||
* A development version of szip is necessary for szip compression
|
||||
* An MPI-3 compatible MPI library must be installed for parallel HDF5 development
|
||||
* clang-format is handy for formatting your code before submission to GitHub. The formatter will automatically update your PR if it's mis-formatted, though, so this isn't strictly necessary.
|
||||
* codespell is useful to identify spelling issues before submission to GitHub. The codespell action won't automatically correct your code, but it will point out spelling errors, so this also isn't strictly necessary.
|
||||
|
||||
These are the requirements for working on the develop branch. Maintenance
|
||||
branches may relax the required versions somewhat. For example, HDF5 1.12 and
|
||||
earlier only require C++98.
|
||||
|
||||
Certain optional features may require additional libraries to be installed. You'll need curl and some S3 components installed to build the read-only S3 VFD, for example.
|
||||
|
||||
### Platform-independence
|
||||
|
||||
HDF5 assumes you have a C99 compiler and, to a certain extent, a POSIX-like
|
||||
environment (other languages will be discussed later). On most operating systems
|
||||
in common use, this will be a reasonable assumption. The biggest exception to
|
||||
this has been Windows, which, until recently, had poor C99 compliance and spotty
|
||||
POSIX functionality. To work around differences in platforms and compilers,
|
||||
we've implemented a compatibility scheme.
|
||||
|
||||
Unlike most codebases, which test for features and inject their own normal-looking
|
||||
functions when there are deficiencies, HDF5 uses a scheme where we prefix all
|
||||
C and POSIX calls with `HD` (e.g., `HDmalloc`). The `H5private.h` header handles
|
||||
most of the fixup for Unix-like operating systems and defines the HD replacements.
|
||||
For Windows, we first parse the `H5win32defs.h` file, which maps missing Windows
|
||||
and MSVC functionality to POSIX and C99 calls. `H5private.h` tests for previously
|
||||
defined HD calls and skips redefining it if it already exists. H5system.c
|
||||
includes Windows glue code as well as a few functions we need to paper over
|
||||
differences in Unix-like systems.
|
||||
|
||||
One thing to keep in mind when looking at our platform-independence layer is
|
||||
that it is quite old, having been authored when the Unix world was much more
|
||||
fragmented and C99 was uncommon. We've slowly been reworking it as POSIX has
|
||||
standardized and C99 become widespread.
|
||||
|
||||
Another thing to keep in mind is that we're fairly conservative about deprecating
|
||||
support for older platforms and compilers. There's an awful lot of ancient
|
||||
hardware that requires HDF5, so we try to only make major changes to things
|
||||
like language requirements when we increment the major version (minor version
|
||||
prior to HDF5 2.0).
|
||||
|
||||
### C99
|
||||
|
||||
We assume you have a C99 compiler. Subfiling uses some C11 features, but that is
|
||||
compiled on demand and we are not moving that requirement to the rest of the
|
||||
library. All modern compilers we've tested can handle HDF5's C99 requirements,
|
||||
even Microsoft's. In the future, we'll remove the `HD` prefixes from all standard
|
||||
C library calls.
|
||||
|
||||
One quirk of HDF5's age, is the `hbool_t` type, which was created before C99
|
||||
Booleans were widespread and which uses `TRUE` and `FALSE` macros for its values
|
||||
instead of C99's `true` and `false`. We plan to switch this over to C99's Boolean
|
||||
types sometime in the near future.
|
||||
|
||||
### POSIX
|
||||
|
||||
We assume basic POSIX.1-2008 functionality is present. When a POSIX (or common Unix)
|
||||
function is missing on a popular platform, we implement a shim or macro
|
||||
in `H5private.h` and/or `H5system.c`. Systems that need a lot of help, like
|
||||
Windows, have gotten special headers in the past (e.g., `H5win32defs.h`) but
|
||||
now that most platforms implement the POSIX and C99 functionality we need, these
|
||||
special headers are less necessary.
|
||||
|
||||
### Threads
|
||||
|
||||
Thread-safety was originally implemented using Pthreads, with Win32 support
|
||||
bolted on later. No other thread libraries are supported. The subfiling
|
||||
feature uses multiple threads under the hood, but that's out of scope for
|
||||
an introductory document. Thread-related code is largely confined to the `H5TS`
|
||||
files, where we define HDF5-specific primitives and then map Pthread or Win32
|
||||
implementations onto them.
|
||||
|
||||
### C++
|
||||
|
||||
The C++ Wrappers require C++11. We generally only require the rule of three
|
||||
for the classes.
|
||||
|
||||
### Fortran
|
||||
|
||||
The Fortran wrappers require Fortran 2003.
|
||||
|
||||
### Java
|
||||
|
||||
The Java wrappers require Java 8.
|
||||
|
||||
### Warning suppression
|
||||
|
||||
In the rare cases where we've decided to suppress a warning, we have a set
|
||||
of function-like macros that we use for that. They are located in `H5private.h`
|
||||
and have the form `H5_<compiler>_DIAG_(OFF|ON)` and take the name of the warning
|
||||
they are suppressing as a parameter. They were originally designed for gcc and
|
||||
extended to clang. They have not been updated for other compilers. Instead,
|
||||
we have plans to revamp the macro system to be more generic and extensible.
|
||||
|
||||
We try to configure the compilers we use the most for maximum grumpiness and
|
||||
then fix all the warnings we can. Please don't use the warning suppression
|
||||
macros in lieu of actually fixing the underlying problems.
|
||||
|
||||
## Build Systems
|
||||
|
||||
We support building the library with both the Autotools and CMake. We'd like to
|
||||
eventually move to only having one build system, which would be CMake since
|
||||
the Autotools don't really support Windows, but that seems unlikely to happen
|
||||
anytime soon. With few exceptions, any new feature, test, or configure
|
||||
option should be supported in both build systems.
|
||||
|
||||
The particulars of the build systems can be found in the `config` directory
|
||||
and its subdirectories.
|
||||
|
||||
## Working in the library
|
||||
|
||||
### Anatomy of an HDF5 API call
|
||||
|
||||
HDF5 API calls have a uniform structure imposed by our function enter/leave and
|
||||
error handling schemes. We currently stick to this boilerplate for ALL
|
||||
functions, though this may change in the future. The general boilerplate varies
|
||||
slightly between internal and public API calls.
|
||||
|
||||
Here's an example of an internal API call:
|
||||
|
||||
```c
|
||||
/*
|
||||
* Function comments of dubious value
|
||||
*/
|
||||
herr_t
|
||||
H5X_do_stuff(/*parameters*/)
|
||||
{
|
||||
/* variables go here */
|
||||
void *foo = NULL;
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
FUNC_ENTER_NOAPI(FAIL)
|
||||
|
||||
HDassert(/*parameter check*/);
|
||||
|
||||
if (H5X_other_call() < 0)
|
||||
HGOTO_ERROR(H5E_MAJ, H5E_MIN, FAIL, "badness");
|
||||
|
||||
done:
|
||||
if (ret_value < 0)
|
||||
/* do error cleanup */
|
||||
/* do regular cleanup stuff */
|
||||
|
||||
FUNC_LEAVE_NOAPI(ret_value);
|
||||
}
|
||||
```
|
||||
|
||||
There are a couple of things to note here.
|
||||
|
||||
* Each function call has a header comment block. The information you'll find in
|
||||
most function comments is not particularly helpful. We're going to improve the
|
||||
format of this.
|
||||
* Most functions will return `herr_t` or `hid_t` ID. We try to avoid other
|
||||
return types and instead use out parameters to return things to the user.
|
||||
* The name will be of the form `H5X_do_something()` with one or two underscores
|
||||
after the `H5X`. The naming scheme will be explained later.
|
||||
* Even though C99 allows declarations anywhere in the function, we put most of
|
||||
them at the top of the file, with the exception of loop variables and
|
||||
variables that are "in scope" inside an ifdef.
|
||||
* We generally initialize values that may need to be freed or otherwise cleaned
|
||||
up to a "bad" value like `NULL` or `H5I_INVALID_HID` so we can better clean up
|
||||
resources on function exit, especially when there have been errors.
|
||||
* Most non-void functions will declare a variable called `ret_value`. This is
|
||||
used by the error handling macros. It's usually the last thing declared in
|
||||
the variable block.
|
||||
* Every function starts with a `FUNC_ENTER macro`, discussed later in this
|
||||
document.
|
||||
* Most internal calls will check parameters via asserts.
|
||||
* We check the return value of any call that can return an error, using the form
|
||||
shown.
|
||||
* On errors, an error macro is invoked. These are described later in this
|
||||
document.
|
||||
* Any function that returns an error will have a `done` target. Most error
|
||||
macros jump to this location on errors.
|
||||
* We do most cleanup at the end of the function, after the `done` target. There
|
||||
are special `DONE` flavors of error macro that we use in post-`done` cleanup
|
||||
code to detect and report errors without loops.
|
||||
* Almost every function ends with a `FUNC_LEAVE` macro.
|
||||
|
||||
And here's an example of a public API call:
|
||||
|
||||
```c
|
||||
/*
|
||||
* Doxygen stuff goes here
|
||||
*/
|
||||
herr_t
|
||||
H5Xdo_api_stuff(/*parameters*/)
|
||||
{
|
||||
/* variables go here */
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3(/*stuff*/)
|
||||
|
||||
if (/*parameter check*/)
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "badness");
|
||||
|
||||
/* VOL setup */
|
||||
|
||||
if (H5VL_call() < 0)
|
||||
HGOTO_ERROR(H5E_FOO, H5E_BAR, FAIL, "badness");
|
||||
|
||||
done:
|
||||
if (ret_value < 0)
|
||||
/* do error cleanup */
|
||||
/* do regular cleanup stuff */
|
||||
|
||||
FUNC_LEAVE_API(ret_value);
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
A public API call differs little from an internal call. The biggest differences:
|
||||
|
||||
* Public API calls are commented using Doxygen. This is how we generate the
|
||||
reference manual entries.
|
||||
* The name will have the form `H5Xdo_stuff()`, with no underscores after the `H5X`.
|
||||
* The function enter macro is `FUNC_ENTER_API` (or similar). Under the hood, this
|
||||
one differs quite a bit from an internal function enter macro. It checks for
|
||||
package initialization, for example, and acquires the global lock in thread-safe HDF5.
|
||||
* There is a `TRACE` macro. This helps with API tracing and is applied by a
|
||||
script invoked by `autogen.sh` (Autotools) or CMake. You probably don't need
|
||||
to worry much about this.
|
||||
* Parameter checking uses the regular HDF5 error scheme and invokes
|
||||
`HGOTO_ERROR` macros on errors.
|
||||
* In storage-related calls, there will usually be some VOL setup (HDF5 1.12.x
|
||||
and later) and in lieu of a regular internal API call, there will be an `H5VL`
|
||||
VOL call.
|
||||
* The function exit macro will be `FUNC_LEAVE_API` (or similar). This is where
|
||||
we release the global thread-safe lock, etc.
|
||||
|
||||
|
||||
### Public, private, package
|
||||
|
||||
HDF5 is divided into _packages_, which encapsulate related functionality. Each
|
||||
has a prefix of the form `H5X(Y)`. An example is the dataset package, which has
|
||||
the prefix `H5D`. Hopefully, you are familiar with this from the public API. In
|
||||
addition to the public packages, we all know and love, there are many internal
|
||||
packages that are not visible to the public via API calls, like `H5FL` (free
|
||||
lists / memory pools) and `H5B2` (version 2 B-trees). There's also an `H5`
|
||||
package that deals with very low-level things like library startup.
|
||||
|
||||
API calls, types, etc. in HDF5 have three levels of visibility. From most to
|
||||
least visible, these are:
|
||||
|
||||
* Public
|
||||
* Private
|
||||
* Package
|
||||
|
||||
**Public** things are in the public API. They are usually found in `H5Xpublic.h`
|
||||
header files. API calls are of the form `H5Xfoo()`, with no underscores between
|
||||
the package name and the rest of the function name.
|
||||
|
||||
**Private** things are for use across the HDF5 library, and can be used outside the packages
|
||||
that contain them. They collectively make up the "internal library API". API
|
||||
calls are of the form `H5X_foo()` with one underscore between the package
|
||||
name and the rest of the function name.
|
||||
|
||||
**Package** things are for use inside the package and the compiler will
|
||||
complain if you include them outside of the package they belong to. They
|
||||
collectively make up the "internal package API". API calls are of the form
|
||||
`H5X__foo()` with *two* underscores between the package name and the rest of the
|
||||
function name. The concept of "friend" packages exists and you can declare this
|
||||
by defining `<package>_FRIEND` in a file. This will let you include the package
|
||||
header from a package in a file that it is not a member of. Doing this is
|
||||
strongly discouraged, though. Test functions are often declared in package
|
||||
headers as they expose package internals and test programs can include
|
||||
multiple package headers so they can check on internal package state.
|
||||
|
||||
Note that the underscore scheme is primarily for API calls and does not extend
|
||||
to things like types and symbols. Another thing to keep in mind is that the
|
||||
difference between package and private API calls can be somewhat arbitrary.
|
||||
We're hoping to improve the coherence of the internal APIs via refactoring.
|
||||
|
||||
|
||||
### Function enter and leave macros
|
||||
|
||||
Function enter and leave macros are added to almost all HDF5 API calls. This is
|
||||
where we set up error handling (see below) and things like the thread-safety
|
||||
global lock (in public API calls). There are different flavors depending on the
|
||||
API call and it's very important that they are appropriate for the function they
|
||||
mark up.
|
||||
|
||||
The various combinations you are most likely to encounter:
|
||||
|
||||
|Macro|Use|
|
||||
|-----|---|
|
||||
|`FUNC_ENTER_API`|Used when entering a public API call|
|
||||
|`FUNC_ENTER_NOAPI`|Used when entering a private API call|
|
||||
|`FUNC_ENTER_PACKAGE`|Used when entering a package API call|
|
||||
|
||||
There are also `_NO_INIT` flavors of some of these macros. These are usually
|
||||
small utility functions that don't initialize the library, like
|
||||
`H5is_library_threadsafe()`. They are uncommon.
|
||||
|
||||
You may also come across `_NO_FS` ("no function stack") flavors that don't push
|
||||
themselves on the stack. These are rare.
|
||||
|
||||
For the most part, you will be using the `API`, `NOAPI`, and `PACKAGE` macros.
|
||||
|
||||
You may see other versions if you are working in a maintenance branch, like the
|
||||
`STATIC` macros that we removed in 1.13. We've been working to reduce the
|
||||
complexity and number of these macros and we don't always push that downstream
|
||||
due to the scope of the changes involved. You should be able to figure out what
|
||||
any new macros do based on what you've seen here, though.
|
||||
|
||||
### Error macros
|
||||
|
||||
Almost all HDF5 functions return an error code, usually -1 or some typedef'd
|
||||
equivalent. Functions that return `void` should be avoided, even if the function
|
||||
cannot fail. Instead, return an `herr_t` value and always return `SUCCEED`.
|
||||
|
||||
|Type|Error Value|
|
||||
|----|-----------|
|
||||
|`herr_t`|`FAIL`|
|
||||
|any signed integer type|-1|
|
||||
|`hid_t`|`H5I_INVALID_HID`|
|
||||
|`htri_t`|`FAIL`|
|
||||
|`haddr_t`|`HADDR_UNDEF`|
|
||||
|pointer|`NULL`|
|
||||
|
||||
We've been trying to move away from using anything other than `herr_t` or `hid_t`
|
||||
to return errors, as eliminating half of a variable's potential values just so
|
||||
we can return a 'bad' value on errors seems unwise in a library that is
|
||||
designed to scale.
|
||||
|
||||
`herr_t` is a typedef'd signed integer. In the library, we only define two
|
||||
values for it: `SUCCEED` and `FAIL`, which are defined to 0 and -1, respectively,
|
||||
in `H5private.h`. We do not export these values, so public API calls just note
|
||||
that `herr_t` values will be negative on failure and non-negative on success.
|
||||
|
||||
Most of the error handling is performed using macros. The only extra setup you
|
||||
will have to do is:
|
||||
|
||||
1. Create a variable named `ret_value` with the same type
|
||||
as the return value for the function. If the type is `herr_t` it is frequently
|
||||
set to `SUCCEED` and will be set to `FAIL` on errors. In most other cases,
|
||||
the value is initialized to the 'bad' value and the function's code will set
|
||||
`ret_value` to a 'good' value at some point, with errors setting it back to
|
||||
the 'bad' value.
|
||||
|
||||
2. Create a done target (`done:`) just before you start your error cleanup.
|
||||
This will be the point to which the error macros will jump.
|
||||
|
||||
We check for errors on almost all internal lines of C code that could putatively
|
||||
fail. The general format is this:
|
||||
|
||||
```c
|
||||
if (function_that_could_fail(foo, bar) < 0)
|
||||
HGOTO_ERROR(H5E_<major>, H5E_<minor>, <bad value>, "tell me about badness");
|
||||
```
|
||||
|
||||
`HGOTO_ERROR` is one of a set of macros defined in `H5Eprivate.h`. This macro
|
||||
pops an error on the error stack and sets the return value to `<bad value>`,
|
||||
then jumps to the `done:` target.
|
||||
|
||||
Major and minor codes are a frequent cause of confusion. A full list of them
|
||||
can be found in `H5err.txt`, which is processed into the actual error header
|
||||
files at configure time by the `bin/make_err` script. The original intent was for major and minor error
|
||||
codes to be strongly associated. i.e., a given minor code would *only* be used
|
||||
with its associated major code. Unfortunately, this has not been the case in
|
||||
practice, and the emitted text can appear nonsensical in error
|
||||
stack dumps. Even worse, the major and minor error codes are used inconsistently
|
||||
throughout the library, making interpreting them almost impossible for
|
||||
external users. We hope to address this deficiency in the near future.
|
||||
|
||||
In the meantime, the following guidelines can be helpful:
|
||||
|
||||
1. Use `H5E_ARGS` as the major error category when parsing function parameters. The minor code will usually be `H5E_BADVALUE`, `H5E_BADRANGE`, or `H5E_BADTYPE`.
|
||||
2. Otherwise use the same major code throughout the source file. There is almost a 1-1 correspondence between packages and major error codes.
|
||||
3. Pick the minor code that seems to match the API call. You can grep through the library to find similar uses.
|
||||
4. The string at the end of the `HGOTO_ERROR` macro is much more important, so make sure that is helpful
|
||||
|
||||
You will still sometimes see the major error code match the package of a failing
|
||||
function call. We're trying to fix those as we come across them.
|
||||
|
||||
Since the `HGOTO_ERROR` macro jumps to the `done:` target, you can't use it
|
||||
after the `done:` target without creating a loop. Instead, you'll need to use
|
||||
the `HDONE_ERROR` macro, which will handle errors without jumping to the target.
|
||||
Instead, processing will continue after pushing the error and setting the
|
||||
return value, in the hopes that we can clean up as much as possible.
|
||||
|
||||
At the end of the function, the `FUNC_LEAVE` macro will return `ret_value`.
|
||||
|
||||
### Trace macros
|
||||
|
||||
These are automatically generated for public C library API calls by the
|
||||
`bin/trace` script, which scans the source code, looking for functions of the
|
||||
form `H5X(Y?)<whatever>()`, to which it will add or update the `H5TRACE` macros.
|
||||
|
||||
`H5TRACE` macros are only added to public C library API calls. They are NOT
|
||||
added to the language wrappers, tools code, high-level library, etc.
|
||||
|
||||
You should never have to modify an `H5TRACE` macro. Either point `bin/trace` at
|
||||
your source file or run `autogen.sh` (which runs `bin/trace` over the C files
|
||||
in `src`). `bin/trace` is a Perl script, so you'll need to have that available.
|
||||
|
||||
|
||||
### Memory - `H5MM` and `H5FL`
|
||||
|
||||
In the C library itself, we use `H5MM` and `H5FL` calls to allocate and free
|
||||
memory instead of directly using the standard C library calls.
|
||||
|
||||
The `H5MM` package was originally designed so that it would be easy to swap in a
|
||||
memory allocator of the developer's choosing. In practice, this has rarely
|
||||
been a useful feature, and we are thinking about removing this scheme. In
|
||||
the meantime, almost all memory allocations in the C library will use the
|
||||
`H5MM` (or `H5FL`) package.
|
||||
|
||||
In the past, we added memory allocation sanity checking to the `H5MM` calls
|
||||
which added heap canaries to memory allocations and performed sanity checking
|
||||
and gathered statistics. These were turned on by default in debug builds
|
||||
for many years. Unfortunately, there is interplay between library-allocated
|
||||
and externally-allocated memory in the filter pipeline where the heap canaries
|
||||
can easily get corrupted and cause problems. We also have some API calls that
|
||||
return library-allocated memory to the user, which can cause problems if they
|
||||
then use `free(3)` to free it. Given these problems, we now have the sanity
|
||||
checks turned off by default in all build modes. You can turn them back on via
|
||||
configure/CMake options, but it's normally easier to use external tools like
|
||||
valgrind or the compiler's memory debugging options.
|
||||
|
||||
`H5FL` provides memory pools (*Free Lists*) that create a set of fixed-size allocations
|
||||
of a certain type that the library will reuse as needed. They use `H5MM` calls
|
||||
under the hood and can be useful when the library creates and frees a lot of
|
||||
objects of that type. It's difficult to give a good guideline as to when to use
|
||||
the `H5FL` calls and when to use the `H5MM` calls, but it's probably best to
|
||||
lean towards `H5MM` unless you can identify a clear performance hit due to
|
||||
memory cycling. Current library usage can be a good guide, but keep in mind that
|
||||
the free lists are probably overused in the library. Another thing to keep in
|
||||
mind is that the free lists can hide memory errors, like use-after-free. Some
|
||||
developers always turn them off and you'll need to turn them off when running
|
||||
memory checkers like valgrind.
|
||||
|
||||
Using free list calls differs little from using `H5MM` calls. There are
|
||||
equivalents for `malloc(3)`, `calloc(3)`, and `free(3)`:
|
||||
|
||||
| C Library|`H5FL`|
|
||||
|----------|------|
|
||||
|`malloc`|`H5FL_MALLOC`|
|
||||
|`calloc`|`H5FL_CALLOC`|
|
||||
|`free`|`H5FL_FREE`|
|
||||
|
||||
Since free lists provide pre-allocated memory of a fixed size, you can't
|
||||
reallocate free list memory and there's no `H5FL` `realloc(3)` equivalent.
|
||||
|
||||
You'll also need to add a setup macro to the top of the file. There are a few
|
||||
flavors defined in `H5FLprivate.h`. Each creates global free list variables,
|
||||
so there are flavors for extern, static, etc.
|
||||
|
||||
|Macro|Purpose|
|
||||
|-----|-------|
|
||||
|`H5FL_DEFINE`|Define a free list that will be used in several files|
|
||||
|`H5FL_EXTERN`|Define a free list that was defined in another file|
|
||||
|`H5FL_DEFINE_STATIC`|Define a free list that will only be used in this file|
|
||||
|
||||
You will also see `ARR`, `BLK`, `SEQ`, and `FAC` flavors of the macros. Their
|
||||
use is beyond the scope of a guide for beginners.
|
||||
|
||||
## Testing
|
||||
|
||||
### Two macro schemes
|
||||
|
||||
The HDF5 C library is tested via a collection of small programs in the `test/`
|
||||
directory. There are a few schemes in use:
|
||||
|
||||
- `testhdf5` - A larger, composite test program composed of several test files, most of which start with 't' (e.g., `tcoords.c`)
|
||||
- Shell/Powershell scripts that test things like SWMR and flush/refresh behavior. These scripts run small sub-programs.
|
||||
- Everything else. These are self-contained test programs that are built and run independently by the test harness.
|
||||
|
||||
|
||||
The test programs do not use a standard test framework like cppunit, but instead
|
||||
use HDF5-specific macros to set up the tests and report errors. There are two
|
||||
sets of macros, one in `testhdf5.h` and another in `h5test.h`.
|
||||
Originally, the `testhdf5` programs used the macros in `testhdf5.h` and everything
|
||||
else used the macros in `h5test.h`, but over time the tests have evolved so that
|
||||
all tests usually include both headers.
|
||||
|
||||
This is unfortunate, because it's very important to not mix up the "test framework
|
||||
macros" in each scheme. The `testhdf5.h` macros register errors by setting global
|
||||
variables and normally continue with the test when they encounter errors. The
|
||||
`h5test.h` macros indicate errors by jumping to an error target and returning
|
||||
a `FAIL` `herr_t` value. If you combine these two macro sets, you may
|
||||
accidentally create tests that fail but do not register the failure.
|
||||
|
||||
We are aware that our testing scheme needs some work and we'll be working to
|
||||
improve it over the next year or so.
|
||||
|
||||
The command-line tools are tested using a different scheme and are discussed elsewhere.
|
||||
|
||||
### `testhdf5.h`
|
||||
|
||||
The macros in this file are almost exclusively used in the `testhdf5` program.
|
||||
They register errors by incrementing a global error count that is inspected at
|
||||
the end of each test (not each test *function*, but each *test* - e.g., after
|
||||
`test_file()` in `tfile.c` runs, but not when the individual functions it
|
||||
calls run).
|
||||
|
||||
Test functions generally look like this:
|
||||
|
||||
```c
|
||||
static void
|
||||
test_something()
|
||||
{
|
||||
/* Variables go here */
|
||||
int out = -1;
|
||||
herr_t ret;
|
||||
|
||||
MESSAGE(5, ("Testing a thing\n"));
|
||||
|
||||
ret = H5Xsome_api_call(&out);
|
||||
CHECK(ret, FAIL, "H5Xsome_api_call()");
|
||||
VERIFY(out, 6, "incorrect value for out");
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
The `MESSAGE` macro just dumps the name of what we're testing when we've the
|
||||
verbosity cranked up. The confusingly-named `CHECK` and `VERIFY` macros are
|
||||
members of a suite of check macros in `testhdf5.h`. `CHECK` macros check to
|
||||
see if a variable is **NOT** a value, `VERIFY` macros check to see if a variable
|
||||
**IS** a value. There are different flavors of macro to match different types
|
||||
so be sure to use the right one to avoid compiler warnings and spurious errors.
|
||||
Under the hood, these macros will emit error information and increment the
|
||||
global error variables.
|
||||
|
||||
Tests are added to `testhdf5` in `testhdf5.c` using the `AddTest()` call.
|
||||
Each test will have a driver function, usually named something like `test_<thing>()`
|
||||
that invokes the test functions in the file.
|
||||
Most tests will cleanup their files using a `cleanup_<thing>()` call. If you are
|
||||
deleting HDF5 files, you should use `H5Fdelete()` instead of `remove(3)` so
|
||||
that files can be cleaned even when they use alternative VFDs or VOL connectors.
|
||||
You'll also need to add prototypes for any new test driver or cleanup functions
|
||||
to `testhdf5.h`.
|
||||
|
||||
Because these macros interact with global variables that are only used in the
|
||||
testhdf5 program, they are useless anywhere else in the library. Even worse, it
|
||||
will *look* like you are testing functionality, but errors will not be picked
|
||||
up by the non-testhdf5 programs, hiding problems.
|
||||
|
||||
### `h5test.h`
|
||||
|
||||
These are the most commonly used macros and are used throughout the test code,
|
||||
even in places that are not specifically tests. Unlike the scheme used in
|
||||
the `testhdf5` program, these macros work more like the library, jumping to
|
||||
an `error:` target on errors. There is no common `ret_value` variable, however.
|
||||
|
||||
Test functions will usually look like this:
|
||||
|
||||
```c
|
||||
static herr_t
|
||||
test_something()
|
||||
{
|
||||
hid_t fapl_id = H5I_INVALID_HID;
|
||||
hid_t fid = H5I_INVALID_HID;
|
||||
char filename[1024];
|
||||
int *buf = NULL;
|
||||
|
||||
TESTING("Testing some feature");
|
||||
|
||||
if ((fapl_id = h5_fileaccess()) < 0)
|
||||
TEST_ERROR;
|
||||
h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
|
||||
|
||||
if ((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id)) < 0)
|
||||
TEST_ERROR;
|
||||
|
||||
/* Many more calls here */
|
||||
|
||||
PASSED();
|
||||
return SUCCEED;
|
||||
|
||||
error:
|
||||
|
||||
HDfree(buf);
|
||||
|
||||
H5E_BEGIN_TRY
|
||||
{
|
||||
H5Fclose(fid);
|
||||
}
|
||||
H5E_END_TRY
|
||||
|
||||
return FAIL;
|
||||
}
|
||||
```
|
||||
|
||||
Tests begin with a `TESTING` macro that emits some text (unlike the `testhdf5`
|
||||
case, this is always dumped). Any errors will be handled by one of the
|
||||
`TEST_ERROR` macros. For the most part, `TEST_ERROR` will suffice, but there
|
||||
are others in `h5test.h` if you want to emit custom text, dump the HDF5 error
|
||||
stack when it would not normally be triggered, etc.
|
||||
|
||||
Most tests will be set up to run with arbitrary VFDs. To do this, you set the
|
||||
fapl ID using the `h5_fileaccess()` function, which will check the `HDF5_TEST_DRIVER`
|
||||
environment variable and set the fapl's VFD accordingly. The `h5_fixname()`
|
||||
call can then be used to get a VFD-appropriate filename for the `H5Fcreate()`,
|
||||
etc. call.
|
||||
|
||||
In the `error` section, we clean up resources and return a 'bad' value, which
|
||||
will usually either be `FAIL` or -1.
|
||||
|
||||
The `main()` function of each test program will usually start out by calling
|
||||
`h5_reset()`, then run each test, incrementing an error count variable if a
|
||||
test fails. The exit code and text will be set based on the error count.
|
||||
|
||||
### Scripts
|
||||
|
||||
If you need to fire off multiple programs to test a new feature, you may have
|
||||
to do this via a script. These are normally named `test_<thing>.sh.in`. The
|
||||
`.in` is because the scripts are often modified and copied during the configure
|
||||
step. In the past, we have tried to stick to POSIX Bourne shell scripts, but
|
||||
many scripts now require bash.
|
||||
|
||||
If you write a new test script, it is important to also add a PowerShell
|
||||
equivalent for testing on Windows.
|
||||
|
||||
It's helpful to run any new shell scripts through `shellcheck`
|
||||
(https://www.shellcheck.net/) to ensure that your scripts are free from
|
||||
common problems.
|
||||
|
||||
|
||||
### Parallel tests (in `testpar/`)
|
||||
|
||||
To be covered in a future update of this guide...
|
||||
|
||||
### Adding new tests
|
||||
|
||||
All new HDF5 library functionality (including bugfixes) should have a test.
|
||||
Some rules of thumb:
|
||||
|
||||
- If you need to run multiple programs, you'll need to create a script and some test programs. Use the macros in `h5test.h` to handle errors in your test programs.
|
||||
- If a suitable test program already exists (especially if your tests will be small), add your new tests to the existing file.
|
||||
- If you need to create a new test program, create one that uses the `h5test.h` macros.
|
||||
- Avoid adding new tests to `testhdf5` or using the macros in `testhdf5.h`.
|
||||
|
||||
Don't forget that you'll need to add your test program or script to the lists in
|
||||
both the CMake and Autotools test files (`CMakeLists.txt` and `Makefile.am` in
|
||||
`test/` respectively). For simple tests, you just need to add your new test to
|
||||
the list of tests.
|
||||
|
||||
All new tests **MUST** run under both the Autotools and CMake. Ideally, they
|
||||
should also work on Windows, but we're willing to overlook this for things
|
||||
that are unlikely to be useful on that platform.
|
||||
|
||||
## Documentation
|
||||
|
||||
We have moved the user guide and reference manual to Doxygen. All public API
|
||||
calls and symbols should have Doxygen markup in the public header file. New major
|
||||
features should be documented in the user guide. This Doxygen content is located in
|
||||
the package's module header file (`H5Xmodule.h`). Language wrapper calls
|
||||
(C++/Fortran/Java) should also have Doxygen markup, which will be located with
|
||||
the wrapper source code. Images and other common Doxygen files belong in the
|
||||
`doxygen` directory.
|
||||
|
||||
Internal documentation for developer consumption is currently stored as Markdown
|
||||
files in the `doc` directory. This may change in the future. Documentation that
|
||||
helps understand the contents of a directory is often stored in a README.md
|
||||
Markdown file in that directory.
|
||||
|
||||
Build and install documentation is stored in text files in `release_docs`. This
|
||||
is admittedly not the best place for this. History files are also kept here.
|
||||
|
||||
## Command-Line Tools
|
||||
|
||||
The HDF5 command-line tools are written in C and built with the library by default.
|
||||
The code is organized into a central tools library (in the `tools/lib` directory)
|
||||
that includes some common functionality and the individual programs, each of which
|
||||
has its own directory in `tools/src`. A few of the smaller tools are aggregated
|
||||
into the `tools/src/misc` directory. Only h5diff has a parallel version at this
|
||||
time and the parallel-specific functionality is in the `tools/src/h5diff/ph5diff_main.c` file.
|
||||
Some h5diff functionality has also made its way into the tools library.
|
||||
The tools code is not as well organized as the main library, so there's more opportunity
|
||||
for refactoring here.
|
||||
|
||||
Also worth noting is that the command-line tools only use **public** HDF5 API
|
||||
calls, even though they include `H5private.h` in order to take advantage of
|
||||
the platform-independence scheme we use in the main library and some private
|
||||
utility functions.
|
||||
|
||||
There are also a few tools in the high-level library. The gif2h5 and h52gif tools
|
||||
are poorly-written and have known security issues, so they will soon be moved
|
||||
to a separate repository, leaving h5watch as the only high-level command-line tool.
|
||||
|
||||
### Source code
|
||||
|
||||
The source code for the tools likes more like standard C code and uses its own
|
||||
set of macros, which are defined in the tools library header files. There are
|
||||
no `FUNC_ENTER` macros, you do not need to define a `ret_value` variable,
|
||||
and the error macros are greatly simplified. Errors are usually handled by
|
||||
a `TOOLS_ERROR` macro (or `TOOLS_GOTO_ERROR` if you need to jump to a `done:`
|
||||
target to handle cleanup).
|
||||
One area where the tools need a lot more work is in handling errors. The tools
|
||||
code frequently ignores errors, often in functions that return `void`.
|
||||
|
||||
A "tools-only" consideration is the use of command-line arguments. We try to
|
||||
be conservative about these, even though they really aren't in the "public API"
|
||||
in the same way as API calls are. Additions and changes to the options will
|
||||
probably result in some discussion.
|
||||
|
||||
### Tools tests
|
||||
|
||||
In most cases, a tool will be run against an input HDF5 file with a particular
|
||||
set of command-line parameters, the exit code checked, and the output compared
|
||||
with a standard output file. In some cases, errors are expected and standard
|
||||
error files will be compared. These standard error files often contain HDF5
|
||||
error stack dumps, which can cause spurious tool test "failures" when we
|
||||
make changes to the main HDF5 C library.
|
||||
|
||||
Test files can be located in a few places in the `tools` directory tree.
|
||||
Common input files that are used with multiple tools are kept in `tools/testfiles`.
|
||||
Input files that are used with just one tool are located in `tools/test/<tool>/testfiles`.
|
||||
Expected output files are located with their respective HDF5 files and end in `.txt`.
|
||||
Expected error files are also located with their respective HDF5 files and end in `.err`.
|
||||
h5dump files will usually have `.ddl` and `.xml` output files and there will
|
||||
usually be `.<tool>` files that contain help output.
|
||||
The test files are generated by programs with `gentest` in their name, though
|
||||
we typically check the generated HDF5 files in instead of recreating them
|
||||
as a part of running the tools tests.
|
||||
|
||||
The Autotools aggregate the tools tests in per-tool shell scripts in the
|
||||
`tools/test/<tool>` directory. Each script starts with a few utility functions
|
||||
that perform setup, compare files, clean output, etc. and the test commands
|
||||
will appear at the end. CMake works similarly, but each test is set up in
|
||||
the CMakeLists.txt and CMakeTests.cmake files in the same directory.
|
||||
|
||||
Adding a new test will usually involve:
|
||||
- Adding a new function to the appropriate generator program to create a new HDF5 file
|
||||
- Adding your new test to the CMake and Autotools test scripts, as described above
|
||||
- Adding appropriate output and/or error files for comparison
|
||||
|
||||
You MUST add new tests to both the Autotools and CMake.
|
||||
+14
-14
@@ -79,7 +79,7 @@ participate in the collective write call.
|
||||
## Multi-dataset I/O support
|
||||
|
||||
The parallel compression feature is supported when using the
|
||||
multi-dataset I/O API routines ([H5Dwrite_multi](https://hdfgroup.github.io/hdf5/group___h5_d.html#gaf6213bf3a876c1741810037ff2bb85d8)/[H5Dread_multi](https://hdfgroup.github.io/hdf5/group___h5_d.html#ga8eb1c838aff79a17de385d0707709915)), but the
|
||||
multi-dataset I/O API routines ([H5Dwrite_multi](https://hdfgroup.github.io/hdf5/v1_14/group___h5_d.html#gaf6213bf3a876c1741810037ff2bb85d8)/[H5Dread_multi](https://hdfgroup.github.io/hdf5/v1_14/group___h5_d.html#ga8eb1c838aff79a17de385d0707709915)), but the
|
||||
following should be kept in mind:
|
||||
|
||||
- Parallel writes to filtered datasets **must** still be collective,
|
||||
@@ -99,7 +99,7 @@ following should be kept in mind:
|
||||
|
||||
## Incremental file space allocation support
|
||||
|
||||
HDF5's [file space allocation time](https://hdfgroup.github.io/hdf5/group___d_c_p_l.html#ga85faefca58387bba409b65c470d7d851)
|
||||
HDF5's [file space allocation time](https://hdfgroup.github.io/hdf5/v1_14/group___d_c_p_l.html#ga85faefca58387bba409b65c470d7d851)
|
||||
is a dataset creation property that can have significant effects
|
||||
on application performance, especially if the application uses
|
||||
parallel HDF5. In a serial HDF5 application, the default file space
|
||||
@@ -118,7 +118,7 @@ While this strategy has worked in the past, it has some noticeable
|
||||
drawbacks. For one, the larger the chunked dataset being created,
|
||||
the more noticeable overhead there will be during dataset creation
|
||||
as all of the data chunks are being allocated in the HDF5 file.
|
||||
Further, these data chunks will, by default, be [filled](https://hdfgroup.github.io/hdf5/group___d_c_p_l.html#ga4335bb45b35386daa837b4ff1b9cd4a4)
|
||||
Further, these data chunks will, by default, be [filled](https://hdfgroup.github.io/hdf5/v1_14/group___d_c_p_l.html#ga4335bb45b35386daa837b4ff1b9cd4a4)
|
||||
with HDF5's default fill data value, leading to extraordinary
|
||||
dataset creation overhead and resulting in pre-filling large
|
||||
portions of a dataset that the application might have been planning
|
||||
@@ -126,7 +126,7 @@ to overwrite anyway. Even worse, there will be more initial overhead
|
||||
from compressing that fill data before writing it out, only to have
|
||||
it read back in, unfiltered and modified the first time a chunk is
|
||||
written to. In the past, it was typically suggested that parallel
|
||||
HDF5 applications should use [H5Pset_fill_time](https://hdfgroup.github.io/hdf5/group___d_c_p_l.html#ga6bd822266b31f86551a9a1d79601b6a2)
|
||||
HDF5 applications should use [H5Pset_fill_time](https://hdfgroup.github.io/hdf5/v1_14/group___d_c_p_l.html#ga6bd822266b31f86551a9a1d79601b6a2)
|
||||
with a value of `H5D_FILL_TIME_NEVER` in order to disable writing of
|
||||
the fill value to dataset chunks, but this isn't ideal if the
|
||||
application actually wishes to make use of fill values.
|
||||
@@ -220,14 +220,14 @@ chunks to end up at addresses in the file that do not align
|
||||
well with the underlying file system, possibly leading to
|
||||
poor performance. As an example, Lustre performance is generally
|
||||
good when writes are aligned with the chosen stripe size.
|
||||
The HDF5 application can use [H5Pset_alignment](https://hdfgroup.github.io/hdf5/group___f_a_p_l.html#gab99d5af749aeb3896fd9e3ceb273677a)
|
||||
The HDF5 application can use [H5Pset_alignment](https://hdfgroup.github.io/hdf5/v1_14/group___f_a_p_l.html#gab99d5af749aeb3896fd9e3ceb273677a)
|
||||
to have a bit more control over where objects in the HDF5
|
||||
file end up. However, do note that setting the alignment
|
||||
of objects generally wastes space in the file and has the
|
||||
potential to dramatically increase its resulting size, so
|
||||
caution should be used when choosing the alignment parameters.
|
||||
|
||||
[H5Pset_alignment](https://hdfgroup.github.io/hdf5/group___f_a_p_l.html#gab99d5af749aeb3896fd9e3ceb273677a)
|
||||
[H5Pset_alignment](https://hdfgroup.github.io/hdf5/v1_14/group___f_a_p_l.html#gab99d5af749aeb3896fd9e3ceb273677a)
|
||||
has two parameters that control the alignment of objects in
|
||||
the HDF5 file, the "threshold" value and the alignment
|
||||
value. The threshold value specifies that any object greater
|
||||
@@ -264,19 +264,19 @@ in a file, this can create significant amounts of free space
|
||||
in the file over its lifetime and eventually cause performance
|
||||
issues.
|
||||
|
||||
An HDF5 application can use [H5Pset_file_space_strategy](https://hdfgroup.github.io/hdf5/group___f_c_p_l.html#ga167ff65f392ca3b7f1933b1cee1b9f70)
|
||||
An HDF5 application can use [H5Pset_file_space_strategy](https://hdfgroup.github.io/hdf5/v1_14/group___f_c_p_l.html#ga167ff65f392ca3b7f1933b1cee1b9f70)
|
||||
with a value of `H5F_FSPACE_STRATEGY_PAGE` to enable the paged
|
||||
aggregation feature, which can accumulate metadata and raw
|
||||
data for dataset data chunks into well-aligned, configurably
|
||||
sized "pages" for better performance. However, note that using
|
||||
the paged aggregation feature will cause any setting from
|
||||
[H5Pset_alignment](https://hdfgroup.github.io/hdf5/group___f_a_p_l.html#gab99d5af749aeb3896fd9e3ceb273677a)
|
||||
[H5Pset_alignment](https://hdfgroup.github.io/hdf5/v1_14/group___f_a_p_l.html#gab99d5af749aeb3896fd9e3ceb273677a)
|
||||
to be ignored. While an application should be able to get
|
||||
comparable performance effects by [setting the size of these pages](https://hdfgroup.github.io/hdf5/group___f_c_p_l.html#gad012d7f3c2f1e1999eb1770aae3a4963) to be equal to the value that
|
||||
would have been set for [H5Pset_alignment](https://hdfgroup.github.io/hdf5/group___f_a_p_l.html#gab99d5af749aeb3896fd9e3ceb273677a),
|
||||
comparable performance effects by [setting the size of these pages](https://hdfgroup.github.io/hdf5/v1_14/group___f_c_p_l.html#gad012d7f3c2f1e1999eb1770aae3a4963) to be equal to the value that
|
||||
would have been set for [H5Pset_alignment](https://hdfgroup.github.io/hdf5/v1_14/group___f_a_p_l.html#gab99d5af749aeb3896fd9e3ceb273677a),
|
||||
this may not necessarily be the case and should be studied.
|
||||
|
||||
Note that [H5Pset_file_space_strategy](https://hdfgroup.github.io/hdf5/group___f_c_p_l.html#ga167ff65f392ca3b7f1933b1cee1b9f70)
|
||||
Note that [H5Pset_file_space_strategy](https://hdfgroup.github.io/hdf5/v1_14/group___f_c_p_l.html#ga167ff65f392ca3b7f1933b1cee1b9f70)
|
||||
has a `persist` parameter. This determines whether or not the
|
||||
file free space manager should include extra metadata in the
|
||||
HDF5 file about free space sections in the file. If this
|
||||
@@ -300,12 +300,12 @@ hid_t file_id = H5Fcreate("file.h5", H5F_ACC_TRUNC, fcpl_id, fapl_id);
|
||||
|
||||
While the parallel compression feature requires that the HDF5
|
||||
application set and maintain collective I/O at the application
|
||||
interface level (via [H5Pset_dxpl_mpio](https://hdfgroup.github.io/hdf5/group___d_x_p_l.html#ga001a22b64f60b815abf5de8b4776f09e)),
|
||||
interface level (via [H5Pset_dxpl_mpio](https://hdfgroup.github.io/hdf5/v1_14/group___d_x_p_l.html#ga001a22b64f60b815abf5de8b4776f09e)),
|
||||
it does not require that the actual MPI I/O that occurs at
|
||||
the lowest layers of HDF5 be collective; independent I/O may
|
||||
perform better depending on the application I/O patterns and
|
||||
parallel file system performance, among other factors. The
|
||||
application may use [H5Pset_dxpl_mpio_collective_opt](https://hdfgroup.github.io/hdf5/group___d_x_p_l.html#gacb30d14d1791ec7ff9ee73aa148a51a3)
|
||||
application may use [H5Pset_dxpl_mpio_collective_opt](https://hdfgroup.github.io/hdf5/v1_14/group___d_x_p_l.html#gacb30d14d1791ec7ff9ee73aa148a51a3)
|
||||
to control this setting and see which I/O method provides the
|
||||
best performance.
|
||||
|
||||
@@ -318,7 +318,7 @@ H5Dwrite(..., dxpl_id, ...);
|
||||
|
||||
### Runtime HDF5 Library version
|
||||
|
||||
An HDF5 application can use the [H5Pset_libver_bounds](https://hdfgroup.github.io/hdf5/group___f_a_p_l.html#gacbe1724e7f70cd17ed687417a1d2a910)
|
||||
An HDF5 application can use the [H5Pset_libver_bounds](https://hdfgroup.github.io/hdf5/v1_14/group___f_a_p_l.html#gacbe1724e7f70cd17ed687417a1d2a910)
|
||||
routine to set the upper and lower bounds on library versions
|
||||
to use when creating HDF5 objects. For parallel compression
|
||||
specifically, setting the library version to the latest available
|
||||
|
||||
+1
-1
@@ -710,6 +710,7 @@ RECURSIVE = YES
|
||||
# run.
|
||||
|
||||
EXCLUDE =
|
||||
|
||||
# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
|
||||
# directories that are symbolic links (a Unix file system feature) are excluded
|
||||
# from the input.
|
||||
@@ -736,7 +737,6 @@ EXCLUDE_PATTERNS += */hl/fortran/src/*.h
|
||||
EXCLUDE_PATTERNS += */HDF5Examples/FORTRAN/*
|
||||
EXCLUDE_PATTERNS += */sanitizer/*
|
||||
|
||||
|
||||
# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
|
||||
# (namespaces, classes, functions, etc.) that should be excluded from the
|
||||
# output. The symbol name can be a fully qualified name, a word, or if the
|
||||
|
||||
+122
-107
@@ -1,5 +1,20 @@
|
||||
ALIASES += THG="The HDF Group"
|
||||
|
||||
################################################################################
|
||||
# Default URLs (Note that md files do not use any aliases)
|
||||
################################################################################
|
||||
ALIASES += HDFURL="docs.hdfgroup.org/hdf5"
|
||||
ALIASES += ARCURL="docs.hdfgroup.org/archive/support/HDF5/doc"
|
||||
ALIASES += RFCURL="docs.hdfgroup.org/hdf5/rfc"
|
||||
ALIASES += DSPURL="portal.hdfgroup.org/display/HDF5"
|
||||
ALIASES += DOCURL="portal.hdfgroup.org/documentation/hdf5-docs"
|
||||
ALIASES += DWNURL="portal.hdfgroup.org/downloads"
|
||||
ALIASES += AEXURL="support.hdfgroup.org/ftp/HDF5/examples"
|
||||
# doxygen subdir (develop, v1_14)
|
||||
ALIASES += DOXURL="hdfgroup.github.io/hdf5/v1_14"
|
||||
#branch name (develop, hdf5_1_14)
|
||||
ALIASES += SRCURL="github.com/HDFGroup/hdf5/blob/hdf5_1_14"
|
||||
|
||||
################################################################################
|
||||
# Styling
|
||||
################################################################################
|
||||
@@ -234,16 +249,16 @@ ALIASES += sa_metadata_ops="\sa \li H5Pget_all_coll_metadata_ops() \li H5Pget_co
|
||||
# References
|
||||
################################################################################
|
||||
|
||||
ALIASES += ref_cons_semantics="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC%20PHDF5%20Consistency%20Semantics%20MC%20120328.docx.pdf\">Enabling a Strict Consistency Semantics Model in Parallel HDF5</a>"
|
||||
ALIASES += ref_file_image_ops="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/HDF5FileImageOperations.pdf\">HDF5 File Image Operations</a>"
|
||||
ALIASES += ref_filter_pipe="<a href=\"https://portal.hdfgroup.org/display/HDF5/HDF5+Data+Flow+Pipeline+for+H5Dread\">Data Flow Pipeline for H5Dread()</a>"
|
||||
ALIASES += ref_group_impls="<a href=\"https://docs.hdfgroup.org/hdf5/v1_14/group___h5_g.html\">Group implementations in HDF5</a>"
|
||||
ALIASES += ref_h5lib_relver="<a href=\"https://docs.hdfgroup.org/archive/support/HDF5/doc/TechNotes/Version.html\">HDF5 Library Release Version Numbers</a>"
|
||||
ALIASES += ref_mdc_in_hdf5="<a href=\"https://portal.hdfgroup.org/display/HDF5/Metadata+Caching+in+HDF5\">Metadata Caching in HDF5</a>"
|
||||
ALIASES += ref_mdc_logging="<a href=\"https://portal.hdfgroup.org/display/HDF5/H5F_START_MDC_LOGGING\">Metadata Cache Logging</a>"
|
||||
ALIASES += ref_news_112="<a href=\"https://portal.hdfgroup.org/documentation/hdf5-docs/release_specifics/new_features_1_12.html\">New Features in HDF5 Release 1.12</a>"
|
||||
ALIASES += ref_h5ocopy="<a href=\"https://portal.hdfgroup.org/display/HDF5/Copying+Committed+Datatypes+with+H5Ocopy\">Copying Committed Datatypes with H5Ocopy()</a>"
|
||||
ALIASES += ref_sencode_fmt_change="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/H5Sencode_format.docx.pdf\">RFC H5Sencode() / H5Sdecode() Format Change</a>"
|
||||
ALIASES += ref_cons_semantics="<a href=\"https://\RFCURL/RFC%20PHDF5%20Consistency%20Semantics%20MC%20120328.docx.pdf\">Enabling a Strict Consistency Semantics Model in Parallel HDF5</a>"
|
||||
ALIASES += ref_file_image_ops="<a href=\"https://\RFCURL/HDF5FileImageOperations.pdf\">HDF5 File Image Operations</a>"
|
||||
ALIASES += ref_filter_pipe="<a href=\"https://\DSPURL/HDF5+Data+Flow+Pipeline+for+H5Dread\">Data Flow Pipeline for H5Dread()</a>"
|
||||
ALIASES += ref_group_impls="<a href=\"\DOXURL/group___h5_g.html\">Group implementations in HDF5</a>"
|
||||
ALIASES += ref_h5lib_relver="<a href=\"https://\ARCURL/TechNotes/Version.html\">HDF5 Library Release Version Numbers</a>"
|
||||
ALIASES += ref_mdc_in_hdf5="<a href=\"https://\DSPURL/Metadata+Caching+in+HDF5\">Metadata Caching in HDF5</a>"
|
||||
ALIASES += ref_mdc_logging="<a href=\"https://\DSPURL/H5F_START_MDC_LOGGING\">Metadata Cache Logging</a>"
|
||||
ALIASES += ref_news_112="<a href=\"https://\DOCURL/release_specifics/new_features_1_12.html\">New Features in HDF5 Release 1.12</a>"
|
||||
ALIASES += ref_h5ocopy="<a href=\"https://\DSPURL/Copying+Committed+Datatypes+with+H5Ocopy\">Copying Committed Datatypes with H5Ocopy()</a>"
|
||||
ALIASES += ref_sencode_fmt_change="<a href=\"https://\RFCURL/H5Sencode_format.docx.pdf\">RFC H5Sencode() / H5Sdecode() Format Change</a>"
|
||||
ALIASES += ref_vlen_strings="\Emph{Creating variable-length string datatypes}"
|
||||
ALIASES += ref_vol_doc="VOL documentation"
|
||||
|
||||
@@ -251,103 +266,103 @@ ALIASES += ref_vol_doc="VOL documentation"
|
||||
# RFCs
|
||||
################################################################################
|
||||
|
||||
ALIASES += ref_rfc20220819="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/Terminal_VOL_Connector_Feature_Flags.pdf\">Terminal VOL Connector Feature Flags</a>"
|
||||
ALIASES += ref_rfc20210528="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC_multi_thread.pdf\">Multi-Thread HDF5</a>"
|
||||
ALIASES += ref_rfc20210219="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/selection_io_RFC_210610.pdf\">Selection I/O</a>"
|
||||
ALIASES += ref_rfc20200213="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC_VFD_subfiling_200424.pdf\">VFD Sub-filing</a>"
|
||||
ALIASES += ref_rfc20200210="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/Onion_VFD_RFC_211122.pdf\">Onion VFD</a>"
|
||||
ALIASES += ref_rfc20190923="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/2019-09-23-RFC_VOL_feature_flags.pdf\">Virtual Object Layer (VOL) API Compatibility</a>"
|
||||
ALIASES += ref_rfc20190715="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/var_len_data_sketch_design_190715.pdf\">Variable-Length Data in HDF5 Sketch Design</a>"
|
||||
ALIASES += ref_rfc20190410="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC_VFD_Plugin.docx.pdf\">A Plugin Interface for HDF5 Virtual File Drivers</a>"
|
||||
ALIASES += ref_rfc20181231="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC_Min_Obj_Headers_181231.pdf\">Dataset Object Header Size</a>"
|
||||
ALIASES += ref_rfc20181220="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/3.2.1_3.2.2_deliverable_181220_v4.pdf\">MS 3.2 – Addressing Scalability: Scalability of open, close, flush CASE STUDY: CGNS Hotspot analysis of CGNS cgp_open</a>"
|
||||
ALIASES += ref_rfc20180830="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC_Sparse_Chunks180830.pdf\">Sparse Chunks</a>"
|
||||
ALIASES += ref_rfc20180829="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/mirror_VFD_RFC_2018-10-05.pdf\">H5FD_MIRROR Virtual File Driver</a>"
|
||||
ALIASES += ref_rfc20180815="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/splitter_VFD_RFC_180830.pdf\">Splitter_VFD</a>"
|
||||
ALIASES += ref_rfc20180712="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC_Update_to_HDF5_References.pdf\">Update to HDF5 References</a>"
|
||||
ALIASES += ref_rfc20180620="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC-Chunking%20Functions-2018-06-20-v3.docx.pdf\">Chunk query functionality in HDF5</a>"
|
||||
ALIASES += ref_rfc20180610="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/VFD_SWMR_RFC_220519.pdf\">VFD SWMR</a>"
|
||||
ALIASES += ref_rfc20180321="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC-API_Contexts-2018-03-21.docx.pdf\">API Contexts</a>"
|
||||
ALIASES += ref_rfc20180125="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/enhance_h5clear.docx.pdf\">Enhancement to the tool <tt>h5clear</tt></a>"
|
||||
ALIASES += ref_rfc20170707="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/H5Sencode_format.docx.pdf\"><tt>H5Sencode/H5Sdecode</tt> Format Change</a>"
|
||||
ALIASES += ref_rfc20160105="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC-bounds.pdf\">Setting Bounds for Object Creation in HDF5 1.10.0</a>"
|
||||
ALIASES += ref_rfc20150915="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/2015-09-28-RFC-HDF5-1.10.0-File-Format-Superblock-Changes-EP.docx.pdf\">File Format Changes in HDF5 1.10.0</a>"
|
||||
ALIASES += ref_rfc20150709="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC-Page_Buffering.pdf\">Page Buffering</a>"
|
||||
ALIASES += ref_rfc20150615="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/cache_image_RFC_150929-QAK.docx.pdf\">Metadata Cache Image</a>"
|
||||
ALIASES += ref_rfc20150429="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/new_datatypes.pdf\">New Datatypes</a>"
|
||||
ALIASES += ref_rfc20150424="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC-CollectiveMetadataWrites.pdf\">Collective Metadata Writes</a>"
|
||||
ALIASES += ref_rfc20150423="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC-CollectiveMetadataReads.pdf\">Enabling Collective Metadata Reads</a>"
|
||||
ALIASES += ref_rfc20150301="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/sent_RFC_format_convert-v3.docx.pdf\">The Tool to Handle HDF5 File Format Compatibility for Chunked Datasets</a>"
|
||||
ALIASES += ref_rfc20150212="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC_H5LTget_hardlinkds.docx.pdf\"><tt>H5LTget_hardlinks</tt> – High-level API to list all the hard links to an object</a>"
|
||||
ALIASES += ref_rfc20150205="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC_F2003_v6.docx.pdf\">HDF5 Fortran Wrappers Maintenance: Dropping Support for Non-Fortran 2003 Standard Compliant Compilers</a>"
|
||||
ALIASES += ref_rfc20150202="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC%20New%20Autotools%20Behavior.docx.pdf\">New Autotools Behavior</a>"
|
||||
ALIASES += ref_rfc20141210="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/HDF5-VDS-requirements-use-cases-2014-12-10.pdf\">HDF5 Virtual Dataset</a>"
|
||||
ALIASES += ref_rfc20141201="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC%20filter%20memory%20issues%20on%20Windows.docx.pdf\">Allocate/Free Mismatches in HDF5 Filter Code on Windows</a>"
|
||||
ALIASES += ref_rfc20140916="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC_VOL.pdf\">Virtual Object Layer</a>"
|
||||
ALIASES += ref_rfc20140827="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/CompressNChunk_RFC.pdf\">Chunking and Compression Performance Tool Requirements</a>"
|
||||
ALIASES += ref_rfc20140729="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/h5fis_accessible.pdf\">Replacing H5Fis_hdf5() with H5Fis_accessible()</a>"
|
||||
ALIASES += ref_rfc20140722="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/64bit_hid_t-v1.docx.pdf\">Switching to a 64-bit <tt>hid_t</tt> Space in HDF5</a>"
|
||||
ALIASES += ref_rfc20140717="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/analysis_ext.pdf\">Data Analysis Extensions</a>"
|
||||
ALIASES += ref_rfc20140707="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/2014-08-28-RFC_VOL.pdf\">Virtual Object Layer</a>"
|
||||
ALIASES += ref_rfc20140524="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC-Why%20does%20not%20compression%20work-GH-EP.docx.pdf\">HDF5 Compression Demystified</a>"
|
||||
ALIASES += ref_rfc20140318="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC%20H5free_memory%20v2.pdf\">Freeing Memory Allocated by the HDF5 Library</a>"
|
||||
ALIASES += ref_rfc20140313="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC-Compat-Tool-v2.docx.pdf\">Options to handle compatibility issues for HDF5 files</a>"
|
||||
ALIASES += ref_rfc20140224="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/Design-MetadataCache-Logging-THG20140224-v4.pdf\">Design: Metadata Cache Logging</a>"
|
||||
ALIASES += ref_rfc20131211="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC%20H5Ocork%20v5%20new%20fxn%20names.pdf\">Fine-Grained Control of Metadata Cache Flushes</a>"
|
||||
ALIASES += ref_rfc20130930="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC-Read-Attempts-for-Metadata-with-Checksum-v3.pdf\">Read Attempts for Metadata with Checksum</a>"
|
||||
ALIASES += ref_rfc20130919="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/core%20CFD%20paging%20v5.docx.pdf\">Core VFD Backing Store Paged Writes</a>"
|
||||
ALIASES += ref_rfc20130630="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/Design-HDF5-FlushDependencyTesting-20130630-v1.1.pdf\">Flush Dependency Testing</a>"
|
||||
ALIASES += ref_rfc20130316="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/HDF5DynamicallyLoadedFilters.pdf\">HDF5 Dynamically Loaded Filters</a>"
|
||||
ALIASES += ref_rfc20121114="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/DECTRIS%20Integration%20RFC%202012-11-29.pdf\">Direct Chunk Write</a>"
|
||||
ALIASES += ref_rfc20121024="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/FileSpaceManagement.pdf\">HDF5 File Space Management</a>"
|
||||
ALIASES += ref_rfc20120828="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/H5HPC_MultiDset_RW_IO_RFC.pdf\">New HDF5 API Routines for HPC Applications - Read/Write Multiple Datasets in an HDF5 file</a>"
|
||||
ALIASES += ref_rfc20120523="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/paged_aggregation.pdf\">HDF5 File Space Management: Paged Aggregation</a>"
|
||||
ALIASES += ref_rfc20120501="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/HDF5FileImageOperations.pdf\">HDF5 File Image Operations</a>"
|
||||
ALIASES += ref_rfc20120305="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC%20PHDF5%20Consistency%20Semantics%20MC%20120328.docx.pdf\">Enabling a Strict Consistency Semantics Model in Parallel HDF5</a>"
|
||||
ALIASES += ref_rfc20120220="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/h5repack_improve_hyperslab_over_chunked_dataset_v1.pdf\"><tt>h5repack</tt>: Improved Hyperslab selections for Large Chunked Datasets</a>"
|
||||
ALIASES += ref_rfc20120120="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/2012-1-25-Maintainers-guide-for-datatype.docx.pdf\">A Maintainer's Guide for the Datatype Module in HDF5 Library</a>"
|
||||
ALIASES += ref_rfc20120104="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC_actual_io_v4-1_done.docx.pdf\">Actual I/O Mode</a>"
|
||||
ALIASES += ref_rfc20111119="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC-H5Ocompare-review_v6.pdf\">New public functions to handle comparison</a>"
|
||||
ALIASES += ref_rfc20110825="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/2011-08-31-RFC_H5Ocopy_Named_DT_v2.docx.pdf\">Merging Named Datatypes in H5Ocopy()</a>"
|
||||
ALIASES += ref_rfc20110811="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC_Enhancement_Hyperslab_Selection-1.4.docx.pdf\">Expanding the HDF5 Hyperslab Selection Interface</a>"
|
||||
ALIASES += ref_rfc20110726="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/metadata_aggregation_RFC_v03.docx.pdf\">HDF5 File Space Allocation and Aggregation</a>"
|
||||
ALIASES += ref_rfc20110614="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC_h5dump_refactor_v3.docx.pdf\"> Refactor <tt>h5dump</tt> to Improve Maintenance</a>"
|
||||
ALIASES += ref_rfc20110329="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC_Tools_Extlink_Cache_v3_r2.docx.pdf\">Support External Link Open File Cache in HDF5 Tools</a>"
|
||||
ALIASES += ref_rfc20110118="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC%20for%20h5diff%20Attribute%20Comparisons_v7.docx.pdf\"><tt>h5diff</tt> Attribute Comparisons</a>"
|
||||
ALIASES += ref_rfc20101122="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC_swmr_timeouts_v2.docx.pdf\">SWMR Timeouts</a>"
|
||||
ALIASES += ref_rfc20101104="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/CacheExternalLinkFileOpens.pdf\">Caching Files Opened Through External Links</a>"
|
||||
ALIASES += ref_rfc20101018="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/HDF5-comparisons_v3-RFC-2011-08-03.pdf\">HDF5 File and Object Comparison Specification</a>"
|
||||
ALIASES += ref_rfc20100902="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/H5edit-RFC-Draft-v5.pdf\"><tt>h5edit</tt> – An HDF5 File Editing Tool</a>"
|
||||
ALIASES += ref_rfc20100727="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC_HDF5_reservedCharacters-v2.pdf\">Reserved Characters for HDF5 Applications</a>"
|
||||
ALIASES += ref_rfc20100726="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/H5HPC_RFC-2010-09-28.pdf\">High-Level HDF5 API routines for HPC Applications</a>"
|
||||
ALIASES += ref_rfc20100511="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC_h5diff_exclude_obj_v1_3.pdf\"><tt>h5diff</tt> – Exclude Object(s) from Comparison</a>"
|
||||
ALIASES += ref_rfc20100422="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC_gen_attribute_tool_v2_f.pdf\">Generating attributes into an object with a tool</a>"
|
||||
ALIASES += ref_rfc20100312="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC_Support_HDF518_in_Tools.pdf\">Supporting HDF5 1.8 in HDF5 Command Line Tools</a>"
|
||||
ALIASES += ref_rfc20091218="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RCF_h5diff_link_v1.2.docx.pdf\">Supporting soft-link and external-link for <tt>h5diff</tt></a>"
|
||||
ALIASES += ref_rfc20090907="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC_Tools_Lib_v2.pdf\">HDF5 Tools Library Functions</a>"
|
||||
ALIASES += ref_rfc20090612="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC_h5diff_default_epsilon.pdf\">Default EPSILON values for comparing floating point data</a>"
|
||||
ALIASES += ref_rfc20081218="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC_h5diff_NonComparable.pdf\">Reporting of Non-Comparable Datasets by <tt>h5diff</tt></a>"
|
||||
ALIASES += ref_rfc20081205="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC_elink_callback.pdf\">External Link Traversal Callback</a>"
|
||||
ALIASES += ref_rfc20081030="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC_chunk_cache_functions.pdf\">Setting Raw Data Chunk Cache Parameters in HDF5</a>"
|
||||
ALIASES += ref_rfc20080915="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/FileFreeSpacePerformance.pdf\">Performance Report for Free-space Manager</a>"
|
||||
ALIASES += ref_rfc20080904="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/ExternalLinkFileAccessProperty.pdf\">Setting File Access Property List for accessing External Link</a>"
|
||||
ALIASES += ref_rfc20080728="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC_Native_Time_Types.pdf\">Native Time Types in HDF5</a>"
|
||||
ALIASES += ref_rfc20080723="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC_Special_Values_in_HDF5.pdf\">Special Values in HDF5</a>"
|
||||
ALIASES += ref_rfc20080301="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/DynamicTransformations_RFC.pdf\">Dynamic Transformations to HDF5 Data</a>"
|
||||
ALIASES += ref_rfc20080209="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC-Using-SVN-branching-Feb9.pdf\">Using SVN branching to improve software development process at THG</a>"
|
||||
ALIASES += ref_rfc20080206="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC-HIS-REL-1.8_Feb6.pdf\">Maintaining the <tt>HISTORY.txt</tt> and <tt>RELEASE.txt</tt> files in HDF5</a>"
|
||||
ALIASES += ref_rfc20071111="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/AURA-corruption-2007-11-12.pdf\">Addressing HDF5 file corruption issue</a>"
|
||||
ALIASES += ref_rfc20071018="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/RFC_NaNsHDF5.pdf\"><tt>NaN</tt> detection in HDF5</a>"
|
||||
ALIASES += ref_rfc20070801="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/Metadata_Journaling_RFC.pdf\">Metadata Journaling to Improve Crash Survivability</a>"
|
||||
ALIASES += ref_rfc20070413="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/API_Compatibility_RFC.txt.pdf\">API Compatibility Strategies for HDF5</a>"
|
||||
ALIASES += ref_rfc20070115="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/PrivateHeap.pdf\">A \"Private\" Heap for HDF5</a>"
|
||||
ALIASES += ref_rfc20060623="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/coll_ind_dd6.pdf\">Performance Comparison of Collective I/O and Independent I/O with Derived Datatypes</a>"
|
||||
ALIASES += ref_rfc20060604="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/h5stat_spec_v3_2006-06-04.pdf\"><tt>h5stat</tt> tool</a>"
|
||||
ALIASES += ref_rfc20060505="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/Simple%20Performance%20Test%20on%20Fletcher32%20Filter.pdf\">Simple Performance Test on Fletcher32 Filter</a>"
|
||||
ALIASES += ref_rfc20060410="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/h5chk_Requirements.pdf\">Requirement Specifications of an HDF5 File Format Validation Tool</a>"
|
||||
ALIASES += ref_rfc20060317="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/sec2driver-RFC.pdf\">Proposed changes to the <tt>sec2</tt> driver </a>"
|
||||
ALIASES += ref_rfc20060124="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/FITS%20to%20HDF5%20mapping.pdf\">Mapping FITS data to HDF5</a>"
|
||||
ALIASES += ref_rfc20040811="<a href=\"https://docs.hdfgroup.org/hdf5/rfc/text-dtype.htm.pdf\">Conversion Between Text and Datatype</a>"
|
||||
ALIASES += ref_rfc20220819="<a href=\"https://\RFCURL/Terminal_VOL_Connector_Feature_Flags.pdf\">Terminal VOL Connector Feature Flags</a>"
|
||||
ALIASES += ref_rfc20210528="<a href=\"https://\RFCURL/RFC_multi_thread.pdf\">Multi-Thread HDF5</a>"
|
||||
ALIASES += ref_rfc20210219="<a href=\"https://\RFCURL/selection_io_RFC_210610.pdf\">Selection I/O</a>"
|
||||
ALIASES += ref_rfc20200213="<a href=\"https://\RFCURL/RFC_VFD_subfiling_200424.pdf\">VFD Sub-filing</a>"
|
||||
ALIASES += ref_rfc20200210="<a href=\"https://\RFCURL/Onion_VFD_RFC_211122.pdf\">Onion VFD</a>"
|
||||
ALIASES += ref_rfc20190923="<a href=\"https://\RFCURL/2019-09-23-RFC_VOL_feature_flags.pdf\">Virtual Object Layer (VOL) API Compatibility</a>"
|
||||
ALIASES += ref_rfc20190715="<a href=\"https://\RFCURL/var_len_data_sketch_design_190715.pdf\">Variable-Length Data in HDF5 Sketch Design</a>"
|
||||
ALIASES += ref_rfc20190410="<a href=\"https://\RFCURL/RFC_VFD_Plugin.docx.pdf\">A Plugin Interface for HDF5 Virtual File Drivers</a>"
|
||||
ALIASES += ref_rfc20181231="<a href=\"https://\RFCURL/RFC_Min_Obj_Headers_181231.pdf\">Dataset Object Header Size</a>"
|
||||
ALIASES += ref_rfc20181220="<a href=\"https://\RFCURL/3.2.1_3.2.2_deliverable_181220_v4.pdf\">MS 3.2 – Addressing Scalability: Scalability of open, close, flush CASE STUDY: CGNS Hotspot analysis of CGNS cgp_open</a>"
|
||||
ALIASES += ref_rfc20180830="<a href=\"https://\RFCURL/RFC_Sparse_Chunks180830.pdf\">Sparse Chunks</a>"
|
||||
ALIASES += ref_rfc20180829="<a href=\"https://\RFCURL/mirror_VFD_RFC_2018-10-05.pdf\">H5FD_MIRROR Virtual File Driver</a>"
|
||||
ALIASES += ref_rfc20180815="<a href=\"https://\RFCURL/splitter_VFD_RFC_180830.pdf\">Splitter_VFD</a>"
|
||||
ALIASES += ref_rfc20180712="<a href=\"https://\RFCURL/RFC_Update_to_HDF5_References.pdf\">Update to HDF5 References</a>"
|
||||
ALIASES += ref_rfc20180620="<a href=\"https://\RFCURL/RFC-Chunking%20Functions-2018-06-20-v3.docx.pdf\">Chunk query functionality in HDF5</a>"
|
||||
ALIASES += ref_rfc20180610="<a href=\"https://\RFCURL/VFD_SWMR_RFC_220519.pdf\">VFD SWMR</a>"
|
||||
ALIASES += ref_rfc20180321="<a href=\"https://\RFCURL/RFC-API_Contexts-2018-03-21.docx.pdf\">API Contexts</a>"
|
||||
ALIASES += ref_rfc20180125="<a href=\"https://\RFCURL/enhance_h5clear.docx.pdf\">Enhancement to the tool <tt>h5clear</tt></a>"
|
||||
ALIASES += ref_rfc20170707="<a href=\"https://\RFCURL/H5Sencode_format.docx.pdf\"><tt>H5Sencode/H5Sdecode</tt> Format Change</a>"
|
||||
ALIASES += ref_rfc20160105="<a href=\"https://\RFCURL/RFC-bounds.pdf\">Setting Bounds for Object Creation in HDF5 1.10.0</a>"
|
||||
ALIASES += ref_rfc20150915="<a href=\"https://\RFCURL/2015-09-28-RFC-HDF5-1.10.0-File-Format-Superblock-Changes-EP.docx.pdf\">File Format Changes in HDF5 1.10.0</a>"
|
||||
ALIASES += ref_rfc20150709="<a href=\"https://\RFCURL/RFC-Page_Buffering.pdf\">Page Buffering</a>"
|
||||
ALIASES += ref_rfc20150615="<a href=\"https://\RFCURL/cache_image_RFC_150929-QAK.docx.pdf\">Metadata Cache Image</a>"
|
||||
ALIASES += ref_rfc20150429="<a href=\"https://\RFCURL/new_datatypes.pdf\">New Datatypes</a>"
|
||||
ALIASES += ref_rfc20150424="<a href=\"https://\RFCURL/RFC-CollectiveMetadataWrites.pdf\">Collective Metadata Writes</a>"
|
||||
ALIASES += ref_rfc20150423="<a href=\"https://\RFCURL/RFC-CollectiveMetadataReads.pdf\">Enabling Collective Metadata Reads</a>"
|
||||
ALIASES += ref_rfc20150301="<a href=\"https://\RFCURL/sent_RFC_format_convert-v3.docx.pdf\">The Tool to Handle HDF5 File Format Compatibility for Chunked Datasets</a>"
|
||||
ALIASES += ref_rfc20150212="<a href=\"https://\RFCURL/RFC_H5LTget_hardlinkds.docx.pdf\"><tt>H5LTget_hardlinks</tt> – High-level API to list all the hard links to an object</a>"
|
||||
ALIASES += ref_rfc20150205="<a href=\"https://\RFCURL/RFC_F2003_v6.docx.pdf\">HDF5 Fortran Wrappers Maintenance: Dropping Support for Non-Fortran 2003 Standard Compliant Compilers</a>"
|
||||
ALIASES += ref_rfc20150202="<a href=\"https://\RFCURL/RFC%20New%20Autotools%20Behavior.docx.pdf\">New Autotools Behavior</a>"
|
||||
ALIASES += ref_rfc20141210="<a href=\"https://\RFCURL/HDF5-VDS-requirements-use-cases-2014-12-10.pdf\">HDF5 Virtual Dataset</a>"
|
||||
ALIASES += ref_rfc20141201="<a href=\"https://\RFCURL/RFC%20filter%20memory%20issues%20on%20Windows.docx.pdf\">Allocate/Free Mismatches in HDF5 Filter Code on Windows</a>"
|
||||
ALIASES += ref_rfc20140916="<a href=\"https://\RFCURL/RFC_VOL.pdf\">Virtual Object Layer</a>"
|
||||
ALIASES += ref_rfc20140827="<a href=\"https://\RFCURL/CompressNChunk_RFC.pdf\">Chunking and Compression Performance Tool Requirements</a>"
|
||||
ALIASES += ref_rfc20140729="<a href=\"https://\RFCURL/h5fis_accessible.pdf\">Replacing H5Fis_hdf5() with H5Fis_accessible()</a>"
|
||||
ALIASES += ref_rfc20140722="<a href=\"https://\RFCURL/64bit_hid_t-v1.docx.pdf\">Switching to a 64-bit <tt>hid_t</tt> Space in HDF5</a>"
|
||||
ALIASES += ref_rfc20140717="<a href=\"https://\RFCURL/analysis_ext.pdf\">Data Analysis Extensions</a>"
|
||||
ALIASES += ref_rfc20140707="<a href=\"https://\RFCURL/2014-08-28-RFC_VOL.pdf\">Virtual Object Layer</a>"
|
||||
ALIASES += ref_rfc20140524="<a href=\"https://\RFCURL/RFC-Why%20does%20not%20compression%20work-GH-EP.docx.pdf\">HDF5 Compression Demystified</a>"
|
||||
ALIASES += ref_rfc20140318="<a href=\"https://\RFCURL/RFC%20H5free_memory%20v2.pdf\">Freeing Memory Allocated by the HDF5 Library</a>"
|
||||
ALIASES += ref_rfc20140313="<a href=\"https://\RFCURL/RFC-Compat-Tool-v2.docx.pdf\">Options to handle compatibility issues for HDF5 files</a>"
|
||||
ALIASES += ref_rfc20140224="<a href=\"https://\RFCURL/Design-MetadataCache-Logging-THG20140224-v4.pdf\">Design: Metadata Cache Logging</a>"
|
||||
ALIASES += ref_rfc20131211="<a href=\"https://\RFCURL/RFC%20H5Ocork%20v5%20new%20fxn%20names.pdf\">Fine-Grained Control of Metadata Cache Flushes</a>"
|
||||
ALIASES += ref_rfc20130930="<a href=\"https://\RFCURL/RFC-Read-Attempts-for-Metadata-with-Checksum-v3.pdf\">Read Attempts for Metadata with Checksum</a>"
|
||||
ALIASES += ref_rfc20130919="<a href=\"https://\RFCURL/core%20CFD%20paging%20v5.docx.pdf\">Core VFD Backing Store Paged Writes</a>"
|
||||
ALIASES += ref_rfc20130630="<a href=\"https://\RFCURL/Design-HDF5-FlushDependencyTesting-20130630-v1.1.pdf\">Flush Dependency Testing</a>"
|
||||
ALIASES += ref_rfc20130316="<a href=\"https://\RFCURL/HDF5DynamicallyLoadedFilters.pdf\">HDF5 Dynamically Loaded Filters</a>"
|
||||
ALIASES += ref_rfc20121114="<a href=\"https://\RFCURL/DECTRIS%20Integration%20RFC%202012-11-29.pdf\">Direct Chunk Write</a>"
|
||||
ALIASES += ref_rfc20121024="<a href=\"https://\RFCURL/FileSpaceManagement.pdf\">HDF5 File Space Management</a>"
|
||||
ALIASES += ref_rfc20120828="<a href=\"https://\RFCURL/H5HPC_MultiDset_RW_IO_RFC.pdf\">New HDF5 API Routines for HPC Applications - Read/Write Multiple Datasets in an HDF5 file</a>"
|
||||
ALIASES += ref_rfc20120523="<a href=\"https://\RFCURL/paged_aggregation.pdf\">HDF5 File Space Management: Paged Aggregation</a>"
|
||||
ALIASES += ref_rfc20120501="<a href=\"https://\RFCURL/HDF5FileImageOperations.pdf\">HDF5 File Image Operations</a>"
|
||||
ALIASES += ref_rfc20120305="<a href=\"https://\RFCURL/RFC%20PHDF5%20Consistency%20Semantics%20MC%20120328.docx.pdf\">Enabling a Strict Consistency Semantics Model in Parallel HDF5</a>"
|
||||
ALIASES += ref_rfc20120220="<a href=\"https://\RFCURL/h5repack_improve_hyperslab_over_chunked_dataset_v1.pdf\"><tt>h5repack</tt>: Improved Hyperslab selections for Large Chunked Datasets</a>"
|
||||
ALIASES += ref_rfc20120120="<a href=\"https://\RFCURL/2012-1-25-Maintainers-guide-for-datatype.docx.pdf\">A Maintainer's Guide for the Datatype Module in HDF5 Library</a>"
|
||||
ALIASES += ref_rfc20120104="<a href=\"https://\RFCURL/RFC_actual_io_v4-1_done.docx.pdf\">Actual I/O Mode</a>"
|
||||
ALIASES += ref_rfc20111119="<a href=\"https://\RFCURL/RFC-H5Ocompare-review_v6.pdf\">New public functions to handle comparison</a>"
|
||||
ALIASES += ref_rfc20110825="<a href=\"https://\RFCURL/2011-08-31-RFC_H5Ocopy_Named_DT_v2.docx.pdf\">Merging Named Datatypes in H5Ocopy()</a>"
|
||||
ALIASES += ref_rfc20110811="<a href=\"https://\RFCURL/RFC_Enhancement_Hyperslab_Selection-1.4.docx.pdf\">Expanding the HDF5 Hyperslab Selection Interface</a>"
|
||||
ALIASES += ref_rfc20110726="<a href=\"https://\RFCURL/metadata_aggregation_RFC_v03.docx.pdf\">HDF5 File Space Allocation and Aggregation</a>"
|
||||
ALIASES += ref_rfc20110614="<a href=\"https://\RFCURL/RFC_h5dump_refactor_v3.docx.pdf\"> Refactor <tt>h5dump</tt> to Improve Maintenance</a>"
|
||||
ALIASES += ref_rfc20110329="<a href=\"https://\RFCURL/RFC_Tools_Extlink_Cache_v3_r2.docx.pdf\">Support External Link Open File Cache in HDF5 Tools</a>"
|
||||
ALIASES += ref_rfc20110118="<a href=\"https://\RFCURL/RFC%20for%20h5diff%20Attribute%20Comparisons_v7.docx.pdf\"><tt>h5diff</tt> Attribute Comparisons</a>"
|
||||
ALIASES += ref_rfc20101122="<a href=\"https://\RFCURL/RFC_swmr_timeouts_v2.docx.pdf\">SWMR Timeouts</a>"
|
||||
ALIASES += ref_rfc20101104="<a href=\"https://\RFCURL/CacheExternalLinkFileOpens.pdf\">Caching Files Opened Through External Links</a>"
|
||||
ALIASES += ref_rfc20101018="<a href=\"https://\RFCURL/HDF5-comparisons_v3-RFC-2011-08-03.pdf\">HDF5 File and Object Comparison Specification</a>"
|
||||
ALIASES += ref_rfc20100902="<a href=\"https://\RFCURL/H5edit-RFC-Draft-v5.pdf\"><tt>h5edit</tt> – An HDF5 File Editing Tool</a>"
|
||||
ALIASES += ref_rfc20100727="<a href=\"https://\RFCURL/RFC_HDF5_reservedCharacters-v2.pdf\">Reserved Characters for HDF5 Applications</a>"
|
||||
ALIASES += ref_rfc20100726="<a href=\"https://\RFCURL/H5HPC_RFC-2010-09-28.pdf\">High-Level HDF5 API routines for HPC Applications</a>"
|
||||
ALIASES += ref_rfc20100511="<a href=\"https://\RFCURL/RFC_h5diff_exclude_obj_v1_3.pdf\"><tt>h5diff</tt> – Exclude Object(s) from Comparison</a>"
|
||||
ALIASES += ref_rfc20100422="<a href=\"https://\RFCURL/RFC_gen_attribute_tool_v2_f.pdf\">Generating attributes into an object with a tool</a>"
|
||||
ALIASES += ref_rfc20100312="<a href=\"https://\RFCURL/RFC_Support_HDF518_in_Tools.pdf\">Supporting HDF5 1.8 in HDF5 Command Line Tools</a>"
|
||||
ALIASES += ref_rfc20091218="<a href=\"https://\RFCURL/RCF_h5diff_link_v1.2.docx.pdf\">Supporting soft-link and external-link for <tt>h5diff</tt></a>"
|
||||
ALIASES += ref_rfc20090907="<a href=\"https://\RFCURL/RFC_Tools_Lib_v2.pdf\">HDF5 Tools Library Functions</a>"
|
||||
ALIASES += ref_rfc20090612="<a href=\"https://\RFCURL/RFC_h5diff_default_epsilon.pdf\">Default EPSILON values for comparing floating point data</a>"
|
||||
ALIASES += ref_rfc20081218="<a href=\"https://\RFCURL/RFC_h5diff_NonComparable.pdf\">Reporting of Non-Comparable Datasets by <tt>h5diff</tt></a>"
|
||||
ALIASES += ref_rfc20081205="<a href=\"https://\RFCURL/RFC_elink_callback.pdf\">External Link Traversal Callback</a>"
|
||||
ALIASES += ref_rfc20081030="<a href=\"https://\RFCURL/RFC_chunk_cache_functions.pdf\">Setting Raw Data Chunk Cache Parameters in HDF5</a>"
|
||||
ALIASES += ref_rfc20080915="<a href=\"https://\RFCURL/FileFreeSpacePerformance.pdf\">Performance Report for Free-space Manager</a>"
|
||||
ALIASES += ref_rfc20080904="<a href=\"https://\RFCURL/ExternalLinkFileAccessProperty.pdf\">Setting File Access Property List for accessing External Link</a>"
|
||||
ALIASES += ref_rfc20080728="<a href=\"https://\RFCURL/RFC_Native_Time_Types.pdf\">Native Time Types in HDF5</a>"
|
||||
ALIASES += ref_rfc20080723="<a href=\"https://\RFCURL/RFC_Special_Values_in_HDF5.pdf\">Special Values in HDF5</a>"
|
||||
ALIASES += ref_rfc20080301="<a href=\"https://\RFCURL/DynamicTransformations_RFC.pdf\">Dynamic Transformations to HDF5 Data</a>"
|
||||
ALIASES += ref_rfc20080209="<a href=\"https://\RFCURL/RFC-Using-SVN-branching-Feb9.pdf\">Using SVN branching to improve software development process at THG</a>"
|
||||
ALIASES += ref_rfc20080206="<a href=\"https://\RFCURL/RFC-HIS-REL-1.8_Feb6.pdf\">Maintaining the <tt>HISTORY.txt</tt> and <tt>RELEASE.txt</tt> files in HDF5</a>"
|
||||
ALIASES += ref_rfc20071111="<a href=\"https://\RFCURL/AURA-corruption-2007-11-12.pdf\">Addressing HDF5 file corruption issue</a>"
|
||||
ALIASES += ref_rfc20071018="<a href=\"https://\RFCURL/RFC_NaNsHDF5.pdf\"><tt>NaN</tt> detection in HDF5</a>"
|
||||
ALIASES += ref_rfc20070801="<a href=\"https://\RFCURL/Metadata_Journaling_RFC.pdf\">Metadata Journaling to Improve Crash Survivability</a>"
|
||||
ALIASES += ref_rfc20070413="<a href=\"https://\RFCURL/API_Compatibility_RFC.txt.pdf\">API Compatibility Strategies for HDF5</a>"
|
||||
ALIASES += ref_rfc20070115="<a href=\"https://\RFCURL/PrivateHeap.pdf\">A \"Private\" Heap for HDF5</a>"
|
||||
ALIASES += ref_rfc20060623="<a href=\"https://\RFCURL/coll_ind_dd6.pdf\">Performance Comparison of Collective I/O and Independent I/O with Derived Datatypes</a>"
|
||||
ALIASES += ref_rfc20060604="<a href=\"https://\RFCURL/h5stat_spec_v3_2006-06-04.pdf\"><tt>h5stat</tt> tool</a>"
|
||||
ALIASES += ref_rfc20060505="<a href=\"https://\RFCURL/Simple%20Performance%20Test%20on%20Fletcher32%20Filter.pdf\">Simple Performance Test on Fletcher32 Filter</a>"
|
||||
ALIASES += ref_rfc20060410="<a href=\"https://\RFCURL/h5chk_Requirements.pdf\">Requirement Specifications of an HDF5 File Format Validation Tool</a>"
|
||||
ALIASES += ref_rfc20060317="<a href=\"https://\RFCURL/sec2driver-RFC.pdf\">Proposed changes to the <tt>sec2</tt> driver </a>"
|
||||
ALIASES += ref_rfc20060124="<a href=\"https://\RFCURL/FITS%20to%20HDF5%20mapping.pdf\">Mapping FITS data to HDF5</a>"
|
||||
ALIASES += ref_rfc20040811="<a href=\"https://\RFCURL/text-dtype.htm.pdf\">Conversion Between Text and Datatype</a>"
|
||||
|
||||
################################################################################
|
||||
# The Usual Suspects
|
||||
|
||||
@@ -23,7 +23,7 @@ Use Doxygen's <a href="https://www.doxygen.nl/manual/commands.html#cmdhtmlinclud
|
||||
special command to include existing plain HTML pages.
|
||||
|
||||
An example from this documentation set can be seen
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/doxygen/dox/FileFormatSpec.dox">here</a>.
|
||||
<a href="https://\SRCURL/doxygen/dox/FileFormatSpec.dox">here</a>.
|
||||
|
||||
\subsection new_rm_entry Creating a New Reference Manual Entry
|
||||
|
||||
@@ -33,7 +33,7 @@ Please refer to the \ref RMT for guidance on how to create a new reference manua
|
||||
|
||||
For each HDF5 module, such as \Code{H5F}, there is an examples source file called
|
||||
\Code{H5*_examples.c}. For example, the \Code{H5F} API examples are located in
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/doxygen/examples/H5F_examples.c">
|
||||
<a href="https://\SRCURL/doxygen/examples/H5F_examples.c">
|
||||
<code>H5F_examples.c</code></a>. Examples are code blocks marked as Doxygen
|
||||
<a href="https://www.doxygen.nl/manual/commands.html#cmdsnippet">snippets</a>.
|
||||
For example, the source code for the H5Fcreate() API sample is located between
|
||||
@@ -44,7 +44,7 @@ the
|
||||
//! <!-- [create] -->
|
||||
\endverbatim
|
||||
comments in
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/doxygen/examples/H5F_examples.c">
|
||||
<a href="https://\SRCURL/doxygen/examples/H5F_examples.c">
|
||||
<code>H5F_examples.c</code></a>.
|
||||
|
||||
Add a new API example by adding a new code block enclosed between matching
|
||||
@@ -80,7 +80,7 @@ See Doxygen's <a href="https://www.doxygen.nl/manual/custcmd.html">Custom Comman
|
||||
as a general reference.
|
||||
|
||||
All custom commands for this project are located in the
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/doxygen/aliases"><tt>aliases</tt></a>
|
||||
<a href="https://\SRCURL/doxygen/aliases"><tt>aliases</tt></a>
|
||||
file in the <a href="https://github.com/HDFGroup/hdf5/tree/hdf5_1_14/doxygen"><tt>doxygen</tt></a>
|
||||
subdirectory of the <a href="https://github.com/HDFGroup/hdf5">main HDF5 repo</a>.
|
||||
|
||||
@@ -91,7 +91,7 @@ ask for help if unsure!
|
||||
|
||||
For ease of reference, we define custom commands for each RFC in the <tt>RFCs</tt> section
|
||||
of the
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/doxygen/aliases"><tt>aliases</tt></a>
|
||||
<a href="https://\SRCURL/doxygen/aliases"><tt>aliases</tt></a>
|
||||
file. For example the custom command \Code{ref_rfc20141210} can be used to insert a
|
||||
reference to "RFC: Virtual Object Layer". In other words, the markup
|
||||
\verbatim
|
||||
@@ -102,16 +102,16 @@ yields a clickable link:
|
||||
\ref_rfc20141210
|
||||
|
||||
To add a new RFC, add a custom command for the RFC to the
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/doxygen/aliases"><tt>aliases</tt></a>
|
||||
<a href="https://\SRCURL/doxygen/aliases"><tt>aliases</tt></a>
|
||||
file. The naming convention for the custom command is \Code{ref_rfcYYYYMMDD},
|
||||
where \Code{YYYYMMDD} is the ID of the RFC. The URL is composed of the prefix
|
||||
\verbatim
|
||||
https://docs.hdfgroup.org/hdf5/rfc/
|
||||
https://\RFCURL/
|
||||
\endverbatim
|
||||
and the name of your RFC file, typically, a PDF file, i.e., the full URL would
|
||||
be
|
||||
\verbatim
|
||||
https://docs.hdfgroup.org/hdf5/rfc/my_great_rfc_name.pdf
|
||||
https://\RFCURL/my_great_rfc_name.pdf
|
||||
\endverbatim
|
||||
|
||||
\subsection hosting How Do Updates and Changes Get Published?
|
||||
|
||||
+310
-311
@@ -27,236 +27,236 @@ Languages are C, Fortran, Java (JHI5), Java Object Package, Python (High Level),
|
||||
<tr>
|
||||
<td>Set Space Allocation Time for Dataset</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/h5ex_d_alloc.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5D/h5ex_d_alloc.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5D/H5Ex_D_Alloc.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_alloc.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5D/h5ex_d_alloc.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_Alloc.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Alloc.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_d_alloc.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/16/h5ex_d_alloc.tst">h5ex_d_alloc.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/16/h5ex_d_alloc.ddl">h5ex_d_alloc.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/16/h5ex_d_alloc.tst">h5ex_d_alloc.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/16/h5ex_d_alloc.ddl">h5ex_d_alloc.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Dataset using Fletcher32 Checksum Filter</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/h5ex_d_checksum.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5D/h5ex_d_checksum.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5D/H5Ex_D_Checksum.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_checksum.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5D/h5ex_d_checksum.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_Checksum.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Checksum.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_d_checksum.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/16/h5ex_d_checksum.tst">h5ex_d_checksum.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/16/h5ex_d_checksum.ddl">h5ex_d_checksum.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/16/h5ex_d_checksum.tst">h5ex_d_checksum.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/16/h5ex_d_checksum.ddl">h5ex_d_checksum.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Chunked Dataset</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/h5ex_d_chunk.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5D/h5ex_d_chunk.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5D/H5Ex_D_Chunk.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_chunk.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5D/h5ex_d_chunk.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_Chunk.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Chunk.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_d_chunk.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/16/h5ex_d_chunk.tst">h5ex_d_chunk.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/16/h5ex_d_chunk.ddl">h5ex_d_chunk.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/16/h5ex_d_chunk.tst">h5ex_d_chunk.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/16/h5ex_d_chunk.ddl">h5ex_d_chunk.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Compact Dataset</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/h5ex_d_compact.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5D/h5ex_d_compact.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5D/H5Ex_D_Compact.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_compact.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5D/h5ex_d_compact.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_Compact.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Compact.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_d_compact.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/16/h5ex_d_compact.tst">h5ex_d_compact.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/16/h5ex_d_compact.ddl">h5ex_d_compact.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/16/h5ex_d_compact.tst">h5ex_d_compact.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/16/h5ex_d_compact.ddl">h5ex_d_compact.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write to External Dataset</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/h5ex_d_extern.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5D/h5ex_d_extern.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5D/H5Ex_D_External.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_extern.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5D/h5ex_d_extern.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_External.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_External.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_d_extern.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/16/h5ex_d_extern.tst">h5ex_d_extern.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/16/h5ex_d_extern.ddl">h5ex_d_extern.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/16/h5ex_d_extern.tst">h5ex_d_extern.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/16/h5ex_d_extern.ddl">h5ex_d_extern.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Dataset w/ Fill Value</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/h5ex_d_fillval.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5D/h5ex_d_fillval.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5D/H5Ex_D_FillValue.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_fillval.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5D/h5ex_d_fillval.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_FillValue.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_FillValue.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_d_fillval.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/16/h5ex_d_fillval.tst">h5ex_d_fillval.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/16/h5ex_d_fillval.ddl">h5ex_d_fillval.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/16/h5ex_d_fillval.tst">h5ex_d_fillval.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/16/h5ex_d_fillval.ddl">h5ex_d_fillval.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write GZIP Compressed Dataset</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/h5ex_d_gzip.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5D/h5ex_d_gzip.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5D/H5Ex_D_Gzip.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_gzip.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5D/h5ex_d_gzip.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_Gzip.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Gzip.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_d_gzip.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/16/h5ex_d_gzip.tst">h5ex_d_gzip.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/16/h5ex_d_gzip.ddl">h5ex_d_gzip.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/16/h5ex_d_gzip.tst">h5ex_d_gzip.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/16/h5ex_d_gzip.ddl">h5ex_d_gzip.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Data by Hyperslabs</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/h5ex_d_hyper.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5D/h5ex_d_hyper.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5D/H5Ex_D_Hyperslab.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_hyper.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5D/h5ex_d_hyper.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_Hyperslab.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Hyperslab.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_d_hyper.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/16/h5ex_d_hyper.tst">h5ex_d_hyper.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/16/h5ex_d_hyper.ddl">h5ex_d_hyper.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/16/h5ex_d_hyper.tst">h5ex_d_hyper.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/16/h5ex_d_hyper.ddl">h5ex_d_hyper.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Dataset with n-bit Filter</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/h5ex_d_nbit.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5D/h5ex_d_nbit.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5D/H5Ex_D_Nbit.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_nbit.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5D/h5ex_d_nbit.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_Nbit.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Nbit.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_d_nbit.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/18/h5ex_d_nbit.tst">h5ex_d_nbit.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/18/h5ex_d_nbit.ddl">h5ex_d_nbit.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/18/h5ex_d_nbit.tst">h5ex_d_nbit.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/18/h5ex_d_nbit.ddl">h5ex_d_nbit.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Integer Dataset</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/h5ex_d_rdwr.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5D/h5ex_d_rdwr.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5D/H5Ex_D_ReadWrite.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_rdwr.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5D/h5ex_d_rdwr.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_ReadWrite.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_ReadWrite.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_d_rdwrc.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/16/h5ex_d_rdwrc.tst">h5ex_d_rdwrc.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/16/h5ex_d_rdwr.ddl">h5ex_d_rdwr.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/16/h5ex_d_rdwrc.tst">h5ex_d_rdwrc.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/16/h5ex_d_rdwr.ddl">h5ex_d_rdwr.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Dataset w/ Shuffle Filter and GZIP Compression</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/h5ex_d_shuffle.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_shuffle.c">C</a>
|
||||
FORTRAN
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5D/H5Ex_D_Shuffle.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_Shuffle.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Shuffle.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_d_shuffle.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/16/h5ex_d_shuffle.tst">h5ex_d_shuffle.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/16/h5ex_d_shuffle.ddl">h5ex_d_shuffle.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/16/h5ex_d_shuffle.tst">h5ex_d_shuffle.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/16/h5ex_d_shuffle.ddl">h5ex_d_shuffle.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Dataset using Scale-Offset Filter (float)</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/h5ex_d_sofloat.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_sofloat.c">C</a>
|
||||
FORTRAN
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5D/H5Ex_D_Sofloat.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_Sofloat.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Sofloat.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_d_sofloat.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/18/h5ex_d_sofloat.tst">h5ex_d_sofloat.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/18/h5ex_d_sofloat.ddl">h5ex_d_sofloat.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/18/h5ex_d_sofloat.tst">h5ex_d_sofloat.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/18/h5ex_d_sofloat.ddl">h5ex_d_sofloat.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Dataset using Scale-Offset Filter (integer)</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/h5ex_d_soint.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5D/h5ex_d_soint.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5D/H5Ex_D_Soint.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_soint.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5D/h5ex_d_soint.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_Soint.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Soint.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_d_soint.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/18/h5ex_d_soint.tst">h5ex_d_soint.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/18/h5ex_d_soint.ddl">h5ex_d_soint.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/18/h5ex_d_soint.tst">h5ex_d_soint.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/18/h5ex_d_soint.ddl">h5ex_d_soint.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Dataset using SZIP Compression</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/h5ex_d_szip.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5D/h5ex_d_szip.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5D/H5Ex_D_Szip.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_szip.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5D/h5ex_d_szip.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_Szip.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Szip.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_d_szip.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/16/h5ex_d_szip.tst">h5ex_d_szip.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/16/h5ex_d_szip.ddl">h5ex_d_szip.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/16/h5ex_d_szip.tst">h5ex_d_szip.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/16/h5ex_d_szip.ddl">h5ex_d_szip.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Dataset using Data Transform Expression</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/h5ex_d_transform.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5D/h5ex_d_transform.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5D/H5Ex_D_Transform.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_transform.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5D/h5ex_d_transform.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_Transform.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_Transform.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_d_transform.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/18/h5ex_d_transform.tst">h5ex_d_transform.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/18/h5ex_d_transform.ddl">h5ex_d_transform.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/18/h5ex_d_transform.tst">h5ex_d_transform.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/18/h5ex_d_transform.ddl">h5ex_d_transform.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Unlimited Dimension Dataset</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/h5ex_d_unlimadd.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_unlimadd.c">C</a>
|
||||
FORTRAN
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5D/H5Ex_D_UnlimitedAdd.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_UnlimitedAdd.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_UnlimitedAdd.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_d_unlimadd.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/16/h5ex_d_unlimadd.tst">h5ex_d_unlimadd.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/16/h5ex_d_unlimadd.ddl">h5ex_d_unlimadd.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/16/h5ex_d_unlimadd.tst">h5ex_d_unlimadd.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/16/h5ex_d_unlimadd.ddl">h5ex_d_unlimadd.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write GZIP Compressed Unlimited Dimension Dataset</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/h5ex_d_unlimgzip.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_unlimgzip.c">C</a>
|
||||
FORTRAN
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5D/H5Ex_D_UnlimitedGzip.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_UnlimitedGzip.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_UnlimitedGzip.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_d_unlimgzip.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/16/h5ex_d_unlimgzip.tst">h5ex_d_unlimgzip.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/16/h5ex_d_unlimgzip.ddl">h5ex_d_unlimgzip.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/16/h5ex_d_unlimgzip.tst">h5ex_d_unlimgzip.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/16/h5ex_d_unlimgzip.ddl">h5ex_d_unlimgzip.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write / Edit Unlimited Dimension Dataset</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/h5ex_d_unlimmod.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5D/h5ex_d_unlimmod.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5D/H5Ex_D_UnlimitedMod.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_unlimmod.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5D/h5ex_d_unlimmod.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5D/H5Ex_D_UnlimitedMod.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datasets/H5ObjectEx_D_UnlimitedMod.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_d_unlimmod.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/16/h5ex_d_unlimmod.tst">h5ex_d_unlimmod.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/tfiles/16/h5ex_d_unlimmod.ddl">h5ex_d_unlimmod.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/16/h5ex_d_unlimmod.tst">h5ex_d_unlimmod.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5D/tfiles/16/h5ex_d_unlimmod.ddl">h5ex_d_unlimmod.ddl</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
@@ -272,105 +272,105 @@ FORTRAN
|
||||
<tr>
|
||||
<td>Create "compact-or-indexed" Format Groups</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5G/h5ex_g_compact.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5G/h5ex_g_compact.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5G/H5Ex_G_Compact.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5G/h5ex_g_compact.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5G/h5ex_g_compact.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5G/H5Ex_G_Compact.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/groups/H5ObjectEx_G_Compact.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_g_compact.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5G/tfiles/18/h5ex_g_compact.tst">h5ex_g_.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5G/tfiles/18/h5ex_g_compact1.ddl">h5ex_g_compact1.ddl</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5G/tfiles/18/h5ex_g_compact2.ddl">h5ex_g_compact2.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5G/tfiles/18/h5ex_g_compact.tst">h5ex_g_.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5G/tfiles/18/h5ex_g_compact1.ddl">h5ex_g_compact1.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5G/tfiles/18/h5ex_g_compact2.ddl">h5ex_g_compact2.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Track links in a Group by Creation Order</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5G/h5ex_g_corder.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5G/h5ex_g_corder.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5G/H5Ex_G_Corder.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5G/h5ex_g_corder.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5G/h5ex_g_corder.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5G/H5Ex_G_Corder.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/groups/H5ObjectEx_G_Corder.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_g_corder.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5G/tfiles/18/h5ex_g_corder.tst">h5ex_g_corder.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5G/tfiles/18/h5ex_g_corder.tst">h5ex_g_corder.tst</a></td>
|
||||
<td>h5ex_g_corder.ddl</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Create / Open / Close a Group</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5G/h5ex_g_create.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5G/h5ex_g_create.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5G/H5Ex_G_Create.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5G/h5ex_g_create.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5G/h5ex_g_create.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5G/H5Ex_G_Create.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/groups/H5ObjectEx_G_Create.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_g_create.h5</td>
|
||||
<td>h5ex_g_create.tst</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5G/tfiles/16/h5ex_g_create.ddl">h5ex_g_create.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5G/tfiles/16/h5ex_g_create.ddl">h5ex_g_create.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Create Intermediate Groups</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5G/h5ex_g_intermediate.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5G/h5ex_g_intermediate.c">C</a>
|
||||
FORTRAN
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5G/H5Ex_G_Intermediate.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5G/H5Ex_G_Intermediate.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/groups/H5ObjectEx_G_Intermediate.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_g_intermediate.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5G/tfiles/18/h5ex_g_intermediate.tst">h5ex_g_intermediate.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5G/tfiles/18/h5ex_g_intermediate.tst">h5ex_g_intermediate.tst</a></td>
|
||||
<td>h5ex_g_intermediate.ddl</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Iterate over Groups w/ H5Literate</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5G/h5ex_g_iterate.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5G/h5ex_g_iterate.c">C</a>
|
||||
FORTRAN
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5G/H5Ex_G_Iterate.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5G/H5Ex_G_Iterate.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/groups/H5ObjectEx_G_Iterate.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_g_iterate.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5G/tfiles/16/h5ex_g_iterate.tst">h5ex_g_iterate.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5G/tfiles/16/h5ex_g_iterate.tst">h5ex_g_iterate.tst</a></td>
|
||||
<td>h5ex_g_iterate.ddl</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Set Conditions to Convert between Compact and Dense Groups</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5G/h5ex_g_phase.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5G/h5ex_g_phase.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5G/H5Ex_G_Phase.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5G/h5ex_g_phase.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5G/h5ex_g_phase.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5G/H5Ex_G_Phase.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/groups/H5ObjectEx_G_Phase.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_g_phase.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5G/tfiles/18/h5ex_g_phase.tst">h5ex_g_phase.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5G/tfiles/18/h5ex_g_phase.tst">h5ex_g_phase.tst</a></td>
|
||||
<td>h5ex_g_phase.ddl</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Recursively Traverse a File with H5Literate</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5G/h5ex_g_traverse.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5G/h5ex_g_traverse.c">C</a>
|
||||
FORTRAN
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5G/H5Ex_G_Traverse.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5G/H5Ex_G_Traverse.java">Java</a>
|
||||
JavaObj MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_g_traverse.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5G/tfiles/16/h5ex_g_traverse.tst">h5ex_g_traverse.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5G/tfiles/16/h5ex_g_traverse.tst">h5ex_g_traverse.tst</a></td>
|
||||
<td>h5ex_g_traverse.ddl</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Recursively Traverse a File with H5Ovisit / H5Lvisit</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5G/h5ex_g_visit.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5G/h5ex_g_visit.c">C</a>
|
||||
FORTRAN
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5G/H5Ex_G_Visit.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5G/H5Ex_G_Visit.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/groups/H5ObjectEx_G_Visit.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_g_visit.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5G/tfiles/18/h5ex_g_visit.tst">h5ex_g_visit.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5G/tfiles/18/h5ex_g_visit.tst">h5ex_g_visit.tst</a></td>
|
||||
<td>h5ex_g_visit.ddl</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -387,347 +387,346 @@ FORTRAN
|
||||
<tr>
|
||||
<td>Read / Write Array (Attribute)</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/h5ex_t_arrayatt.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5T/h5ex_t_arrayatt.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5T/H5Ex_T_ArrayAttribute.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_arrayatt.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_arrayatt.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_ArrayAttribute.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_ArrayAttribute.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_t_arrayatt.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/16/h5ex_t_arrayatt.tst">h5ex_t_arrayatt.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/18/h5ex_t_arrayatt.ddl">h5ex_t_arrayatt.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/16/h5ex_t_arrayatt.tst">h5ex_t_arrayatt.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/18/h5ex_t_arrayatt.ddl">h5ex_t_arrayatt.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Array (Dataset)</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/h5ex_t_array.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5T/h5ex_t_array.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5T/H5Ex_T_Array.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_array.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_array.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_Array.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_Array.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_t_array.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/16/h5ex_t_array.tst">h5ex_t_array.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/18/h5ex_t_array.ddl">h5ex_t_array.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/18/h5ex_t_array.ddl">h5ex_t_array.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Bitfield (Attribute)</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/h5ex_t_bitatt.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5T/h5ex_t_bitatt.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5T/H5Ex_T_BitAttribute.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_bitatt.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_bitatt.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_BitAttribute.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_BitAttribute.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_t_bitatt.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/16/h5ex_t_bitatt.tst">h5ex_t_bitatt.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/18/h5ex_t_bitatt.ddl">h5ex_t_bitatt.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/16/h5ex_t_bitatt.tst">h5ex_t_bitatt.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/18/h5ex_t_bitatt.ddl">h5ex_t_bitatt.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Bitfield (Dataset)</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/h5ex_t_bit.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5T/h5ex_t_bit.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5T/H5Ex_T_Bit.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_bit.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_bit.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_Bit.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_Bit.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_t_bit.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/16/h5ex_t_bit.tst">h5ex_t_bit.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/18/h5ex_t_bit.ddl">h5ex_t_bit.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/16/h5ex_t_bit.tst">h5ex_t_bit.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/18/h5ex_t_bit.ddl">h5ex_t_bit.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Compound (Attribute)</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/h5ex_t_cmpdatt.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5T/h5ex_t_cmpdatt.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5T/H5Ex_T_CompoundAttribute.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_cmpdatt.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_cmpdatt.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_CompoundAttribute.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_CompoundAttribute.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_t_cmpdatt.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/16/h5ex_t_cmpdatt.tst">h5ex_t_cmpdatt.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/18/h5ex_t_cmpdatt.ddl">h5ex_t_cmpdatt.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/16/h5ex_t_cmpdatt.tst">h5ex_t_cmpdatt.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/18/h5ex_t_cmpdatt.ddl">h5ex_t_cmpdatt.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Compound (Dataset)</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/h5ex_t_cmpd.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5T/h5ex_t_cmpd.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5T/H5Ex_T_Compound.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_cmpd.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_cmpd.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_Compound.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_Compound.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_t_cmpd.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/16/h5ex_t_cmpd.tst">h5ex_t_cmpd.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/18/h5ex_t_cmpd.ddl">h5ex_t_cmpd.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/16/h5ex_t_cmpd.tst">h5ex_t_cmpd.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/18/h5ex_t_cmpd.ddl">h5ex_t_cmpd.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Commit Named Datatype and Read Back</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/h5ex_t_commit.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_commit.c">C</a>
|
||||
FORTRAN
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5T/H5Ex_T_Commit.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_Commit.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_Commit.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_t_commit.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/16/h5ex_t_commit.tst">h5ex_t_commit.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/18/h5ex_t_commit.ddl">h5ex_t_commit.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/16/h5ex_t_commit.tst">h5ex_t_commit.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/18/h5ex_t_commit.ddl">h5ex_t_commit.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Convert Between Datatypes in Memory</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/h5ex_t_convert.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_convert.c">C</a>
|
||||
FORTRAN Java JavaObj MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_t_convert.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/16/h5ex_t_convert.tst">h5ex_t_convert.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/18/h5ex_t_convert.ddl">h5ex_t_convert.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/16/h5ex_t_convert.tst">h5ex_t_convert.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/18/h5ex_t_convert.ddl">h5ex_t_convert.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Complex Compound (Attribute)</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/h5ex_t_cpxcmpdatt.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_cpxcmpdatt.c">C</a>
|
||||
FORTRAN Java JavaObj MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_t_cpxcmpdatt.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/16/h5ex_t_cpxcmpdatt.tst">h5ex_t_cpxcmpdatt.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/18/h5ex_t_cpxcmpdatt.ddl">h5ex_t_cpxcmpdatt.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/16/h5ex_t_cpxcmpdatt.tst">h5ex_t_cpxcmpdatt.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/18/h5ex_t_cpxcmpdatt.ddl">h5ex_t_cpxcmpdatt.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Complex Compound (Dataset)</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/h5ex_t_cpxcmpd.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_cpxcmpd.c">C</a>
|
||||
FORTRAN Java JavaObj MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_t_cpxcmpd.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/16/h5ex_t_cpxcmpd.tst">h5ex_t_cpxcmpd.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/18/h5ex_t_cpxcmpd.ddl">h5ex_t_cpxcmpd.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/16/h5ex_t_cpxcmpd.tst">h5ex_t_cpxcmpd.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/18/h5ex_t_cpxcmpd.ddl">h5ex_t_cpxcmpd.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Enumerated (Attribute)</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/h5ex_t_enumatt.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5T/h5ex_t_enumatt_F03.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_enumatt.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_enumatt_F03.F90">FORTRAN</a>
|
||||
Java JavaObj MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_t_enumatt.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob//HDF5Examples/C/H5T/tfiles/16/h5ex_t_enumatt.tst">h5ex_t_enumatt.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob//HDF5Examples/C/H5T/tfiles/18/h5ex_t_enumatt.ddl">h5ex_t_enumatt.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/16/h5ex_t_enumatt.tst">h5ex_t_enumatt.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/18/h5ex_t_enumatt.ddl">h5ex_t_enumatt.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Enumerated (Dataset)</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/h5ex_t_enum.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5T/h5ex_t_enum_F03.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_enum.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_enum_F03.F90">FORTRAN</a>
|
||||
Java JavaObj MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_t_enum.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/16/h5ex_t_enum.tst">h5ex_t_enum.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/18/h5ex_t_enum.ddl">h5ex_t_enum.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/16/h5ex_t_enum.tst">h5ex_t_enum.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/18/h5ex_t_enum.ddl">h5ex_t_enum.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Floating Point (Attribute)</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/h5ex_t_floatatt.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5T/h5ex_t_floatatt_F03.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5T/H5Ex_T_FloatAttribute.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_floatatt.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_floatatt_F03.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_FloatAttribute.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_FloatAttribute.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_t_floatatt.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/16/h5ex_t_floatatt.tst">h5ex_t_floatatt.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/18/h5ex_t_floatatt.ddl">h5ex_t_floatatt.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/16/h5ex_t_floatatt.tst">h5ex_t_floatatt.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/18/h5ex_t_floatatt.ddl">h5ex_t_floatatt.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Floating Point (Dataset)</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/h5ex_t_float.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5T/h5ex_t_float_F03.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5T/H5Ex_T_Float.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_float.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_float_F03.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_Float.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_Float.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_t_float.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/16/h5ex_t_float.tst">h5ex_t_float.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/18/h5ex_t_float.ddl">h5ex_t_float.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/16/h5ex_t_float.tst">h5ex_t_float.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/18/h5ex_t_float.ddl">h5ex_t_float.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Integer Datatype (Attribute)</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/h5ex_t_intatt.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5T/h5ex_t_intatt_F03.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5T/H5Ex_T_IntegerAttribute.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_intatt.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_intatt_F03.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_IntegerAttribute.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_IntegerAttribute.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_t_intatt.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/16/h5ex_t_intatt.tst">h5ex_t_intatt.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/18/h5ex_t_intatt.ddl">h5ex_t_intatt.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/16/h5ex_t_intatt.tst">h5ex_t_intatt.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/18/h5ex_t_intatt.ddl">h5ex_t_intatt.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Integer Datatype (Dataset)</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/h5ex_t_int.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5T/h5ex_t_int_F03.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5T/H5Ex_T_Integer.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_int.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_int_F03.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_Integer.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_Integer.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_t_int.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/16/h5ex_t_int.tst">h5ex_t_int.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/18/h5ex_t_int.ddl">h5ex_t_int.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/16/h5ex_t_int.tst">h5ex_t_int.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/18/h5ex_t_int.ddl">h5ex_t_int.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Object References (Attribute)</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/h5ex_t_objrefatt.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5T/h5ex_t_objrefatt_F03.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5T/H5Ex_T_ObjectReferenceAttribute.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_objrefatt.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_objrefatt_F03.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_ObjectReferenceAttribute.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_ObjectReferenceAttribute.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_t_objrefatt.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/16/h5ex_t_objrefatt.tst">h5ex_t_objrefatt.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/112/h5ex_t_objrefatt.ddl">h5ex_t_objrefatt.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/16/h5ex_t_objrefatt.tst">h5ex_t_objrefatt.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/112/h5ex_t_objrefatt.ddl">h5ex_t_objrefatt.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Object References (Dataset)</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/h5ex_t_objref.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5T/h5ex_t_objref_F03.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5T/H5Ex_T_ObjectReference.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_objref.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_objref_F03.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_ObjectReference.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_ObjectReference.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_t_objref.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/16/h5ex_t_objref.tst">h5ex_t_objref.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/112/h5ex_t_objref.ddl">h5ex_t_objref.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/16/h5ex_t_objref.tst">h5ex_t_objref.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/112/h5ex_t_objref.ddl">h5ex_t_objref.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Opaque (Attribute)</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/h5ex_t_opaqueatt.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5T/h5ex_t_opaqueatt_F03.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5T/H5Ex_T_OpaqueAttribute.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_opaqueatt.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_opaqueatt_F03.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_OpaqueAttribute.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_OpaqueAttribute.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_t_opaqueatt.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/16/h5ex_t_opaqueatt.tst">h5ex_t_opaqueatt.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/18/h5ex_t_opaqueatt.ddl">h5ex_t_opaqueatt.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/16/h5ex_t_opaqueatt.tst">h5ex_t_opaqueatt.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/18/h5ex_t_opaqueatt.ddl">h5ex_t_opaqueatt.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Opaque (Dataset)</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/h5ex_t_opaque.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5T/h5ex_t_opaque_F03.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5T/H5Ex_T_Opaque.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_opaque.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_opaque_F03.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_Opaque.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_Opaque.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_t_opaque.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/16/h5ex_t_opaque.tst">h5ex_t_opaque.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/18/h5ex_t_opaque.ddl">h5ex_t_opaque.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/16/h5ex_t_opaque.tst">h5ex_t_opaque.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/18/h5ex_t_opaque.ddl">h5ex_t_opaque.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Region References (Attribute)</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/h5ex_t_regrefatt.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5T/h5ex_t_regrefatt_F03.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5T/H5Ex_T_RegionReferenceAttribute.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_regrefatt.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_regrefatt_F03.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_RegionReferenceAttribute.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_RegionReferenceAttribute.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_t_regrefatt.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/16/h5ex_t_regrefatt.tst">h5ex_t_regrefatt.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/112/h5ex_t_regrefatt.ddl">h5ex_t_regrefatt.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/16/h5ex_t_regrefatt.tst">h5ex_t_regrefatt.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/112/h5ex_t_regrefatt.ddl">h5ex_t_regrefatt.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Region References (Dataset)</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/h5ex_t_regref.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5T/h5ex_t_regref_F03.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5T/H5Ex_T_RegionReference.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_regref.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_regref_F03.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_RegionReference.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_RegionReference.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_t_regref.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/16/h5ex_t_regref.tst">h5ex_t_regref.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/112/h5ex_t_regref.ddl">h5ex_t_regref.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/16/h5ex_t_regref.tst">h5ex_t_regref.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/112/h5ex_t_regref.ddl">h5ex_t_regref.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write String (Attribute)</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/h5ex_t_stringatt.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5T/h5ex_t_stringatt_F03.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5T/H5Ex_T_StringAttribute.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_stringatt.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_stringatt_F03.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_StringAttribute.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_StringAttribute.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_t_stringatt.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/16/h5ex_t_stringatt.tst">h5ex_t_stringatt.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/18/h5ex_t_stringatt.ddl">h5ex_t_stringatt.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/16/h5ex_t_stringatt.tst">h5ex_t_stringatt.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/18/h5ex_t_stringatt.ddl">h5ex_t_stringatt.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write String (Dataset)</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/h5ex_t_string.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5T/h5ex_t_string_F03.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5T/H5Ex_T_String.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_string.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_string_F03.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_String.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_String.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_t_string.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/16/h5ex_t_string.tst">h5ex_t_string.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/18/h5ex_t_string.ddl">h5ex_t_string.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/16/h5ex_t_string.tst">h5ex_t_string.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/18/h5ex_t_string.ddl">h5ex_t_string.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Variable Length (Attribute)</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/h5ex_t_vlenatt.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5T/h5ex_t_vlenatt_F03.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_vlenatt.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_vlenatt_F03.F90">FORTRAN</a>
|
||||
Java JavaObj MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_t_vlenatt.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/16/h5ex_t_vlenatt.tst">h5ex_t_vlenatt.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/114/h5ex_t_vlenatt.ddl">h5ex_t_vlenatt.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/16/h5ex_t_vlenatt.tst">h5ex_t_vlenatt.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/114/h5ex_t_vlenatt.ddl">h5ex_t_vlenatt.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Variable Length (Dataset)</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/h5ex_t_vlen.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5T/h5ex_t_vlen_F03.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_vlen.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_vlen_F03.F90">FORTRAN</a>
|
||||
Java JavaObj MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_t_vlen.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/16/h5ex_t_vlen.tst">h5ex_t_vlen.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/114/h5ex_t_vlen.ddl">h5ex_t_vlen.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/16/h5ex_t_vlen.tst">h5ex_t_vlen.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/114/h5ex_t_vlen.ddl">h5ex_t_vlen.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Variable Length String (Attribute)</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/h5ex_t_vlstringatt.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5T/h5ex_t__F03.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_vlstringatt.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t__F03.F90">FORTRAN</a>
|
||||
Java JavaObj MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_t_vlstringatt.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/16/h5ex_t_vlstringatt.tst">h5ex_t_vlstringatt.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/18/h5ex_t_vlstringatt.ddl">h5ex_t_vlstringatt.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/16/h5ex_t_vlstringatt.tst">h5ex_t_vlstringatt.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/18/h5ex_t_vlstringatt.ddl">h5ex_t_vlstringatt.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Variable Length String (Dataset)</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/h5ex_t_vlstring.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5T/h5ex_t_vlstring_F03.F90">FORTRAN</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5T/H5Ex_T_VLString.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5T/h5ex_t_vlstring.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5T/h5ex_t_vlstring_F03.F90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5T/H5Ex_T_VLString.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/datatypes/H5ObjectEx_T_VLString.java">JavaObj</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>h5ex_t_vlstring.h5</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/16/h5ex_t_vlstring.tst">h5ex_t_vlstring.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5T/tfiles/18/h5ex_t_vlstring.ddl">h5ex_t_vlstring.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/16/h5ex_t_vlstring.tst">h5ex_t_vlstring.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5T/tfiles/18/h5ex_t_vlstring.ddl">h5ex_t_vlstring.ddl</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
@@ -743,92 +742,92 @@ FORTRAN
|
||||
<tr>
|
||||
<td>Read / Write Dataset using Blosc Compression</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/h5ex_d_blosc.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5FLT/h5ex_d_blosc.c">C</a>
|
||||
FORTRAN Java JavaObj MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/tfiles/h5ex_d_blosc.h5">h5ex_d_blosc.h5</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/tfiles/h5ex_d_blosc.tst">h5ex_d_blosc.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/tfiles/h5ex_d_blosc.ddl">h5ex_d_blosc.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5FLT/tfiles/h5ex_d_blosc.h5">h5ex_d_blosc.h5</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5FLT/tfiles/h5ex_d_blosc.tst">h5ex_d_blosc.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5FLT/tfiles/h5ex_d_blosc.ddl">h5ex_d_blosc.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Dataset using Bit Shuffle Compression</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/h5ex_d_bshuf.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5FLT/h5ex_d_bshuf.c">C</a>
|
||||
FORTRAN Java JavaObj MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/tfiles/h5ex_d_bshuf.h5">h5ex_d_bshuf.h5</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/tfiles/h5ex_d_bshuf.tst">h5ex_d_bshuf.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/tfiles/h5ex_d_bshuf.ddl">h5ex_d_bshuf.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5FLT/tfiles/h5ex_d_bshuf.h5">h5ex_d_bshuf.h5</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5FLT/tfiles/h5ex_d_bshuf.tst">h5ex_d_bshuf.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5FLT/tfiles/h5ex_d_bshuf.ddl">h5ex_d_bshuf.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Dataset using BZip2 Compression</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/h5ex_d_bzip2.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5FLT/h5ex_d_bzip2.c">C</a>
|
||||
FORTRAN Java JavaObj MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/tfiles/h5ex_d_bzip2.h5">h5ex_d_bzip2.h5</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/tfiles/h5ex_d_bzip2.tst">h5ex_d_bzip2.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/tfiles/h5ex_d_bzip2.ddl">h5ex_d_bzip2.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5FLT/tfiles/h5ex_d_bzip2.h5">h5ex_d_bzip2.h5</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5FLT/tfiles/h5ex_d_bzip2.tst">h5ex_d_bzip2.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5FLT/tfiles/h5ex_d_bzip2.ddl">h5ex_d_bzip2.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Dataset using JPEG Compression</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/h5ex_d_jpeg.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5FLT/h5ex_d_jpeg.c">C</a>
|
||||
FORTRAN Java JavaObj MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/tfiles/h5ex_d_jpeg.h5">h5ex_d_jpeg.h5</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/tfiles/h5ex_d_jpeg.tst">h5ex_d_jpeg.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/tfiles/h5ex_d_jpeg.ddl">h5ex_d_jpeg.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5FLT/tfiles/h5ex_d_jpeg.h5">h5ex_d_jpeg.h5</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5FLT/tfiles/h5ex_d_jpeg.tst">h5ex_d_jpeg.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5FLT/tfiles/h5ex_d_jpeg.ddl">h5ex_d_jpeg.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Dataset using LZ4 Compression</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/h5ex_d_lz4.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5FLT/h5ex_d_lz4.c">C</a>
|
||||
FORTRAN Java JavaObj MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/tfiles/h5ex_d_lz4.h5">h5ex_d_lz4.h5</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/tfiles/h5ex_d_lz4.tst">h5ex_d_lz4.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/tfiles/h5ex_d_lz4.ddl">h5ex_d_lz4.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5FLT/tfiles/h5ex_d_lz4.h5">h5ex_d_lz4.h5</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5FLT/tfiles/h5ex_d_lz4.tst">h5ex_d_lz4.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5FLT/tfiles/h5ex_d_lz4.ddl">h5ex_d_lz4.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Dataset using LZF Compression</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/h5ex_d_lzf.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5FLT/h5ex_d_lzf.c">C</a>
|
||||
FORTRAN Java JavaObj MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/tfiles/h5ex_d_lzf.h5">h5ex_d_lzf.h5</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/tfiles/h5ex_d_lzf.tst">h5ex_d_lzf.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/tfiles/h5ex_d_lzf.ddl">h5ex_d_lzf.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5FLT/tfiles/h5ex_d_lzf.h5">h5ex_d_lzf.h5</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5FLT/tfiles/h5ex_d_lzf.tst">h5ex_d_lzf.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5FLT/tfiles/h5ex_d_lzf.ddl">h5ex_d_lzf.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Dataset using MAFISC Compression</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/h5ex_d_mafisc.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5FLT/h5ex_d_mafisc.c">C</a>
|
||||
FORTRAN Java JavaObj MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/tfiles/h5ex_d_mafisc.h5">h5ex_d_mafisc.h5</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/tfiles/h5ex_d_mafisc.tst">h5ex_d_mafisc.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/tfiles/h5ex_d_mafisc.ddl">h5ex_d_mafisc.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5FLT/tfiles/h5ex_d_mafisc.h5">h5ex_d_mafisc.h5</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5FLT/tfiles/h5ex_d_mafisc.tst">h5ex_d_mafisc.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5FLT/tfiles/h5ex_d_mafisc.ddl">h5ex_d_mafisc.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Dataset using ZFP Compression</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/h5ex_d_zfp.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5FLT/h5ex_d_zfp.c">C</a>
|
||||
FORTRAN Java JavaObj MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/tfiles/h5ex_d_zfp.h5">h5ex_d_zfp.h5</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/tfiles/h5ex_d_zfp.tst">h5ex_d_zfp.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/tfiles/h5ex_d_zfp.ddl">h5ex_d_zfp.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5FLT/tfiles/h5ex_d_zfp.h5">h5ex_d_zfp.h5</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5FLT/tfiles/h5ex_d_zfp.tst">h5ex_d_zfp.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5FLT/tfiles/h5ex_d_zfp.ddl">h5ex_d_zfp.ddl</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read / Write Dataset using ZStd Compression</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/h5ex_d_zstd.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5FLT/h5ex_d_zstd.c">C</a>
|
||||
FORTRAN Java JavaObj MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/tfiles/h5ex_d_zstd.h5">h5ex_d_zstd.h5</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/tfiles/h5ex_d_zstd.tst">h5ex_d_zstd.tst</a></td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5FLT/tfiles/h5ex_d_zstd.ddl">h5ex_d_zstd.ddl</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5FLT/tfiles/h5ex_d_zstd.h5">h5ex_d_zstd.h5</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5FLT/tfiles/h5ex_d_zstd.tst">h5ex_d_zstd.tst</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/C/H5FLT/tfiles/h5ex_d_zstd.ddl">h5ex_d_zstd.ddl</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
@@ -842,66 +841,66 @@ FORTRAN
|
||||
<tr>
|
||||
<td>Create/Read/Write an Attribute</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5J/HDF5AttributeCreate.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5J/HDF5AttributeCreate.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/intro/H5Object_CreateAttribute.java">JavaObj</a>
|
||||
</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5J/tfiles/110/HDF5AttributeCreate.txt">HDF5AttributeCreate.txt</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/JAVA/H5J/tfiles/110/HDF5AttributeCreate.txt">HDF5AttributeCreate.txt</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Create Datasets</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5J/HDF5DatasetCreate.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5J/HDF5DatasetCreate.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/intro/H5Object_CreateDataset.java">JavaObj</a>
|
||||
</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5J/tfiles/110/HDF5DatasetCreate.txt">HDF5DatasetCreate.txt</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/JAVA/H5J/tfiles/110/HDF5DatasetCreate.txt">HDF5DatasetCreate.txt</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Read/Write Datasets</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5J/HDF5DatasetRead.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5J/HDF5DatasetRead.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/intro/H5Object_ReadWrite.java">JavaObj</a>
|
||||
</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5J/tfiles/110/HDF5DatasetRead.txt">HDF5DatasetRead.txt</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/JAVA/H5J/tfiles/110/HDF5DatasetRead.txt">HDF5DatasetRead.txt</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Create an Empty File</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5J/HDF5FileCreate.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5J/HDF5FileCreate.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/intro/H5Object_CreateFile.java">JavaObj</a>
|
||||
</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5J/tfiles/110/HDF5FileCreate.txt">HDF5FileCreate.txt</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/JAVA/H5J/tfiles/110/HDF5FileCreate.txt">HDF5FileCreate.txt</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Retrieve the File Structure</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5J/HDF5FileStructure.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5J/HDF5FileStructure.java">Java</a>
|
||||
JavaObj
|
||||
</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5J/tfiles/110/HDF5FileStructure.txt">HDF5FileStructure.txt</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/JAVA/H5J/tfiles/110/HDF5FileStructure.txt">HDF5FileStructure.txt</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Create Groups</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5J/HDF5GroupCreate.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5J/HDF5GroupCreate.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/intro/H5Object_CreateGroup.java">JavaObj</a>
|
||||
</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5J/tfiles/110/HDF5GroupCreate.java">HDF5GroupCreate.txt</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/JAVA/H5J/tfiles/110/HDF5GroupCreate.java">HDF5GroupCreate.txt</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Select a Subset of a Dataset</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5J/HDF5SubsetSelect.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5J/HDF5SubsetSelect.java">Java</a>
|
||||
JavaObj
|
||||
</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5J/tfiles/110/HDF5SubsetSelect.txt">HDF5SubsetSelect.txt</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/JAVA/H5J/tfiles/110/HDF5SubsetSelect.txt">HDF5SubsetSelect.txt</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Create Two Datasets Within Groups</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5J/HDF5GroupDatasetCreate.java">Java</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/JAVA/H5J/HDF5GroupDatasetCreate.java">Java</a>
|
||||
<a href="https://github.com/HDFGroup/hdfview/blob/master/test/org.hdfgroup.object.example.test/intro/H5Object_CreateGroupDataset.java">JavaObj</a>
|
||||
</td>
|
||||
<td><a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/JAVA/H5J/tfiles/110/HDF5GroupDatasetCreate.java">HDF5GroupDatasetCreate.txt</a></td>
|
||||
<td><a href="https://\SRCURL/HDF5Examples/JAVA/H5J/tfiles/110/HDF5GroupDatasetCreate.java">HDF5GroupDatasetCreate.txt</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
@@ -917,8 +916,8 @@ FORTRAN
|
||||
<tr>
|
||||
<td>Creating and Accessing a File</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5PAR/ph5_file_create.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5PAR/ph5_file_create.f90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5PAR/ph5_file_create.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5PAR/ph5_file_create.f90">FORTRAN</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>ph5_.h5</td>
|
||||
@@ -927,8 +926,8 @@ FORTRAN
|
||||
<tr>
|
||||
<td>Creating and Accessing a Dataset</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5PAR/ph5_dataset.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5PAR/ph5_dataset.f90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5PAR/ph5_dataset.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5PAR/ph5_dataset.f90">FORTRAN</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>ph5_.h5</td>
|
||||
@@ -937,8 +936,8 @@ FORTRAN
|
||||
<tr>
|
||||
<td>Writing and Reading Contiguous Hyperslabs</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5PAR/ph5_hyperslab_by_row.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5PAR/ph5_hyperslab_by_row.f90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5PAR/ph5_hyperslab_by_row.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5PAR/ph5_hyperslab_by_row.f90">FORTRAN</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>ph5_.h5</td>
|
||||
@@ -947,8 +946,8 @@ FORTRAN
|
||||
<tr>
|
||||
<td>Writing and Reading Regularly Spaced Data Hyperslabs</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5PAR/ph5_hyperslab_by_col.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5PAR/ph5_hyperslab_by_col.f90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5PAR/ph5_hyperslab_by_col.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5PAR/ph5_hyperslab_by_col.f90">FORTRAN</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>ph5_.h5</td>
|
||||
@@ -957,8 +956,8 @@ FORTRAN
|
||||
<tr>
|
||||
<td>Writing and Reading Pattern Hyperslabs</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5PAR/ph5_hyperslab_by_pattern.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5PAR/ph5_hyperslab_by_pattern.f90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5PAR/ph5_hyperslab_by_pattern.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5PAR/ph5_hyperslab_by_pattern.f90">FORTRAN</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>ph5_.h5</td>
|
||||
@@ -967,8 +966,8 @@ FORTRAN
|
||||
<tr>
|
||||
<td>Writing and Reading Chunk Hyperslabs</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5PAR/ph5_hyperslab_by_chunk.c">C</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5PAR/ph5_hyperslab_by_chunk.f90">FORTRAN</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5PAR/ph5_hyperslab_by_chunk.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5PAR/ph5_hyperslab_by_chunk.f90">FORTRAN</a>
|
||||
MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>ph5_.h5</td>
|
||||
@@ -977,7 +976,7 @@ FORTRAN
|
||||
<tr>
|
||||
<td>Using the Subfiling VFD to Write a File Striped Across Multiple Subfiles</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5PAR/ph5_subfiling.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5PAR/ph5_subfiling.c">C</a>
|
||||
FORTRAN MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>ph5_.h5</td>
|
||||
@@ -986,7 +985,7 @@ FORTRAN
|
||||
<tr>
|
||||
<td>Write to Datasets with Filters Applied</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5PAR/ph5_filtered_writes.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5PAR/ph5_filtered_writes.c">C</a>
|
||||
FORTRAN MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>ph5_.h5</td>
|
||||
@@ -995,7 +994,7 @@ FORTRAN
|
||||
<tr>
|
||||
<td>Collectively Write Datasets with Filters and Not All Ranks have Data</td>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5PAR/ph5_filtered_writes_no_sel.c">C</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5PAR/ph5_filtered_writes_no_sel.c">C</a>
|
||||
FORTRAN MATLAB PyHigh PyLow
|
||||
</td>
|
||||
<td>ph5_.h5</td>
|
||||
|
||||
@@ -71,8 +71,8 @@ A brief introduction to Parallel HDF5. If you are new to HDF5 please see the @re
|
||||
HDF5-1.10 New Features
|
||||
</td>
|
||||
<td>
|
||||
\li <a href="https://portal.hdfgroup.org/display/HDF5/Introduction+to+the+Virtual+Dataset++-+VDS">Introduction to the Virtual Dataset - VDS</a>
|
||||
\li <a href="https://docs.hdfgroup.org/hdf5/v1_14/group___s_w_m_r.html">Introduction to Single-Writer/Multiple-Reader (SWMR)</a>
|
||||
\li \ref VDS
|
||||
\li \ref SWMR
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
@@ -71,7 +71,13 @@
|
||||
|
||||
<DL>
|
||||
<DT>Compact layout</DT>
|
||||
<DD></DD>
|
||||
<DD>
|
||||
<P>A dataset storage layout where the dataset elements are stored in the
|
||||
object header of the dataset. This layout is suitable for very small
|
||||
datasets that can easily fit in the object header.</P>
|
||||
<P>Compact layout can improve storage and access performance for files
|
||||
that have many very small datasets.</P>
|
||||
</DD>
|
||||
</DL>
|
||||
|
||||
<DL>
|
||||
@@ -174,17 +180,20 @@ and an HDF5 path name in that file.</DD>
|
||||
|
||||
<DL>
|
||||
<DT>File format</DT>
|
||||
<DD></DD>
|
||||
<DD>HDF5 file format refers to the structure and organization of the HDF5 data
|
||||
being stored within the file.</DD>
|
||||
</DL>
|
||||
|
||||
<DL>
|
||||
<DT>Fill value</DT>
|
||||
<DD></DD>
|
||||
<DD>A default value assigned to data elements that have not yet been written.</DD>
|
||||
</DL>
|
||||
|
||||
<DL>
|
||||
<DT>Filter</DT>
|
||||
<DD></DD>
|
||||
<DD>
|
||||
Filters are optional stages that can be inserted in the data pipeline to implement
|
||||
compression and error checking. User applications may also add custom filters.</DD>
|
||||
</DL>
|
||||
|
||||
\section GLS_G G
|
||||
|
||||
@@ -608,8 +608,7 @@ on the <a href="http://hdfeos.org/">HDF-EOS Tools and Information Center</a> pag
|
||||
\section secHDF5Examples Examples
|
||||
\li \ref LBExamples
|
||||
\li \ref ExAPI
|
||||
\li <a href="https://github.com/HDFGroup/hdf5/tree/v1_14/examples">Examples in the Source Code</a>
|
||||
\li <a href="https://portal.hdfgroup.org/display/HDF5/Other+Examples">Other Examples</a>
|
||||
\li <a href="https://github.com/HDFGroup/hdf5/tree/hdf5_1_14/HDF5Examples">Examples in the Source Code</a>
|
||||
|
||||
\section secHDF5ExamplesCompile How To Compile
|
||||
For information on compiling in C, C++ and Fortran, see: \ref LBCompiling
|
||||
@@ -618,10 +617,10 @@ For information on compiling in C, C++ and Fortran, see: \ref LBCompiling
|
||||
<a href="http://hdfeos.org/zoo/index.php">IDL, MATLAB, and NCL Examples for HDF-EOS</a>
|
||||
Examples of how to access and visualize NASA HDF-EOS files using IDL, MATLAB, and NCL.
|
||||
|
||||
<a href="https://support.hdfgroup.org/ftp/HDF5/examples/misc-examples/">Miscellaneous Examples</a>
|
||||
<a href="https://\AEXURL/misc-examples/">Miscellaneous Examples</a>
|
||||
These (very old) examples resulted from working with users, and are not fully tested. Most of them are in C, with a few in Fortran and Java.
|
||||
|
||||
<a href="https://support.hdfgroup.org/ftp/HDF5/examples/special_values_HDF5_example.tar">Using Special Values</a>
|
||||
<a href="https://\AEXURL/special_values_HDF5_example.tar">Using Special Values</a>
|
||||
These examples show how to create special values in an HDF5 application.
|
||||
|
||||
*/
|
||||
|
||||
@@ -95,7 +95,7 @@ Below is the example program:
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5PAR/ph5_hyperslab_by_row.c">hyperslab_by_row.c</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5PAR/ph5_hyperslab_by_row.c">hyperslab_by_row.c</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -205,7 +205,7 @@ Below is the F90 example program which illustrates how to write contiguous hyper
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5PAR/ph5_f90_hyperslab_by_col.F90">hyperslab_by_col.F90</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5PAR/ph5_f90_hyperslab_by_col.F90">hyperslab_by_col.F90</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -275,7 +275,7 @@ Below is an example program for writing hyperslabs by column in Parallel HDF5:
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5PAR/ph5_hyperslab_by_col.c">hyperslab_by_col.c</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5PAR/ph5_hyperslab_by_col.c">hyperslab_by_col.c</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -346,7 +346,7 @@ Below is the example program for writing hyperslabs by column in Parallel HDF5:
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5PAR/ph5_f90_hyperslab_by_row.F90">hyperslab_by_row.F90</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5PAR/ph5_f90_hyperslab_by_row.F90">hyperslab_by_row.F90</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -431,12 +431,12 @@ Below are example programs for writing hyperslabs by pattern in Parallel HDF5:
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5PAR/ph5_hyperslab_by_pattern.c">hyperslab_by_pattern.c</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5PAR/ph5_hyperslab_by_pattern.c">hyperslab_by_pattern.c</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5PAR/ph5_f90_hyperslab_by_pattern.F90">hyperslab_by_pattern.F90</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5PAR/ph5_f90_hyperslab_by_pattern.F90">hyperslab_by_pattern.F90</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -530,12 +530,12 @@ Below are example programs for writing hyperslabs by pattern in Parallel HDF5:
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5PAR/ph5_hyperslab_by_chunk.c">hyperslab_by_chunk.c</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5PAR/ph5_hyperslab_by_chunk.c">hyperslab_by_chunk.c</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5PAR/ph5_f90_hyperslab_by_chunk.F90">hyperslab_by_chunk.F90</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5PAR/ph5_f90_hyperslab_by_chunk.F90">hyperslab_by_chunk.F90</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
@@ -145,8 +145,8 @@ Following is example code for creating an access template in HDF5:
|
||||
\endcode
|
||||
|
||||
The following example programs create an HDF5 file using Parallel HDF5:
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5PAR/ph5_file_create.c">C: file_create.c</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5PAR/ph5_f90_file_create.F90">F90: file_create.F90</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5PAR/ph5_file_create.c">C: file_create.c</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5PAR/ph5_f90_file_create.F90">F90: file_create.F90</a>
|
||||
|
||||
|
||||
\subsection subsec_pintro_create_dset Creating and Accessing a Dataset with PHDF5
|
||||
@@ -226,8 +226,8 @@ The following code demonstrates a collective write using Parallel HDF5:
|
||||
\endcode
|
||||
|
||||
The following example programs create an HDF5 dataset using Parallel HDF5:
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5PAR/ph5_dataset.c">C: dataset.c</a>
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/FORTRAN/H5PAR/ph5_f90_dataset.F90">F90: dataset.F90</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5PAR/ph5_dataset.c">C: dataset.c</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/FORTRAN/H5PAR/ph5_f90_dataset.F90">F90: dataset.F90</a>
|
||||
|
||||
|
||||
\subsubsection subsec_pintro_hyperslabs Hyperslabs
|
||||
@@ -264,7 +264,6 @@ HDF5 by contiguous hyperslab, by regularly spaced data in a column/row, by patte
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
<hr>
|
||||
Navigate back: \ref index "Main" / \ref GettingStarted
|
||||
|
||||
|
||||
+10
-10
@@ -59,7 +59,7 @@ These examples (C, C++, Fortran) are provided in the HDF5 source code and (Unix)
|
||||
<tr>
|
||||
<td>Create a file
|
||||
</td>
|
||||
<td>C Fortran C++ <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/java/examples/intro/H5_CreateFile.java">Java</a> Python
|
||||
<td>C Fortran C++ <a href="https://\SRCURL/java/examples/intro/H5_CreateFile.java">Java</a> Python
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
@@ -67,7 +67,7 @@ These examples (C, C++, Fortran) are provided in the HDF5 source code and (Unix)
|
||||
<tr>
|
||||
<td>Create a dataset
|
||||
</td>
|
||||
<td><a href="https://raw.githubusercontent.com//HDFGroup/hdf5/hdf5_1_14/examples/h5_crtdat.c">C</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/fortran/examples/h5_crtdat.f90">Fortran</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/c++/examples/h5tutr_crtdat.cpp">C++</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/java/examples/intro/H5_CreateDataset.java">Java</a> <a href="https://support.hdfgroup.org/ftp/HDF5/examples/Py/h5_crtdat.py">Python</a>
|
||||
<td><a href="https://\SRCURL/examples/h5_crtdat.c">C</a> <a href="https://\SRCURL/fortran/examples/h5_crtdat.f90">Fortran</a> <a href="https://\SRCURL/c++/examples/h5tutr_crtdat.cpp">C++</a> <a href="https://\SRCURL/java/examples/intro/H5_CreateDataset.java">Java</a> <a href="https://\AEXURL/Py/h5_crtdat.py">Python</a>
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
@@ -75,7 +75,7 @@ These examples (C, C++, Fortran) are provided in the HDF5 source code and (Unix)
|
||||
<tr>
|
||||
<td>Read and write to a dataset
|
||||
</td>
|
||||
<td><a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/examples/h5_rdwt.c">C</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/fortran/examples/h5_rdwt.f90">Fortran</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/c++/examples/h5tutr_rdwt.cpp">C++</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/java/examples/intro/H5_ReadWrite.java">Java</a> <a href="https://support.hdfgroup.org/ftp/HDF5/examples/Py/h5_rdwt.py">Python</a>
|
||||
<td><a href="https://\SRCURL/examples/h5_rdwt.c">C</a> <a href="https://\SRCURL/fortran/examples/h5_rdwt.f90">Fortran</a> <a href="https://\SRCURL/c++/examples/h5tutr_rdwt.cpp">C++</a> <a href="https://\SRCURL/java/examples/intro/H5_ReadWrite.java">Java</a> <a href="https://\AEXURL/Py/h5_rdwt.py">Python</a>
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
@@ -83,7 +83,7 @@ These examples (C, C++, Fortran) are provided in the HDF5 source code and (Unix)
|
||||
<tr>
|
||||
<td>Create an attribute
|
||||
</td>
|
||||
<td><a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/examples/h5_crtatt.c">C</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/fortran/examples/h5_crtatt.f90">Fortran</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/c++/examples/h5tutr_crtatt.cpp">C++</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/java/examples/intro/H5_CreateAttribute.java">Java</a> <a href="https://support.hdfgroup.org/ftp/HDF5/examples/Py/h5_crtatt.py">Python</a>
|
||||
<td><a href="https://\SRCURL/examples/h5_crtatt.c">C</a> <a href="https://\SRCURL/fortran/examples/h5_crtatt.f90">Fortran</a> <a href="https://\SRCURL/c++/examples/h5tutr_crtatt.cpp">C++</a> <a href="https://\SRCURL/java/examples/intro/H5_CreateAttribute.java">Java</a> <a href="https://\AEXURL/Py/h5_crtatt.py">Python</a>
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
@@ -91,7 +91,7 @@ These examples (C, C++, Fortran) are provided in the HDF5 source code and (Unix)
|
||||
<tr>
|
||||
<td>Create a group
|
||||
</td>
|
||||
<td><a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/examples/h5_crtgrp.c">C</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/fortran/examples/h5_crtgrp.f90">Fortran</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/c++/examples/h5tutr_crtgrp.cpp">C++</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/java/examples/intro/H5_CreateGroup.java">Java</a> <a href="https://support.hdfgroup.org/ftp/HDF5/examples/Py/h5_crtgrp.py">Python</a>
|
||||
<td><a href="https://\SRCURL/examples/h5_crtgrp.c">C</a> <a href="https://\SRCURL/fortran/examples/h5_crtgrp.f90">Fortran</a> <a href="https://\SRCURL/c++/examples/h5tutr_crtgrp.cpp">C++</a> <a href="https://\SRCURL/java/examples/intro/H5_CreateGroup.java">Java</a> <a href="https://\AEXURL/Py/h5_crtgrp.py">Python</a>
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
@@ -99,7 +99,7 @@ These examples (C, C++, Fortran) are provided in the HDF5 source code and (Unix)
|
||||
<tr>
|
||||
<td>Create groups in a file using absolute and relative paths
|
||||
</td>
|
||||
<td><a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/examples/h5_crtgrpar.c">C</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/fortran/examples/h5_crtgrpar.f90">Fortran</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/c++/examples/h5tutr_crtgrpar.cpp">C++</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/java/examples/intro/H5_CreateGroupAbsoluteRelative.java">Java</a> <a href="https://support.hdfgroup.org/ftp/HDF5/examples/Py/h5_crtgrpar.py">Python</a>
|
||||
<td><a href="https://\SRCURL/examples/h5_crtgrpar.c">C</a> <a href="https://\SRCURL/fortran/examples/h5_crtgrpar.f90">Fortran</a> <a href="https://\SRCURL/c++/examples/h5tutr_crtgrpar.cpp">C++</a> <a href="https://\SRCURL/java/examples/intro/H5_CreateGroupAbsoluteRelative.java">Java</a> <a href="https://\AEXURL/Py/h5_crtgrpar.py">Python</a>
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
@@ -107,7 +107,7 @@ These examples (C, C++, Fortran) are provided in the HDF5 source code and (Unix)
|
||||
<tr>
|
||||
<td>Create datasets in a group
|
||||
</td>
|
||||
<td><a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/examples/h5_crtgrpd.c">C</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/fortran/examples/h5_crtgrpd.f90">Fortran</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/c++/examples/h5tutr_crtgrpd.cpp">C++</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/java/examples/intro/H5_CreateGroupDataset.java">Java</a> <a href="https://support.hdfgroup.org/ftp/HDF5/examples/Py/h5_crtgrpd.py">Python</a>
|
||||
<td><a href="https://\SRCURL/examples/h5_crtgrpd.c">C</a> <a href="https://\SRCURL/fortran/examples/h5_crtgrpd.f90">Fortran</a> <a href="https://\SRCURL/c++/examples/h5tutr_crtgrpd.cpp">C++</a> <a href="https://\SRCURL/java/examples/intro/H5_CreateGroupDataset.java">Java</a> <a href="https://\AEXURL/Py/h5_crtgrpd.py">Python</a>
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
@@ -115,7 +115,7 @@ These examples (C, C++, Fortran) are provided in the HDF5 source code and (Unix)
|
||||
<tr>
|
||||
<td>Create a file and dataset and select/read a subset from the dataset
|
||||
</td>
|
||||
<td><a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/examples/h5_subset.c">C</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/fortran/examples/h5_subset.f90">Fortran</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/c++/examples/h5tutr_subset.cpp">C++</a> Java Python
|
||||
<td><a href="https://\SRCURL/examples/h5_subset.c">C</a> <a href="https://\SRCURL/fortran/examples/h5_subset.f90">Fortran</a> <a href="https://\SRCURL/c++/examples/h5tutr_subset.cpp">C++</a> Java Python
|
||||
</td>
|
||||
<td>Also see examples to Write by row (and column) below.
|
||||
</td>
|
||||
@@ -123,7 +123,7 @@ These examples (C, C++, Fortran) are provided in the HDF5 source code and (Unix)
|
||||
<tr>
|
||||
<td>Create an extendible (unlimited dimension) dataset
|
||||
</td>
|
||||
<td><a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/examples/h5_extend.c">C</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/fortran/examples/h5_extend.f90">Fortran</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/c++/examples/h5tutr_extend.cpp">C++</a> Java Python
|
||||
<td><a href="https://\SRCURL/examples/h5_extend.c">C</a> <a href="https://\SRCURL/fortran/examples/h5_extend.f90">Fortran</a> <a href="https://\SRCURL/c++/examples/h5tutr_extend.cpp">C++</a> Java Python
|
||||
</td>
|
||||
<td>Also see examples to Extend by row (and column) below
|
||||
</td>
|
||||
@@ -131,7 +131,7 @@ These examples (C, C++, Fortran) are provided in the HDF5 source code and (Unix)
|
||||
<tr>
|
||||
<td>Create a chunked and compressed dataset
|
||||
</td>
|
||||
<td><a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/examples/h5_cmprss.c">C</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/fortran/examples/h5_cmprss.f90">Fortran</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_14/c++/examples/h5tutr_cmprss.cpp">C++</a> Java <a href="https://support.hdfgroup.org/ftp/HDF5/examples/Py/h5_cmprss.py">Python</a>
|
||||
<td><a href="https://\SRCURL/examples/h5_cmprss.c">C</a> <a href="https://\SRCURL/fortran/examples/h5_cmprss.f90">Fortran</a> <a href="https://\SRCURL/c++/examples/h5tutr_cmprss.cpp">C++</a> Java <a href="https://\AEXURL/Py/h5_cmprss.py">Python</a>
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
|
||||
@@ -468,7 +468,7 @@ If the offset were 1x1 (instead of 1x2), then the selection can be made:
|
||||
</table>
|
||||
|
||||
The selections above were tested with the
|
||||
<a href="https://support.hdfgroup.org/ftp/HDF5/examples/howto/subset/h5_subsetbk.c">h5_subsetbk.c</a>
|
||||
<a href="https://\AEXURL/howto/subset/h5_subsetbk.c">h5_subsetbk.c</a>
|
||||
example code. The memory dataspace was defined as one-dimensional.
|
||||
|
||||
\subsection subsecLBDsetSubRWProgRem Remarks
|
||||
|
||||
@@ -156,9 +156,9 @@ Specifically look at the \ref ExAPI.
|
||||
There are examples for different languages.
|
||||
|
||||
The C example to create a chunked dataset is:
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/h5ex_d_chunk.c">h5ex_d_chunk.c</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_chunk.c">h5ex_d_chunk.c</a>
|
||||
The C example to create a compact dataset is:
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/HDF5Examples/C/H5D/h5ex_d_compact.c">h5ex_d_compact.c</a>
|
||||
<a href="https://\SRCURL/HDF5Examples/C/H5D/h5ex_d_compact.c">h5ex_d_compact.c</a>
|
||||
|
||||
\section secLBDsetLayoutChange Changing the Layout after Dataset Creation
|
||||
The dataset layout is a Dataset Creation Property List. This means that once the dataset has been
|
||||
@@ -166,8 +166,8 @@ created the dataset layout cannot be changed. The h5repack utility can be used t
|
||||
to a new with a new layout.
|
||||
|
||||
\section secLBDsetLayoutSource Sources of Information
|
||||
<a href="https://portal.hdfgroup.org/documentation/hdf5-docs/chunking_in_hdf5.html">Chunking in HDF5</a>
|
||||
(See the documentation on <a href="https://confluence.hdfgroup.org/display/HDF5/Advanced+Topics+in+HDF5">Advanced Topics in HDF5</a>)
|
||||
<a href="https://\DOCURL/chunking_in_hdf5.html">Chunking in HDF5</a>
|
||||
(See the documentation on <a href="https://\DOCURL/advanced_topics_list.html">Advanced Topics in HDF5</a>)
|
||||
\see \ref sec_plist in the HDF5 \ref UG.
|
||||
|
||||
<hr>
|
||||
@@ -184,7 +184,7 @@ certain initial dimensions, then to later increase the size of any of the initia
|
||||
|
||||
HDF5 requires you to use chunking to define extendible datasets. This makes it possible to extend
|
||||
datasets efficiently without having to excessively reorganize storage. (To use chunking efficiently,
|
||||
be sure to see the advanced topic, <a href="https://portal.hdfgroup.org/documentation/hdf5-docs/chunking_in_hdf5.html">Chunking in HDF5</a>.)
|
||||
be sure to see the advanced topic, <a href="https://\DOCURL/chunking_in_hdf5.html">Chunking in HDF5</a>.)
|
||||
|
||||
The following operations are required in order to extend a dataset:
|
||||
\li Declare the dataspace of the dataset to have unlimited dimensions for all dimensions that might eventually be extended.
|
||||
@@ -224,7 +224,7 @@ Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
|
||||
|
||||
\section secLBComDsetCreate Creating a Compressed Dataset
|
||||
HDF5 requires you to use chunking to create a compressed dataset. (To use chunking efficiently,
|
||||
be sure to see the advanced topic, <a href="https://portal.hdfgroup.org/documentation/hdf5-docs/chunking_in_hdf5.html">Chunking in HDF5</a>.)
|
||||
be sure to see the advanced topic, <a href="https://\DOCURL/chunking_in_hdf5.html">Chunking in HDF5</a>.)
|
||||
|
||||
The following operations are required in order to create a compressed dataset:
|
||||
\li Create a dataset creation property list.
|
||||
@@ -294,12 +294,12 @@ Specifically look at the \ref ExAPI.
|
||||
There are examples for different languages, where examples of using #H5Literate and #H5Ovisit/#H5Lvisit are included.
|
||||
|
||||
The h5ex_g_traverse example traverses a file using H5Literate:
|
||||
\li C: <a href="https://github.com/HDFGroup/hdf5/blob/v1_14/HDF5Examples/C/H5G/h5ex_g_traverse.c">h5ex_g_traverse.c</a>
|
||||
\li F90: <a href="https://github.com/HDFGroup/hdf5/blob/v1_14/HDF5Examples/FORTRAN/H5G/h5ex_g_traverse.F90">h5ex_g_traverse_F03.f90</a>
|
||||
\li C: <a href="https://\SRCURL/HDF5Examples/C/H5G/h5ex_g_traverse.c">h5ex_g_traverse.c</a>
|
||||
\li F90: <a href="https://\SRCURL/HDF5Examples/FORTRAN/H5G/h5ex_g_traverse.F90">h5ex_g_traverse_F03.f90</a>
|
||||
|
||||
The h5ex_g_visit example traverses a file using H5Ovisit and H5Lvisit:
|
||||
\li C: <a href="https://github.com/HDFGroup/hdf5/blob/v1_14/HDF5Examples/C/H5G/h5ex_g_visit.c">h5ex_g_visit.c</a>
|
||||
\li F90: <a href="https://github.com/HDFGroup/hdf5/blob/v1_14/HDF5Examples/FORTRAN/H5G/h5ex_g_visit.F90">h5ex_g_visit_F03.f90</a>
|
||||
\li C: <a href="https://\SRCURL/HDF5Examples/C/H5G/h5ex_g_visit.c">h5ex_g_visit.c</a>
|
||||
\li F90: <a href="https://\SRCURL/HDF5Examples/FORTRAN/H5G/h5ex_g_visit.F90">h5ex_g_visit_F03.f90</a>
|
||||
|
||||
<hr>
|
||||
Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
|
||||
@@ -693,7 +693,7 @@ did = H5Dopen (file_id, "/foo/boo/moo"); /* absolute path */
|
||||
<hr>
|
||||
Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
|
||||
|
||||
@page LBCompiling Compiling HDF5 Applications
|
||||
/** @page LBCompiling Compiling HDF5 Applications
|
||||
Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
|
||||
<hr>
|
||||
|
||||
@@ -1003,11 +1003,9 @@ There are log files for the configure, test, and build.
|
||||
<hr>
|
||||
Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
|
||||
|
||||
@page LBTraining Training Videos
|
||||
Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
|
||||
<hr>
|
||||
*/
|
||||
|
||||
<a href="https://confluence.hdfgroup.org/display/HDF5/Training+Videos">Training Videos</a>
|
||||
/ref LBTraining
|
||||
|
||||
<hr>
|
||||
Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
|
||||
|
||||
@@ -7,8 +7,8 @@ This tutorial enables you to get a feel for HDF5 by using the HDFView browser. I
|
||||
any programming experience.
|
||||
|
||||
\section sec_learn_hv_install HDFView Installation
|
||||
\li Download and install HDFView. It can be downloaded from the <a href="https://portal.hdfgroup.org/downloads/hdfview/hdfview3_3_1.html">Download HDFView</a> page.
|
||||
\li Obtain the <a href="https://support.hdfgroup.org/ftp/HDF5/examples/files/tutorial/storm1.txt">storm1.txt</a> text file, used in the tutorial.
|
||||
\li Download and install HDFView. It can be downloaded from the <a href="https://\DWNURL/hdfview/hdfview3_3_1.html">Download HDFView</a> page.
|
||||
\li Obtain the <a href="https://\AEXURL/files/tutorial/storm1.txt">storm1.txt</a> text file, used in the tutorial.
|
||||
|
||||
\section sec_learn_hv_begin Begin Tutorial
|
||||
Once you have HDFView installed, bring it up and you are ready to begin the tutorial.
|
||||
@@ -113,11 +113,11 @@ Datatype information as is):
|
||||
</table>
|
||||
</li>
|
||||
<li>Double left click on the <em>Storm</em> dataset in the tree view. A window with an empty spreadsheet pops open.</li>
|
||||
<li>Copy the data from the <a href="https://support.hdfgroup.org/ftp/HDF5/examples/files/tutorial/storm1.txt">storm1.txt</a> file into the dataset.
|
||||
<li>Copy the data from the <a href="https://\AEXURL/files/tutorial/storm1.txt">storm1.txt</a> file into the dataset.
|
||||
|
||||
If you downloaded <a href="https://support.hdfgroup.org/ftp/HDF5/examples/files/tutorial/storm1.txt">storm1.txt</a>,
|
||||
If you downloaded <a href="https://\AEXURL/files/tutorial/storm1.txt">storm1.txt</a>,
|
||||
then click on the <em>Import/Export Data</em> menu and select <em>Import Data from -> Text File</em>.
|
||||
Specify a location, select <a href="https://support.hdfgroup.org/ftp/HDF5/examples/files/tutorial/storm1.txt">storm1.txt</a>
|
||||
Specify a location, select <a href="https://\AEXURL/files/tutorial/storm1.txt">storm1.txt</a>
|
||||
and click on the <em>Open</em> button. Answer <em>Yes</em> in the dialog box that
|
||||
pops up (which asks if you wish to paste the selected data).
|
||||
|
||||
@@ -246,7 +246,7 @@ in the file).
|
||||
|
||||
Please note that the chunk sizes used in this topic are for demonstration purposes only. For
|
||||
information on chunking and specifying an appropriate chunk size, see the
|
||||
<a href="https://portal.hdfgroup.org/documentation/hdf5-docs/chunking_in_hdf5.html">Chunking in HDF5</a> documentation.
|
||||
<a href="https://\DOCURL/chunking_in_hdf5.html">Chunking in HDF5</a> documentation.
|
||||
|
||||
Also see the HDF5 Tutorial topic on \ref secLBComDsetCreate.
|
||||
<ul>
|
||||
@@ -317,8 +317,8 @@ You will see the <em>Another Storm</em> dataset in the <em>Image</em> group:
|
||||
</tr>
|
||||
</table>
|
||||
</li>
|
||||
<li>Copy the data from the <a href="https://support.hdfgroup.org/ftp/HDF5/examples/files/tutorial/storm1.txt">storm1.txt</a> file into the dataset. (See the previous topic for copying
|
||||
<a href="https://support.hdfgroup.org/ftp/HDF5/examples/files/tutorial/storm1.txt">storm1.txt</a> into a dataset.)</li>
|
||||
<li>Copy the data from the <a href="https://\AEXURL/files/tutorial/storm1.txt">storm1.txt</a> file into the dataset. (See the previous topic for copying
|
||||
<a href="https://\AEXURL/files/tutorial/storm1.txt">storm1.txt</a> into a dataset.)</li>
|
||||
<li><em>Table -> Close</em>, and save the data.</li>
|
||||
<li>Right click on <em>Another Storm</em>, and select <em>Open As</em>.</li>
|
||||
<li>Select the <em>Image</em> button in the Dataset Selection window that pops up. Click the <em>Ok</em> button at the
|
||||
@@ -375,7 +375,7 @@ Add data to the <em>Storm Image</em> dataset as was shown previously:
|
||||
<li>Right click on <em>Storm Image</em>, and select <em>Open As</em> to open the Dataset Selection window.</li>
|
||||
<li>Click on the <em>Spreadsheet</em> button at the top left of the Dataset Selection window to view the image
|
||||
as a spreadsheet.</li>
|
||||
<li>Copy the data from the <a href="https://support.hdfgroup.org/ftp/HDF5/examples/files/tutorial/storm1.txt">storm1.txt</a> file into the dataset.</li>
|
||||
<li>Copy the data from the <a href="https://\AEXURL/files/tutorial/storm1.txt">storm1.txt</a> file into the dataset.</li>
|
||||
<li>Close the dataset and save the data.</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
@@ -23,11 +23,11 @@ documents cover a mix of tasks, concepts, and reference, to help a specific
|
||||
\par Versions
|
||||
Version-specific documentation (see the version in the title area) can be found
|
||||
here:
|
||||
- <a href="https://hdfgroup.github.io/hdf5/develop/index.html">HDF5 <code>develop</code> branch</a>
|
||||
- <a href="https://hdfgroup.github.io/hdf5/v1_14/index.html">HDF5 1.14.x (this site)</a>
|
||||
- <a href="https://docs.hdfgroup.org/hdf5/v1_12/index.html">HDF5 1.12.x</a>
|
||||
- <a href="https://docs.hdfgroup.org/hdf5/v1_10/index.html">HDF5 1.10.x</a>
|
||||
- <a href="https://docs.hdfgroup.org/hdf5/v1_8/index.html">HDF5 1.8.x</a>
|
||||
- <a href="https://hdfgroup.github.io/hdf5/develop/index.html">HDF5 <code>develop</code> branch </a>
|
||||
- <a href="https://\DOXURL/index.html">HDF5 1.14.x (this site)</a>
|
||||
- <a href="https://\HDFURL/v1_12/index.html">HDF5 1.12.x</a>
|
||||
- <a href="https://\HDFURL/v1_10/index.html">HDF5 1.10.x</a>
|
||||
- <a href="https://\HDFURL/v1_8/index.html">HDF5 1.8.x</a>
|
||||
|
||||
\par Search
|
||||
If you are looking for a specific function, constant, type, etc., use the
|
||||
|
||||
@@ -3,12 +3,14 @@
|
||||
\li \ref api-compat-macros
|
||||
\li \ref APPDBG
|
||||
\li \ref FMTDISC
|
||||
\li \ref FILEIMGOPS
|
||||
\li \ref FILTER
|
||||
\li \ref IOFLOW
|
||||
\li \ref TNMDC
|
||||
\li \ref MT
|
||||
\li \ref SWMR
|
||||
\li \ref VDS
|
||||
\li \ref RELVERSION
|
||||
\li \ref VFL
|
||||
|
||||
*/
|
||||
@@ -25,6 +27,12 @@
|
||||
|
||||
*/
|
||||
|
||||
/** \page RELVERSION HDF5 Library Release Version Numbers
|
||||
|
||||
\htmlinclude LibraryReleaseVersionNumbers.html
|
||||
|
||||
*/
|
||||
|
||||
/** \page VFL HDF5 Virtual File Layer
|
||||
|
||||
\htmlinclude VFL.html
|
||||
@@ -37,6 +45,12 @@
|
||||
|
||||
*/
|
||||
|
||||
/** \page FILEIMGOPS HDF5 File Image Operations
|
||||
|
||||
\htmlinclude FileImageOps.html
|
||||
|
||||
*/
|
||||
|
||||
/** \page FILTER HDF5 Filters
|
||||
|
||||
\htmlinclude Filters.html
|
||||
@@ -60,3 +74,4 @@
|
||||
\htmlinclude intro_VDS.html
|
||||
|
||||
*/
|
||||
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
/** @page LBTraining Training Videos
|
||||
Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
|
||||
<hr>
|
||||
|
||||
<br>
|
||||
<table>
|
||||
<tr>
|
||||
<td>[**HDF5 Introduction**](https://youtu.be/S74Kc8QYDac)</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
## Core Topics
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td>[**Data Model and Basic Usage, Core Topic #1**](https://youtu.be/vKuthH200eI)</td>
|
||||
<td>[**Datasets, Core Topic #2**](https://youtu.be/2oDXgecMMfo)</td>
|
||||
<td>[**Attributes, Core Topic #3**](https://youtu.be/d_P6LhmzmWQ)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>[**Groups and Links, Core Topic #4**](https://youtu.be/29J_FxPEDxo)</td>
|
||||
<td>[**Discovering File Structure, Core Topic #5**](https://youtu.be/rIl1Gz8zh-8)</td>
|
||||
<td>[**Partial IO, Core Topic #6**](https://youtu.be/RuzwPCFGBRE)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>[**Compound Datatype, Core Topic #7**](https://youtu.be/NXWwjrPdACY)</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
## Advanced Topics:
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td>[**Dataset Storage Layouts, Advanced Topic #1**](https://youtu.be/mOTpu5KDpj8)</td>
|
||||
<td>[**Using Compression and Filters, Advanced Topic #2**](https://youtu.be/TvnDV-U9T4k)</td>
|
||||
<td>[**Using Command Line Tools, Advanced Topic #3**](https://youtu.be/CPIO1lmRkdM)</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<hr>
|
||||
Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
+11
-11
@@ -342,7 +342,7 @@ These documents provide additional information for the use and tuning of specifi
|
||||
</tr>
|
||||
<tr style="height: 36.00pt;">
|
||||
<td style="width: 234.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
|
||||
<p style="font-style: italic; color: #0000ff;"><span><a href="http://www.hdfgroup.org/HDF5/doc/Advanced/Chunking/index.html">Chunking in HDF5</a></span></p>
|
||||
<p style="font-style: italic; color: #0000ff;"><span><a href="http://\ARCURL/Advanced/Chunking/index.html">Chunking in HDF5</a></span></p>
|
||||
</td>
|
||||
<td style="width: 198.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
|
||||
<p>Structuring the use of chunking and tuning it for performance.</p>
|
||||
@@ -350,7 +350,7 @@ These documents provide additional information for the use and tuning of specifi
|
||||
</tr>
|
||||
<tr style="height: 36.00pt;">
|
||||
<td style="width: 234.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
|
||||
<p style="font-style: italic; color: #0000ff;"><span class="FM_LT_LinkText"><a href="http://www.hdfgroup.org/HDF5/doc/Advanced/DirectChunkWrite/UsingDirectChunkWrite.pdf">Using the Direct Chunk Write Function</a></span></p>
|
||||
<p style="font-style: italic; color: #0000ff;"><span class="FM_LT_LinkText"><a href="http://\ARCURL/Advanced/DirectChunkWrite/UsingDirectChunkWrite.pdf">Using the Direct Chunk Write Function</a></span></p>
|
||||
</td>
|
||||
<td style="width: 198.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
|
||||
<p>Describes another way that chunks can be written to datasets.</p>
|
||||
@@ -358,7 +358,7 @@ These documents provide additional information for the use and tuning of specifi
|
||||
</tr>
|
||||
<tr style="height: 88.00pt;">
|
||||
<td style="width: 234.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
|
||||
<p style="font-style: italic; color: #0000ff;"><span><a href="http://www.hdfgroup.org/HDF5/doc/Advanced/CommittedDatatypeCopying/CopyingCommittedDatatypesWithH5Ocopy.pdf">Copying Committed Datatypes with H5Ocopy</a></span></p>
|
||||
<p style="font-style: italic; color: #0000ff;"><span><a href="http://\ARCURL/Advanced/CommittedDatatypeCopying/CopyingCommittedDatatypesWithH5Ocopy.pdf">Copying Committed Datatypes with H5Ocopy</a></span></p>
|
||||
</td>
|
||||
<td style="width: 198.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
|
||||
<p>Describes how to copy to another file a dataset that uses a committed datatype or an object with an attribute that uses a committed datatype so that the committed datatype in the destination file can be used by multiple objects.</p>
|
||||
@@ -366,7 +366,7 @@ These documents provide additional information for the use and tuning of specifi
|
||||
</tr>
|
||||
<tr style="height: 36.00pt;">
|
||||
<td style="width: 234.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
|
||||
<p style="font-style: italic; color: #0000ff;"><span><a href="http://www.hdfgroup.org/HDF5/doc/Advanced/MetadataCache/index.html">Metadata Caching in HDF5</a></span></p>
|
||||
<p style="font-style: italic; color: #0000ff;"><span><a href="http://\ARCURL/Advanced/MetadataCache/index.html">Metadata Caching in HDF5</a></span></p>
|
||||
</td>
|
||||
<td style="width: 198.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
|
||||
<p>Managing the HDF5 metadata cache and tuning it for performance.</p>
|
||||
@@ -374,7 +374,7 @@ These documents provide additional information for the use and tuning of specifi
|
||||
</tr>
|
||||
<tr style="height: 49.00pt;">
|
||||
<td style="width: 234.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
|
||||
<p style="font-style: italic; color: #0000ff;"><span><a href="https://docs.hdfgroup.org/hdf5/rfc/HDF5DynamicallyLoadedFilters.pdf">HDF5 Dynamically Loaded Filters</a></span></p>
|
||||
<p style="font-style: italic; color: #0000ff;"><span><a href="https://\RFCURL/HDF5DynamicallyLoadedFilters.pdf">HDF5 Dynamically Loaded Filters</a></span></p>
|
||||
</td>
|
||||
<td style="width: 198.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
|
||||
<p>Describes how an HDF5 application can apply a filter that is not registered with the HDF5 Library.</p>
|
||||
@@ -382,7 +382,7 @@ These documents provide additional information for the use and tuning of specifi
|
||||
</tr>
|
||||
<tr style="height: 62.00pt;">
|
||||
<td style="width: 234.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
|
||||
<p style="font-style: italic; color: #0000ff;"><span><a href="https://docs.hdfgroup.org/hdf5/rfc/HDF5FileImageOperations.pdf">HDF5 File Image Operations</a></span></p>
|
||||
<p style="font-style: italic; color: #0000ff;"><span><a href="https://\RFCURL/HDF5FileImageOperations.pdf">HDF5 File Image Operations</a></span></p>
|
||||
</td>
|
||||
<td style="width: 198.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
|
||||
<p>Describes how to work with HDF5 files in memory. Disk I/O is not required when file images are opened, created, read from, or written to.</p>
|
||||
@@ -390,7 +390,7 @@ These documents provide additional information for the use and tuning of specifi
|
||||
</tr>
|
||||
<tr style="height: 62.00pt;">
|
||||
<td style="width: 234.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
|
||||
<p style="font-style: italic; color: #0000ff;"><span><a href="https://docs.hdfgroup.org/archive/support/HDF5/doc/Advanced/ModifiedRegionWrites/ModifiedRegionWrites.pdf">Modified Region Writes</a></span></p>
|
||||
<p style="font-style: italic; color: #0000ff;"><span><a href="https://\ARCURL/Advanced/ModifiedRegionWrites/ModifiedRegionWrites.pdf">Modified Region Writes</a></span></p>
|
||||
</td>
|
||||
<td style="width: 198.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
|
||||
<p>Describes how to set write operations for in-memory files so that only modified regions are written to storage. Available when the Core (Memory) VFD is used.</p>
|
||||
@@ -398,7 +398,7 @@ These documents provide additional information for the use and tuning of specifi
|
||||
</tr>
|
||||
<tr style="height: 36.00pt;">
|
||||
<td style="width: 234.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
|
||||
<p style="font-style: italic; color: #0000ff;"><span><a href="http://www.hdfgroup.org/HDF5/doc/Advanced/UsingIdentifiers/index.html">Using Identifiers</a></span></p>
|
||||
<p style="font-style: italic; color: #0000ff;"><span><a href="http://\ARCURL/Advanced/UsingIdentifiers/index.html">Using Identifiers</a></span></p>
|
||||
</td>
|
||||
<td style="width: 198.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
|
||||
<p>Describes how identifiers behave and how they should be treated.</p>
|
||||
@@ -406,7 +406,7 @@ These documents provide additional information for the use and tuning of specifi
|
||||
</tr>
|
||||
<tr style="height: 36.00pt;">
|
||||
<td style="width: 234.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
|
||||
<p style="font-style: italic; color: #0000ff;"><span><a href="http://www.hdfgroup.org/HDF5/doc/Advanced/UsingUnicode/index.html">Using UTF-8 Encoding in HDF5 Applications</a></span></p>
|
||||
<p style="font-style: italic; color: #0000ff;"><span><a href="http://\ARCURL/Advanced/UsingUnicode/index.html">Using UTF-8 Encoding in HDF5 Applications</a></span></p>
|
||||
</td>
|
||||
<td style="width: 198.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
|
||||
<p>Describes the use of UTF-8 Unicode character encodings in HDF5 applications.</p>
|
||||
@@ -414,7 +414,7 @@ These documents provide additional information for the use and tuning of specifi
|
||||
</tr>
|
||||
<tr style="height: 49.00pt;">
|
||||
<td style="width: 234.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
|
||||
<p style="font-style: italic; color: #0000ff;"><span><a href="http://www.hdfgroup.org/HDF5/doc/Advanced/FreeingMemory/FreeingMemoryAllocatedByTheHdf5Library.pdf">Freeing Memory Allocated by the HDF5 Library</a></span></p>
|
||||
<p style="font-style: italic; color: #0000ff;"><span><a href="http://\ARCURL/Advanced/FreeingMemory/FreeingMemoryAllocatedByTheHdf5Library.pdf">Freeing Memory Allocated by the HDF5 Library</a></span></p>
|
||||
</td>
|
||||
<td style="width: 198.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
|
||||
<p>Describes how inconsistent memory management can cause heap corruption or resource leaks and possible solutions.</p>
|
||||
@@ -422,7 +422,7 @@ These documents provide additional information for the use and tuning of specifi
|
||||
</tr>
|
||||
<tr style="height: 23.00pt;">
|
||||
<td style="width: 234.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
|
||||
<p style="font-style: italic; color: #0000ff;"><span><a href="http://www.hdfgroup.org/HDF5/doc/Glossary.html">HDF5 Glossary</a></span></p>
|
||||
<p style="font-style: italic; color: #0000ff;"><span>@ref GLS</span></p>
|
||||
</td>
|
||||
<td style="width: 198.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
|
||||
<p>A glossary of terms.</p>
|
||||
|
||||
@@ -92,7 +92,7 @@ Public header Files you will need to be familiar with include:
|
||||
</table>
|
||||
|
||||
Many VOL connectors are listed on The HDF Group's VOL plugin registration page, located at:
|
||||
<a href="https://portal.hdfgroup.org/documentation/hdf5-docs/registered_vol_connectors.html">Registered VOL Connectors</a>.
|
||||
<a href="https://\DOCURL/registered_vol_connectors.html">Registered VOL Connectors</a>.
|
||||
Not all of these VOL connectors are supported by The HDF Group and the level of completeness varies, but the
|
||||
connectors found there can serve as examples of working implementations
|
||||
|
||||
@@ -195,7 +195,7 @@ contact <a href="help@hdfgroup.org">help@hdfgroup.org</a> for help with this. We
|
||||
name you've chosen will appear on the registered VOL connectors page.
|
||||
|
||||
As noted above, registered VOL connectors will be listed at:
|
||||
<a href="https://portal.hdfgroup.org/documentation/hdf5-docs/registered_vol_connectors.html">Registered VOL Connectors</a>
|
||||
<a href="https://\DOCURL/registered_vol_connectors.html">Registered VOL Connectors</a>
|
||||
|
||||
A new \b conn_version field has been added to the class struct for 1.13. This field is currently not used by
|
||||
the library so its use is determined by the connector author. Best practices for this field will be determined
|
||||
|
||||
+20
-35
@@ -48,15 +48,15 @@ Navigate back: \ref index "Main" / \ref GettingStarted
|
||||
|
||||
\section secViewToolsCommandObtain Obtain Tools and Files (Optional)
|
||||
Pre-built binaries for Linux and Windows are distributed within the respective HDF5 binary release
|
||||
packages, which can be obtained from the <a href="https://portal.hdfgroup.org/downloads/index.html">Download HDF5</a> page.
|
||||
packages, which can be obtained from the <a href="https://\DWNURL/index.html">Download HDF5</a> page.
|
||||
|
||||
HDF5 files can be obtained from various places such as \ref HDF5Examples and <a href="http://www.hdfeos.org/">HDF-EOS and Tools and
|
||||
Information Center</a>. Specifically, the following examples are used in this tutorial topic:
|
||||
\li HDF5 Files created from compiling the \ref LBExamples
|
||||
\li HDF5 Files on the \ref ExAPI page
|
||||
\li NPP JPSS files, <a href="https://support.hdfgroup.org/ftp/HDF5/examples/files/tutorial/SVM01_npp_d20130524_t1255132_e1256374_b08146_c20130524192048864992_noaa_ops.h5.gz">SVM01_npp.. (gzipped)</a>
|
||||
and <a href="https://support.hdfgroup.org/ftp/HDF5/examples/files/tutorial/SVM09_npp_d20120229_t0849107_e0854511_b01759_c20120229145452682127_noaa_ops.h5.gz">SVM09_npp.. (gzipped)</a>
|
||||
\li HDF-EOS <a href="https://support.hdfgroup.org/ftp/HDF5/examples/files/tutorial/OMI-Aura.he5">OMI-Aura file</a>
|
||||
\li NPP JPSS files, <a href="https://\AEXURL/files/tutorial/SVM01_npp_d20130524_t1255132_e1256374_b08146_c20130524192048864992_noaa_ops.h5.gz">SVM01_npp.. (gzipped)</a>
|
||||
and <a href="https://\AEXURL/files/tutorial/SVM09_npp_d20120229_t0849107_e0854511_b01759_c20120229145452682127_noaa_ops.h5.gz">SVM09_npp.. (gzipped)</a>
|
||||
\li HDF-EOS <a href="https://\AEXURL/files/tutorial/OMI-Aura.he5">OMI-Aura file</a>
|
||||
|
||||
\section secViewToolsCommandTutor Tutorial Topics
|
||||
A variety of command-line tools are included in the HDF5 binary distribution. There are tools to view,
|
||||
@@ -196,44 +196,29 @@ The following h5dump options can be helpful in viewing the content and structure
|
||||
<th>Comment</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>-n, --contents
|
||||
</td>
|
||||
<td>Displays a list of the objects in a file
|
||||
</td>
|
||||
<td>See @ref subsubsecViewToolsViewContent_h5dumpEx1
|
||||
</td>
|
||||
<td>-n, --contents</td>
|
||||
<td>Displays a list of the objects in a file</td>
|
||||
<td>See @ref subsubsecViewToolsViewContent_h5dumpEx1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>-n 1, --contents=1
|
||||
</td>
|
||||
<td>Displays a list of the objects and attributes in a file
|
||||
</td>
|
||||
<td>See @ref subsubsecViewToolsViewAttr_h5dumpEx6
|
||||
</td>
|
||||
<td>-n 1, --contents=1</td>
|
||||
<td>Displays a list of the objects and attributes in a file</td>
|
||||
<td>See @ref subsubsecViewToolsViewAttr_h5dumpEx6</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>-H, --header
|
||||
</td>
|
||||
<td>Displays header information only (no data)
|
||||
</td>
|
||||
<td>See @ref subsubsecViewToolsViewContent_h5dumpEx2
|
||||
</td>
|
||||
<td>-H, --header</td>
|
||||
<td>Displays header information only (no data)</td>
|
||||
<td>See @ref subsubsecViewToolsViewContent_h5dumpEx2</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>-A 0, --onlyattr=0
|
||||
</td>
|
||||
<td>Suppresses the display of attributes
|
||||
</td>
|
||||
<td>See @ref subsubsecViewToolsViewContent_h5dumpEx2
|
||||
</td>
|
||||
<td>-A 0, --onlyattr=0</td>
|
||||
<td>Suppresses the display of attributes</td>
|
||||
<td>See @ref subsubsecViewToolsViewContent_h5dumpEx2</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>-N P, --any_path=P
|
||||
</td>
|
||||
<td>Displays any object or attribute that matches path P
|
||||
</td>
|
||||
<td>See @ref subsubsecViewToolsViewAttr_h5dumpEx6
|
||||
</td>
|
||||
<td>-N P, --any_path=P</td>
|
||||
<td>Displays any object or attribute that matches path P</td>
|
||||
<td>See @ref subsubsecViewToolsViewAttr_h5dumpEx6</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
@@ -997,7 +982,7 @@ In other words, it is an array of four elements, in which each element is a 3 by
|
||||
|
||||
This dataset is much more complex. Also note that subsetting cannot be done on Array datatypes.
|
||||
|
||||
See this <a href="https://docs.hdfgroup.org/hdf5/v1_14/_l_b_datatypes.html">section</a> for more information on the Array datatype.
|
||||
See this <a href="https://\DOXURL/_l_b_datatypes.html">section</a> for more information on the Array datatype.
|
||||
|
||||
\subsubsection subsubsecViewToolsViewDtypes_objref Object Reference
|
||||
An Object Reference is a reference to an entire object (dataset, group, or named datatype).
|
||||
|
||||
@@ -11,8 +11,8 @@ Navigate back: \ref index "Main" / \ref GettingStarted / \ref ViewToolsCommand
|
||||
|
||||
This tutorial illustrates how to use the HDF5 tools to examine NPP files from the JPSS project. The following files are discussed:
|
||||
\code
|
||||
SVM09_npp_d20120229_t0849107_e0854511_b01759_c20120229145452682127_noaa_ops.h5 (<a href="https://support.hdfgroup.org/ftp/HDF5/examples/files/tutorial/SVM09_npp_d20120229_t0849107_e0854511_b01759_c20120229145452682127_noaa_ops.h5.gz">gzipped file</a>)
|
||||
SVM01_npp_d20130524_t1255132_e1256374_b08146_c20130524192048864992_noaa_ops.h5 (<a href="https://support.hdfgroup.org/ftp/HDF5/examples/files/tutorial/SVM01_npp_d20130524_t1255132_e1256374_b08146_c20130524192048864992_noaa_ops.h5.gz">gzipped file</a>)
|
||||
SVM09_npp_d20120229_t0849107_e0854511_b01759_c20120229145452682127_noaa_ops.h5 (<a href="https://\AEXURL/files/tutorial/SVM09_npp_d20120229_t0849107_e0854511_b01759_c20120229145452682127_noaa_ops.h5.gz">gzipped file</a>)
|
||||
SVM01_npp_d20130524_t1255132_e1256374_b08146_c20130524192048864992_noaa_ops.h5 (<a href="https://\AEXURL/files/tutorial/SVM01_npp_d20130524_t1255132_e1256374_b08146_c20130524192048864992_noaa_ops.h5.gz">gzipped file</a>)
|
||||
\endcode
|
||||
|
||||
\section secViewToolsJPSSDeter Determining File Contents
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
|
||||
We treat documentation like code and use
|
||||
<a href="https://www.doxygen.nl/index.html">Doxygen</a> to
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/src/H5Fpublic.h">markup
|
||||
<a href="https://\SRCURL/src/H5Fpublic.h">markup
|
||||
comments in the code</a> or create
|
||||
<a href="https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/doxygen/dox/Overview.dox">stand-alone pages</a>.
|
||||
<a href="https://\SRCURL/doxygen/dox/Overview.dox">stand-alone pages</a>.
|
||||
|
||||
Every RM entry consists of a subset of the elements listed below. Not every RM
|
||||
entry warrants the full set. More is better, and we can, perhaps, distinguish
|
||||
|
||||
@@ -36,7 +36,7 @@ TABLE CAPTION STRONG { font-size: larger }
|
||||
</li><li><h3><u>Background Reading:</u></h3>
|
||||
|
||||
<dl>
|
||||
<dt><a href="https://hdfgroup.github.io/hdf5/v1_14/_s_p_e_c.html">HDF5 File Format Specification</a>
|
||||
<dt><a href="https://\DOXURL/_s_p_e_c.html">HDF5 File Format Specification</a>
|
||||
</dt><dd>This describes the current HDF5 file format.
|
||||
</dd></dl>
|
||||
|
||||
|
||||
@@ -0,0 +1,1610 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<title> HDF5 File Image Operations </title>
|
||||
<!--
|
||||
redirect_from:
|
||||
- /display/HDF5/HDF5+File+Image+Operations
|
||||
(Note that links don't seem to work with sections of heading 1 or 2, only with h3 and h4)
|
||||
-->
|
||||
<head>
|
||||
<style>
|
||||
|
||||
#table1 {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 10px;
|
||||
}
|
||||
#table2 {
|
||||
font-size: 12px;
|
||||
border: 1px solid black;
|
||||
border-collapse: collapse;
|
||||
border-spacing: 10px;
|
||||
width: 100%;
|
||||
}
|
||||
#td1, #th1 {
|
||||
background-color: #778DC8;
|
||||
text-align: left;
|
||||
padding: 8px;
|
||||
}
|
||||
#td2, #th2 {
|
||||
text-align: left;
|
||||
padding: 8px;
|
||||
}
|
||||
#td3 {
|
||||
width: 30%;
|
||||
}
|
||||
tr:nth-child(even) {
|
||||
background-color: #eeeeee;
|
||||
}
|
||||
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<ul>
|
||||
<li><a href="#introduction">1. Introduction to HDF5 File Image Operations</a></li>
|
||||
<ul>
|
||||
<li><a href="#file-image-operations-function-summary">File Image Operations Function Summary</a></li>
|
||||
<li><a href="#abbreviations">Abbreviations</a></li>
|
||||
<li><a href="#developer-prerequisites">Developer Prerequisites</a></li>
|
||||
<li><a href="#resources">Resources</a></li>
|
||||
</ul>
|
||||
|
||||
<li><a href="#c-api-call-syntax">2. C API Call Syntax</a></li>
|
||||
<ul>
|
||||
<li><a href="#low-level-c-api-routines">2.1. Low-level C API Routines</a></li>
|
||||
<ul>
|
||||
<li><a href="#h5pset_file_image">H5Pset_file_image</a></li>
|
||||
<li><a href="#h5pget_file_image">H5Pget_file_image</a></li>
|
||||
<li><a href="#h5pset_file_image_callbacks">H5Pset_file_image_callbacks</a></li>
|
||||
<li><a href="#h5pget_file_image_callbacks">H5Pget_file_image_callbacks</a></li>
|
||||
<li><a href="#virtual-file-driver-feature-flags">Virtual File Driver Feature Flags</a></li>
|
||||
<li><a href="#h5fget_file_image">H5Fget_file_image</a></li>
|
||||
</ul>
|
||||
<li><a href="#high-level-c-api-routine">2.2. High-level C API Routine</a></li>
|
||||
<ul>
|
||||
<li><a href="#h5ltopen_file_image">H5LTopen_file_image</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
|
||||
<li><a href="#c-api-call-semantics">3. C API Call Semantics</a></li>
|
||||
<ul>
|
||||
<li><a href="#file-image-callback-semantics">3.1. File Image Callback Semantics</a></li>
|
||||
<ul>
|
||||
<li><a href="#buffer-ownership">Buffer Ownership</a></li>
|
||||
<li><a href="#sharing-a-file-image-buffer-with-the-hdf5-library">Sharing a File image Buffer with the HDF5 Library</a></li>
|
||||
<li><a href="#file-driver-considerations">File Driver Considerations</a></li>
|
||||
</ul>
|
||||
|
||||
<li><a href="#initial-file-image-semantics">3.2. Initial File Image Semantics</a></li>
|
||||
<ul>
|
||||
<li><a href="#applying-initial-file-image-semantics">Applying Initial File Image Semantics to the Core File Driver</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
|
||||
<li><a href="#examples">4. Examples</a></li>
|
||||
<ul>
|
||||
<li><a href="#reading-an-in-memory-hdf5-file-image">4.1. Reading an In-memory HDF5 File Image</a></li>
|
||||
<li><a href="#in-memory-hdf5-file-image-construction">4.2. In-memory HDF5 File Image Construction</a></li>
|
||||
<li><a href="#using-hdf5-to-construct-and-read-a-data-packet">4.3. Using HDF5 to Construct and Read a Data Packet</a></li>
|
||||
<li><a href="#using-template-file">4.4. Using a Template File</a></li>
|
||||
</ul>
|
||||
|
||||
<li><a href="#java-signatures-for-file-image-operations-api-calls">5. Java Signatures for File Image Operations API Calls</a></li>
|
||||
<li><a href="#fortran-signatures-for-file-image-operations-api-calls">6. Fortran Signatures for File Image Operations API Calls</a></li>
|
||||
<ul>
|
||||
<li><a href="#low-level-fortran">6.1. Low-level Fortran API Routines</a></li>
|
||||
<ul>
|
||||
<li><a href="#h5pset_file_image_f">H5Pset_file_image_f</a></li>
|
||||
<li><a href="#h5pget_file_image_f">H5Pget_file_image_f</a></li>
|
||||
<li><a href="#h5pset_file_image_callbacks_f">H5Pset_file_image_callbacks_f</a></li>
|
||||
<li><a href="#h5pget_file_image_callbacks_f">H5Pget_file_image_callbacks_f</a></li>
|
||||
<li><a href="#fortran-virtual">Fortran Virtual File Driver Feature Flags</a></li>
|
||||
<li><a href="#h5fget_file_image_f">H5Fget_file_image_f</a></li>
|
||||
</ul>
|
||||
<li><a href="#high-level-fortran">6.2. High-level Fortran API Routine</a></li>
|
||||
<ul>
|
||||
<li><a href="#h5ltopen_file_image_f">H5LTopen_file_image_f</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</ul>
|
||||
|
||||
<h3 id="introduction">1. Introduction to HDF5 File Image Operations</h3>
|
||||
|
||||
<p>File image operations allow users to work with HDF5 files in memory in the same ways that users currently work with HDF5 files on disk. Disk I/O is not required when file images are opened, created, read from, or written to.</p>
|
||||
<p>An HDF5 file image is an HDF5 file that is held in a buffer in main memory. Setting up a file image in memory involves using either a buffer in the file access property list or a buffer in the Core (aka Memory) file driver.</p>
|
||||
<p>The advantage of working with a file in memory is faster access to the data.</p>
|
||||
<p>The challenge of working with files in memory buffers is maximizing performance and minimizing memory footprint while working within the constraints of the property list mechanism. This should be a non-issue for small file images, but may be a major issue for large images.</p>
|
||||
<p>If invoked with the appropriate flags, the H5LTopen_file_image() high level library call should deal with these challenges in most cases. However, some applications may require the programmer to address these issues directly.</p>
|
||||
|
||||
<h3 id="file-image-operations-function-summary">1.1. File Image Operations Function Summary</h3>
|
||||
<p>Functions used in file image operations are listed below.</p>
|
||||
<table id="table1">
|
||||
<tr>
|
||||
<th id="th1">C Function</th>
|
||||
<th id="th1">Purpose</th>
|
||||
<th id="th1">Section</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>H5Pset_file_image</td>
|
||||
<td>Specifies an initial file image</td>
|
||||
<td>2.1.1</td>
|
||||
</tr>
|
||||
</tr>
|
||||
<td>H5Pget_file_image</td>
|
||||
<td>Retrieves a copy of the file image designated for a VFD to use as the initial contents of a file</td>
|
||||
<td>2.1.2</td>
|
||||
<tr>
|
||||
</tr>
|
||||
<td>H5Pset_file_image_callbacks</td>
|
||||
<td>Manages file image buffer allocation, copying, reallocation, and release</td>
|
||||
<td>2.1.3</td>
|
||||
</tr>
|
||||
</tr>
|
||||
<td>H5Pget_file_image_callbacks</td>
|
||||
<td>Obtains the current file image callbacks from a file access property list</td>
|
||||
<td>2.1.4</td>
|
||||
</tr>
|
||||
</tr>
|
||||
<td>H5Fget_file_image</td>
|
||||
<td>Provides a simple way to retrieve a copy of the image of an existing, open file</td>
|
||||
<td>2.1.5</td>
|
||||
</tr>
|
||||
</tr>
|
||||
<td>H5LTopen_file_image</td>
|
||||
<td>Provides a convenient way to open an initial file image with the Core VFD</td>
|
||||
<td>2.1.6</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h3 id="abbreviations">1.2. Abbreviations</h3>
|
||||
<p>The following abbreviations are used in this document:</p>
|
||||
<table id="table1">
|
||||
<tr>
|
||||
<th>Abbreviation</th>
|
||||
<th text-align: left>Explanation</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>FAPL or fapl</td>
|
||||
<td>File Access Property List. In code samples, fapl is used.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>VFD</td>
|
||||
<td>Virtual File Driver</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>VFL</td>
|
||||
<td>Virtual File Layer</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h3 id="developer-prerequisites">1.3. Developer Prerequisites</h3>
|
||||
<p>Developers who use the file image operations described in this document should be proficient and experienced users of the HDF5 C Library APIs. More specifically, developers should have a working knowledge of property lists, callbacks, and virtual file drivers.</p>
|
||||
|
||||
<h3 id="resources">1.4. Resources</h3>
|
||||
<p>See the following for more information.</p>
|
||||
<p>The “RFC: File Image Operations” is the primary source for the information in this document.</p>
|
||||
<p>The “Alternate File Storage Layouts and Low-level File Drivers” section is in “The HDF5 File” chapter of the HDF5 User’s Guide .</p>
|
||||
<p>The H5P_SET_FAPL_CORE function call can be used to modify the file access property list so that the Memory virtual file driver, H5FD_CORE, is used. The Memory file driver is also known as the Core file driver.</p>
|
||||
<p>Refer to the <a href="./_v_f_l.html">Virtual File Layer</a> for more detail. A list of VFL Functions is provided below.</p>
|
||||
<p>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<th>C Function</th>
|
||||
<th id="th1">Purpose</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="./group___f_a_p_l.html#ga8bcce60e23e9d2a019212c63b146502e">H5Pset_driver</a></td>
|
||||
<td>Sets a file driver</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="./group___f_a_p_l.html#ga1b072297fed53cd8586604e45c483a56">H5Pget_driver_info</a></td>
|
||||
<td>Returns a pointer to file driver information</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="./_h5_f_ddevelop_8h.html#a576ba6b6ebc34ae422bf40700a4c372d">H5FDregister</a></td>
|
||||
<td>Registers a new file driver as a member of the virtual file driver class</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="./_h5_f_ddevelop_8h.html#a59017726a881d6c4f29eecd86470ab37">H5FDunregister</a></td>
|
||||
<td>Removes a driver ID from the library</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="./_h5_f_ddevelop_8h.html#a36c22438fe64e0f9e4dc13aec57da21f">H5FDopen</a></td>
|
||||
<td>Opens a file</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="./_h5_f_ddevelop_8h.html#ae4fea992d984e0adf3679be5f63ea9ad">H5FDclose</a></td>
|
||||
<td>Closes the file using the driver 'close' callback</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="./_h5_f_ddevelop_8h.html#a9b1a0e9f4d0ff59d85b5c6cdd17d4c36">H5FDcmp</a></td>
|
||||
<td>Compares the keys of two files using the file driver callback if the files belong to the same driver, otherwise sort the files by driver class pointer value</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="./_h5_f_ddevelop_8h.html#a2731cbbb7420979f09e76c2bbdb3f712">H5FDquery</a></td>
|
||||
<td>Queries a VFL driver for its feature flags</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="./_h5_f_ddevelop_8h.html#a4289f584f0dc6687a0f2f8c899ce7c17">H5FDalloc</a></td>
|
||||
<td>Allocates memory from the file</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="./_h5_f_ddevelop_8h.html#a27b43b854c133868598d56a839e9dac4">H5FDfree</a></td>
|
||||
<td>Frees format addresses in the file</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="./_h5_f_ddevelop_8h.html#aec8e1b721f73b34585c13b30723432f2">H5FDset_eoa</a></td>
|
||||
<td>Set the end-of-address marker for the file</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="./_h5_f_ddevelop_8h.html#a26caa637bd025f7689a8b7e00185c462">H5FDget_eoa</a></td>
|
||||
<td>Returns the address of the first byte after the last allocated memory in the file</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="./_h5_f_ddevelop_8h.html#a88f9da115c26884314618f2977872217">H5FDget_eof</a></td>
|
||||
<td>Returns the end-of-file address, which is the greater of the end-of-format address and the actual EOF marker</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="./_h5_f_ddevelop_8h.html#a37e835946eaa795005d6bd0d4af2ac3c">H5FDread</a></td>
|
||||
<td>Reads bytes from the file beginning at the specified address according to the provided data transfer property list</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="./_h5_f_ddevelop_8h.html#ae9da30010680e1eebb6d0b171528d64d">H5FDwrite</a></td>
|
||||
<td>Writes bytes to the file beginning at the specified address according to the provided data transfer property list</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="./_h5_f_ddevelop_8h.html#a56d03c211045edb510465dbdf0f811c0">H5FDflush</a></td>
|
||||
<td>Notifies driver to flush all cached data</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h3 id="c-api-call-syntax">2. C API Call Syntax</h3>
|
||||
|
||||
<p>The C API function calls described in this chapter fall into two categories: low-level routines that are part of the main HDF5 C Library and one high-level routine that is part of the “lite” API in the high-level wrapper library. The high-level routine uses the low-level routines and presents frequently requested functionality conveniently packaged for application developers’ use.</p>
|
||||
|
||||
<h3 id="low-level-c-api-routines">2.1. Low-level C API Routines</h3>
|
||||
|
||||
<p>The purpose of this section is to describe the low-level C API routines that support file image operations. These routines allow an in-memory image of an HDF5 file to be opened without requiring file system I/O.</p>
|
||||
<p>The basic approach to opening an in-memory image of an HDF5 file is to pass the image to the Core file driver, and then tell the Core file driver to open the file. We do this by using the H5Pget/set_file_image calls. These calls allow the user to specify an initial file image.</p>
|
||||
<p>A potential problem with the H5Pget/set_file_image calls is the overhead of allocating and copying of large file image buffers. The callback routines enable application programs to avoid this problem. However, the use of these callbacks is complex and potentially hazardous: the particulars are discussed in the semantics and examples chapters below (see section 3.1 and section 4.1 respectively). Fortunately, use of the file image callbacks should seldom be necessary: the H5LTopen_file_image call should address most use cases.</p>
|
||||
<p>The property list facility in HDF5 is employed in file image operations. This facility was designed for passing data, not consumable resources, into API calls. The peculiar ways in which the file image allocation callbacks may be used allows us to avoid extending the property list structure to handle consumable resources cleanly and to avoid constructing a new facility for the purpose.</p>
|
||||
<p>The sub-sections below describe the low-level C APIs that are used with file image operations.</p>
|
||||
|
||||
<h4 id="h5pset_file_image">2.1.1. H5Pset_file_image</h4>
|
||||
|
||||
<p>The H5Pset_file_image routine allows an application to provide an image for a file driver to use as the initial contents of the file. This call was designed initially for use with the Core VFD, but it can be used with any VFD that supports using an initial file image when opening a file. See the “Virtual File Driver Feature Flags” section for more information. Calling this routine makes a copy of the provided file image buffer. See the “H5Pset_file_image_callbacks” section for more information.</p>
|
||||
<p>The signature of H5Pset_file_image is defined as follows:</p>
|
||||
<p><code>herr_t H5Pset_file_image(hid_t fapl_id, void *buf_ptr, size_t buf_len)</code>
|
||||
|
||||
<p>The parameters of H5Pset_file_image are defined as follows:</p>
|
||||
<p>fapl_id contains the ID of the target file access property list.
|
||||
buf_ptr supplies a pointer to the initial file image, or NULL if no initial file image is desired.
|
||||
buf_len contains the size of the supplied buffer, or 0 if no initial image is desired.
|
||||
If either the buf_len parameter is zero, or the buf_ptr parameter is NULL, no file image will be set in the FAPL, and any existing file image buffer in the FAPL will be released. If a buffer is released, the FAPL’s file image buf_len will be set to 0 and buf_ptr will be set to NULL.</p>
|
||||
<p>Given the tight interaction between the file image callbacks and the file image, the file image callbacks in a property list cannot be changed while a file image is defined.</p>
|
||||
<p>With properly constructed file image callbacks, it is possible to avoid actually copying the file image. The particulars of this are discussed in greater detail in the “C API Call Semantics” chapter and in the “Examples” chapter.</p>
|
||||
|
||||
<h4 id="h5pget_file_image">2.1.2. H5Pget_file_image</h4>
|
||||
|
||||
<p>The H5Pget_file_image routine allows an application to retrieve a copy of the file image designated for a VFD to use as the initial contents of a file. This routine uses the file image callbacks (if defined) when allocating and loading the buffer to return to the application, or it uses malloc and memcpy if the callbacks are undefined. When malloc and memcpy are used, it will be the caller’s responsibility to discard the returned buffer via a call to free.</p>
|
||||
<p>The signature of H5Pget_file_image is defined as follows:</p>
|
||||
<p><code>herr_t H5Pget_file_image(hid_t fapl_id, void **buf_ptr_ptr, size_t *buf_len_ptr)</code>
|
||||
|
||||
<p>The parameters of H5Pget_file_image are defined as follows:</p>
|
||||
<p>fapl_id contains the ID of the target file access property list.
|
||||
<p><code>buf_ptr_ptr</code> contains a NULL or a pointer to a void*. If buf_ptr_ptr is not NULL, on successful return, *buf_ptr_ptr will contain a pointer to a copy of the initial image provided in the last call to H5Pset_file_image for the supplied fapl_id. If no initial image has been set, *buf_ptr_ptr will be NULL.</p>
|
||||
<p><code>buf_len_ptr</code> contains a NULL or a pointer to size_t. If buf_len_ptr is not NULL, on successful return, *buf_len_ptr will contain the value of the buf_len parameter for the initial image in the supplied fapl_id. If no initial image is set, the value of *buf_len_ptr will be 0.</p>
|
||||
|
||||
<p>As with H5Pset_file_image, appropriately defined file image callbacks can allow this function to avoid buffer allocation and memory copy operations.</p>
|
||||
|
||||
<h4 id="h5pset_file_image_callbacks">2.1.3. H5Pset_file_image_callbacks</h4>
|
||||
|
||||
<p>The H5Pset_file_image_callbacks API call exists to allow an application to control the management of file image buffers through user defined callbacks. These callbacks will be used in the management of file image buffers in property lists and in select file drivers. These routines are invoked when a new file image buffer is allocated, when an existing file image buffer is copied or resized, or when a file image buffer is released from use. From the perspective of the HDF5 Library, the operations of the image_malloc, image_memcpy, image_realloc, and image_free callbacks must be identical to those of the corresponding C standard library calls (malloc, memcpy, realloc, and free). While the operations must be identical, the file image callbacks have more parameters. The callbacks and their parameters are described below. The return values of image_malloc and image_realloc are identical to the return values of malloc and realloc. However, the return values of image_memcpy and image_free are different than the return values of memcpy and free: the return values of image_memcpy and image_free can also indicate failure. See the “File Image Callback Semantics” section for more information.</p>
|
||||
<p>The signature of H5Pset_file_image_callbacks is defined as follows:</p>
|
||||
|
||||
<p><pre><code>typedef enum
|
||||
{
|
||||
H5_FILE_IMAGE_OP_PROPERTY_LIST_SET,
|
||||
H5_FILE_IMAGE_OP_PROPERTY_LIST_COPY,
|
||||
H5_FILE_IMAGE_OP_PROPERTY_LIST_GET,
|
||||
H5_FILE_IMAGE_OP_PROPERTY_LIST_CLOSE,
|
||||
H5_FILE_IMAGE_OP_FILE_OPEN,
|
||||
H5_FILE_IMAGE_OP_FILE_RESIZE,
|
||||
H5_FILE_IMAGE_OP_FILE_CLOSE
|
||||
} H5_file_image_op_t;</code></pre></p>
|
||||
|
||||
<p><pre><code>typedef struct
|
||||
{
|
||||
void *(*image_malloc)(size_t size, H5_file_image_op_t file_image_op,
|
||||
void *udata);
|
||||
void *(*image_memcpy)(void *dest, const void *src, size_t size,
|
||||
H5_file_image_op_t file_image_op, void *udata);
|
||||
void *(*image_realloc)(void *ptr, size_t size,
|
||||
H5_file_image_op_t file_image_op, void *udata);
|
||||
herr_t (*image_free)(void *ptr, H5_file_image_op_t file_image_op,
|
||||
void *udata);
|
||||
void *(*udata_copy)(void *udata);
|
||||
herr_t (*udata_free)(void *udata);
|
||||
void *udata;
|
||||
} H5_file_image_callbacks_t;</code></pre></p>
|
||||
|
||||
<p><code>herr_t H5Pset_file_image_callbacks(hid_t fapl_id,
|
||||
H5_file_image_callbacks_t *callbacks_ptr)</code></p>
|
||||
|
||||
The parameters of H5Pset_file_image_callbacks are defined as follows:</p>
|
||||
|
||||
<ul>
|
||||
<li><code>fapl_id</code> contains the ID of the target file access property list.</li>
|
||||
<li><code>callbacks_ptr</code> contains a pointer to an instance of the H5_file_image_callbacks_t structure.</li>
|
||||
</ul>
|
||||
|
||||
<p>The fields of the H5_file_image_callbacks_t structure are defined as follows:
|
||||
|
||||
<ul>
|
||||
<li><code>image_malloc</code> contains a pointer to a function with (from the perspective of HDF5) functionality identical to the standard C library malloc() call. The parameters of the image_malloc callback are defined as follows:</li>
|
||||
<ul>
|
||||
<li><code>size</code> contains the size in bytes of the image buffer to allocate.</li>
|
||||
<li><code>file_image_op</code> contains one of the values of H5_file_image_op_t. These values indicate the operation being performed on the file image when this callback is invoked. Possible values for file_image_op are discussed in Table 2.</li>
|
||||
<li><code>udata</code> holds the value passed in for the udata parameter to H5Pset_file_image_callbacks.</li>
|
||||
</ul>
|
||||
|
||||
Setting <code>image_malloc</code> to NULL indicates that the HDF5 Library should invoke the standard C library malloc() routine when allocating file image buffers.<p>
|
||||
|
||||
<li><code>image_memcpy</code> contains a pointer to a function with (from the perspective of HDF5) functionality identical to the standard C library memcpy() call except that it returns NULL on failure. Recall that the memcpy C Library routine is defined to return the dest parameter in all cases. The parameters of the image_memcpy callback are defined as follows:</li>
|
||||
<ul>
|
||||
<li><code>dest</code> contains the address of the destination buffer.</li>
|
||||
<li><code>src</code> contains the address of the source buffer.</li>
|
||||
<li><code>size</code> contains the number of bytes to copy.</li>
|
||||
<li><code>file_image_op</code> contains one of the values of H5_file_image_op_t. These values indicate the operation being performed on the file image when this callback is invoked. Possible values for file_image_op are discussed in Table 2.</li>
|
||||
<li><code>udata</code> holds the value passed in for the udata parameter to H5Pset_file_image_callbacks.</li>
|
||||
</ul>
|
||||
|
||||
Setting </code>image_memcpy to NULL indicates that the HDF5 Library should invoke the standard C library memcpy() routine when copying buffers.<p>
|
||||
|
||||
<li><p><code>image_realloc</code> contains a pointer to a function with (from the perspective of HDF5) functionality identical to the standard C library realloc() call. The parameters of the image_realloc callback are defined as follows:</li>
|
||||
<ul>
|
||||
<li><code>ptr</code> contains the pointer to the buffer being reallocated.</li>
|
||||
<li><code>size</code> contains the desired size in bytes of the buffer after realloc.</li>
|
||||
<li><code>file_image_op</code> contains one of the values of H5_file_image_op_t. These values indicate the operation being performed on the file image when this callback is invoked. Possible values for file_image_op are discussed in Table 2.</li>
|
||||
<li><code>udata</code> holds the value passed in for the udata parameter to H5Pset_file_image_callbacks.</li>
|
||||
</ul>
|
||||
|
||||
Setting </code>image_realloc to NULL indicates that the HDF5 Library should invoke the standard C library realloc() routine when resizing file image buffers.<p>
|
||||
|
||||
<li><code>image_free</code> contains a pointer to a function with (from the perspective of HDF5) functionality identical to the standard C library free() call except that it will return 0 (SUCCEED) on success and -1 (FAIL) on failure. The parameters of the image_free callback are defined as follows:</li>
|
||||
<ul>
|
||||
<li><code>ptr</code> contains the pointer to the buffer being released.</li>
|
||||
<li><code>file_image_op</code> contains one of the values of H5_file_image_op_t. These values indicate the operation being performed on the file image when this callback is invoked. Possible values for file_image_op are discussed in Table 2 .</li>
|
||||
<li><code>udata</code> holds the value passed in for the udata parameter to H5Pset_file_image_callbacks.</li>
|
||||
</ul>
|
||||
|
||||
Setting <code>image_free</code> to NULL indicates that the HDF5 Library should invoke the standard C library free() routine when releasing file image buffers.<p>
|
||||
|
||||
<li><code>udata_copy</code> contains a pointer to a function that (from the perspective of HDF5) allocates a buffer of suitable size, copies the contents of the supplied udata into the new buffer, and returns the address of the new buffer. The function returns NULL on failure. This function is necessary if a non-NULL udata parameter is supplied, so that property lists containing the image callbacks can be copied. If the udata parameter (below) is NULL, then this parameter should be NULL as well. The parameter of the udata_copy callback is defined as follows:</li>
|
||||
<ul>
|
||||
<li><code>udata</code> contains the pointer to the user data block being copied.</li>
|
||||
</ul><p>
|
||||
|
||||
<li><code>udata_free</code> contains a pointer to a function that (from the perspective of HDF5) frees a user data block. This function is necessary if a non-NULL udata parameter is supplied so that property lists containing image callbacks can be discarded without a memory leak. If the udata parameter (below) is NULL, this parameter should be NULL as well. The parameter of the udata_free callback is defined as follows:</li>
|
||||
<ul>
|
||||
<li><code>udata</code> contains the pointer to the user data block to be freed.</li>
|
||||
</ul>
|
||||
|
||||
<code>udata_free</code> returns 0 (SUCCEED) on success and -1 (FAIL) on failure.</p>
|
||||
|
||||
<li><code>udata</code> contains a pointer value, potentially to user-defined data, that will be passed to the image_malloc, image_memcpy, image_realloc, and image_free callbacks.</li>
|
||||
</ul>
|
||||
|
||||
The semantics of the values that can be set for the file_image_op parameter to the above callbacks are described in the table below:<p>
|
||||
<table id="table1">
|
||||
<caption align="top"; text-align: left;>Table 2. Values for the file_image_op parameter</caption>
|
||||
<tr>
|
||||
<th id="th1">Value</th>
|
||||
<th id="th1">Comments</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>H5_FILE_IMAGE_OP_PROPERTY_LIST_SET</td>
|
||||
<td>This value is passed to the image_malloc and image_memcpy callbacks when an image buffer is being copied while being set in a FAPL</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>H5_FILE_IMAGE_OP_PROPERTY_LIST_COPY</td>
|
||||
<td>This value is passed to the image_malloc and image_memcpy callbacks when an image buffer is being copied when a FAPL is copied</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>H5_FILE_IMAGE_OP_PROPERTY_LIST_GET</td>
|
||||
<td>This value is passed to the image_malloc and image_memcpy callbacks when an image buffer is being copied while being retrieved from a FAPL</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>H5_FILE_IMAGE_OP_PROPERTY_LIST_CLOSE</td>
|
||||
<td>This value is passed to the image_free callback when an image buffer is being released during a FAPL close operation.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>H5_FILE_IMAGE_OP_FILE_OPEN</td>
|
||||
<td>This value is passed to the image_malloc and image_memcpy callbacks when an image buffer is copied during a file open operation. While the image being opened will typically be copied from a FAPL, this need not always be the case. An example of an exception is when the Core file driver takes its initial image from a file.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>H5_FILE_IMAGE_OP_FILE_RESIZE</td>
|
||||
<td>This value is passed to the image_realloc callback when a file driver needs to resize an image buffer.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>H5_FILE_IMAGE_OP_FILE_CLOSE</td>
|
||||
<td>This value is passed to the image_free callback when an image buffer is being released during a file close operation.</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<p>In closing our discussion of H5Pset_file_image_callbacks(), we note the interaction between this call and the H5Pget/set_file_image() calls above: since the malloc, memcpy, and free callbacks defined in the instance of H5_file_image_callbacks_t are used by H5Pget/set_file_image(), H5Pset_file_image_callbacks() will fail if a file image is already set in the target property list.</p>
|
||||
<p>For more information on writing the file image to disk, set the <code>backing_store</code> parameter. See the H5Pset_fapl_core entry in the HDF5 Reference Manual.</p>
|
||||
|
||||
<h4 id="h5pget_file_image_callbacks">2.1.4. H5Pget_file_image_callbacks</h4>
|
||||
<p>The H5Pget_file_image_callbacks routine is designed to obtain the current file image callbacks from a file access property list.</p>
|
||||
<p>The signature of H5Pget_file_image_callbacks() is defined as follows:</p></code></p>
|
||||
|
||||
<p><code>herr_t H5Pget_file_image_callbacks(hid_t fapl_id,
|
||||
H5_file_image_callbacks_t *callbacks_ptr)</code></p>
|
||||
|
||||
The parameters of H5Pget_file_image_callbacks are defined as follows:</p>
|
||||
|
||||
<ul>
|
||||
<li><code>fapl_id</code> contains the ID of the target file access property list.</li>
|
||||
<li><code>callbacks_ptr</code> contains a pointer to an instance of the H5_file_image_callbacks_t structure. All fields should be initialized to NULL. See the “H5Pset_file_image_callbacks” section for more information on the H5_file_image_callbacks_t structure.</li>
|
||||
</ul>
|
||||
|
||||
Upon successful return, the fields of *callbacks_ptr shall contain values as defined below:</p>
|
||||
<ul>
|
||||
<li>Upon successful return, callbacks_ptr->image_malloc will contain the pointer passed as the image_malloc field of the instance of H5_file_image_callbacks_t pointed to by the callbacks_ptr parameter of the last call to H5Pset_file_image_callbacks() for the specified FAPL, or NULL if there has been no such call.</li>
|
||||
<li>Upon successful return, callbacks_ptr->image_memcpy will contain the pointer passed as the image_memcpy field of the instance of H5_file_image_callbacks_t pointed to by the callbacks_ptr parameter of the last call to H5Pset_file_image_callbacks() for the specified FAPL, or NULL if there has been no such call.</li>
|
||||
<li>Upon successful return, callbacks_ptr->image_realloc will contain the pointer passed as the image_realloc field of the instance of H5_file_image_callbacks_t pointed to by the callbacks_ptr parameter of the last call to H5Pset_file_image_callbacks() for the specified FAPL, or NULL if there has been no such call.</li>
|
||||
<li>Upon successful return, callbacks_ptr->image_free_ptr will contain the pointer passed as the image_free field of the instance of H5_file_image_callbacks_t pointed to by the callbacks_ptr parameter of the last call to H5Pset_file_image_callbacks() for the specified FAPL, or NULL if there has been no such call.</li>
|
||||
<li>Upon successful return, callbacks_ptr->udata_copy will contain the pointer passed as the udata_copy field of the instance of H5_file_image_callbacks_t pointed to by the callbacks_ptr parameter of the last call to H5Pset_file_image_callbacks() for the specified FAPL, or NULL if there has been no such call.</li>
|
||||
<li>Upon successful return, callbacks_ptr-> udata_free will contain the pointer passed as the udata_free field of the instance of H5_file_image_callbacks_t pointed to by the callbacks_ptr parameter of the last call to H5Pset_file_image_callbacks() for the specified FAPL, or NULL if there has been no such call.</li>
|
||||
<li>Upon successful return, callbacks_ptr->udata will contain the pointer passed as the udata field of the instance of H5_file_image_callbacks_t pointed to by the callbacks_ptr parameter of the last call to H5Pset_file_image_callbacks() for the specified FAPL, or NULL if there has been no such call.</li>
|
||||
</ul>
|
||||
|
||||
<h4 id="virtual-file-driver-feature-flags">2.1.5. Virtual File Driver Feature Flags</h4>
|
||||
|
||||
Implementation of the <code>H5Pget/set_file_image_callbacks()</code> and <code>H5Pget/set_file_image()</code> function calls requires a pair of virtual file driver feature flags. The flags are H5FD_FEAT_ALLOW_FILE_IMAGE and H5FD_FEAT_CAN_USE_FILE_IMAGE_CALLBACKS. Both of these are defined in H5FDpublic.h.</p>
|
||||
|
||||
<p>The first flag, H5FD_FEAT_ALLOW_FILE_IMAGE, allows a file driver to indicate whether or not it supports file images. A VFD that sets this flag when its ‘query’ callback is invoked indicates that the file image set in the FAPL will be used as the initial contents of a file. Support for setting an initial file image is designed primarily for use with the Core VFD. However, any VFD can indicate support for this feature by setting the flag and copying the image in an appropriate way for the VFD (possibly by writing the image to a file and then opening the file). However, such a VFD need not employ the file image after file open time. In such cases, the VFD will not make an in-memory copy of the file image and will not employ the file image callbacks.</p>
|
||||
|
||||
<p>File drivers that maintain a copy of the file in memory (only the Core file driver at present) can be constructed to use the initial image callbacks (if defined). Those that do must set the H5FD_FEAT_CAN_USE_FILE_IMAGE_CALLBACKS flag, the second flag, when their ‘query’ callbacks are invoked.</p>
|
||||
|
||||
<p>Thus file drivers that set the H5FD_FEAT_ALLOW_FILE_IMAGE flag but not the H5FD_FEAT_CAN_USE_FILE_IMAGE_CALLBACKS flag may read the supplied image from the property list (if present) and use it to initialize the contents of the file. However, they will not discard the image when done, nor will they make any use of any file image callbacks (if defined).</p>
|
||||
|
||||
<p>If an initial file image appears in a file allocation property list that is used in an H5Fopen() call, and if the underlying file driver does not set the H5FD_FEAT_ALLOW_FILE_IMAGE flag, then the open will fail.</p>
|
||||
|
||||
<p>If a driver sets both the H5FD_FEAT_ALLOW_FILE_IMAGE flag and the H5FD_FEAT_CAN_USE_FILE_IMAGE_CALLBACKS flag, then that driver will allocate a buffer of the required size, copy the contents of the initial image buffer from the file access property list, and then open the copy as if it had just loaded it from file. If the file image allocation callbacks are defined, the driver shall use them for all memory management tasks. Otherwise it will use the standard malloc, memcpy, realloc, and free C library calls for this purpose.</p>
|
||||
|
||||
<p>If the VFD sets the H5FD_FEAT_ALLOW_FILE_IMAGE flag, and an initial file image is defined by an application, the VFD should ensure that file creation operations (as opposed to file open operations) bypass use of the file image, and create a new, empty file.</p>
|
||||
|
||||
<p>Finally, it is logically possible that a file driver would set the H5FD_FEAT_CAN_USE_FILE_IMAGE_CALLBACKS flag, but not the H5FD_FEAT_ALLOW_FILE_IMAGE flag. While it is hard to think of a situation in which this would be desirable, setting the flags this way will not cause any problems: the two capabilities are logically distinct.</p>
|
||||
|
||||
<h4 id="h5fget_file_image">2.1.6. H5Fget_file_image</h4>
|
||||
|
||||
<p>The purpose of the H5Fget_file_image routine is to provide a simple way to retrieve a copy of the image of an existing, open file. This routine can be used with files opened using the SEC2 (aka POSIX), STDIO, and Core (aka Memory) VFDs.</p>
|
||||
|
||||
<p>The signature of H5Fget_file_image is defined as follows:</p>
|
||||
<p><code>ssize_t H5Fget_file_image(hid_t file_id, void *buf_ptr, size_t buf_len)</code></p>
|
||||
|
||||
The parameters of H5Fget_file_image are defined as follows:
|
||||
|
||||
<ul>
|
||||
<li><code>file_id</code> contains the ID of the target file.</li>
|
||||
<li><code>buf_ptr</code> contains a pointer to the buffer into which the image of the HDF5 file is to be copied. If buf_ptr is NULL, no data will be copied, but the return value will still indicate the buffer size required (or a negative value on error).</li>
|
||||
<li><code>buf_len</code> contains the size of the supplied buffer.</li>
|
||||
</ul>
|
||||
|
||||
<p>If the return value of H5Fget_file_image is a positive value, then the value will be the length of buffer required to store the file image (in other words, the length of the file). A negative value might be returned if the file is too large to store in the supplied buffer or on failure.</p>
|
||||
|
||||
<p>The current file size can be obtained via a call to H5Fget_filesize(). Note that this function returns the value of the end of file (EOF) and not the end of address space (EOA). While these values are frequently the same, it is possible for the EOF to be larger than the EOA. Since H5Fget_file_image() will only obtain a copy of the file from the beginning of the superblock to the EOA, it will be best to use H5Fget_file_image() to determine the size of the buffer required to contain the image.</p>
|
||||
|
||||
<strong>Other Design Considerations</strong>
|
||||
|
||||
<p>Here are some other notes regarding the design and implementation of H5Fget_file_image.</p>
|
||||
<p>The H5Fget_file_image call should be part of the high-level library. However, a file driver agnostic implementation of the routine requires access to data structures that are hidden within the HDF5 Library. We chose to implement the call in the library proper rather than expose those data structures.</p>
|
||||
<p>There is no reason why the H5Fget_file_image() API call could not work on files opened with any file driver. However, the Family, Multi, and Split file drivers have issues that make the call problematic. At present, files opened with the Family file driver are marked as being created with that file driver in the superblock, and the HDF5 Library refuses to open files so marked with any other file driver. This negates the purpose of the H5Fget_file_image() call. While this mark can be removed from the image, the necessary code is not trivial.</p>
|
||||
<p>Thus we will not support the Family file driver in H5Fget_file_image() unless there is demand for it. Files created with the Multi and Split file drivers are also marked in the superblock. In addition, they typically use a very sparse address space. A sparse address space would require the use of an impractically large buffer for an image, and most of the buffer would be empty. So, we see no point in supporting the Multi and Split file drivers in H5Fget_file_image() under any foreseeable circumstances.</p>
|
||||
|
||||
<h3 id="high-level-c-api-routine">2.2. High-level C API Routine</h3>
|
||||
|
||||
<p>The H5LTopen_file_image high-level routine encapsulates the capabilities of routines in the main HDF5 Library with conveniently accessible abstractions.</p>
|
||||
|
||||
<h4 id="h5ltopen_file_image">2.2.1. H5LTopen_file_image</h4>
|
||||
|
||||
<p>The H5LTopen_file_image routine is designed to provide an easier way to open an initial file image with the Core VFD. Flags to H5LTopen_file_image allow for various file image buffer ownership policies to be requested. See the HDF5 Reference Manual for more information on high-level APIs.</p>
|
||||
<p>The signature of H5LTopen_file_image is defined as follows:</p>
|
||||
|
||||
<p><code>hid_t H5LTopen_file_image(void *buf_ptr, size_t buf_len, unsigned flags)</code>
|
||||
|
||||
<p>The parameters of H5LTopen_file_image are defined as follows:</p>
|
||||
<ul>
|
||||
<li><code>buf_ptr</code> contains a pointer to the supplied initial image. A NULL value is invalid and will cause H5LTopen_file_image to fail.</li>
|
||||
<li><code>buf_len</code> contains the size of the supplied buffer. A value of 0 is invalid and will cause H5LTopen_file_image to fail.</li>
|
||||
<li><code>flags</code> contains a set of flags indicating whether the image is to be opened read/write, whether HDF5 is to take control of the buffer, and how long the application promises to maintain the buffer. Possible flags are described in the table below:</li>
|
||||
</ul>
|
||||
|
||||
<table id="table1">
|
||||
<caption align="top"; text-align: left;>Table 3. Flags for H5LTopen_file_image</caption>
|
||||
<tr>
|
||||
<th id="th1">Value</th>
|
||||
<th id="th1">Comments</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>H5LT_FILE_IMAGE_OPEN_RW</td>
|
||||
<td>Indicates that the HDF5 Library should open the image read/write instead of the default read-only.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>H5LT_FILE_IMAGE_DONT_COPY</td>
|
||||
<td>
|
||||
<ul style="list-style-type:none;">
|
||||
<li>Indicates that the HDF5 Library should not copy the file image buffer provided, but should use it directly. The HDF5 Library will release the file image when finished. The supplied buffer must have been allocated via a call to the standard C library malloc() or calloc() routines. The HDF5 Library will call free() to release the buffer. In the absence of this flag, the HDF5 Library will copy the buffer provided. The H5LT_FILE_IMAGE_DONT_COPY flag provides an application with the ability to “give ownership” of a file image buffer to the HDF5 Library.</li>
|
||||
<li>The HDF5 Library will modify the buffer on write if the image is opened read/write and the H5LT_FILE_IMAGE_DONT_COPY flag is set.</li>
|
||||
<li>The H5LT_FILE_IMAGE_DONT_RELEASE flag, see below, is invalid unless the H5LT_FILE_IMAGE_DONT_COPY flag is set</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>H5LT_FILE_IMAGE_DONT_RELEASE</td>
|
||||
<td>
|
||||
<ul style="list-style-type:none;">
|
||||
<li>Indicates that the HDF5 Library should not attempt to release the buffer when the file is closed. This implies that the application will tend to this detail and that the application will not discard the buffer until after the file image is closed.</li>
|
||||
<li>Since there is no way to return a changed buffer base address to the application, and since realloc can change this value, calls to realloc() must be barred when this flag is set. As a result, any write that requires an increased buffer size will fail.</li>
|
||||
<li>This flag is invalid unless the H5LT_FILE_IMAGE_DONT_COPY flag, see above, is set.</li>
|
||||
<li>If the H5LT_FILE_IMAGE_DONT_COPY flag is set and this flag is not set, the HDF5 Library will release the file image buffer after the file is closed using the standard C library free() routine.</li>
|
||||
<li>Using this flag and the H5LT_FILE_IMAGE_DONT_COPY flag provides a way for the application to specify a buffer that the HDF5 Library can use for opening and accessing as a file image while letting the application retain ownership of the buffer.</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<p>The following table is intended to summarize the semantics of the H5LT_FILE_IMAGE_DONT_COPY and H5LT_FILE_IMAGE_DONT_RELEASE flags (shown as “Don’t Copy Flag” and “Don’t Release Flag” respectively in the table):</p>
|
||||
|
||||
<table id="table1">
|
||||
<caption align="top"; text-align: left;>Table 4. Summary of Don’t Copy and Don’t Release Flag Actions</caption>
|
||||
<tr>
|
||||
<th id="th1">Don’t Copy Flag</th>
|
||||
<th id="th1">Don’t Release Flag</th>
|
||||
<th id="th1">Make Copy of User Supplied Buffer</th>
|
||||
<th id="th1">Pass User Supplied Buffer to File Driver</th>
|
||||
<th id="th1">Release User Supplied Buffer When Done</th>
|
||||
<th id="th1">Permit realloc of Buffer Used by File Driver</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>False</td>
|
||||
<td>Don’t care</td>
|
||||
<td>True</td>
|
||||
<td>False</td>
|
||||
<td>False</td>
|
||||
<td>True</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>True</td>
|
||||
<td>False</td>
|
||||
<td>False</td>
|
||||
<td>True</td>
|
||||
<td>True</td>
|
||||
<td>True</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>True</td>
|
||||
<td>True</td>
|
||||
<td>False</td>
|
||||
<td>True</td>
|
||||
<td>False</td>
|
||||
<td>False</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<p>The return value of H5LTopen_file_image will be a file ID on success or a negative value on failure. The file ID returned should be closed with H5Fclose.</p>
|
||||
<p>Note that there is no way currently to specify a “backing store” file name in this definition of H5LTopen_image.</p>
|
||||
|
||||
<h3 id="c-api-call-semantics">3. C API Call Semantics</h3>
|
||||
<p>The purpose of this chapter is to describe some issues that developers should consider when using file image buffers, property lists, and callback APIs.</p>
|
||||
|
||||
<h3 id="file-image-callback-semantics">3.1. File Image Callback Semantics</h3>
|
||||
<p>The H5Fget/set_file_image_callbacks() API calls allow an application to hook the memory management operations used when allocating, duplicating, and discarding file images in the property list, in the Core file driver, and potentially in any in-memory file driver developed in the future.</p>
|
||||
<p>From the perspective of the HDF5 Library, the supplied image_malloc(), image_memcpy(), image_realloc(), and image_free() callback routines must function identically to the C standard library malloc(), memcpy(), realloc(), and free() calls. What happens on the application side can be much more nuanced, particularly with the ability to pass user data to the callbacks. However, whatever the application does with these calls, it must maintain the illusion that the calls have had the expected effect. Maintaining this illusion requires some understanding of how the property list structure works, and what HDF5 will do with the initial images passed to it.</p>
|
||||
<p>At the beginning of this document, we talked about the need to work within the constraints of the property list mechanism. When we said “from the perspective of the HDF5 Library…” in the paragraph above, we are making reference to this point.</p>
|
||||
<p>The property list mechanism was developed as a way to add parameters to functions without changing the parameter list and breaking existing code. However, it was designed to use only “call by value” semantics, not “call by reference”. The decision to use “call by value” semantics requires that the values of supplied variables be copied into the property list. This has the advantage of simplifying the copying and deletion of property lists. However, if the value to be copied is large (say a 2 GB file image), the overhead can be unacceptable.</p>
|
||||
<p>The usual solution to this problem is to use “call by reference” where only a pointer to an object is placed in a parameter list rather than a copy of the object itself. However, use of “call by reference” semantics would greatly complicate the property list mechanism: at a minimum, it would be necessary to maintain reference counts to dynamically allocated objects so that the owner of the object would know when it was safe to free the object.</p>
|
||||
<p>After much discussion, we decided that the file image operations calls were sufficiently specialized that it made no sense to rework the property list mechanism to support “call by reference.” Instead we provided the file image callback mechanism to allow the user to implement some version of “call by reference” when needed. It should be noted that we expect this mechanism to be used rarely if at all. For small file images, the copying overhead should be negligible, and for large images, most use cases should be addressed by the H5LTopen_file_image call.</p>
|
||||
<p>In the (hopefully) rare event that use of the file image callbacks is necessary, the fundamental point to remember is that the callbacks must be constructed and used in such a way as to maintain the library’s illusion that it is using “call by value” semantics.</p>
|
||||
<p>Thus the property list mechanism must think that it is allocating a new buffer and copying the supplied buffer into it when the file image property is set. Similarly, it must think that it is allocating a new buffer and copying the contents of the existing buffer into it when it copies a property list that contains a file image. Likewise, it must think it is de-allocating a buffer when it discards a property list that contains a file image.</p>
|
||||
<p>Similar illusions must be maintained when a file image buffer is copied into the Core file driver (or any future driver that uses the file image callbacks) when the file driver re-sizes the buffer containing the image and finally when the driver discards the buffer.</p>
|
||||
|
||||
<h4 id="buffer-ownership">3.1.1. Buffer Ownership</h4>
|
||||
<p>The owner of a file image in a buffer is the party that has the responsibility to discard the file image buffer when it is no longer needed. In this context, the owner is either the HDF5 Library or the application program.</p>
|
||||
<p>We implemented the image_* callback facility to allow efficient management of large file images. These facilities can be used to allow sharing of file image buffers between the application and the HDF5 library, and also transfer of ownership in either direction. In such operations, care must be taken to ensure that ownership is clear and that file image buffers are not discarded before all references to them are discarded by the non-owning party.</p>
|
||||
<p>Ownership of a file image buffer will only be passed to the application program if the file image callbacks are designed to do this. In such cases, the application program must refrain from freeing the buffer until the library has deleted all references to it. This in turn will happen after all property lists (if any) that refer to the buffer have been discarded, and the file driver (if any) that used the buffer has closed the file and thinks it has discarded the buffer.</p>
|
||||
|
||||
<h4 id="sharing-a-file-image-buffer-with-the-hdf5-library">3.1.2. Sharing a File image Buffer with the HDF5 Library</h4>
|
||||
<p>As mentioned above, the HDF5 property lists are a mechanism for passing values into HDF5 Library calls. They were created to allow calls to be extended with new parameters without changing the actual API or breaking existing code. They were designed based on the assumption that all new parameters would be “call by value” and not “call by reference.” Having “call by value” parameters means property lists can be copied, reused, and discarded with ease.</p>
|
||||
<p>Suppose an application wished to share a file image buffer with the HDF5 Library. This means the library would be allowed to read the file image, but not free it. The file image callbacks might be constructed as follows to share a buffer:</p>
|
||||
|
||||
<ul>
|
||||
<li>Construct the image_malloc() call so that it returns the address of the buffer instead of allocating new space. This will keep the library thinking that the buffers are distinct even when they are not. Support this by including the address of the buffer in the user data. As a sanity check, include the buffer’s size in the user data as well, and require image_malloc() to fail if the requested buffer size is unexpected. Finally, include a reference counter in the user data, and increment the reference counter on each call to image_malloc().</li>
|
||||
<li>Construct the image_memcpy() call so that it does nothing. As a sanity check, make it fail if the source and destination pointers do not match the buffer address in the user data or if the size is unexpected.</li>
|
||||
<li>Construct the image_free() routine so that it does nothing. As a sanity check, make it compare the supplied pointer with the expected pointer in the user data. Also, make it decrement the reference counter and notify the application that the HDF5 Library is done with the buffer when the reference count drops to 0.</li>
|
||||
</ul>
|
||||
|
||||
As the property list code will never resize a buffer, we do not discuss the image_realloc() call here. The behavior of image_realloc() in this scenario depends on what the application wants to do with the file image after it has been opened. We discuss this issue in the next section. Note also that the operation passed into the file image callbacks allow the callbacks to behave differently depending on the context in which they are used.</p>
|
||||
<p>For more information on user defined data, see the “H5Pset_file_image_callbacks” section.</p>
|
||||
|
||||
<h4 id="file-driver-considerations">3.1.3. File Driver Considerations</h4>
|
||||
<p>When a file image is opened by a driver that sets both the H5FD_FEAT_ALLOW_FILE_IMAGE and the H5FD_FEAT_CAN_USE_FILE_IMAGE_CALLBACKS flags, the driver will allocate a buffer large enough for the initial file image and then copy the image from the property list into this buffer. As processing progresses, the driver will reallocate the image as necessary to increase its size and will eventually discard the image at file close. If defined, the driver will use the file image callbacks for these operations; otherwise, the driver will use the standard C library calls. See the "H5Pset_file_image_callbacks” section for more information.</p>
|
||||
<p>As described above, the file image callbacks can be constructed so as to avoid the overhead of buffer allocations and copies while allowing the HDF5 Library to maintain its illusions on the subject. There are two possible complications involving the file driver. The complications are the possibility of reallocation calls from the driver and the possibility of the continued existence of property lists containing references to the buffer.</p>
|
||||
<p>Suppose an application wishes to share a file image buffer with the HDF5 Library. The application allows the library to read (and possibly write) the image, but not free it. We must first decide whether the image is to be opened read-only or read/write.</p>
|
||||
<p>If the image will be opened read-only (or if we know that any writes will not change the size of the image), the image_realloc() call should never be invoked. Thus the image_realloc() routine can be constructed so as to always fail, and the image_malloc(), image_memcpy(), and image_free() routines can be constructed as described in the section above.</p>
|
||||
<p>Suppose, however, that the file image will be opened read/write and may grow during the computation. We must now allow for the base address of the buffer to change due to reallocation calls, and we must employ the user data structure to communicate any change in the buffer base address and size to the application. We pass buffer changes to the application so that the application will be able to eventually free the buffer. To this end, we might define a user data structure as shown in the example below:</p>
|
||||
<pre><code> typedef struct udata {
|
||||
void *init_ptr;
|
||||
size_t init_size;
|
||||
int init_ref_count;
|
||||
void *mod_ptr;
|
||||
size_t mod_size;
|
||||
int mod_ref_count;
|
||||
}
|
||||
</code></pre>
|
||||
<p><strong>Example 1.</strong> Using a user data structure to communicate with an application</p>
|
||||
<p>We initialize an instance of the structure so that init_ptr points to the buffer to be shared, init_size contains the initial size of the buffer, and all other fields are initialized to either NULL or 0 as indicated by their type. We then pass a pointer to the instance of the user data structure to the HDF5 Library along with allocation callback functions constructed as follows:</p>
|
||||
|
||||
<ul>
|
||||
<li>Construct the image_malloc() call so that it returns the value in the init_ptr field of the user data structure and increments the init_ref_count. As a sanity check, the function should fail if the requested size does not match the init_size field in the user data structure or if any of the modified fields have values other than their initial values.</li>
|
||||
<li>Construct the image_memcpy() call so that it does nothing. As a sanity check, it should be made to fail if the source, destination, and size parameters do not match the init_ptr and init_size fields as appropriate.</li>
|
||||
<li>Construct the image_realloc() call so that it performs a standard realloc. Sanity checking, assuming that the realloc is successful, should be as follows:</li>
|
||||
|
||||
<ul>
|
||||
<li>If the mod_ptr, mod_size, or mod_ref_count fields of the user data structure still have their initial values, verify that the supplied pointer matches the init_ptr field and that the supplied size does not match the init_size field. Decrement init_ref_count, set mod_ptr equal to the address returned by realloc, set mod_size equal to the supplied size, and set mod_ref_count to 1.</li>
|
||||
<li>If the mod_ptr, mod_size, or mod_ref_count fields of the user data structure are defined, verify that the supplied pointer matches the value of mod_ptr and that the supplied size does not match mod_size. Set mod_ptr equal to the value returned by realloc, and set mod_size equal to the supplied size.</li>
|
||||
</ul>
|
||||
|
||||
In both cases, if all sanity checks pass, return the value returned by the realloc call. Otherwise, return NULL.</p>
|
||||
<li>Construct the image_free() routine so that it does nothing. Perform sanity checks as follows:</li>
|
||||
<ul>
|
||||
<li>If the H5_FILE_IMAGE_OP_PROPERTY_LIST_CLOSE flag is set, decrement the init_ref_count field of the user data structure. Flag an error if init_ref_count drops below zero.</li>
|
||||
<li>If the H5_FILE_IMAGE_OP_FILE_CLOSE flag is set, check to see if the mod_ptr, mod_size, or mod_ref_count fields of the user data structure have been modified from their initial values. If they have, verify that mod_ref_count contains 1 and then set that field to zero. If they have not been modified, proceed as per the H5_FILE_IMAGE_OP_PROPERTY_LIST_CLOSE case.</li>
|
||||
</ul>
|
||||
</ul>
|
||||
|
||||
In either case, if both the init_ref_count and mod_ref_count fields have dropped to zero, notify the application that the HDF5 Library is done with the buffer. If the mod_ptr or mod_size fields have been modified, pass these values on to the application as well.</p>
|
||||
|
||||
<h3 id="initial-file-image-semantics">3.2. Initial File Image Semantics</h3>
|
||||
<p>One can argue whether creating a file with an initial file image is closer to creating a file or opening a file. The consensus seems to be that it is closer to a file open, and thus we shall require that the initial image only be used for calls to H5Fopen().</p>
|
||||
<p>Whatever our convention, from an internal perspective, opening a file with an initial file image is a bit of both creating a file and opening a file. Conceptually, we will create a file on disk, write the supplied image to the file, close the file, open the file as an HDF5 file, and then proceed as usual (of course, the Core VFD will not write to the file system unless it is configured to do so). This process is similar to a file create: we are creating a file that did not exist on disk to begin with and writing data to it. Also, we must verify that no file of the supplied name is open. However, this process is also similar to a file open: we must read the superblock and handle the usual file open tasks.</p>
|
||||
<p>Implementing the above sequence of actions has a number of implications on the behavior of the H5Fopen() call when an initial file image is supplied:</p>
|
||||
<ul>
|
||||
<li>H5Fopen() must fail if the target file driver does not set the H5FD_FEAT_ALLOW_FILE_IMAGE flag and a file image is specified in the FAPL.</li>
|
||||
<li>If the target file driver supports the H5FD_FEAT_ALLOW_FILE_IMAGE flag, then H5Fopen() must fail if the file is already open or if a file of the specified name exists.</li>
|
||||
<li>Even if the above constraints are satisfied, H5Fopen() must still fail if the image does not contain a valid (or perhaps just plausibly valid) image of an HDF5 file. In particular, the superblock must be processed, and the file structure be set up accordingly.</li>
|
||||
</ul>
|
||||
|
||||
See the “Virtual File Driver Feature Flags” section for more information.</p>
|
||||
<p>As we indicated earlier, if an initial file image appears in the property list of an H5Fcreate() call, it is ignored.</p>
|
||||
<p>While the above section on the semantics of the file image callbacks may seem rather gloomy, we get the payback here. The above says everything that needs to be said about initial file image semantics in general. The sub-section below has a few more observations on the Core file driver.</p>
|
||||
|
||||
<h4 id="applying-initial-file-image-semantics-to-the-core-file-driver">3.2.1. Applying Initial File Image Semantics to the Core File Driver</h4>
|
||||
<p>At present, the Core file driver uses the <code>open()</code> and <code>read()</code> system calls to load an HDF5 file image from the file system into RAM. Further, if the <code>backing_store</code> flag is set in the FAPL entry specifying the use of the Core file driver, the Core file driver’s internal image will be used to overwrite the source file on either flush or close. See the H5Pset_fapl_core entry in the HDF5 Reference Manual for more information.</p>
|
||||
<p>This results in the following observations. In all cases assume that use of the Core file driver has been specified in the FAPL.</p>
|
||||
<ul>
|
||||
<li>If the file specified in the H5Fopen() call does not exist, and no initial image is specified in the FAPL, the open must fail because there is no source for the initial image needed by the Core file driver.</li>
|
||||
<li>If the file specified in the H5Fopen() call does exist, and an initial image is specified in the FAPL, the open must fail because the source of the needed initial image is ambiguous: the file image could be taken either from file or from the FAPL.</li>
|
||||
<li>If the file specified in the H5Fopen() call does not exist, and an initial image is specified in the FAPL, the open will succeed. This assumes that the supplied image is valid. Further, if the backing store flag is set, the file specified in the H5Fopen() call will be created, and the contents of the Core file driver’s internal buffer will be written to the new file on flush or close.</li>
|
||||
</ul>
|
||||
|
||||
Thus a call to H5Fopen() can result in the creation of a new HDF5 file in the file system.</p>
|
||||
|
||||
<h3 id="examples">4. Examples</h3>
|
||||
<p>The purpose of this chapter is to provide examples of how to read or build an in-memory HDF5 file image.</p>
|
||||
|
||||
<h3 id="reading-an-in-memory-hdf5-file-image">4.1. Reading an In-memory HDF5 File Image</h3>
|
||||
|
||||
<p>The H5Pset_file_image() function call allows the Core file driver to be initialized from an application provided buffer. The following pseudo code illustrates its use:</p>
|
||||
|
||||
<pre><code>
|
||||
<allocate and initialize buf_len and buf>
|
||||
<allocate fapl_id>
|
||||
<set fapl to use Core file driver>
|
||||
H5Pset_file_image(fapl_id, buf, buf_len);
|
||||
<discard buf any time after this point>
|
||||
<open file>
|
||||
<discard fapl any time after this point>
|
||||
<read and/or write file as desired, close>
|
||||
</code></pre>
|
||||
|
||||
<strong>Example 2.</strong> Using H5Pset_file_image to initialize the Core file driver</p>
|
||||
|
||||
<p>This solution is easy to code, but the supplied buffer is duplicated twice. The first time is in the call to H5Pset_file_image() when the image is duplicated and the duplicate inserted into the property list. The second time is when the file is opened: the image is copied from the property list into the initial buffer allocated by the Core file driver. This is a non-issue for small images, but this could become a significant performance hit for large images.</p>
|
||||
<p>If we want to avoid the extra malloc and memcpycalls, we must decide whether the application should retain ownership of the buffer or pass ownership to the HDF5 Library.</p>
|
||||
<p>The following pseudo code illustrates opening the image read -only using the H5LTopen_file_image() routine. In this example, the application retains ownership of the buffer and avoids extra buffer allocations and memcpy calls.</p>
|
||||
|
||||
<pre><code>
|
||||
<allocate and initialize buf_len and buf>
|
||||
hid_t file_id;
|
||||
unsigned flags = H5LT_FILE_IMAGE_DONT_COPY | H5LT_FILE_IMAGE_DONT_RELEASE;
|
||||
file_id = H5LTopen_file_image(buf, buf_len, flags);
|
||||
<read file as desired, and then close>
|
||||
<discard buf any time after this point>
|
||||
</code></pre>
|
||||
|
||||
<strong>Example 3.</strong> Using H5LTopen_file_image to open a read-only file image where the application retains ownership of the buffer
|
||||
|
||||
<p>If the application wants to transfer ownership of the buffer to the HDF5 Library, and the standard C library routine free is an acceptable way of discarding it, the above example can be modified as follows:</p>
|
||||
|
||||
<pre><code>
|
||||
<allocate and initialize buf_len and buf>
|
||||
hid_t file_id;
|
||||
unsigned flags = H5LT_FILE_IMAGE_DONT_COPY;
|
||||
file_id = H5LTopen_file_image(buf, buf_len, flags);
|
||||
<read file as desired, and then close>
|
||||
</code></pre>
|
||||
|
||||
<strong>Example 4.</strong> Using H5LTopen_file_image to open a read-only file image where the application transfers ownership of the buffer
|
||||
|
||||
<p>Again, file access is read-only. Read/write access can be obtained via the H5LTopen_file_image() call, but we will explore that in the section below.</p>
|
||||
|
||||
<h3 id="in-memory-hdf5-file-image-construction">4.2. In-memory HDF5 File Image Construction</h3>
|
||||
|
||||
<p>Before the implementation of file image operations, HDF5 supported construction of an image of an HDF5 file in memory with the Core file driver. The H5Fget_file_image() function call allows an application access to the file image without first writing it to disk. See the following code fragment:</p>
|
||||
|
||||
<pre><code>
|
||||
<Open and construct the desired file with the Core file driver>
|
||||
H5Fflush(fid);
|
||||
size = H5Fget_file_image(fid, NULL, 0);
|
||||
buffer_ptr = malloc(size);
|
||||
H5Fget_file_image(fid, buffer_ptr, size);
|
||||
</code></pre>
|
||||
|
||||
<strong>Example 5.</strong> Accessing the image of a file in memory
|
||||
|
||||
<p>The use of H5Fget_file_image() may be acceptable for small images. For large images, the cost of the malloc() and memcpy() operations may be excessive. To address this issue, the H5Pset_file_image_callbacks() call allows an application to manage dynamic memory allocation for file images and memory-based file drivers (only the Core file driver at present). The following code fragment illustrates its use. Note that most error checking is omitted for simplicity and that H5Pset_file_image is not used to set the initial file image.</p>
|
||||
|
||||
<pre><code>
|
||||
struct udata_t {
|
||||
void * image_ptr;
|
||||
size_t image_size;
|
||||
} udata = {NULL, 0};
|
||||
|
||||
void *image_malloc(size_t size, H5_file_image_op_t file_image_op, void *udata)
|
||||
{
|
||||
((struct udata_t *)udata)->image_size = size;
|
||||
return(malloc(size));
|
||||
}
|
||||
|
||||
void *image_memcpy)(void *dest, const void *src, size_t size,
|
||||
H5_file_image_op_t file_image_op, void *udata)
|
||||
{
|
||||
assert(FALSE); /* Should never be invoked in this scenario. */
|
||||
return(NULL); /* always fails */
|
||||
}
|
||||
|
||||
void image_realloc(void *ptr, size_t size, H5_file_image_op_t file_image_op, void *udata)
|
||||
{
|
||||
((struct udata_t *)udata)->image_size = size;
|
||||
return(realloc(ptr, size));
|
||||
}
|
||||
|
||||
herr_t image_free(void *ptr, H5_file_image_op_t file_image_op, void *udata)
|
||||
{
|
||||
assert(file_image_op == H5_FILE_IMAGE_OP_FILE_CLOSE);
|
||||
((struct udata_t *)udata)->image_ptr = ptr;
|
||||
return(0); /* if we get here, we must have been successful */
|
||||
}
|
||||
|
||||
void *udata_copy(void *udata)
|
||||
{
|
||||
return(udata);
|
||||
}
|
||||
|
||||
herr_t udata_free(void *udata)
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
|
||||
H5_file_image_callbacks_t callbacks = {image_malloc, image_memcpy,
|
||||
image_realloc, image_free,
|
||||
udata_copy, udata_free,
|
||||
(void *)(&udata)};
|
||||
|
||||
<allocate fapl_id>
|
||||
H5Pset_file_image_callbacks(fapl_id, &callbacks);
|
||||
<open core file using fapl_id, write file, close it>
|
||||
assert(udata.image_ptr!= NULL);
|
||||
/* udata now contains the base address and length of the final version of the core file */
|
||||
<use image of file, and then discard it via free()>
|
||||
</code></pre>
|
||||
|
||||
<strong>Example 6.</strong> Using H5Pset_file_image_callbacks to improve memory allocation</p>
|
||||
|
||||
<p>The above code fragment gives the application full ownership of the buffer used by the Core file driver after the file is closed, and it notifies the application that the HDF5 Library is done with the buffer by setting udata.image_ptr to something other than NULL. If read access to the buffer is sufficient, the H5Fget_vfd_handle() call can be used as an alternate solution to get access to the base address of the Core file driver’s buffer.</p>
|
||||
<p>The above solution avoids some unnecessary mallocand memcpycalls and should be quite adequate if an image of an HDF5 file is constructed only occasionally. However, if an HDF5 file image must be constructed regularly, and if we can put a strong and tight upper bound on the size of the necessary buffer, then the following pseudo code demonstrates a method of avoiding memory allocation completely. The downside, however, is that buffer is allocated statically. Again, much error checking is omitted for clarity.</p>
|
||||
|
||||
<pre><code>
|
||||
char buf[BIG_ENOUGH];
|
||||
struct udata_t {
|
||||
void * image_ptr;
|
||||
size_t image_size;
|
||||
size_t max_image_size;
|
||||
int ref_count;
|
||||
} udata = {(void *)(&(buf[0]), 0, BIG_ENOUGH, 0};
|
||||
|
||||
void *image_malloc(size_t size, H5_file_image_op_t file_image_op, void *udata)
|
||||
{
|
||||
assert(size <= ((struct udata_t *)udata)->max_image_size);
|
||||
assert(((struct udata_t *)udata)->ref_count == 0);
|
||||
((struct udata_t *)udata)->image_size = size;
|
||||
(((struct udata_t *)udata)->ref_count)++;
|
||||
return((((struct udata_t *)udata)->image_ptr);
|
||||
}
|
||||
void *image_memcpy)(void *dest, const void *src, size_t size, H5_file_image_op_t file_image_op, void *udata)
|
||||
{
|
||||
assert(FALSE); /* Should never be invoked in this scenario. */
|
||||
return(NULL); /* always fails */
|
||||
}
|
||||
void *image_realloc(void *ptr, size_t size, H5_file_image_op_t file_image_op, void *udata)
|
||||
{
|
||||
assert(ptr == ((struct udata_t *)udata)->image_ptr);
|
||||
assert(size <= ((struct udata_t *)udata)->max_image_size);
|
||||
assert(((struct udata_t *)udata)->ref_count == 1);
|
||||
((struct udata_t *)udata)->image_size = size;
|
||||
return((((struct udata_t *)udata)->image_ptr);
|
||||
}
|
||||
herr_t image_free(void *ptr, H5_file_image_op_t file_image_op, void *udata)
|
||||
{
|
||||
assert(file_image_op == H5_FILE_IMAGE_OP_FILE_CLOSE);
|
||||
assert(ptr == ((struct udata_t *)udata)->image_ptr);
|
||||
assert(((struct udata_t *)udata)->ref_count == 1);
|
||||
(((struct udata_t *)udata)->ref_count)--;
|
||||
return(0); /* if we get here, we must have been successful */
|
||||
}
|
||||
void *udata_copy(void *udata)
|
||||
{
|
||||
return(udata);
|
||||
}
|
||||
herr_t udata_free(void *udata)
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
H5_file_image_callbacks_t callbacks = {image_malloc, image_memcpy,
|
||||
image_realloc, image_free,
|
||||
udata_copy, udata_free,
|
||||
(void *)(&udata)};
|
||||
/* end of initialization */
|
||||
<allocate fapl_id>
|
||||
H5Pset_file_image_callbacks(fapl_id, &callbacks);
|
||||
<open core file using fapl_id>
|
||||
<discard fapl any time after the open>
|
||||
<write the file, flush it, and then close it>
|
||||
assert(udata.ref_count == 0);
|
||||
/* udata now contains the base address and length of the final version of the core file */
|
||||
<use the image of the file>
|
||||
<reinitialize udata, and repeat the above from the end of initialization onwards to write a new file image>
|
||||
</code></pre>
|
||||
|
||||
<strong>Example 7.</strong> Using H5Pset_file_image_callbacks with a static buffer</p>
|
||||
|
||||
<p>If we can further arrange matters so that only the contents of the datasets in the HDF5 file image change, but not the structure of the file itself, we can optimize still further by re-using the image and changing only the contents of the datasets after the initial write to the buffer. The following pseudo code shows how this might be done. Note that the code assumes that buf already contains the image of the HDF5 file whose dataset contents are to be overwritten. Again, much error checking is omitted for clarity. Also, observe that the file image callbacks do not support the H5Pget_file_image() call.</p>
|
||||
|
||||
<pre><code>
|
||||
<buf already defined and loaded with file image>
|
||||
<udata already defined and initialized>
|
||||
void *image_malloc(size_t size, H5_file_image_op_t file_image_op, void *udata)
|
||||
{
|
||||
assert(size <= ((struct udata_t *)udata)->max_image_size);
|
||||
assert(size == ((struct udata_t *)udata)->image_size);
|
||||
assert(((struct udata_t *)udata)->ref_count >= 0);
|
||||
((struct udata_t *)udata)->image_size = size;
|
||||
(((struct udata_t *)udata)->ref_count)++;
|
||||
return((((struct udata_t *)udata)->image_ptr);
|
||||
}
|
||||
void *image_memcpy)(void *dest, const void *src, size_t size, H5_file_image_op_t file_image_op, void *udata)
|
||||
{
|
||||
assert(dest == ((struct udata_t *)udata)->image_ptr);
|
||||
assert(src == ((struct udata_t *)udata)->image_ptr);
|
||||
assert(size <= ((struct udata_t *)udata)->max_image_size);
|
||||
assert(size == ((struct udata_t *)udata)->image_size);
|
||||
assert(((struct udata_t *)udata)->ref_count >= 1);
|
||||
return(dest); /* if we get here, we must have been successful */
|
||||
}
|
||||
void *image_realloc(void *ptr, size_t size, H5_file_image_op_t file_image_op, void *udata)
|
||||
{
|
||||
/* One would think that this function is not needed in this scenario, as
|
||||
* only the contents of the HDF5 file is being changed, not its size or
|
||||
* structure. However, the Core file driver calls realloc() just before
|
||||
* close to clip the buffer to the size indicated by the end of the
|
||||
* address space.
|
||||
*
|
||||
* While this call must be supported in this case, the size of
|
||||
* the image should never change. Hence the function can limit itself
|
||||
* to performing sanity checks, and returning the base address of the
|
||||
* statically allocated buffer.
|
||||
*/
|
||||
assert(ptr == ((struct udata_t *)udata)->image_ptr);
|
||||
assert(size <= ((struct udata_t *)udata)->max_image_size);
|
||||
assert(((struct udata_t *)udata)->ref_count >= 1);
|
||||
assert(((struct udata_t *)udata)->image_size == size);
|
||||
return((((struct udata_t *)udata)->image_ptr);
|
||||
}
|
||||
herr_t image_free(void *ptr, H5_file_image_op_t file_image_op, void *udata)
|
||||
{
|
||||
assert((file_image_op == H5_FILE_IMAGE_OP_PROPERTY_LIST_CLOSE) ||
|
||||
(file_image_op == H5_FILE_IMAGE_OP_FILE_CLOSE));
|
||||
assert(((struct udata_t *)udata)->ref_count >= 1);
|
||||
(((struct udata_t *)udata)->ref_count)--;
|
||||
return(0); /* if we get here, we must have been successful */
|
||||
}
|
||||
void *udata_copy(void *udata)
|
||||
{
|
||||
return(udata);
|
||||
}
|
||||
herr_t udata_free(void *udata)
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
H5_file_image_callbacks_t callbacks = {image_malloc, image_memcpy,
|
||||
image_realloc, image_free,
|
||||
udata_copy, udata_free,
|
||||
(void *)(&udata)};
|
||||
/* end of initialization */
|
||||
<allocate fapl_id>
|
||||
H5Pset_file_image_callbacks(fapl_id, &callbacks);
|
||||
H5Pset_file_image(fapl_id, udata.image_ptr, udata.image_len);
|
||||
<open core file using fapl_id>
|
||||
<discard fapl any time after the open>
|
||||
<overwrite data in datasets in the file, and then close it>
|
||||
assert(udata.ref_count == 0);
|
||||
/* udata now contains the base address and length of the final version of the core file */
|
||||
<use the image of the file>
|
||||
<repeat the above from the end of initialization onwards to write new data to datasets in file image>
|
||||
</code></pre>
|
||||
|
||||
<strong>Example 8.</strong> Using H5Pset_file_image_callbacks where only the datasets change
|
||||
|
||||
<p>Before we go on, we should note that the above pseudo code can be written more compactly, albeit with fewer sanity checks, using the H5LTopen_file_image() call. See the example below:</p>
|
||||
|
||||
<pre><code>
|
||||
<buf already defined and loaded with file image>
|
||||
<udata already defined and initialized>
|
||||
hid_t file_id;
|
||||
unsigned flags = H5LT_FILE_IMAGE_OPEN_RW | H5LT_FILE_IMAGE_DONT_COPY | H5LT_FILE_IMAGE_DONT_RELEASE;
|
||||
/* end initialization */
|
||||
file_id = H5LTopen_file_image(udata.image_ptr, udata.image_len, flags);
|
||||
<overwrite data in datasets in the file, and then close it>
|
||||
/* udata now contains the base address and length of the final version of the core file */
|
||||
<use the image of the file>
|
||||
<repeat the above from the end of initialization onwards to write new data to datasets in file image>
|
||||
</code></pre>
|
||||
|
||||
<p><strong>Example 9.</strong> Using H5LTopen_file_image where only the datasets change
|
||||
<p>The above pseudo code allows updates of a file image about as cheaply as possible. We assume the application has enough RAM for the image and that the HDF5 file structure is constant after the first write.</p>
|
||||
<p>While the scenario above is plausible, we will finish this section with a more general scenario. In the pseudo code below, we assume sufficient RAM to retain the HDF5 file image between uses, but we do not assume that the HDF5 file structure remains constant or that we can place a hard pper bound on the image size.</p>
|
||||
<p>Since we must use malloc, realloc, and free in this example, and since realloc can change the base address of a buffer, we must maintain two of ptr, size, and ref_count triples in the udata structure. The first triple is for the property list (which will never change the buffer), and the second triple is for the file driver. As shall be seen, this complicates the file image callbacks considerably. Note also that while we do not use H5Pget_file_image() in this example, we do include support for it in the file image callbacks. As usual, much error checking is omitted in favor of clarity.</p>
|
||||
|
||||
<pre><code>
|
||||
struct udata_t {
|
||||
void * fapl_image_ptr;
|
||||
size_t fapl_image_size;
|
||||
int fapl_ref_count;
|
||||
void * vfd_image_ptr;
|
||||
size_t vfd_image_size;
|
||||
nt vfd_ref_count;
|
||||
} udata = {NULL, 0, 0, NULL, 0, 0};
|
||||
boolean initial_file_open = TRUE;
|
||||
|
||||
void *image_malloc(size_t size, H5_file_image_op_t file_image_op, void *udata)
|
||||
{
|
||||
void * return_value = NULL;
|
||||
switch ( file_image_op ) {
|
||||
case H5_FILE_IMAGE_OP_PROPERTY_LIST_SET:
|
||||
case H5_FILE_IMAGE_OP_PROPERTY_LIST_COPY:
|
||||
assert(((struct udata_t *)udata)->fapl_image_ptr != NULL);
|
||||
assert(((struct udata_t *)udata)->fapl_image_size == size);
|
||||
assert(((struct udata_t *)udata)->fapl_ref_count >= 0);
|
||||
return_value = ((struct udata_t *)udata)->fapl_image_ptr;
|
||||
(((struct udata_t *)udata)->fapl_ref_count)++;
|
||||
break;
|
||||
case H5_FILE_IMAGE_OP_PROPERTY_LIST_GET:
|
||||
assert(((struct udata_t *)udata)->fapl_image_ptr != NULL);
|
||||
assert(((struct udata_t *)udata)->vfd_image_size == size);
|
||||
assert(((struct udata_t *)udata)->fapl_ref_count >= 1);
|
||||
return_value = ((struct udata_t *)udata)->fapl_image_ptr;
|
||||
/* don’t increment ref count */
|
||||
break;
|
||||
case H5_FILE_IMAGE_OP_FILE_OPEN:
|
||||
assert(((struct udata_t *)udata)->vfd_image_ptr == NULL);
|
||||
assert(((struct udata_t *)udata)->vfd_image_size == 0);
|
||||
assert(((struct udata_t *)udata)->vfd_ref_count == 0);
|
||||
if (((struct udata_t *)udata)->fapl_image_ptr == NULL ) {
|
||||
((struct udata_t *)udata)->vfd_image_ptr = malloc(size);
|
||||
((struct udata_t *)udata)->vfd_image_size = size;
|
||||
} else {
|
||||
assert(((struct udata_t *)udata)->fapl_image_size == size);
|
||||
assert(((struct udata_t *)udata)->fapl_ref_count >= 1);
|
||||
((struct udata_t *)udata)->vfd_image_ptr = ((struct udata_t *)udata)->fapl_image_ptr;
|
||||
((struct udata_t *)udata)->vfd_image_size = size;
|
||||
}
|
||||
return_value = ((struct udata_t *)udata)->vfd_image_ptr;
|
||||
(((struct udata_t *)udata)->vfd_ref_count)++;
|
||||
break;
|
||||
default:
|
||||
assert(FALSE);
|
||||
}
|
||||
return(return_value);
|
||||
}
|
||||
|
||||
void *image_memcpy)(void *dest, const void *src, size_t size,
|
||||
H5_file_image_op_t file_image_op, void *udata)
|
||||
{
|
||||
switch(file_image_op) {
|
||||
case H5_FILE_IMAGE_OP_PROPERTY_LIST_SET:
|
||||
case H5_FILE_IMAGE_OP_PROPERTY_LIST_COPY:
|
||||
case H5_FILE_IMAGE_OP_PROPERTY_LIST_GET:
|
||||
assert(dest == ((struct udata_t *)udata)->fapl_image_ptr);
|
||||
assert(src == ((struct udata_t *)udata)->fapl_image_ptr);
|
||||
assert(size == ((struct udata_t *)udata)->fapl_image_size);
|
||||
assert(((struct udata_t *)udata)->fapl_ref_count >= 1);
|
||||
break;
|
||||
case H5_FILE_IMAGE_OP_FILE_OPEN:
|
||||
assert(dest == ((struct udata_t *)udata)->vfd_image_ptr);
|
||||
assert(src == ((struct udata_t *)udata)->fapl_image_ptr);
|
||||
assert(size == ((struct udata_t *)udata)->fapl_image_size);
|
||||
assert(size == ((struct udata_t *)udata)->vfd_image_size);
|
||||
assert(((struct udata_t *)udata)->fapl_ref_count >= 1);
|
||||
assert(((struct udata_t *)udata)->vfd_ref_count == 1);
|
||||
break;
|
||||
default:
|
||||
assert(FALSE);
|
||||
break;
|
||||
}
|
||||
return(dest); /* if we get here, we must have been successful */
|
||||
}
|
||||
|
||||
void *image_realloc(void *ptr, size_t size, H5_file_image_op_t file_image_op, void *udata)
|
||||
{
|
||||
assert(ptr == ((struct udata_t *)udata)->vfd_image_ptr); |
|
||||
assert(((struct udata_t *)udata)->vfd_ref_count == 1);
|
||||
((struct udata_t *)udata)->vfd_image_ptr = realloc(ptr, size);
|
||||
((struct udata_t *)udata)->vfd_image_size = size;
|
||||
return((((struct udata_t *)udata)->vfd_image_ptr);
|
||||
}
|
||||
|
||||
herr_t image_free(void *ptr, H5_file_image_op_t file_image_op, void *udata)
|
||||
{
|
||||
switch(file_image_op) {
|
||||
case H5_FILE_IMAGE_OP_PROPERTY_LIST_CLOSE:
|
||||
assert(ptr == ((struct udata_t *)udata)->fapl_image_ptr);
|
||||
assert(((struct udata_t *)udata)->fapl_ref_count >= 1);
|
||||
(((struct udata_t *)udata)->fapl_ref_count)--;
|
||||
break;
|
||||
case H5_FILE_IMAGE_OP_FILE_CLOSE:
|
||||
assert(ptr == ((struct udata_t *)udata)->vfd_image_ptr);
|
||||
assert(((struct udata_t *)udata)->vfd_ref_count == 1);
|
||||
(((struct udata_t *)udata)->vfd_ref_count)--;
|
||||
break;
|
||||
default:
|
||||
assert(FALSE);
|
||||
break;
|
||||
}
|
||||
return(0); /* if we get here, we must have been successful */
|
||||
}
|
||||
|
||||
void *udata_copy(void *udata)
|
||||
{
|
||||
return(udata);
|
||||
}
|
||||
|
||||
herr_t udata_free(void *udata)
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
H5_file_image_callbacks_t callbacks = {image_malloc, image_memcpy,
|
||||
image_realloc, image_free,
|
||||
udata_copy, udata_free,
|
||||
(void *)(&udata)};
|
||||
/* end of initialization */
|
||||
<allocate fapl_id>
|
||||
H5Pset_file_image_callbacks(fapl_id, &callbacks);
|
||||
if ( initial_file_open ) {
|
||||
initial_file_open = FALSE;
|
||||
} else {
|
||||
assert(udata.vfd_image_ptr != NULL);
|
||||
assert(udata.vfd_image_size > 0);
|
||||
assert(udata.vfd_ref_count == 0);
|
||||
assert(udata.fapl_ref_count == 0);
|
||||
udata.fapl_image_ptr = udata.vfd_image_ptr;
|
||||
udata.fapl_image_size = udata.vfd_image_size;
|
||||
udata.vfd_image_ptr = NULL;
|
||||
udata.vfd_image_size = 0;
|
||||
H5Pset_file_image(fapl_id, udata.fapl_image_ptr, udata.fapl_image_size);
|
||||
}
|
||||
|
||||
<open core file using fapl_id>
|
||||
<discard fapl any time after the open>
|
||||
<write/update the file, and then close it>
|
||||
assert(udata.fapl_ref_count == 0);
|
||||
assert(udata.vfd_ref_count == 0);</p>
|
||||
<p>/* udata.vfd_image_ptr and udata.vfd_image_size now contain the base address and length of the final version of the core file */
|
||||
<use the image of the file>
|
||||
<repeat the above from the end of initialization to modify the file image as needed>
|
||||
<free the image when done>
|
||||
</code></pre>
|
||||
|
||||
<strong>Example 10.</strong> Using H5LTopen_file_image where only the datasets change and where the file structure and image size might not be constant</p>
|
||||
|
||||
<p>The above pseudo code shows how a buffer can be passed back and forth between the application and the HDF5 Library. The code also shows the application having control of the actual allocation, reallocation, and freeing of the buffer.</p>
|
||||
|
||||
<h3 id="using-hdf5-to-construct-and-read-a-data-packet">4.3. Using HDF5 to Construct and Read a Data Packet</h3>
|
||||
<p>Using the file image operations described in this document, we can bundle up data in an image of an HDF5 file on one process, transmit the image to a second process, and then open and read the image on the second process without any mandatory file system I/O.</p>
|
||||
<p>We have already demonstrated the construction and reading of such buffers above, but it may be useful to offer an example of the full operation. We do so in the example below using as simple a set of calls as possible. The set of calls in the example has extra buffer allocations. To reduce extra buffer allocations, see the sections above.</p>
|
||||
<p>In the following example, we construct an HDF5 file image on process A and then transmit the image to process B where we then open the image and extract the desired data. Note that no file system I/O is performed: all the processing is done in memory with the Core file driver.</p>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<th>*** Process A ***</th>
|
||||
<th>*** Process B ***</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><Open and construct the desired file with the Core file driver></td>
|
||||
<td>hid_t file_id;</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>H5Fflush(fid);</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>size = H5Fget_file_image(fid, NULL, 0);</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>buffer_ptr = malloc(size);</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>H5Fget_file_image(fid, buffer_ptr, size);</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><transmit size></td>
|
||||
<td><br><receive size></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><transmit *buffer_ptr></td>
|
||||
<td>buffer_ptr = malloc(size)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>free(buffer_ptr);</td>
|
||||
<td><receive image in *buffer_ptr></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><close core file></td>
|
||||
<td>file_id = H5LTopen_file_image(buf,
|
||||
buf_len,
|
||||
H5LT_FILE_IMAGE_DONT_COPY);</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td><read data from file, then close. note that the Core file driver will discard the buffer on close></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<strong>Example 11.</strong> Building and passing a file image from one process to another
|
||||
|
||||
|
||||
<h3 id="using-a-template-file">4.4. Using a Template File</h3>
|
||||
|
||||
<p>After the above examples, an example of the use of a template file might seem anti-climactic. A template file might be used to enforce consistency on file structure between files or in parallel HDF5 to avoid long sequences of collective operations to create the desired groups, datatypes, and possibly datasets. The following pseudo code outlines a potential use:</p>
|
||||
|
||||
<pre><code>
|
||||
<allocate and initialize buf and buflen, with buf containing the desired initial image (which in turn contains the desired group, datatype, and dataset definitions), and buf_len containing the size of buf>
|
||||
<allocate fapl_id>
|
||||
<set fapl to use desired file driver that supports initial images>
|
||||
H5Pset_file_image(fapl_id, buf, buf_len);
|
||||
<discard buf any time after this point>
|
||||
<open file>
|
||||
<discard fapl any time after this point>
|
||||
<read and/or write file as desired, close>
|
||||
</code></pre>
|
||||
|
||||
<strong>Example 12.</strong> Using a template file</p>
|
||||
|
||||
<p>Observe that the above pseudo code includes an unnecessary buffer allocation and copy in the call to H5Pset_file_image(). As we have already discussed ways of avoiding this, we will not address that issue here.</p>
|
||||
<p>What is interesting in this case is to consider why the application would find this use case attractive.</p>
|
||||
<p>In the serial case, at first glance there seems little reason to use the initial image facility at all. It is easy enough to use standard C calls to duplicate a template file, rename it as desired, and then open it as an HDF5 file.</p>
|
||||
<p>However, this assumes that the template file will always be available and in the expected place. This is a questionable assumption for an application that will be widely distributed. Thus, we can at least make an argument for either keeping an image of the template file in the executable or for including code for writing the desired standard definitions to new HDF5 files.</p>
|
||||
<p>Assuming the image is relatively small, we can further make an argument for the image in place of the code, as, quite simply, the image should be easier to maintain and modify with an HDF5 file editor.</p>
|
||||
<p>However, there remains the question of why one should pass the image to the HDF5 Library instead of writing it directly with standard C calls and then using HDF5 to open it. Other than convenience and a slight reduction in code size, we are hard pressed to offer a reason.</p>
|
||||
<p>In contrast, the argument is stronger in the parallel case since group, datatype, and dataset creations are all expensive collective operations. The argument is also weaker: simply copying an existing template file and opening it should lose many of its disadvantages in the HPC context although we would imagine that it is always useful to reduce the number of files in a deployment.</p>
|
||||
<p>In closing, we would like to consider one last point. In the parallel case, we would expect template files to be quite large. Parallel HDF5 requires eager space allocation for chunked datasets. For similar reasons, we would expect template files in this context to contain long sequences of zeros with a scattering of metadata here and there. Such files would compress well, and the compressed images would be cheap to distribute across the available processes if necessary. Once distributed, each process could uncompress the image and write to file those sections containing actual data that lay within the section of the file assigned to the process. This approach might be significantly faster than a simple copy as it would allow sparse writes, and thus it might provide a compelling use case for template files. However, this approach would require extending our current API to allow compressed images. We would also have to add the H5Pget/set_image_decompression_callback() API calls. We see no problem in doing this. However, it is beyond the scope of the current effort, and thus we will not pursue the matter further unless there is interest in our doing so.</p>
|
||||
|
||||
<h3 id="java-signatures-for-file-image-operations-api-calls">5. Java Signatures for File Image Operations API Calls</h3>
|
||||
|
||||
<p>Potential Java function call signatures for the file image operation APIs are described in this section. These have not yet been implemented, and there are no immediate plans for implementation.</p>
|
||||
<p>Note that the H5LTopen_file_image() call is omitted. We have not supported high-level library calls in Java.</p>
|
||||
|
||||
<p><strong>H5Pset_file_image</strong></p>
|
||||
<p><code>int H5Pset_file_image(int fapl_id, const byte[] buf_ptr);</code></p>
|
||||
|
||||
<strong>H5Pget_file_image</strong></p>
|
||||
<p><code>herr_t H5Pget_file_image(hid_t fapl_id, byte[] buf_ptr_ptr);</code></p>
|
||||
|
||||
<strong>H5_file_image_op_t</strong></p>
|
||||
<pre><code>public static H5_file_image_op_t
|
||||
{
|
||||
H5_FILE_IMAGE_OP_PROPERTY_LIST_SET,
|
||||
H5_FILE_IMAGE_OP_PROPERTY_LIST_COPY,
|
||||
H5_FILE_IMAGE_OP_PROPERTY_LIST_GET,
|
||||
H5_FILE_IMAGE_OP_PROPERTY_LIST_CLOSE,
|
||||
H5_FILE_IMAGE_OP_FILE_OPEN,
|
||||
H5_FILE_IMAGE_OP_FILE_RESIZE,
|
||||
H5_FILE_IMAGE_OP_FILE_CLOSE
|
||||
}</code></pre>
|
||||
|
||||
<strong>H5_file_image_malloc_cb</strong></p>
|
||||
<pre><code>public interface H5_file_image_malloc_cb extends Callbacks {
|
||||
buf[] callback(H5_file_image_op_t file_image_op, CBuserdata udata);
|
||||
}</code></pre>
|
||||
|
||||
<strong>H5_file_image_memcpy_cb</strong></p>
|
||||
<pre><code>public interface H5_file_image_memcpy_cb extends Callbacks {
|
||||
buf[] callback(buf[] dest, const buf[] src, H5_file_image_op_t file_image_op, CBuserdata
|
||||
udata);
|
||||
}</code></pre>
|
||||
|
||||
<strong>H5_file_image_realloc_cb</strong></p>
|
||||
<pre><code>public interface H5_file_image_realloc_cb extends Callbacks {
|
||||
buf[] callback(buf[] ptr, H5_file_image_op_t file_image_op, CBuserdata udata);
|
||||
}</code></pre>
|
||||
|
||||
<strong>H5_file_image_free_cb</strong></p>
|
||||
<pre><code>public interface H5_file_image_free_cb extends Callbacks {
|
||||
void callback(buf[] ptr, H5_file_image_op_t file_image_op, CBuserdata udata);
|
||||
}</code></pre>
|
||||
|
||||
<strong>H5_file_udata_copy_cb</strong></p>
|
||||
<pre><code>public interface H5_file_udata_copy_cb extends Callbacks {
|
||||
buf[] callback(CBuserdata udata);
|
||||
}</code></pre>
|
||||
|
||||
<strong>H5_file_udata_free_cb</strong></p>
|
||||
<pre><code>public interface H5_file_udata_free_cb extends Callbacks {
|
||||
void callback(CBuserdata udata);
|
||||
}</code></pre>
|
||||
|
||||
<strong>H5_file_image_callbacks_t</strong></p>
|
||||
<pre><code>public abstract class H5_file_image_callbacks_t
|
||||
{
|
||||
H5_file_image_malloc_cb image_malloc;
|
||||
H5_file_image_memcpy_cb image_memcpy;
|
||||
H5_file_image_realloc_cb image_realloc;
|
||||
H5_file_image_free_cb image_free;
|
||||
H5_file_udata_copy_cb udata_copy;
|
||||
H5_file_udata_free_cb udata_free;
|
||||
CBuserdata udata;
|
||||
public H5_file_image_callbacks_t(
|
||||
H5_file_image_malloc_cb image_malloc,
|
||||
H5_file_image_memcpy_cb image_memcpy,
|
||||
H5_file_image_realloc_cb image_realloc,
|
||||
H5_file_image_free_cb image_free,
|
||||
H5_file_udata_copy_cb udata_copy,
|
||||
H5_file_udata_free_cb udata_free,
|
||||
CBuserdata udata) {
|
||||
this.image_malloc = image_malloc;
|
||||
this.image_memcpy = image_memcpy;
|
||||
this.image_realloc = image_realloc;
|
||||
this.image_free = image_free;
|
||||
this.udata_copy = udata_copy;
|
||||
this.udata_free = udata_free;
|
||||
this.udata = udata;
|
||||
}
|
||||
}</code></pre>
|
||||
|
||||
<strong>H5Pset_file_image_callbacks</strong></p>
|
||||
<pre><code>int H5Pset_file_image_callbacks(int fapl_id, H5_file_image_callbacks_t callbacks_ptr);</code></pre>
|
||||
|
||||
<strong>H5Pget_file_image_callbacks</strong></p>
|
||||
<pre><code>int H5Pget_file_image_callbacks(int fapl_id, H5_file_image_callbacks_t[] callbacks_ptr);</code></pre>
|
||||
|
||||
<strong>H5Fget_file_image</strong></p>
|
||||
<pre><code>long H5Fget_file_image(int file_id, byte[] buf_ptr);</code></pre>
|
||||
|
||||
<h3 id="fortran-signatures-for-file-image-operations-api-calls">6. Fortran Signatures for File Image Operations API Calls</h3>
|
||||
|
||||
<p>Potential Fortran function call signatures for the file image operation APIs are described in this section. These have not yet been implemented, and there are no immediate plans for implementation.</p>
|
||||
|
||||
<h3 id="low-level-fortran">6.1. Low-level Fortran API Routines</h3>
|
||||
|
||||
<p>The Fortran low-level APIs make use of Fortran 2003’s ISO_C_BINDING module in order to achieve portable and standard conforming interoperability with the C APIs. The C pointer (C_PTR) and function pointer (C_FUN_PTR) types are returned from the intrinsic procedures C_LOC(X) and C_FUNLOC(X), respectively, defined in the ISO_C_BINDING module. The argument X is the data or function to which the C pointers point to and must have the TARGET attribute in the calling program. Note that the variable name lengths of the Fortran equivalent of the predefined C constants were shortened to less than 31 characters in order to be Fortran standard compliant.</p>
|
||||
|
||||
<h4 id="h5pset_file_image_f">6.1.1. H5Pset_file_image_f</h4>
|
||||
|
||||
<p>The signature of H5Pset_file_image_f is defined as follows:</p>
|
||||
<p><code>SUBROUTINE H5Pset_file_image_f(fapl_id, buf_ptr, buf_len, hdferr)</code>
|
||||
|
||||
<p>The parameters of H5Pset_file_image are defined as follows:</p>
|
||||
|
||||
<table id="table2">
|
||||
<tr>
|
||||
<td id="td3"><code>INTEGER(hid_t), INTENT(IN):: fapl_id</code></td>
|
||||
<td>Will contain the ID of the target file access property list.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>TYPE(C_PTR), INTENT(IN):: buf_ptr</code></td>
|
||||
<td>Will supply the C pointer to the initial file image or C_NULL_PTR if no initial file image is desired.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>INTEGER(size_t), INTENT(IN):: buf_len</code></td>
|
||||
<td>Will contain the size of the supplied buffer or 0 if no initial image is desired.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>INTEGER, INTENT(OUT) :: hdferr</code></td>
|
||||
<td>Will return the error status: 0 for success and -1 for failure.</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h4 id="h5pget_file_image_f">6.1.2. H5Pget_file_image_f</h4>
|
||||
<p>The signature of H5Pget_file_image_f is defined as follows:</p>
|
||||
<p><code>SUBROUTINE H5Pget_file_image_f(fapl_id, buf_ptr, buf_len, hdferr)</code>
|
||||
|
||||
<p>The parameters of H5Pget_file_image_f are defined as follows:</p>
|
||||
<table id="table2">
|
||||
<tr>
|
||||
<td id="td3"><code>INTEGER(hid_t), INTENT(IN) :: fapl_id</code></td>
|
||||
<td>Will contain the ID of the target file access property list</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>TYPE(C_PTR), INTENT(INOUT), VALUE :: buf_ptr</code></td>
|
||||
<td>Will hold either a C_NULL_PTR or a scalar of type c_ptr. If buf_ptr is not C_NULL_PTR, on successful return, buf_ptr shall contain a C pointer to a copy of the initial image provided in the last call to H5Pset_file_image_f for the supplied fapl_id, or buf_ptr shall contain a C_NULL_PTR if there is no initial image set. The Fortran pointer can be obtained using the intrinsic C_F_POINTER.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>INTEGER(size_t), INTENT(OUT) :: buf_len</code></td>
|
||||
<td>Will contain the value of the buffer parameter for the initial image in the supplied fapl_id. The value will be 0 if no initial image is set.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>INTEGER, INTENT(OUT) :: hdferr</code></td>
|
||||
<td>Will return the error status: 0 for success and -1 for failure.</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h4 id="h5pset_file_image_callbacks_f">6.1.3. H5Pset_file_image_callbacks_f</h4>
|
||||
<p>The signature of H5Pset_file_image_callbacks_f is defined as follows:
|
||||
|
||||
<pre><code>
|
||||
<p>INTEGER :: H5_IMAGE_OP_PROPERTY_LIST_SET_F=0,
|
||||
H5_IMAGE_OP_PROPERTY_LIST_COPY_F=1,
|
||||
H5_IMAGE_OP_PROPERTY_LIST_GET_F=2,
|
||||
H5_IMAGE_OP_PROPERTY_LIST_CLOSE_F=3,
|
||||
H5_IMAGE_OP_FILE_OPEN_F=4,
|
||||
H5_IMAGE_OP_FILE_RESIZE_F=5,
|
||||
H5_IMAGE_OP_FILE_CLOSE_F=6
|
||||
TYPE, BIND(C) :: H5_file_image_callbacks_t
|
||||
TYPE(C_FUN_PTR), VALUE :: image_malloc
|
||||
TYPE(C_FUN_PTR), VALUE :: image_memcpy
|
||||
TYPE(C_FUN_PTR), VALUE :: image_realloc
|
||||
TYPE(C_FUN_PTR), VALUE :: image_free
|
||||
TYPE(C_FUN_PTR), VALUE :: udata
|
||||
TYPE(C_FUN_PTR), VALUE :: udata_copy
|
||||
TYPE(C_FUN_PTR), VALUE :: udata_free
|
||||
TYPE(C_PTR), VALUE :: udata
|
||||
END TYPE H5_file_image_callbacks_t
|
||||
</code></pre>
|
||||
|
||||
The semantics of the above values will be the same as those defined in the C enum. See Section 2.1.3 for more information.</p>
|
||||
<p>Fortran Callback APIs</p>
|
||||
<p>The Fortran callback APIs are shown below.</p>
|
||||
<p>FUNCTION op_func(size, file_image_op, udata,) RESULT(image_malloc)
|
||||
|
||||
<table id="table2">
|
||||
<tr>
|
||||
<td id="td3">INTEGER(size_t) :: size</td>
|
||||
<td>Will contain the size of the image buffer to allocate in bytes.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>INTEGER :: file_image_op</td>
|
||||
<td>Will be set to one of the values of H5_IMAGE_OP_* indicating the operation being performed on the file image when this callback is invoked.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>TYPE(C_PTR), VALUE :: udata</td>
|
||||
<td>Will be set to the value passed in for the udata parameter to H5Pset_file_image_callbacks_f.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>TYPE(C_FUN_PTR), VALUE :: image_malloc</td>
|
||||
<td>Shall contain a pointer to a function with functionality identical to the standard C library memcpy() call.</p></td>
|
||||
</tr>
|
||||
</table>
|
||||
<p>FUNCTION op_func(dest, src, size, & file_image_op, udata) RESULT(image_memcpy)
|
||||
|
||||
<table id="table2">
|
||||
<tr>
|
||||
<td id="td3">TYPE(C_PTR), VALUE :: dest</td>
|
||||
<td>Will contain the address of the buffer into which to copy.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>TYPE(C_PTR), VALUE :: src</td>
|
||||
<td>Will contain the address of the buffer from which to copy</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>INTEGER(size_t) :: size</td>
|
||||
<td>Will contain the number of bytes to copy.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>INTEGER :: file_image_op</td>
|
||||
<td>Will be set to one of the values of H5_IMAGE_OP_* indicating the operation being performed on the file image when this callback is invoked.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>TYPE(C_PTR), VALUE :: udata</td>
|
||||
<td>Will be set to the value passed in for the udata parameter to H5Pset_file_image_callbacks_f.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>TYPE(C_FUN_PTR), VALUE :: image_memcpy</td>
|
||||
<td>Shall contain a pointer to a function with functionality identical to the standard C library memcpy() call.</p></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<p>FUNCTION op_func(ptr, size, & file_image_op, udata) RESULT(image_realloc)
|
||||
<table id="table2">
|
||||
<tr>
|
||||
<td id="td3">TYPE(C_PTR), VALUE :: ptr</td>
|
||||
<td>Will contain the pointer to the buffer being reallocated</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>INTEGER(size_t) :: size</td>
|
||||
<td>Will contain the desired size of the buffer after realloc in bytes.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>INTEGER :: file_image_op</td>
|
||||
<td>Will be set to one of the values of H5_IMAGE_OP_* indicating the operation being performed on the file image when this callback is invoked.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>TYPE(C_PTR), VALUE :: udata</td>
|
||||
<td>Will be set to the value passed in for the udata parameter to H5Pset_file_image_callbacks_f.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>TYPE(C_FUN_PTR), VALUE :: image_realloc</td>
|
||||
<td>Shall contain a pointer to a unction functionality identical to the standard C library realloc() call.</p></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<p>FUNCTION op_func(ptr, file_image_op, udata) RESULT(image_free)
|
||||
<table id="table2">
|
||||
<tr>
|
||||
<td id="td3">TYPE(C_PTR), VALUE :: ptr</td>
|
||||
<td>Will contain the pointer to the buffer being released.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>INTEGER :: file_image_op</td>
|
||||
<td>Will be set to one of the values of H5_IMAGE_OP_* indicating the operation being performed on the file image when this callback is invoked.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>TYPE(C_PTR), VALUE :: udata</td>
|
||||
<td>Will be set to the value passed in for the udata parameter to H5Pset_file_image_callbacks_f.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>TYPE(C_PTR), VALUE :: image_free</td>
|
||||
<td>Shall contain a pointer to a function with functionality identical to the standard C library free() call</p></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<p>FUNCTION op_func(udata) RESULT(udata_copy)
|
||||
<table id="table2">
|
||||
<tr>
|
||||
<td id="td3">TYPE(C_PTR), VALUE :: udata</td>
|
||||
<td>Will be set to the value passed in for the udata parameter to H5Pset_file_image_callbacks_f.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>TYPE(C_FUN_PTR), VALUE :: udata_copy</td>
|
||||
<td>Shall contain a pointer to a function that will allocate a buffer of suitable size, copy the contents of the supplied udata into the new buffer, and return the address of the new buffer. The function will return C_NULL_PTR on failure.</p></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<p>FUNCTION op_func(udata) RESULT(udata_free)
|
||||
<table id="table2">
|
||||
<tr>
|
||||
<td id="td3">TYPE(C_PTR), VALUE :: udata</td>
|
||||
<td>Shall contain a pointer value, potentially to user-defined data, that will be passed to the image_malloc, image_memcpy, image_realloc, and image_free callbacks.</p></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<p>The signature of H5Pset_file_image_callbacks_f is defined as follows:</p>
|
||||
<p>SUBROUTINE H5Pset_file_image_callbacks_f(fapl_id, &callbacks_ptr, hdferr)
|
||||
The parameters are defined as follows:</p>
|
||||
<table id="table2">
|
||||
<tr>
|
||||
<td id="td3"><p>INTEGER(hid_t), INTENT(IN) :: fapl_id</td>
|
||||
<td>Will contain the ID of the target file access property list.</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p>TYPE(H5_file_image_callbacks_t), INTENT(IN) :: callbacks_ptr</td>
|
||||
<td>Will contain the callback derived type. callbacks_ptr shall contain a pointer to the Fortran function via the intrinsic functions C_LOC(X) and C_FUNLOC(X).</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><p>INTEGER, INTENT(OUT) :: hdferr</td>
|
||||
<td>Will return the error status: 0 for success and -1 for failure.</p></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h4 id="h5pget_file_image_callbacks_f">6.1.4. H5Pget_file_image_callbacks_f</h4>
|
||||
<p>The H5Pget_file_image_callbacks_f routine is designed to obtain the current file image callbacks from a file access property list.</p>
|
||||
<p>The signature is defined as follows</p>
|
||||
<p>SUBROUTINE H5Pget_file_image_callbacks_f(fapl_id, callbacks_ptr, hdferr)
|
||||
The parameters are defined as follows:</p>
|
||||
<table id="table2">
|
||||
<tr>
|
||||
<td id="td3">INTEGER(hid_t), INTENT(IN) :: fapl_id</td>
|
||||
<td>Will contain the ID of the target file access property list.</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>TYPE(H5_file_image_callbacks_t), INTENT(OUT) :: callbacks_ptr</td>
|
||||
<td>Will contain the callback derived type. Each member of the derived type shall have the same meaning as its C counterpart. See section 2.1.4 for more information.</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>INTEGER, INTENT(OUT) :: hdferr</td>
|
||||
<td>Will return the error status: 0 for success and -1 for failure.</p></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h4 id="fortran-virtual">6.1.5. Fortran Virtual File Driver Feature Flags</h4>
|
||||
<p>Implementation of the H5Pget/set_file_image_callbacks_f() and H5Pget/set_file_image_f() APIs requires a pair of new virtual file driver feature flags:</p>
|
||||
<p>H5FD_FEAT_LET_IMAGE_F
|
||||
H5FD_FEAT_LET_IMAGE_CALLBACK_F
|
||||
See the “Virtual File Driver Feature Flags” section for more information.</p>
|
||||
|
||||
<h4 id="h5fget_file_image_f">6.1.6. H5Fget_file_image_f</h4>
|
||||
<p>The signature of H5Fget_file_image_f shall be defined as follows:</p>
|
||||
<p>SUBROUTINE H5Fget_file_image_f(file_id, buf_ptr, buf_len, hdferr, buf_size)
|
||||
The parameters of H5Fget_file_image_f are defined as follows:</p>
|
||||
<table id="table2">
|
||||
<tr>
|
||||
<td id="td3">INTEGER(hid_t), INTENT(IN) :: file_id</td>
|
||||
<td>Will contain the ID of the target file.</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>TYPE(C_PTR), INTENT(IN) :: buf_ptr</td>
|
||||
<td>Will contain a C pointer to the buffer into which the image of the HDF5 file is to be copied. If buf_ptr is C_NULL_PTR, no data will be copied.</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>INTEGER(size_t), INTENT(IN) :: buf_len</td>
|
||||
<td>Will contain the size in bytes of the supplied buffer.</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>INTEGER(ssizet_t), INTENT(OUT), OPTIONAL :: buf_size</td>
|
||||
<td>Will indicate the buffer size required to store the file image (in other words, the length of the file). If only the buf_size is needed, then buf_ptr should be also be set to C_NULL_PTR</p></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>INTEGER, INTENT(OUT) :: hdferr</td>
|
||||
<td>Returns the error status: 0 for success and -1 for failure.</p></td>
|
||||
<p>See the “H5Fget_file_image” section for more information.</p>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h3 id="high-level-fortran">6.2. High-level Fortran API Routine</h3>
|
||||
|
||||
The new Fortran high-level routine H5LTopen_file_image_f will provide a wrapper for the high-level H5LTopen_file_image function. Consequently, the high-level Fortran API will not be implemented using low-level HDF5 Fortran APIs.
|
||||
|
||||
<h4 id="h5ltopen_file_image_f">6.2.1. H5LTopen_file_image_f</h4>
|
||||
The signature of H5LTopen_file_image_f is defined as follows:</p>
|
||||
<p>SUBROUTINE H5LTopen_file_image_f(buf_ptr, buf_len, flags, file_id, hdferr)
|
||||
The parameters of H5LTopen_file_image_f are defined as follows:</p>
|
||||
<table id="table2">
|
||||
<tr>
|
||||
<td id="td3">TYPE(C_PTR), INTENT(IN), VALUE :: buf_ptr</td>
|
||||
<td>Will contain a pointer to the supplied initial image. A C_NULL_PTR value is invalid and will cause H5LTopen_file_image_f to fail.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>INTEGER(size_t), INTENT(IN) :: buf_len</td>
|
||||
<td>Will contain the size of the supplied buffer. A value of 0 is invalid and will cause H5LTopen_file_image_f to fail.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>INTEGER, INTENT(IN) :: flags</td>
|
||||
<td>Will contain a set of flags indicating whether the image is to be opened read/write, whether HDF5 is to take control of the buffer, and how long the application promises to maintain the buffer. Possible flags are as follows: H5LT_IMAGE_OPEN_RW_F, H5LT_IMAGE_DONT_COPY_F, and H5LT_IMAGE_DONT_RELEASE_F. The C equivalent flags are defined in the “H5LTopen_file_image” section.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>INTEGER(hid_t), INTENT(IN) :: file_id</td>
|
||||
<td>Will be a file ID on success.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>INTEGER, INTENT(OUT) :: hdferr</td>
|
||||
<td>Returns the error status: 0 for success and -1 for failure.</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1432,7 +1432,7 @@
|
||||
|
||||
<tr>
|
||||
<td><p>Address of Member File N</p></td>
|
||||
<td><p>This field Specifies the virtual address at which the member file starts.</p>
|
||||
<td><p>This field specifies the virtual address at which the member file starts.</p>
|
||||
<p>N is the number of member files.</p>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -17727,8 +17727,8 @@ disk address for the chunk.</p>
|
||||
|
||||
<p>A description of the rationale that leads to the present
|
||||
implementation of the extensible array can be found at
|
||||
<a href="https://svn.hdfgroup.org/hdf5doc/trunk/projects/1_10_alpha/ReviseChunks/skip_lists">
|
||||
https://svn.hdfgroup.org/hdf5doc/trunk/projects/1_10_alpha/ReviseChunks/skip_lists</a>.
|
||||
<a href="https://github.com/HDFGroup/hdf5doc/tree/master/projects/1_10_alpha/ReviseChunks/skip_lists">
|
||||
https://github.com/HDFGroup/hdf5doc/tree/master/projects/1_10_alpha/ReviseChunks/skip_lists</a>.
|
||||
</p>
|
||||
|
||||
<p>The current implementation differs from the data structure
|
||||
|
||||
@@ -0,0 +1,318 @@
|
||||
<!DOCTYPE html>
|
||||
<html><head>
|
||||
<title>HDF5 Library Release Version Numbers</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<br>
|
||||
<h2>Contents</h2>
|
||||
|
||||
<ul>
|
||||
<li><a href="#Introduction">Introduction</a></li>
|
||||
<li><a href="#Definitions">Definitions</a></li>
|
||||
<li><a href="#TrunkReleaseBranchesFeatureBranches">The Trunk, Release Branches, and Feature Branches</a></li>
|
||||
<li><a href="#VersionSupportFromTheLibrary">Version Support from the Library</a></li>
|
||||
<li><a href="#UseCases">Use Cases</a></li>
|
||||
<ul>
|
||||
|
||||
<li><a href="#ApplicationVersionChecking">Application Version Checking</a></li>
|
||||
<li><a href="#ConditionalInclusions">Conditional Inclusions or Exclusions Based on the Version</a></li>
|
||||
<li><a href="#SpecifyingAFormat">Specifying a Format</a></li>
|
||||
|
||||
</ul>
|
||||
<li><a href="#SharedLibraryVersionNumbers">Shared Library Version Numbers</a></li>
|
||||
</ul>
|
||||
|
||||
<h2><a name="Introduction">Introduction</a></h2>
|
||||
|
||||
<p>HDF5 software is updated on a regular basis. These updates, known
|
||||
as releases, range in scope and size from small to large. Some updates
|
||||
may only fix bugs, and some updates may require a change in the format
|
||||
of the data file. The version numbers that are applied to updates give
|
||||
information about the kinds of changes made in the updates. This Tech
|
||||
Note describes what the version numbers mean.</p>
|
||||
|
||||
<p>Note that this document describes release version numbers for the
|
||||
HDF5 Library. For more information, see the
|
||||
<a href="#SharedLibraryVersionNumbers">Shared Library Version Numbers</a> section at the end of this document.</p>
|
||||
|
||||
<h2><a name="Definitions">Definitions</a></h2>
|
||||
|
||||
<p>Each software release of the HDF5 Library is labeled with a version
|
||||
number. The version number is a set of three integers written as HDF5-1.2.3,
|
||||
HDF5 version 1.2 release 3, or HDF5 Release 1.2.3. The version number
|
||||
might also include text. A patch version might be labeled HDF5-1.2.3-patch1.
|
||||
The '5' in "HDF5" is part of the product name and will not change during
|
||||
the life of the project.</p>
|
||||
|
||||
<p>The key components in HDF5 Library version numbers are the major version
|
||||
number, the minor version number, the release number, and an optional text
|
||||
string. </p>
|
||||
|
||||
<p>The first integer in a version number is the <b>major version
|
||||
number</b>. This integer increments when there is an extensive change
|
||||
to the file format or library API. Such a change may require files to
|
||||
be translated and will likely require applications to be modified. </p>
|
||||
|
||||
<p>The second integer, 2 in the examples above, is the <b>minor version
|
||||
number</b>. This number is incremented when there are new features that
|
||||
require a change in the file format. For example, a change in file format
|
||||
was required during the change from version 1.6 to version 1.8. Stable
|
||||
released versions of the library are given <i>even</i> minor version
|
||||
numbers such as 1.6 and 1.8 while <i>odd</i> minor version numbers such
|
||||
as 1.7 and 1.9 are used on the trunk for major development. See the
|
||||
section below for more information.</p>
|
||||
|
||||
<p>The third integer, 3 in the examples above, is the <b>release
|
||||
number</b>. A change in this number indicates that the library has
|
||||
been updated. The updates might include bug fixes, performance
|
||||
improvements, and new features that do not require a file format
|
||||
change. </p>
|
||||
|
||||
<p>A version number might also include some text. The two current
|
||||
possibilities are <b>patch</b> and <b>snap</b>. A patch version might
|
||||
be made to a released version to make available a feature or a bug
|
||||
fix. In the figure below, a patch to the 1.8.5 release is labeled
|
||||
1.8.5-patch1. A snapshot is an intermediate posting of the software
|
||||
in a branch or in the trunk. Snapshots are made available so that users
|
||||
may begin to test changes in the software that affect their software.
|
||||
The changes may range from bug fixes to new features. Snapshots are made
|
||||
and released regularly. How regularly depends on whether the software
|
||||
passes the tests done on each build. A possible version number for a
|
||||
snapshot might be 1.9-snap81. This version would hold the 81st snapshot
|
||||
off the 1.9 development branch (the current trunk). For the
|
||||
snapshots are available at
|
||||
<a href="https://github.com/HDFGroup/hdf5/releases/tag/snapshot">https://github.com/HDFGroup/hdf5/releases/tag/snapshot</a>.</p>
|
||||
|
||||
<h2><a name="TrunkReleaseBranchesFeatureBranches">The Trunk, Release Branches, and Feature Branches</a></h2>
|
||||
|
||||
<p>The HDF Group uses a version control system to manage the HDF5
|
||||
project. Within the system, a trunk and branches are used to track
|
||||
changes. The version numbers described above identify where a given
|
||||
piece of software was produced in the system. The figure below shows
|
||||
the general scheme.</p>
|
||||
|
||||
<table align="center" width="500" border="0">
|
||||
<tbody><tr valign="center" align="center">
|
||||
<td>
|
||||
<hr color="green" size="3">
|
||||
<img height="400" src="trunk_branches.jpg" alt="The trunk, release branches, and feature branches"></td>
|
||||
</tr>
|
||||
<tr valign="center" align="left">
|
||||
<td>
|
||||
<hr color="green" size="1">
|
||||
<b>Figure 1.</b> The trunk, release branches, and feature branches
|
||||
</td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
|
||||
<p>The <b>trunk</b> is the center of the system. New features are
|
||||
implemented in <b>feature branches</b> and aggregated in the trunk.
|
||||
<b>Release branches</b> are then created from the trunk.</p>
|
||||
|
||||
<p>The minor version number of the trunk is always an odd number. From
|
||||
the time of Release 1.8.0 to the first 1.10 release, the trunk will be
|
||||
version 1.9. The trunk was version 1.7 from the time of release 1.6.0
|
||||
until the first 1.8 release.</p>
|
||||
|
||||
<p>Projects that add new features, bug fixes, and performance improvements
|
||||
are developed on <b>feature branches</b>. When a project is completed,
|
||||
its feature branch is merged into the trunk. In the figure above, the
|
||||
merging of a feature branch is represented by a dashed arrow from the
|
||||
feature branch to the trunk. If a feature requires a file format change,
|
||||
then the feature will stay in the trunk until the next significant
|
||||
release. This would mean in the figure above that the new feature would
|
||||
be released in a future 1.10 release branch. If a feature does not
|
||||
require a file format change, then it might be merged into one or more
|
||||
release branches. This would mean in the figure above that the new
|
||||
feature could be merged into the 1.8 branch and could be included in
|
||||
the 1.8.6 release. If the feature was added to the 1.8.5 branch, then a
|
||||
patch version might be released.</p>
|
||||
|
||||
<p><b>Release branches</b> hold software that is distributed to general
|
||||
users. In the figure above, a few release branches are shown below the
|
||||
trunk. Work is done in release branches for a period of time. Branches
|
||||
further from the trunk have less work done in them. For example, a patch
|
||||
branch such as 1.8.5-patch1 may contain only one or two changes. A release
|
||||
branch such as 1.8.5 may contain a number of bug fixes and new functions,
|
||||
but these changes are small in number compared to the number of changes in
|
||||
the 1.8 branch. </p>
|
||||
|
||||
<p>We aim to make available to the public two maintenance releases a year.
|
||||
The releases occur usually in the spring near May 15 and in the fall near
|
||||
November 15. If two release branches are being maintained, then
|
||||
maintenance releases may be made for each release branch. For example,
|
||||
there was a time when both the 1.6 and 1.8 branches were actively
|
||||
maintained. In one maintenance release, the 1.6.10 and 1.8.4 versions were
|
||||
released at the same time. The 1.6 and 1.8 branches were both actively
|
||||
maintained to give early adopters access to new features and to give most
|
||||
users plenty of time to make the change to 1.8 software from 1.6.</p>
|
||||
|
||||
<p>As we improve any branch, we consider the effect of any change on the
|
||||
readability of objects. Applications built, for example, with version
|
||||
1.8.5 will be able to read data files written with any prior version
|
||||
of the library. So, a 1.8.5 application will be able to read a dataset
|
||||
written with 1.4.5. A 1.8.5 application may be able to read a dataset
|
||||
written under the 1.8.7 library if no new features, features not known
|
||||
to 1.8.5, were used.
|
||||
|
||||
<h2><a name="VersionSupportFromTheLibrary">Version Support from the Library</a></h2>
|
||||
|
||||
<p>The library provides macros and functions to query and check
|
||||
version numbers.</p>
|
||||
|
||||
<p>The following constants are defined in the file <code>H5public.h</code>
|
||||
and determine the version of the include files.</p>
|
||||
|
||||
<ul>
|
||||
<li><code>H5_VERS_MAJOR</code></li>
|
||||
<li><code>H5_VERS_MINOR</code></li>
|
||||
<li><code>H5_VERS_RELEASE</code></li>
|
||||
<li><code>H5_VERS_SUBRELEASE</code></li>
|
||||
<li><code>H5_VERS_INFO</code></li>
|
||||
</ul>
|
||||
|
||||
<p>The table below describes some of the function calls and macros
|
||||
that can be used to query and check version numbers.</p>
|
||||
|
||||
<table width="600" cellspacing="0" align="center">
|
||||
<tbody><tr valign="bottom">
|
||||
<td colspan="2" align="left" valign="bottom">
|
||||
<b>Table 1. Version function calls and macros</b></td>
|
||||
</tr>
|
||||
<tr><td colspan="2"><hr color="green" size="2"></td></tr>
|
||||
<tr valign="top">
|
||||
<td width="35%">
|
||||
<b>Function Call or Macro</b></td>
|
||||
<td width="65%">
|
||||
<b>Comments</b></td>
|
||||
</tr><tr><td colspan="2"><hr color="green" size="1"></td></tr>
|
||||
<tr valign="top">
|
||||
<td><code>H5get_libversion</code></td>
|
||||
<td>This function returns through its arguments the version
|
||||
numbers for the library to which the application is linked.</td>
|
||||
</tr>
|
||||
<tr><td colspan="2"><hr color="green" size="1"></td></tr>
|
||||
<tr valign="top">
|
||||
<td><code>H5check</code></td>
|
||||
<td>This macro uses the <code>H5check_version</code> function
|
||||
to verify that the version number of the HDF5 include file used
|
||||
to compile the application matches the version number of the
|
||||
library to which the application is linked. This check occurs
|
||||
automatically when the first HDF5 file is created or opened and
|
||||
is important because a mismatch between the include files and the
|
||||
library is likely to result in corrupted data and/or segmentation
|
||||
faults. If a mismatch is detected, the library issues an error
|
||||
message on the standard error stream and aborts. </td>
|
||||
</tr>
|
||||
<tr><td colspan="2"><hr color="green" size="1"></td></tr>
|
||||
<tr valign="top">
|
||||
<td><code>H5check_version</code></td>
|
||||
<td><p>This function is called by the <code>H5check</code> macro
|
||||
with the include file version constants. The function compares
|
||||
its arguments to the result returned by <code>H5get_libversion</code>.
|
||||
If a mismatch is detected, it prints an error message on the standard
|
||||
error stream and aborts.</p>
|
||||
|
||||
<p>The behavior of this function can be modified by the
|
||||
<code>HDF5_DISABLE_VERSION_CHECK</code> environment variable. Setting
|
||||
the environment variable to a value of =911=92 will issue a
|
||||
warning but continue without aborting. Setting the environment
|
||||
variable to a value of =912=92 will suppress the warning
|
||||
and continue silently without aborting.</p></td>
|
||||
</tr>
|
||||
<tr><td colspan="2"><hr color="green" size="1"></td></tr>
|
||||
<tr valign="top">
|
||||
<td><code>H5_VERSION_GE</code> and
|
||||
<code>H5_VERSION_LE</code></td>
|
||||
<td>These macros compare the version of the HDF5 library being used
|
||||
against the version number specified in the parameters. At compile
|
||||
time, they can be used to conditionally include or exclude code
|
||||
based on the library's version.</td>
|
||||
</tr>
|
||||
<tr><td colspan="2"><hr color="green" size="1"></td></tr>
|
||||
<tr valign="top">
|
||||
<td><code>H5Pset_libver_bounds</code></td>
|
||||
<td>This function can be used to control the versions of the object
|
||||
formats that will be used when creating objects in a file. </td>
|
||||
</tr>
|
||||
<tr><td colspan="2"><hr color="green" size="2"></td></tr>
|
||||
</tbody></table>
|
||||
|
||||
<p>For more information on these and other function calls and macros,
|
||||
see the <a href="https://docs.hdfgroup.org/hdf5/develop/_r_m.html"> <cite>HDF5 Reference Manual</cite></a>. </p>
|
||||
|
||||
<h2><a name="UseCases">Use Cases</a></h2>
|
||||
|
||||
<p>The purpose of this section is to describe how some of the version
|
||||
functions, macros, and constants might be used. </p>
|
||||
|
||||
<h3><a name="ApplicationVersionChecking">Application Version Checking</a></h3>
|
||||
|
||||
<p>Suppose first that a developer builds an application that will read
|
||||
from and write to an HDF5 file. When the application is compiled, a
|
||||
version of the HDF5 Library such as 1.8.6 will be used. The version
|
||||
constants (<code>H5_VERS_MAJOR</code>, <code>H5_VERS_MINOR</code>,
|
||||
and <code>H5_VERS_RELEASE</code>) are included in the application when
|
||||
it is compiled. </p>
|
||||
|
||||
<p>Suppose next that a user gets a copy of the application and starts it
|
||||
up on a workstation. The executable is put into memory along with the
|
||||
HDF5 Library. However, an application may only work successfully with
|
||||
the version of the library with which the application was compiled. In
|
||||
other words, the version of the library that is loaded when the applicati=
|
||||
on
|
||||
is started must be the same version as the version of the library with
|
||||
which the application was compiled. This is verified by the library when
|
||||
the first HDF5 API routine is called. If an application wants to confirm
|
||||
early in its startup procedure that the version of the library that will
|
||||
be loaded into memory at the workstation will work with the application,
|
||||
then it can use the <code>H5get_libversion</code> and
|
||||
<code>H5check_version</code> function calls. </p>
|
||||
|
||||
<h3><a name="ConditionalInclusions">Conditional Inclusions or Exclusions Based on the Version</a></h3>
|
||||
|
||||
<p>The <code>H5_VERSION_GE</code> and <code>H5_VERSION_LE</code> version
|
||||
macros compare the version of the HDF5 Library being used against the
|
||||
version number specified in the parameters. At compile time, they can be
|
||||
used to conditionally include or exclude code based on the library's
|
||||
version. For example, the link functions, <code>H5Lxxx</code>, are
|
||||
new in version 1.8, and some group functions, <code>H5Gxxx</code>,
|
||||
are deprecated in 1.8. With the <code>H5_VERSION_GE</code> macro, an
|
||||
application could use <code>H5Ldelete</code> if the library version is
|
||||
1.8.0 or greater, or it could use <code>H5Gunlink</code> if the library
|
||||
version is less than 1.8.0. </p>
|
||||
|
||||
<h3><a name="SpecifyingAFormat">Specifying a Format</a></h3>
|
||||
<p>Suppose a data file has three datasets. It is possible that the three
|
||||
datasets were added to the data file with applications using different
|
||||
versions of HDF5. The different versions could be 1.4.5, 1.6.10, and
|
||||
1.8.6. If another dataset is written to the data file, then it will be
|
||||
written by default in the oldest format possible that has all of the
|
||||
features needed to successfully write the dataset. If a newer feature
|
||||
such as compact storage, a new parameter for a function, or a partially
|
||||
compressed dataset is used, then a newer format will be used.
|
||||
<code>H5Pset_libver_bounds</code> could be used to specify the oldest
|
||||
format used. In the situation above, the owners of the data file might
|
||||
want all data written to the file in the future to be in a 1.8 format
|
||||
rather than 1.6 or 1.4. </p>
|
||||
|
||||
<h2><a name="SharedLibraryVersionNumbers">Shared Library Version Numbers</a></h2>
|
||||
|
||||
<p>HDF5 shared libraries utilize the
|
||||
<a href="https://www.gnu.org/software/libtool/manual/libtool.html#Versioning">
|
||||
libtool versioning system</a> in order to indicate interface
|
||||
compatibility between maintenance releases of HDF5. While we always
|
||||
attempt to maintain interface compatibility between minor maintenance
|
||||
release versions of HDF5, if we are forced to break interface
|
||||
compatibility in order to resolve a critical defect within the
|
||||
library, then the library interface version attached to the shared
|
||||
libraries for a given release will be incremented accordingly.</p>
|
||||
|
||||
<p>Please note that this libtool version number for interface
|
||||
compatibility is unrelated to the HDF5 release version for a given
|
||||
release.</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -17,8 +17,8 @@
|
||||
<h3 id="swmr-users-guide"><a href="https://docs.hdfgroup.org/hdf5/tn/HDF5_SWMR_User_Guide.pdf">SWMR User's Guide</a></h3>
|
||||
<h3 id="hdf5-library-apis">HDF5 Library APIs</h3>
|
||||
<ul>
|
||||
<li><a href="https://docs.hdfgroup.org/hdf5/develop/group___s_w_m_r.html#ga159be34fbe7e4a959589310ef0196dfe">H5F_START_SWMR_WRITE</a> — Enables SWMR writing mode for a file</li>
|
||||
<li><a href="https://docs.hdfgroup.org/hdf5/develop/group___h5_d_o.html#ga316caac160af15192e0c78228667341e">H5DO_APPEND</a> — Appends data to a dataset along a specified dimension</li>
|
||||
<li><a href="https://\DOXURL/group___s_w_m_r.html#ga159be34fbe7e4a959589310ef0196dfe">H5F_START_SWMR_WRITE</a> — Enables SWMR writing mode for a file</li>
|
||||
<li><a href="https://\DOXURL/group___h5_d_o.html#ga316caac160af15192e0c78228667341e">H5DO_APPEND</a> — Appends data to a dataset along a specified dimension</li>
|
||||
<li>H5P_SET_OBJECT_FLUSH_CB — Sets a callback function to invoke when an object flush occurs in the file</li>
|
||||
<li>H5P_GET_OBJECT_FLUSH_CB — Retrieves the object flush property values from the file access property list</li>
|
||||
<li>H5O_DISABLE_MDC_FLUSHES — Prevents metadata entries for an HDF5 object from being flushed from the metadata cache to storage</li>
|
||||
|
||||
@@ -6,13 +6,13 @@
|
||||
<tab type="user" url="@ref GettingStarted" title="Getting started" />
|
||||
<tab type="user" url="@ref UG" title="User Guide" />
|
||||
<tab type="user" url="@ref RM" title="Reference Manual" />
|
||||
<tab type="user" url="https://portal.hdfgroup.org/display/HDF5/HDF5+Application+Developer%27s+Guide" title="Application Developer's Guide" />
|
||||
<tab type="user" url="https://\DSPURL/HDF5+Application+Developer%27s+Guide" title="Application Developer's Guide" />
|
||||
<tab type="user" url="https://github.com/HDFGroup/arch-doc/blob/main/An_Overview_of_the_HDF5_Library_Architecture.v2.pdf" title="HDF5 Library Architecture Overview" />
|
||||
<tab type="user" url="@ref SPEC" title="Specifications" />
|
||||
<tab type="user" url="@ref Cookbook" title="Cookbook" />
|
||||
<tab type="user" url="@ref TN" title="Technical Notes" />
|
||||
<tab type="user" url="@ref VOL_Connector" title="HDF5 VOL Connector Author Guide" />
|
||||
<tab type="user" url="https://portal.hdfgroup.org/display/HDF5/HDF5+VOL+User%27s+Guide" title="HDF5 VOL User's Guide" />
|
||||
<tab type="user" url="https://\DSPURL/HDF5+VOL+User%27s+Guide" title="HDF5 VOL User's Guide" />
|
||||
<tab type="user" url="@ref RFC" title="RFCs" />
|
||||
<tab type="user" url="@ref FTS" title="Full-Text Search" />
|
||||
<tab type="user" url="@ref About" title="About" />
|
||||
|
||||
@@ -7,5 +7,6 @@
|
||||
<img src=tutr-swmr1.png>
|
||||
<img src=tutrvds-snglimg.png>
|
||||
<img src=tutrvds-multimgs.png>
|
||||
<img src=trunk_branches.jpg>
|
||||
|
||||
*/
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 50 KiB |
@@ -109,7 +109,7 @@ FOR DEVELOPERS
|
||||
|
||||
The valid KINDs for integers and reals that are stored in H5config_f.inc are used in the H5_buildiface.F90 file located in the fortran/src directory. During the build process, H5_buildiface.F90 generates all the valid F90 KIND interfaces for the following APIs: h5awrite_f, h5aread_f, h5dwrite_f, h5dread_f, h5pset_fill_value_f, h5pget_fill_value_f, h5pset_f, h5pget_f, h5pregister_f, and h5pinsert_f. These APIs can handle up to and including rank seven arrays for all the found KINDs. Again, it's important to note that no new Fortran APIs should be added to H5_buildiface.F90 since new Fortran APIs should not use F90 specification but should instead use F2003. The source file generated by H5_buildiface.F90 is H5_gen.F90, which is the Fortran module H5_GEN, Figure 1. This module is included in the HDF5 module HDF5.F90.
|
||||
|
||||

|
||||

|
||||
|
||||
Procedure to add a new function
|
||||
--------------------------------
|
||||
|
||||
@@ -80,20 +80,6 @@ H5DOread_chunk(hid_t dset_id, hid_t dxpl_id, const hsize_t *offset, uint32_t *fi
|
||||
*
|
||||
* Return: Non-negative on success/Negative on failure
|
||||
*
|
||||
* Note:
|
||||
* This routine is copied from the fast forward feature branch: features/hdf5_ff
|
||||
* src/H5FF.c:H5DOappend() with the following modifications:
|
||||
* 1) Remove and replace macro calls such as
|
||||
* FUNC_ENTER_API, H5TRACE, HGOTO_ERROR
|
||||
* accordingly because hl does not have these macros
|
||||
* 2) Replace H5I_get_type() by H5Iget_type()
|
||||
* 3) Replace H5P_isa_class() by H5Pisa_class()
|
||||
* 4) Fix a bug in the following: replace extension by size[axis]
|
||||
* if(extension < old_size) {
|
||||
* ret_value = FAIL;
|
||||
* goto done;
|
||||
* }
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
herr_t
|
||||
|
||||
+1
-1
@@ -161,7 +161,7 @@ H5_HLDLL herr_t H5DOappend(hid_t dset_id, hid_t dxpl_id, unsigned axis, size_t e
|
||||
* from one datatype to another, and the filter pipeline to write the chunk.
|
||||
* Developers should have experience with these processes before
|
||||
* using this function. Please see
|
||||
* <a href="https://portal.hdfgroup.org/display/HDF5/Using+the+Direct+Chunk+Write+Function">
|
||||
* <a href="https://\DSPURL/Using+the+Direct+Chunk+Write+Function">
|
||||
* Using the Direct Chunk Write Function</a>
|
||||
* for more information.
|
||||
*
|
||||
|
||||
+3
-3
@@ -1387,7 +1387,7 @@ H5_HLDLL herr_t H5LTget_attribute_info(hid_t loc_id, const char *obj_name, const
|
||||
* Currently, only the DDL(#H5LT_DDL) is supported.
|
||||
* The complete DDL definition of HDF5 datatypes can be found in
|
||||
* the last chapter of the
|
||||
* <a href="https://portal.hdfgroup.org/display/HDF5/HDF5+User+Guides">
|
||||
* <a href="https://\DSPURL/HDF5+User+Guides">
|
||||
* HDF5 User's Guide</a>.
|
||||
*
|
||||
* \par Example
|
||||
@@ -1425,7 +1425,7 @@ H5_HLDLL hid_t H5LTtext_to_dtype(const char *text, H5LT_lang_t lang_type);
|
||||
* Currently only DDL (#H5LT_DDL) is supported for \p lang_type.
|
||||
* The complete DDL definition of HDF5 data types can be found in
|
||||
* the last chapter of the
|
||||
* <a href="https://portal.hdfgroup.org/display/HDF5/HDF5+User+Guides">
|
||||
* <a href="https://\DSPURL/HDF5+User+Guides">
|
||||
* HDF5 User's Guide</a>.
|
||||
*
|
||||
* \par Example
|
||||
@@ -1625,7 +1625,7 @@ H5_HLDLL htri_t H5LTpath_valid(hid_t loc_id, const char *path, hbool_t check_obj
|
||||
* \note **Recommended Reading:**
|
||||
* \note This function is part of the file image operations feature set.
|
||||
* It is highly recommended to study the guide
|
||||
* <a href="https://portal.hdfgroup.org/display/HDF5/HDF5+File+Image+Operations">
|
||||
* <a href="https://\DSPURL/HDF5+File+Image+Operations">
|
||||
* HDF5 File Image Operations</a> before using this feature set.\n
|
||||
* See the “See Also” section below for links to other elements of
|
||||
* HDF5 file image operations.
|
||||
|
||||
@@ -785,13 +785,13 @@ main(int argc, char *argv[])
|
||||
h5tools_init();
|
||||
|
||||
/* To exit from h5watch for SIGTERM signal */
|
||||
if (HDsignal(SIGTERM, catch_signal) == SIG_ERR) {
|
||||
if (signal(SIGTERM, catch_signal) == SIG_ERR) {
|
||||
error_msg("An error occurred while setting a signal handler.\n");
|
||||
leave(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/* To exit from h5watch for SIGINT signal */
|
||||
if (HDsignal(SIGINT, catch_signal) == SIG_ERR) {
|
||||
if (signal(SIGINT, catch_signal) == SIG_ERR) {
|
||||
error_msg("An error occurred while setting a signal handler.\n");
|
||||
leave(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
@@ -91,6 +91,6 @@ The <i><b>H5</b> </i>class automatically loads the native method implementations
|
||||
and the HDF5 library.
|
||||
|
||||
<h3>To Obtain</h3>
|
||||
The JHI5 is included with the <a href="https://portal.hdfgroup.org/display/support/Downloads">HDF5</a> library.
|
||||
The JHI5 is included with the <a href="https://portal.hdfgroup.org/downloads/index.html">HDF5</a> library.
|
||||
|
||||
</body>
|
||||
|
||||
@@ -10,7 +10,7 @@ This file provides instructions for installing the HDF5 software.
|
||||
For help with installing, questions can be posted to the HDF Forum or sent to the HDF Helpdesk:
|
||||
|
||||
HDF Forum: https://forum.hdfgroup.org/
|
||||
HDF Helpdesk: https://hdfgroup.atlassian.net/servicedesk/customer/portals
|
||||
HDF Helpdesk: https://help.hdfgroup.org/
|
||||
|
||||
CONTENTS
|
||||
--------
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
Table of Contents
|
||||
|
||||
Section I. Preconditions
|
||||
Section II: Unix and Mac OSX Configuration and Build
|
||||
Section II: Unix and macOS Configuration and Build
|
||||
Section III: Full installation instructions for source distributions
|
||||
Section IV: Using the Library
|
||||
Section V: Windows Configuration and Build
|
||||
@@ -15,7 +15,7 @@ Section V: Windows Configuration and Build
|
||||
For help with installing, questions can be posted to the HDF Forum or sent to the HDF Helpdesk:
|
||||
|
||||
HDF Forum: https://forum.hdfgroup.org/
|
||||
HDF Helpdesk: https://hdfgroup.atlassian.net/servicedesk/customer/portals
|
||||
HDF Helpdesk: https://help.hdfgroup.org/
|
||||
|
||||
|
||||
========================================================================
|
||||
@@ -34,7 +34,7 @@ Obtaining HDF5 source code
|
||||
|
||||
|
||||
========================================================================
|
||||
II. Unix and Mac OSX Configuration and Build
|
||||
II. Unix and macOS Configuration and Build
|
||||
========================================================================
|
||||
|
||||
See RELEASE.txt in the release_notes/ directory for the list of platforms
|
||||
@@ -42,7 +42,7 @@ tested for this release.
|
||||
|
||||
Before You Start:
|
||||
|
||||
1. Make sure that the ZLIB library is installed on your system.
|
||||
1. Make sure that the zlib library is installed on your system.
|
||||
|
||||
2. Optional: Install the Szip version 2.1 library (you may use
|
||||
Szip 2.0 binaries).
|
||||
@@ -65,14 +65,14 @@ Before You Start:
|
||||
|
||||
<more configure_flags> above refers to the configure flags appropriate
|
||||
to your installation. For example, to install HDF5 with the
|
||||
Fortran and C++ interfaces and with SZIP compression, the
|
||||
Fortran and C++ interfaces and with Szip compression, the
|
||||
configure line might read as follows:
|
||||
|
||||
$ ./configure --prefix=/usr/local/hdf5 --enable-fortran \
|
||||
--enable-cxx --with-szlib=PATH_TO_SZIP
|
||||
|
||||
In this case, PATH_TO_SZIP would be replaced with the path to the
|
||||
installed location of the SZIP library.
|
||||
installed location of the Szip library.
|
||||
|
||||
========================================================================
|
||||
III. Full installation instructions for source distributions
|
||||
@@ -87,19 +87,13 @@ III. Full installation instructions for source distributions
|
||||
|
||||
$ tar xf hdf5-X.Y.Z.tar
|
||||
|
||||
1.2. Compressed tar archive (*.tar.Z)
|
||||
|
||||
$ uncompress -c < hdf5-X.Y.Z.tar.Z | tar xf -
|
||||
Or
|
||||
$ tar Zxf hdf5-X.Y.Z.tar.Z
|
||||
|
||||
1.3. Gzip'd tar archive (*.tar.gz)
|
||||
1.2. Gzip'd tar archive (*.tar.gz)
|
||||
|
||||
$ gunzip < hdf5-X.Y.Z.tar.gz | tar xf -
|
||||
Or
|
||||
$ tar zxf hdf5-X.Y.Z.tar.gz
|
||||
|
||||
1.4. Bzip'd tar archive (*.tar.bz2)
|
||||
1.3. Bzip'd tar archive (*.tar.bz2)
|
||||
|
||||
$ bunzip2 < hdf5-X.Y.Z.tar.bz2 | tar xf -
|
||||
Or
|
||||
@@ -258,11 +252,11 @@ III. Full installation instructions for source distributions
|
||||
LDFLAGS=-L/usr/unsup/lib \
|
||||
./configure
|
||||
|
||||
HDF5 includes Szip as a predefined compression method (see 3.2).
|
||||
HDF5 includes Szip as a predefined compression method (see INSTALL 2.2).
|
||||
To enable Szip compression, the HDF5 library must be configured
|
||||
and built using the Szip library:
|
||||
|
||||
$ ./configure --with-szlib=/Szip_Install_Directory
|
||||
$ ./configure --with-szlib=PATH_TO_SZIP
|
||||
|
||||
3.7. Static versus shared linking
|
||||
The build process will create static libraries on all systems and
|
||||
@@ -365,7 +359,7 @@ III. Full installation instructions for source distributions
|
||||
source code. For additional configuration options and other details,
|
||||
see "API Compatibility Macros":
|
||||
|
||||
https://portal.hdfgroup.org/display/HDF5/API+Compatibility+Macros
|
||||
https://hdfgroup.github.io/hdf5/v1_14/api-compat-macros.html
|
||||
|
||||
4. Building
|
||||
The library, confidence tests, and programs can be built by
|
||||
@@ -496,7 +490,7 @@ IV. Using the Library
|
||||
For information on using HDF5 see the documentation, tutorials and examples
|
||||
found here:
|
||||
|
||||
https://portal.hdfgroup.org/display/HDF5/HDF5
|
||||
https://portal.hdfgroup.org/documentation/index.html
|
||||
|
||||
A summary of the features included in the built HDF5 installation can be found
|
||||
in the libhdf5.settings file in the same directory as the static and/or
|
||||
|
||||
@@ -70,7 +70,7 @@ External compression plugin libraries from https://github.com/HDFGroup/hdf5_plug
|
||||
hdf5_plugins.tar.gz
|
||||
|
||||
External compression szip and zlib libraries:
|
||||
ZLIB "https://github.com/madler/zlib/releases/download/v1.2.13/zlib-1.3.tar.gz"
|
||||
ZLIB "https://github.com/madler/zlib/releases/download/v1.3/zlib-1.3.tar.gz"
|
||||
LIBAEC "https://github.com/MathisRosenhauer/libaec/releases/download/v1.0.6/libaec-1.0.6.tar.gz"
|
||||
-------------------------------------------------------------------------
|
||||
-------------------------------------------------------------------------
|
||||
|
||||
@@ -44,7 +44,7 @@ and the parallel file system.
|
||||
For help with installing, questions can be posted to the HDF Forum or sent to the HDF Helpdesk:
|
||||
|
||||
HDF Forum: https://forum.hdfgroup.org/
|
||||
HDF Helpdesk: https://portal.hdfgroup.org/display/support/The+HDF+Help+Desk
|
||||
HDF Helpdesk: https://help.hdfgroup.org/
|
||||
|
||||
In your mail, please include the output of "uname -a". If you have run the
|
||||
"configure" command, attach the output of the command and the content of
|
||||
@@ -202,7 +202,7 @@ Reference
|
||||
1. POSIX Compliant. A good explanation is by Donald Lewin,
|
||||
After a write() to a regular file has successfully returned, any
|
||||
successful read() from each byte position on the file that was modified
|
||||
by that write() will return the date that was written by the write(). A
|
||||
by that write() will return the data that was written by the write(). A
|
||||
subsequent write() to the same byte will overwrite the file data. If a
|
||||
read() of a file data can be proven by any means [e.g., MPI_Barrier()]
|
||||
to occur after a write() of that data, it must reflect that write(),
|
||||
|
||||
@@ -1,18 +1,9 @@
|
||||
HDF5 version 1.14.5-1 currently under development
|
||||
|
||||
This is a maintenance release with a few changes and updates:
|
||||
Features included for the next major release:
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
* Added support for _Float16 16-bit floating-point datatype
|
||||
|
||||
Support for the 16-bit floating-point _Float16 C type has been added to
|
||||
HDF5. On platforms where this type is available, this can enable more
|
||||
efficient storage of floating-point data when an application doesn't
|
||||
need the precision of larger floating-point datatypes. It can also allow
|
||||
for improved performance when converting between 16-bit floating-point
|
||||
data and data of another HDF5 datatype.
|
||||
|
||||
(GitHub #4065, #2154)
|
||||
*
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
Please see the full release notes for detailed information regarding this release,
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
This tar file contains
|
||||
|
||||
build-unix.sh script to build HDF5 with CMake on unix machines
|
||||
build-unix-hpc.sh script to build HDF5 with CMake on unix machines and run
|
||||
tests with batch scripts (sbatch).
|
||||
CTestScript.cmake
|
||||
HDF5config.cmake CMake scripts for building HDF5
|
||||
HDF5options.cmake
|
||||
hdf5-1.14.1 HDF5 1.14.1 source
|
||||
LIBAEC.tar.gz source for building SZIP replacement
|
||||
ZLib.tar.gz source for building ZLIB
|
||||
hdf5_plugins.tar.gz source for building compression plugins
|
||||
HDF5Examples-2.0.3-Source.tar.gz source for building examples
|
||||
|
||||
For more information about building HDF5 with CMake, see USING_HDF5_CMake.txt in
|
||||
hdf5-1.14.1/release_docs, or
|
||||
https://portal.hdfgroup.org/display/support/Building+HDF5+with+CMake.
|
||||
|
||||
For more information about building HDF5 with CMake on HPC machines, including
|
||||
cross compiling on Cray XC40, see README_HPC in hdf5-1.14.1/release_docs.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,163 @@
|
||||
# Release Process
|
||||
|
||||
## Objective:
|
||||
Release a new version of HDF software, which corrects defects, adds functionality, improves maintainability, and/or ports it to new operational environments.
|
||||
|
||||
## Description (General):
|
||||
At regularly scheduled intervals throughout each year, The HDF Group releases a new version of each of its maintained/core software products and corresponding documentation set. This is referred to as a maintenance release. The main purpose of a maintenance release is to address defects reported against previous releases of the software, to port the software to new operating environments, and to improve maintainability by way of refactoring code and improving documentation. A maintenance release may also include new functionality in any of the product's components.
|
||||
|
||||
Depending on the software being released, there may be specific guidelines that are followed or steps that are performed in addition to the 'standard' maintenance release procedure - in such a case, product-specific tabs are provided within the page to view information specific to only that product.
|
||||
|
||||
## Description (HDF5):
|
||||
Twice each year, The HDF Group releases a new version of the HDF5 C, C++, and Fortran libraries and command line utilities and associated documentation set. This is referred to as a maintenance release of HDF5. The main purpose of a maintenance release is to address defects reported against previous releases of the software, to port HDF5 to new operating environments, and to improve maintainability by way of refactoring code and improving documentation. A maintenance release may also include new functionality in the C, C++, and Fortran libraries and/or command line utilities if requested and/or funded by the user community and/or The HDF Group's customers. The new features included in a maintenance release expand the feature set only and do not change the HDF5 file format, with the exception of addressing critical defects that corrupt data.
|
||||
|
||||
Maintenance releases are always backward compatible with regards to the HDF5 file format, meaning that:
|
||||
- New libraries and command line utilities can access HDF5 files created by the previous versions of the libraries.
|
||||
|
||||
Maintenance releases are always forward compatible with regards to the HDF5 file format, meaning that:
|
||||
- HDF5 libraries and command line utilities can access files created by future maintenance versions of the library.
|
||||
Note that maintenance releases are NOT guaranteed to be interface-compatible, meaning that, on occasion, application source code will need updated and re-compiled against a new maintenance release when the interface changes. Interface changes are only made when absolutely necessary as deemed by the HDF5 product manager(s), and interface compatibility reports are published with each release to inform customers and users of any incompatibilities in the interface.
|
||||
|
||||
For more information on the HDF5 versioning and backward and forward compatibility issues, see the [API Compatibility Macros](https://docs.hdfgroup.org/hdf5/v1_14/v1_14_4/api-compat-macros.html) on the public website.
|
||||
|
||||
## Participants:
|
||||
- Product Manager — The individual responsible for the overall direction and development of a software product at The HDF Group.
|
||||
- Release Manager — The individual responsible for coordinating and overseeing the activities specific to releasing a software product at The HDF Group.
|
||||
- Software Developer — An individual or group responsible for performing maintenance on supported HDF software.
|
||||
- Software Tester — An individual responsible for identifying, implementing, and conducting tests of software code, modules, packages, executables, and/or release binaries.
|
||||
- Test Automation Team — A team at The HDF Group responsible for overseeing the daily automated regression tests of software maintained by the company's Sustaining Engineering program.
|
||||
|
||||
## Tasks:
|
||||
### 1. Plan Maintenance Release (Product Manager | Release Manager)
|
||||
|
||||
### 2. Perform Software Maintenance (Software Developers | Product Manager | Release Manager)
|
||||
|
||||
### 3. Prepare Release Notes (Release Manager)
|
||||
1. Confirm that all non-trivial changes made to the source are reflected in the release notes. Verify the following:
|
||||
- [HDF5 Milestones Projects](https://github.com/HDFGroup/hdf5/milestones)
|
||||
- Each entry in [RELEASE.txt](https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/release_docs/RELEASE.txt) traces to one or more resolved GH issues marked with FixVersion="X.Y.Z".
|
||||
- Each resolved GH milestone issue traces to an entry in [RELEASE.txt](https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/release_docs/RELEASE.txt).
|
||||
- Each resolved GH milestone issue traces to one or more revisions to the HDF5 source.
|
||||
- Each resolved GH milestone issue traces to one or more pull requests.
|
||||
2. For each previously authored KNOWN ISSUE in the [RELEASE.txt](https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/release_docs/RELEASE.txt), if the issue has been resolved or can no longer be confirmed, remove the issue from the [RELEASE.txt](https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/release_docs/RELEASE.txt).
|
||||
- Document any new known issues at the top of the list.
|
||||
3. Update the TESTED CONFIGURATION FEATURES SUMMARY in [RELEASE.txt](https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/release_docs/RELEASE.txt) to correspond to features and options that have been tested during the maintenance period by the automated daily regression tests.
|
||||
- **See: Testing/Testing Systems(this is a page in confluence)**
|
||||
4. Update current compiler information for each platform in the PLATFORMS TESTED section of [RELEASE.txt](https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/release_docs/RELEASE.txt).
|
||||
5. Review the [RELEASE.txt](https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/release_docs/RELEASE.txt) for formatting and language to verify that it corresponds to guidelines found in **[Writing Notes in a RELEASE.txt(this is missing)]()** File.
|
||||
6. Review and update, if needed, the [README](https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/README.md) and [COPYING](https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/COPYING) files.
|
||||
7. Review and update all INSTALL_* files in [release_docs](https://github.com/HDFGroup/hdf5/tree/hdf5_1_14/release_docs), if needed.
|
||||
- [INSTALL](https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/release_docs/INSTALL) should be general info and not require extensive changes
|
||||
- [INSTALL_Auto.txt](https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/release_docs/INSTALL_Auto.txt) are the instructions for building under autotools.
|
||||
- [INSTALL_CMake.txt](https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/release_docs/INSTALL_CMake.txt) are the instructions for building under CMake.
|
||||
|
||||
### 4. Freeze Code (Release Manager | Test Automation Team)
|
||||
1. Transition from performing maintenance on software to preparing for its delivery.
|
||||
2. A few days before the code freeze, announce (via a product's developer mailing list and during team meetings) the pending freeze of the code for the release. On the day of the code freeze, send a "no more commits" message for the software being released and any third party software we develop that it depends on, as well as a "no more upgrades" message for other third party software the release depends on.
|
||||
- Recently we haven’t announced a code freeze since it doesn’t take long to create the release branch and the support branch doesn’t need to remain frozen once the release branch is created. There are a few things that can be done on the support branch before the release branch is created, in particular updating the .so numbers.
|
||||
3. Move all unresolved Milestone issues to the next release version in GitHub.
|
||||
4. Verify that frozen code branch satisfies all existing regression test cases, and give the 'OK' to the release coordinator once all daily test configurations are passing as expected after the date of the code freeze. If there are failing tests after the code freeze date, coordinate with maintainers responsible for the failures to ensure that either the changes causing the failures are corrected or reverted.
|
||||
5. Verify release branches for third-party software used: SZIP, ZLIB, and Plugins; and announce release versions to hdf5lib@lists.hdfgroup.org.
|
||||
|
||||
### 5. Update Interface Version (Release Manager | Product Manager)
|
||||
1. Verify interface additions, changes, and removals, and update the shared library interface version number.
|
||||
2. Execute the CI snapshot workflow.
|
||||
- Actions - “[hdf5 release build](https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/.github/workflows/release.yml)” workflow and use the defaults.
|
||||
3. Download and inspect release build source and binary files. Downloaded source files should build correctly, one or more binaries should install and run correctly. There should be nothing missing nor any extraneous files that aren’t meant for release.
|
||||
4. Verify the interface compatibility reports between the current source and the previous release on the Github [Snapshots](https://github.com/HDFGroup/hdf5/releases/tag/snapshot-1.14) page.
|
||||
- The compatibility reports are produced by the CI and are viewable in the Github [Releases/snapshot](https://github.com/HDFGroup/hdf5/releases/tag/snapshot) section.
|
||||
5. Verify the interface compatibility reports between the current source and the previous release on the Github [Snapshots](https://github.com/HDFGroup/hdf5/releases/tag/snapshot-1.14) page.
|
||||
- The compatibility reports are produced by the CI and are viewable in the Github [Releases/snapshot](https://github.com/HDFGroup/hdf5/releases/tag/snapshot) section.
|
||||
6. Confirm the necessity of and approve of any interface-breaking changes. If any changes need to be reverted, task the developer who made the change to do so as soon as possible. If a change is reverted, return to the previous step and regenerate the compatibility report after the changes is made. Otherwise, continue to the next step.
|
||||
7. Update the .so version numbers in the [config/lt_vers.am](https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/config/lt_vers.am) file in the support branch according to [libtool's library interface version](https://www.gnu.org/software/libtool/manual/libtool.html#Versioning) scheme.
|
||||
- See [Updating version info (Libtool)](https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html#Updating-version-info) for rules to help update library version numbers.
|
||||
8. After the release branch has been created, run `./autogen.sh` to regenerate build system files on the release branch and commit the changes.
|
||||
|
||||
### 6. Prepare Release Branch (Release Manager)
|
||||
1. Get the release branch ready for pre-release testing and packaging.
|
||||
2. For all release preparation operations, the release coordinator will clone and push directly to canonical HDF5:
|
||||
- `$ git clone https://github.com/HDFGroup/hdf5.git`
|
||||
3. Create a release preparation branch (hdf5_X_Y_Z) by branching off of the support branch (hdf5_X_Y):
|
||||
- `$ git checkout hdf5_X_Y`
|
||||
- `$ git checkout -b hdf5_X_Y_Z`
|
||||
- or create the new branch in GitHub GUI.
|
||||
4. Check that required CMake files point to the specific versions of the third-party software (szip, zlib and plugins) that they depend on.
|
||||
- Update as needed.
|
||||
5. Change the **support** branch to X.Y.{Z+1}-1 using the [bin/h5vers](https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/bin/h5vers) script:
|
||||
- `$ git checkout hdf5_X_Y`
|
||||
- `$ bin/h5vers -s X.Y.{Z+1}-1;`
|
||||
- `$ git commit -m "Updated support branch version number to X.Y.{Z+1}-1"`
|
||||
- `$ git push`
|
||||
6. Change the **release preparation branch**'s version number to X.Y.Z-{SR+1} using the [bin/h5vers](https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/bin/h5vers) script:
|
||||
- `$ git checkout hdf5_X_Y_Z;`
|
||||
- `$ bin/h5vers -s X.Y.Z-{SR+1};`
|
||||
- `$ git commit -m "Updated release preparation branch version number to X.Y.Z-{SR+1}"`
|
||||
- `$ git push`
|
||||
7. Update default configuration mode
|
||||
- `$ git checkout hdf5_X_Y_Z;` and `$ bin/switch_maint_mode -disable ./configure.ac` to disable `AM_MAINTAINER_MODE`.
|
||||
- Need to set option `HDF5_GENERATE_HEADERS` to `OFF`, currently in line 996 of [src/CMakeLists.txt](https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/src/CMakeLists.txt).
|
||||
- Change the **release preparation branch**'s (i.e. hdf5_X_Y_Z) default configuration mode from development to production in [configure.ac](https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/configure.ac).
|
||||
- Find “Determine build mode” in [configure.ac](https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/configure.ac).
|
||||
- Change `default=debug` to `default=production` at the bottom of the `AS_HELP_STRING` for `--enable-build-mode`.
|
||||
- Under `if test "X-$BUILD_MODE" = X- ; then` change `BUILD_MODE=debug` to `BUILD_MODE=production`.
|
||||
- Run `sh ./autogen.sh` to regenerate the UNIX build system files and commit the changes. (use `git status --ignored` to see the changes and `git add -f` to add all files. First delete any new files not to be committed, notably `src/H5public.h~` and `autom4te.cache/`.)
|
||||
- `$ git push with commit message listing change steps for creating release branch`
|
||||
8. E-mail hdf5lib@hdfgroup.org to indicate that the code freeze on the release support branch (i.e. hdf5_X_Y) has been lifted and development on the next maintenance release can resume. The code freeze will remain in place on the release preparation branch (i.e. hdf5_X_Y_Z) indefinitely.
|
||||
|
||||
### 7. Perform Release Testing (Test Automation Team | Release Manager | Project Leads)
|
||||
1. Verify that source and binary distributions of HDF5 are acceptable on all target operating environments.
|
||||
2. Create a page on Confluence as a sub-page of the current release version's project collaboration page (see HDF5 Maintenance Releases) to document release testing results.
|
||||
3. Document the test procedure that will be used for this release on the new sub-page.
|
||||
4. Schedule daily stand-up meetings or other regular checkpoints to assure progress on testing tasks, and inform testing team of your expectations.
|
||||
5. Schedule and enable daily automated regression testing of the release preparation branch (i.e. hdf5_X_Y_Z). Give the 'OK' to proceed once all required tests have verified that HDF5 is functioning as intended on all target operating environments.
|
||||
6. Select release build from workflow.
|
||||
7. Choose the release branch
|
||||
8. Change ‘Release version tag’ name to 'hdf5_X.Y.Z.P'
|
||||
- P is some pre-release number.
|
||||
9. Send a message to the HDF forum indicating that a pre-release source package is available for testing at <e.g. gamma.hdfgroup.org/ftp/pub/outgoing/hdf5/{hdf5-X.Y.Z-P}> and that feedback from the user community on their test results is being accepted.
|
||||
10. Contact paying clients who are interested in testing the pre-release source package and inform them that it is available for testing and that feedback on their test results of the pre-release is appreciated.
|
||||
11. This should be automated and currently github binaries are not signed.
|
||||
- Follow the [How to sign binaries with digital certificates(this is missing)]() work instructions to sign each Windows and Mac binary package with a digital certificate.
|
||||
12. Once binaries are ready to be tested, send an e-mail notification or update the Confluence test dashboard page indicating source and binary test assignments and when results should be made available.
|
||||
13. Use the pre-release source packages to build and test HDF5 on assigned platforms by hand. Build both shared and static libraries, Fortran, C++, and szip, and any additional configurations required on specific remote platforms based on customer support needs.
|
||||
14. Use the pre-release binary packages found in /mnt/scr1/pre-release/hdf5/vXYZ/pre-\<n\>/binaries/{UNIX, Windows} to test according to the binary testing procedures for your assigned platforms.
|
||||
15. Scripted Testing:
|
||||
- UNIX: [Scripted Binary Testing of HDF5 on UNIX systems (this is missing)]()
|
||||
- Windows: [Testing HDF5 Binaries(this is missing)]()
|
||||
16. Manual Testing (i.e. verifying correct test outcomes via visual inspection):
|
||||
- Use this if UNIX test script is not reporting correct results, yet binaries look OK.
|
||||
- UNIX: [Manual Binary Testing of HDF5 on Unix systems (this is missing)]()
|
||||
17. Update the test results Confluence page with status/outcome of all test assignments.
|
||||
18. If any test source (hdf-forum, clients, internal testers, automated regression suite) identifies any issues:
|
||||
- a) Enter the issue in JIRA summarizing the failure if it is not already there.
|
||||
- b) Decide whether to resolve the issue for this release or simply document it as a known issue.
|
||||
- c) Document and assign action items resulting from a) or b), and monitor them to closure.
|
||||
19. Decide if another cycle of pre-release testing should occur based on the issue reports received and the actions taken during this cycle. If another round of testing is required (i.e. there were significant issues in pre-release testing which resulted in code changes), increment the subrelease version number and go back to step 7.2. If no further testing is required (i.e. no code changes were made and issues were documented as known issues, or code changes were trivial, unit tested, and exhaustive testing is unneeded), then proceed.
|
||||
|
||||
|
||||
### 8. Finalize Release Notes (Release Manager)
|
||||
1. Perform a final review of release notes and ensure that any new changes made to the source, any new known issues discovered, and any additional tests run since the code freeze have been reflected in RELEASE.txt and other appropriate in-source documentation files (INSTALL_*, etc.). (Refer to the sub-steps of step 3 for what to check).
|
||||
2. Update the [RELEASE.txt](https://github.com/HDFGroup/hdf5/blob/hdf5_1_14/release_docs/RELEASE.txt) in the **support** branch (i.e. hdf5_X_Y) to remove entries in “Bugs fixed” and “New Features” sections and increment the version number for the following release (“Bug fixes since X.Y.Z” - occurs twice).
|
||||
- `$ git checkout hdf5_X_Y`
|
||||
- `$ vi RELEASE.txt # update RELEASE.txt to clear it out`
|
||||
- `$ git commit -m "Reset RELEASE.txt in preparation for the next release."`
|
||||
- `$ git push`
|
||||
3. Update Release Notes in **release** branch (Release Manager)
|
||||
|
||||
### 9. Package and Distribute Release (Release Manager)
|
||||
1. h5vers will run autogen.sh, which can change the generated files if certain code files have been changed since the files generated by autogen.sh were committed on the release branch. This should be checked by running `git status --ignored;`, then running autogen.sh, then repeating `git status --ignored;`. If there are modified files from either git status command, they should be committed (or deleted if there are backup files or an autom4te.cache directory), and at least minimal testing should be done to see that the software is still good with the changes.
|
||||
2. Set version for release, removing the subrelease string, initially `$ bin/h5vers -s X.Y.Z;`. Any subsequent patch releases will need the subrelease number.
|
||||
3. Run `bin/release` (similar to 8.2) and commit all the changed files.
|
||||
4. Select release build from workflow.
|
||||
- Choose the release branch
|
||||
- Change ‘Release version tag’ name to 'hdf5_X.Y.Z'
|
||||
- Press "Run Workflow"
|
||||
5. Review the release files in Github
|
||||
6. Edit the Github Release and change status to Release
|
||||
- Change status from Pre-release to Release
|
||||
|
||||
### 10. Add the contents of the RELEASE.txt file in the release code to the HISTORY file in the **support** branch, just below the introductory lines at the top of the HISTORY file.
|
||||
|
||||
### 11. Conduct Release Retrospective (Release Manager)
|
||||
1. Schedule time and solicit comments from retrospective
|
||||
2. Identify issues and document them
|
||||
@@ -539,7 +539,6 @@ H5dont_atexit(void)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API_NOINIT_NOERR_NOFS
|
||||
H5TRACE0("e", "");
|
||||
|
||||
if (H5_dont_atexit_g)
|
||||
ret_value = FAIL;
|
||||
@@ -572,7 +571,6 @@ H5garbage_collect(void)
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE0("e", "");
|
||||
|
||||
/* Call the garbage collection routines in the library */
|
||||
if (H5FL_garbage_coll() < 0)
|
||||
@@ -616,8 +614,6 @@ H5set_free_list_limits(int reg_global_lim, int reg_list_lim, int arr_global_lim,
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE6("e", "IsIsIsIsIsIs", reg_global_lim, reg_list_lim, arr_global_lim, arr_list_lim, blk_global_lim,
|
||||
blk_list_lim);
|
||||
|
||||
/* Call the free list function to actually set the limits */
|
||||
if (H5FL_set_free_list_limits(reg_global_lim, reg_list_lim, arr_global_lim, arr_list_lim, blk_global_lim,
|
||||
@@ -654,7 +650,6 @@ H5get_free_list_sizes(size_t *reg_size /*out*/, size_t *arr_size /*out*/, size_t
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE4("e", "*z*z*z*z", reg_size, arr_size, blk_size, fac_size);
|
||||
|
||||
/* Call the free list function to actually get the sizes */
|
||||
if (H5FL_get_free_list_sizes(reg_size, arr_size, blk_size, fac_size) < 0)
|
||||
@@ -814,7 +809,6 @@ H5get_libversion(unsigned *majnum /*out*/, unsigned *minnum /*out*/, unsigned *r
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3("e", "*Iu*Iu*Iu", majnum, minnum, relnum);
|
||||
|
||||
/* Set the version information */
|
||||
if (majnum)
|
||||
@@ -877,7 +871,6 @@ H5check_version(unsigned majnum, unsigned minnum, unsigned relnum)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API_NOINIT_NOERR_NOFS
|
||||
H5TRACE3("e", "IuIuIu", majnum, minnum, relnum);
|
||||
|
||||
/* Don't check again, if we already have */
|
||||
if (checked)
|
||||
@@ -1023,7 +1016,6 @@ H5open(void)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API_NOPUSH(FAIL)
|
||||
/*NO TRACE*/
|
||||
|
||||
/* all work is done by FUNC_ENTER() */
|
||||
|
||||
@@ -1048,7 +1040,6 @@ H5atclose(H5_atclose_func_t func, void *ctx)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "Hc*x", func, ctx);
|
||||
|
||||
/* Check arguments */
|
||||
if (NULL == func)
|
||||
@@ -1088,7 +1079,6 @@ H5close(void)
|
||||
* this function for an uninitialized library.
|
||||
*/
|
||||
FUNC_ENTER_API_NOINIT_NOERR_NOFS
|
||||
H5TRACE0("e", "");
|
||||
|
||||
H5_term_library();
|
||||
|
||||
@@ -1126,7 +1116,6 @@ H5allocate_memory(size_t size, bool clear)
|
||||
void *ret_value = NULL;
|
||||
|
||||
FUNC_ENTER_API_NOINIT
|
||||
H5TRACE2("*x", "zb", size, clear);
|
||||
|
||||
if (0 == size)
|
||||
return NULL;
|
||||
@@ -1169,7 +1158,6 @@ H5resize_memory(void *mem, size_t size)
|
||||
void *ret_value = NULL;
|
||||
|
||||
FUNC_ENTER_API_NOINIT
|
||||
H5TRACE2("*x", "*xz", mem, size);
|
||||
|
||||
ret_value = H5MM_realloc(mem, size);
|
||||
|
||||
@@ -1192,7 +1180,6 @@ herr_t
|
||||
H5free_memory(void *mem)
|
||||
{
|
||||
FUNC_ENTER_API_NOINIT
|
||||
H5TRACE1("e", "*x", mem);
|
||||
|
||||
/* At this time, it is impossible for this to fail. */
|
||||
H5MM_xfree(mem);
|
||||
@@ -1216,7 +1203,6 @@ H5is_library_threadsafe(bool *is_ts /*out*/)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API_NOINIT
|
||||
H5TRACE1("e", "*b", is_ts);
|
||||
|
||||
if (is_ts) {
|
||||
#ifdef H5_HAVE_THREADSAFE
|
||||
@@ -1251,7 +1237,6 @@ H5is_library_terminating(bool *is_terminating /*out*/)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API_NOINIT
|
||||
H5TRACE1("e", "*b", is_terminating);
|
||||
|
||||
assert(is_terminating);
|
||||
|
||||
|
||||
@@ -223,7 +223,6 @@ H5Acreate2(hid_t loc_id, const char *attr_name, hid_t type_id, hid_t space_id, h
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE6("i", "i*siiii", loc_id, attr_name, type_id, space_id, acpl_id, aapl_id);
|
||||
|
||||
/* Create the attribute synchronously */
|
||||
if ((ret_value =
|
||||
@@ -255,8 +254,6 @@ H5Acreate_async(const char *app_file, const char *app_func, unsigned app_line, h
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE10("i", "*s*sIui*siiiii", app_file, app_func, app_line, loc_id, attr_name, type_id, space_id,
|
||||
acpl_id, aapl_id, es_id);
|
||||
|
||||
/* Set up request token pointer for asynchronous operation */
|
||||
if (H5ES_NONE != es_id)
|
||||
@@ -372,7 +369,6 @@ H5Acreate_by_name(hid_t loc_id, const char *obj_name, const char *attr_name, hid
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE8("i", "i*s*siiiii", loc_id, obj_name, attr_name, type_id, space_id, acpl_id, aapl_id, lapl_id);
|
||||
|
||||
/* Create the attribute synchronously */
|
||||
if ((ret_value = H5A__create_by_name_api_common(loc_id, obj_name, attr_name, type_id, space_id, acpl_id,
|
||||
@@ -404,8 +400,6 @@ H5Acreate_by_name_async(const char *app_file, const char *app_func, unsigned app
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE12("i", "*s*sIui*s*siiiiii", app_file, app_func, app_line, loc_id, obj_name, attr_name, type_id,
|
||||
space_id, acpl_id, aapl_id, lapl_id, es_id);
|
||||
|
||||
/* Set up request token pointer for asynchronous operation */
|
||||
if (H5ES_NONE != es_id)
|
||||
@@ -539,7 +533,6 @@ H5Aopen(hid_t loc_id, const char *attr_name, hid_t aapl_id)
|
||||
hid_t ret_value = H5I_INVALID_HID;
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE3("i", "i*si", loc_id, attr_name, aapl_id);
|
||||
|
||||
/* Open the attribute synchronously */
|
||||
if ((ret_value = H5A__open_api_common(loc_id, attr_name, aapl_id, NULL, NULL)) < 0)
|
||||
@@ -569,7 +562,6 @@ H5Aopen_async(const char *app_file, const char *app_func, unsigned app_line, hid
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE7("i", "*s*sIui*sii", app_file, app_func, app_line, loc_id, attr_name, aapl_id, es_id);
|
||||
|
||||
/* Set up request token pointer for asynchronous operation */
|
||||
if (H5ES_NONE != es_id)
|
||||
@@ -667,7 +659,6 @@ H5Aopen_by_name(hid_t loc_id, const char *obj_name, const char *attr_name, hid_t
|
||||
hid_t ret_value = H5I_INVALID_HID;
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE5("i", "i*s*sii", loc_id, obj_name, attr_name, aapl_id, lapl_id);
|
||||
|
||||
/* Open the attribute by name asynchronously */
|
||||
if ((ret_value =
|
||||
@@ -698,8 +689,6 @@ H5Aopen_by_name_async(const char *app_file, const char *app_func, unsigned app_l
|
||||
hid_t ret_value = H5I_INVALID_HID;
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE9("i", "*s*sIui*s*siii", app_file, app_func, app_line, loc_id, obj_name, attr_name, aapl_id,
|
||||
lapl_id, es_id);
|
||||
|
||||
/* Set up request token pointer for asynchronous operation */
|
||||
if (H5ES_NONE != es_id)
|
||||
@@ -806,7 +795,6 @@ H5Aopen_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type, H5_iter_
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE7("i", "i*sIiIohii", loc_id, obj_name, idx_type, order, n, aapl_id, lapl_id);
|
||||
|
||||
/* Open the attribute by idx synchronously */
|
||||
if ((ret_value = H5A__open_by_idx_api_common(loc_id, obj_name, idx_type, order, n, aapl_id, lapl_id, NULL,
|
||||
@@ -838,8 +826,6 @@ H5Aopen_by_idx_async(const char *app_file, const char *app_func, unsigned app_li
|
||||
hid_t ret_value = H5I_INVALID_HID;
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE11("i", "*s*sIui*sIiIohiii", app_file, app_func, app_line, loc_id, obj_name, idx_type, order, n,
|
||||
aapl_id, lapl_id, es_id);
|
||||
|
||||
/* Set up request token pointer for asynchronous operation */
|
||||
if (H5ES_NONE != es_id)
|
||||
@@ -924,7 +910,6 @@ H5Awrite(hid_t attr_id, hid_t dtype_id, const void *buf)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3("e", "ii*x", attr_id, dtype_id, buf);
|
||||
|
||||
/* Synchronously write the data */
|
||||
if (H5A__write_api_common(attr_id, dtype_id, buf, NULL, NULL) < 0)
|
||||
@@ -952,7 +937,6 @@ H5Awrite_async(const char *app_file, const char *app_func, unsigned app_line, hi
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE7("e", "*s*sIuii*xi", app_file, app_func, app_line, attr_id, dtype_id, buf, es_id);
|
||||
|
||||
/* Set up request token pointer for asynchronous operation */
|
||||
if (H5ES_NONE != es_id)
|
||||
@@ -1032,7 +1016,6 @@ H5Aread(hid_t attr_id, hid_t dtype_id, void *buf /*out*/)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3("e", "ii*x", attr_id, dtype_id, buf);
|
||||
|
||||
/* Synchronously read the data */
|
||||
if (H5A__read_api_common(attr_id, dtype_id, buf, NULL, NULL) < 0)
|
||||
@@ -1060,7 +1043,6 @@ H5Aread_async(const char *app_file, const char *app_func, unsigned app_line, hid
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE7("e", "*s*sIuii*xi", app_file, app_func, app_line, attr_id, dtype_id, buf, es_id);
|
||||
|
||||
/* Set up request token pointer for asynchronous operation */
|
||||
if (H5ES_NONE != es_id)
|
||||
@@ -1106,7 +1088,6 @@ H5Aget_space(hid_t attr_id)
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE1("i", "i", attr_id);
|
||||
|
||||
/* Check arguments */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(attr_id, H5I_ATTR)))
|
||||
@@ -1151,7 +1132,6 @@ H5Aget_type(hid_t attr_id)
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE1("i", "i", attr_id);
|
||||
|
||||
/* Check arguments */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(attr_id, H5I_ATTR)))
|
||||
@@ -1199,7 +1179,6 @@ H5Aget_create_plist(hid_t attr_id)
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE1("i", "i", attr_id);
|
||||
|
||||
assert(H5P_LST_ATTRIBUTE_CREATE_ID_g != -1);
|
||||
|
||||
@@ -1253,7 +1232,6 @@ H5Aget_name(hid_t attr_id, size_t buf_size, char *buf /*out*/)
|
||||
ssize_t ret_value = -1; /* Return value */
|
||||
|
||||
FUNC_ENTER_API((-1))
|
||||
H5TRACE3("Zs", "iz*s", attr_id, buf_size, buf);
|
||||
|
||||
/* check arguments */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(attr_id, H5I_ATTR)))
|
||||
@@ -1304,7 +1282,6 @@ H5Aget_name_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type, H5_i
|
||||
ssize_t ret_value; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE8("Zs", "i*sIiIoh*szi", loc_id, obj_name, idx_type, order, n, name, size, lapl_id);
|
||||
|
||||
/* Check args */
|
||||
if (H5I_ATTR == H5I_get_type(loc_id))
|
||||
@@ -1373,7 +1350,6 @@ H5Aget_storage_size(hid_t attr_id)
|
||||
hsize_t ret_value; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(0)
|
||||
H5TRACE1("h", "i", attr_id);
|
||||
|
||||
/* Check arguments */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(attr_id, H5I_ATTR)))
|
||||
@@ -1412,7 +1388,6 @@ H5Aget_info(hid_t attr_id, H5A_info_t *ainfo /*out*/)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*Ai", attr_id, ainfo);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(attr_id, H5I_ATTR)))
|
||||
@@ -1454,7 +1429,6 @@ H5Aget_info_by_name(hid_t loc_id, const char *obj_name, const char *attr_name, H
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE5("e", "i*s*s*Aii", loc_id, obj_name, attr_name, ainfo, lapl_id);
|
||||
|
||||
/* Check args */
|
||||
if (H5I_ATTR == H5I_get_type(loc_id))
|
||||
@@ -1511,7 +1485,6 @@ H5Aget_info_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type, H5_i
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE7("e", "i*sIiIoh*Aii", loc_id, obj_name, idx_type, order, n, ainfo, lapl_id);
|
||||
|
||||
/* Check args */
|
||||
if (H5I_ATTR == H5I_get_type(loc_id))
|
||||
@@ -1654,7 +1627,6 @@ H5Arename(hid_t loc_id, const char *old_name, const char *new_name)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3("e", "i*s*s", loc_id, old_name, new_name);
|
||||
|
||||
/* Synchronously rename the attribute */
|
||||
if (H5A__rename_api_common(loc_id, old_name, new_name, NULL, NULL) < 0)
|
||||
@@ -1682,7 +1654,6 @@ H5Arename_async(const char *app_file, const char *app_func, unsigned app_line, h
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE7("e", "*s*sIui*s*si", app_file, app_func, app_line, loc_id, old_name, new_name, es_id);
|
||||
|
||||
/* Set up request token pointer for asynchronous operation */
|
||||
if (H5ES_NONE != es_id)
|
||||
@@ -1767,7 +1738,6 @@ H5Arename_by_name(hid_t loc_id, const char *obj_name, const char *old_attr_name,
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE5("e", "i*s*s*si", loc_id, obj_name, old_attr_name, new_attr_name, lapl_id);
|
||||
|
||||
/* Synchronously rename the attribute */
|
||||
if (H5A__rename_by_name_api_common(loc_id, obj_name, old_attr_name, new_attr_name, lapl_id, NULL, NULL) <
|
||||
@@ -1797,8 +1767,6 @@ H5Arename_by_name_async(const char *app_file, const char *app_func, unsigned app
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE9("e", "*s*sIui*s*s*sii", app_file, app_func, app_line, loc_id, obj_name, old_attr_name,
|
||||
new_attr_name, lapl_id, es_id);
|
||||
|
||||
/* Set up request token pointer for asynchronous operation */
|
||||
if (H5ES_NONE != es_id)
|
||||
@@ -1872,7 +1840,6 @@ H5Aiterate2(hid_t loc_id, H5_index_t idx_type, H5_iter_order_t order, hsize_t *i
|
||||
herr_t ret_value; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE6("e", "iIiIo*hAO*x", loc_id, idx_type, order, idx, op, op_data);
|
||||
|
||||
/* Check arguments */
|
||||
if (H5I_ATTR == H5I_get_type(loc_id))
|
||||
@@ -1960,7 +1927,6 @@ H5Aiterate_by_name(hid_t loc_id, const char *obj_name, H5_index_t idx_type, H5_i
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE8("e", "i*sIiIo*hAO*xi", loc_id, obj_name, idx_type, order, idx, op, op_data, lapl_id);
|
||||
|
||||
/* Check arguments */
|
||||
if (H5I_ATTR == H5I_get_type(loc_id))
|
||||
@@ -2026,7 +1992,6 @@ H5Adelete(hid_t loc_id, const char *name)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*s", loc_id, name);
|
||||
|
||||
/* Check arguments */
|
||||
if (H5I_ATTR == H5I_get_type(loc_id))
|
||||
@@ -2085,7 +2050,6 @@ H5Adelete_by_name(hid_t loc_id, const char *obj_name, const char *attr_name, hid
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE4("e", "i*s*si", loc_id, obj_name, attr_name, lapl_id);
|
||||
|
||||
/* Check arguments */
|
||||
if (H5I_ATTR == H5I_get_type(loc_id))
|
||||
@@ -2155,7 +2119,6 @@ H5Adelete_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type, H5_ite
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE6("e", "i*sIiIohi", loc_id, obj_name, idx_type, order, n, lapl_id);
|
||||
|
||||
/* check arguments */
|
||||
if (H5I_ATTR == H5I_get_type(loc_id))
|
||||
@@ -2212,7 +2175,6 @@ H5Aclose(hid_t attr_id)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE1("e", "i", attr_id);
|
||||
|
||||
/* Check arguments */
|
||||
if (H5I_ATTR != H5I_get_type(attr_id))
|
||||
@@ -2247,7 +2209,6 @@ H5Aclose_async(const char *app_file, const char *app_func, unsigned app_line, hi
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE5("e", "*s*sIuii", app_file, app_func, app_line, attr_id, es_id);
|
||||
|
||||
/* Check arguments */
|
||||
if (H5I_ATTR != H5I_get_type(attr_id))
|
||||
@@ -2385,7 +2346,6 @@ H5Aexists(hid_t obj_id, const char *attr_name)
|
||||
htri_t ret_value = FAIL; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("t", "i*s", obj_id, attr_name);
|
||||
|
||||
/* Synchronously check if an attribute exists */
|
||||
exists = false;
|
||||
@@ -2417,7 +2377,6 @@ H5Aexists_async(const char *app_file, const char *app_func, unsigned app_line, h
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE7("e", "*s*sIui*s*bi", app_file, app_func, app_line, obj_id, attr_name, attr_exists, es_id);
|
||||
|
||||
/* Set up request token pointer for asynchronous operation */
|
||||
if (H5ES_NONE != es_id)
|
||||
@@ -2497,7 +2456,6 @@ H5Aexists_by_name(hid_t loc_id, const char *obj_name, const char *attr_name, hid
|
||||
htri_t ret_value = FAIL; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE4("t", "i*s*si", loc_id, obj_name, attr_name, lapl_id);
|
||||
|
||||
/* Synchronously check if an attribute exists */
|
||||
exists = false;
|
||||
@@ -2530,8 +2488,6 @@ H5Aexists_by_name_async(const char *app_file, const char *app_func, unsigned app
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE9("e", "*s*sIui*s*s*bii", app_file, app_func, app_line, loc_id, obj_name, attr_name, attr_exists,
|
||||
lapl_id, es_id);
|
||||
|
||||
/* Set up request token pointer for asynchronous operation */
|
||||
if (H5ES_NONE != es_id)
|
||||
|
||||
@@ -108,7 +108,6 @@ H5Acreate1(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id, hid_t
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE5("i", "i*siii", loc_id, name, type_id, space_id, acpl_id);
|
||||
|
||||
/* Check arguments */
|
||||
if (H5I_ATTR == H5I_get_type(loc_id))
|
||||
@@ -182,7 +181,6 @@ H5Aopen_name(hid_t loc_id, const char *name)
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE2("i", "i*s", loc_id, name);
|
||||
|
||||
/* Check arguments */
|
||||
if (H5I_ATTR == H5I_get_type(loc_id))
|
||||
@@ -247,7 +245,6 @@ H5Aopen_idx(hid_t loc_id, unsigned idx)
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE2("i", "iIu", loc_id, idx);
|
||||
|
||||
/* Check arguments */
|
||||
if (H5I_ATTR == H5I_get_type(loc_id))
|
||||
@@ -312,7 +309,6 @@ H5Aget_num_attrs(hid_t loc_id)
|
||||
int ret_value = -1;
|
||||
|
||||
FUNC_ENTER_API((-1))
|
||||
H5TRACE1("Is", "i", loc_id);
|
||||
|
||||
loc_params.type = H5VL_OBJECT_BY_SELF;
|
||||
loc_params.obj_type = H5I_get_type(loc_id);
|
||||
@@ -382,7 +378,6 @@ H5Aiterate1(hid_t loc_id, unsigned *attr_num /*in,out*/, H5A_operator1_t op, voi
|
||||
herr_t ret_value; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5_ITER_ERROR)
|
||||
H5TRACE4("e", "i*IuAo*x", loc_id, attr_num, op, op_data);
|
||||
|
||||
/* check arguments */
|
||||
if (H5I_ATTR == H5I_get_type(loc_id))
|
||||
|
||||
+5
-2
@@ -42,7 +42,7 @@ typedef struct {
|
||||
* \param[in] ainfo The attribute's info struct
|
||||
* \param[in,out] op_data A pointer to the operator data passed into
|
||||
* H5Aiterate2() or H5Aiterate_by_name()
|
||||
* \returns The return values from an operator are:
|
||||
* \return The return values from an operator are:
|
||||
* \li Zero causes the iterator to continue, returning zero when
|
||||
* all attributes have been processed.
|
||||
* \li Positive causes the iterator to immediately return that
|
||||
@@ -51,6 +51,9 @@ typedef struct {
|
||||
* \li Negative causes the iterator to immediately return that value,
|
||||
* indicating failure. The iterator can be restarted at the next
|
||||
* attribute.
|
||||
*
|
||||
* \since 1.8.0
|
||||
*
|
||||
*/
|
||||
typedef herr_t (*H5A_operator2_t)(hid_t location_id /*in*/, const char *attr_name /*in*/,
|
||||
const H5A_info_t *ainfo /*in*/, void *op_data /*in,out*/);
|
||||
@@ -1098,7 +1101,7 @@ H5_DLL herr_t H5Arename_by_name(hid_t loc_id, const char *obj_name, const char *
|
||||
* \param[in] attr_name The name of the current object attribute
|
||||
* \param[in,out] operator_data A pointer to the operator data passed into
|
||||
* H5Aiterate1()
|
||||
* \returns The return values from an operator are:
|
||||
* \return The return values from an operator are:
|
||||
* \li Zero causes the iterator to continue, returning zero when
|
||||
* all attributes have been processed.
|
||||
* \li Positive causes the iterator to immediately return that
|
||||
|
||||
+23
-23
@@ -245,7 +245,7 @@ H5C__log_json_set_up(H5C_log_info_t *log_info, const char log_location[], int mp
|
||||
/* Open log file and set it to be unbuffered */
|
||||
if (NULL == (json_udata->outfile = fopen(file_name, "w")))
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "can't create mdc log file");
|
||||
HDsetbuf(json_udata->outfile, NULL);
|
||||
setbuf(json_udata->outfile, NULL);
|
||||
|
||||
done:
|
||||
if (file_name)
|
||||
@@ -339,7 +339,7 @@ H5C__json_write_start_log_msg(void *udata)
|
||||
\"action\":\"logging start\"\
|
||||
},\n\
|
||||
",
|
||||
(long long)HDtime(NULL));
|
||||
(long long)time(NULL));
|
||||
|
||||
/* Write the log message to the file */
|
||||
if (H5C__json_write_log_message(json_udata) < 0)
|
||||
@@ -378,7 +378,7 @@ H5C__json_write_stop_log_msg(void *udata)
|
||||
}\n\
|
||||
]}\n\
|
||||
",
|
||||
(long long)HDtime(NULL));
|
||||
(long long)time(NULL));
|
||||
|
||||
/* Write the log message to the file */
|
||||
if (H5C__json_write_log_message(json_udata) < 0)
|
||||
@@ -417,7 +417,7 @@ H5C__json_write_create_cache_log_msg(void *udata, herr_t fxn_ret_value)
|
||||
\"returned\":%d\
|
||||
},\n\
|
||||
",
|
||||
(long long)HDtime(NULL), (int)fxn_ret_value);
|
||||
(long long)time(NULL), (int)fxn_ret_value);
|
||||
|
||||
/* Write the log message to the file */
|
||||
if (H5C__json_write_log_message(json_udata) < 0)
|
||||
@@ -455,7 +455,7 @@ H5C__json_write_destroy_cache_log_msg(void *udata)
|
||||
\"action\":\"destroy\"\
|
||||
},\n\
|
||||
",
|
||||
(long long)HDtime(NULL));
|
||||
(long long)time(NULL));
|
||||
|
||||
/* Write the log message to the file */
|
||||
if (H5C__json_write_log_message(json_udata) < 0)
|
||||
@@ -494,7 +494,7 @@ H5C__json_write_evict_cache_log_msg(void *udata, herr_t fxn_ret_value)
|
||||
\"returned\":%d\
|
||||
},\n\
|
||||
",
|
||||
(long long)HDtime(NULL), (int)fxn_ret_value);
|
||||
(long long)time(NULL), (int)fxn_ret_value);
|
||||
|
||||
/* Write the log message to the file */
|
||||
if (H5C__json_write_log_message(json_udata) < 0)
|
||||
@@ -535,7 +535,7 @@ H5C__json_write_expunge_entry_log_msg(void *udata, haddr_t address, int type_id,
|
||||
\"returned\":%d\
|
||||
},\n\
|
||||
",
|
||||
(long long)HDtime(NULL), (unsigned long)address, (int)type_id, (int)fxn_ret_value);
|
||||
(long long)time(NULL), (unsigned long)address, (int)type_id, (int)fxn_ret_value);
|
||||
|
||||
/* Write the log message to the file */
|
||||
if (H5C__json_write_log_message(json_udata) < 0)
|
||||
@@ -574,7 +574,7 @@ H5C__json_write_flush_cache_log_msg(void *udata, herr_t fxn_ret_value)
|
||||
\"returned\":%d\
|
||||
},\n\
|
||||
",
|
||||
(long long)HDtime(NULL), (int)fxn_ret_value);
|
||||
(long long)time(NULL), (int)fxn_ret_value);
|
||||
|
||||
/* Write the log message to the file */
|
||||
if (H5C__json_write_log_message(json_udata) < 0)
|
||||
@@ -618,7 +618,7 @@ H5C__json_write_insert_entry_log_msg(void *udata, haddr_t address, int type_id,
|
||||
\"returned\":%d\
|
||||
},\n\
|
||||
",
|
||||
(long long)HDtime(NULL), (unsigned long)address, type_id, flags, (int)size, (int)fxn_ret_value);
|
||||
(long long)time(NULL), (unsigned long)address, type_id, flags, (int)size, (int)fxn_ret_value);
|
||||
|
||||
/* Write the log message to the file */
|
||||
if (H5C__json_write_log_message(json_udata) < 0)
|
||||
@@ -659,7 +659,7 @@ H5C__json_write_mark_entry_dirty_log_msg(void *udata, const H5C_cache_entry_t *e
|
||||
\"returned\":%d\
|
||||
},\n\
|
||||
",
|
||||
(long long)HDtime(NULL), (unsigned long)entry->addr, (int)fxn_ret_value);
|
||||
(long long)time(NULL), (unsigned long)entry->addr, (int)fxn_ret_value);
|
||||
|
||||
/* Write the log message to the file */
|
||||
if (H5C__json_write_log_message(json_udata) < 0)
|
||||
@@ -700,7 +700,7 @@ H5C__json_write_mark_entry_clean_log_msg(void *udata, const H5C_cache_entry_t *e
|
||||
\"returned\":%d\
|
||||
},\n\
|
||||
",
|
||||
(long long)HDtime(NULL), (unsigned long)entry->addr, (int)fxn_ret_value);
|
||||
(long long)time(NULL), (unsigned long)entry->addr, (int)fxn_ret_value);
|
||||
|
||||
/* Write the log message to the file */
|
||||
if (H5C__json_write_log_message(json_udata) < 0)
|
||||
@@ -742,7 +742,7 @@ H5C__json_write_mark_unserialized_entry_log_msg(void *udata, const H5C_cache_ent
|
||||
\"returned\":%d\
|
||||
},\n\
|
||||
",
|
||||
(long long)HDtime(NULL), (unsigned long)entry->addr, (int)fxn_ret_value);
|
||||
(long long)time(NULL), (unsigned long)entry->addr, (int)fxn_ret_value);
|
||||
|
||||
/* Write the log message to the file */
|
||||
if (H5C__json_write_log_message(json_udata) < 0)
|
||||
@@ -784,7 +784,7 @@ H5C__json_write_mark_serialized_entry_log_msg(void *udata, const H5C_cache_entry
|
||||
\"returned\":%d\
|
||||
},\n\
|
||||
",
|
||||
(long long)HDtime(NULL), (unsigned long)entry->addr, (int)fxn_ret_value);
|
||||
(long long)time(NULL), (unsigned long)entry->addr, (int)fxn_ret_value);
|
||||
|
||||
/* Write the log message to the file */
|
||||
if (H5C__json_write_log_message(json_udata) < 0)
|
||||
@@ -827,7 +827,7 @@ H5C__json_write_move_entry_log_msg(void *udata, haddr_t old_addr, haddr_t new_ad
|
||||
\"returned\":%d\
|
||||
},\n\
|
||||
",
|
||||
(long long)HDtime(NULL), (unsigned long)old_addr, (unsigned long)new_addr, type_id,
|
||||
(long long)time(NULL), (unsigned long)old_addr, (unsigned long)new_addr, type_id,
|
||||
(int)fxn_ret_value);
|
||||
|
||||
/* Write the log message to the file */
|
||||
@@ -869,7 +869,7 @@ H5C__json_write_pin_entry_log_msg(void *udata, const H5C_cache_entry_t *entry, h
|
||||
\"returned\":%d\
|
||||
},\n\
|
||||
",
|
||||
(long long)HDtime(NULL), (unsigned long)entry->addr, (int)fxn_ret_value);
|
||||
(long long)time(NULL), (unsigned long)entry->addr, (int)fxn_ret_value);
|
||||
|
||||
/* Write the log message to the file */
|
||||
if (H5C__json_write_log_message(json_udata) < 0)
|
||||
@@ -914,7 +914,7 @@ H5C__json_write_create_fd_log_msg(void *udata, const H5C_cache_entry_t *parent,
|
||||
\"returned\":%d\
|
||||
},\n\
|
||||
",
|
||||
(long long)HDtime(NULL), (unsigned long)parent->addr, (unsigned long)child->addr,
|
||||
(long long)time(NULL), (unsigned long)parent->addr, (unsigned long)child->addr,
|
||||
(int)fxn_ret_value);
|
||||
|
||||
/* Write the log message to the file */
|
||||
@@ -966,7 +966,7 @@ H5C__json_write_protect_entry_log_msg(void *udata, const H5C_cache_entry_t *entr
|
||||
\"returned\":%d\
|
||||
},\n\
|
||||
",
|
||||
(long long)HDtime(NULL), (unsigned long)entry->addr, type_id, rw_s, (int)entry->size,
|
||||
(long long)time(NULL), (unsigned long)entry->addr, type_id, rw_s, (int)entry->size,
|
||||
(int)fxn_ret_value);
|
||||
|
||||
/* Write the log message to the file */
|
||||
@@ -1010,7 +1010,7 @@ H5C__json_write_resize_entry_log_msg(void *udata, const H5C_cache_entry_t *entry
|
||||
\"returned\":%d\
|
||||
},\n\
|
||||
",
|
||||
(long long)HDtime(NULL), (unsigned long)entry->addr, (int)new_size, (int)fxn_ret_value);
|
||||
(long long)time(NULL), (unsigned long)entry->addr, (int)new_size, (int)fxn_ret_value);
|
||||
|
||||
/* Write the log message to the file */
|
||||
if (H5C__json_write_log_message(json_udata) < 0)
|
||||
@@ -1051,7 +1051,7 @@ H5C__json_write_unpin_entry_log_msg(void *udata, const H5C_cache_entry_t *entry,
|
||||
\"returned\":%d\
|
||||
},\n\
|
||||
",
|
||||
(long long)HDtime(NULL), (unsigned long)entry->addr, (int)fxn_ret_value);
|
||||
(long long)time(NULL), (unsigned long)entry->addr, (int)fxn_ret_value);
|
||||
|
||||
/* Write the log message to the file */
|
||||
if (H5C__json_write_log_message(json_udata) < 0)
|
||||
@@ -1096,7 +1096,7 @@ H5C__json_write_destroy_fd_log_msg(void *udata, const H5C_cache_entry_t *parent,
|
||||
\"returned\":%d\
|
||||
},\n\
|
||||
",
|
||||
(long long)HDtime(NULL), (unsigned long)parent->addr, (unsigned long)child->addr,
|
||||
(long long)time(NULL), (unsigned long)parent->addr, (unsigned long)child->addr,
|
||||
(int)fxn_ret_value);
|
||||
|
||||
/* Write the log message to the file */
|
||||
@@ -1140,7 +1140,7 @@ H5C__json_write_unprotect_entry_log_msg(void *udata, haddr_t address, int type_i
|
||||
\"returned\":%d\
|
||||
},\n\
|
||||
",
|
||||
(long long)HDtime(NULL), (unsigned long)address, type_id, flags, (int)fxn_ret_value);
|
||||
(long long)time(NULL), (unsigned long)address, type_id, flags, (int)fxn_ret_value);
|
||||
|
||||
/* Write the log message to the file */
|
||||
if (H5C__json_write_log_message(json_udata) < 0)
|
||||
@@ -1181,7 +1181,7 @@ H5C__json_write_set_cache_config_log_msg(void *udata, const H5AC_cache_config_t
|
||||
\"returned\":%d\
|
||||
},\n\
|
||||
",
|
||||
(long long)HDtime(NULL), (int)fxn_ret_value);
|
||||
(long long)time(NULL), (int)fxn_ret_value);
|
||||
|
||||
/* Write the log message to the file */
|
||||
if (H5C__json_write_log_message(json_udata) < 0)
|
||||
@@ -1222,7 +1222,7 @@ H5C__json_write_remove_entry_log_msg(void *udata, const H5C_cache_entry_t *entry
|
||||
\"returned\":%d\
|
||||
},\n\
|
||||
",
|
||||
(long long)HDtime(NULL), (unsigned long)entry->addr, (int)fxn_ret_value);
|
||||
(long long)time(NULL), (unsigned long)entry->addr, (int)fxn_ret_value);
|
||||
|
||||
/* Write the log message to the file */
|
||||
if (H5C__json_write_log_message(json_udata) < 0)
|
||||
|
||||
+1
-1
@@ -240,7 +240,7 @@ H5C__log_trace_set_up(H5C_log_info_t *log_info, const char log_location[], int m
|
||||
/* Open log file and set it to be unbuffered */
|
||||
if (NULL == (trace_udata->outfile = fopen(file_name, "w")))
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "can't create mdc log file");
|
||||
HDsetbuf(trace_udata->outfile, NULL);
|
||||
setbuf(trace_udata->outfile, NULL);
|
||||
|
||||
/* Write the header */
|
||||
fprintf(trace_udata->outfile, "### HDF5 metadata cache trace file version 1 ###\n");
|
||||
|
||||
+1455
-1595
@@ -16,9 +16,6 @@
|
||||
* include H5Cprivate.h instead.
|
||||
*/
|
||||
|
||||
/* clang-format off */
|
||||
/* Maintain current format by disabling format for this file */
|
||||
|
||||
#if !(defined H5C_FRIEND || defined H5C_MODULE)
|
||||
#error "Do not include this file outside the H5C package!"
|
||||
#endif
|
||||
@@ -30,23 +27,22 @@
|
||||
#include "H5Cprivate.h"
|
||||
|
||||
/* Other private headers needed by this file */
|
||||
#include "H5Clog.h" /* Cache logging */
|
||||
#include "H5SLprivate.h" /* Skip lists */
|
||||
#include "H5Clog.h" /* Cache logging */
|
||||
#include "H5SLprivate.h" /* Skip lists */
|
||||
|
||||
/**************************/
|
||||
/* Package Private Macros */
|
||||
/**************************/
|
||||
|
||||
/* Number of epoch markers active */
|
||||
#define H5C__MAX_EPOCH_MARKERS 10
|
||||
#define H5C__MAX_EPOCH_MARKERS 10
|
||||
|
||||
/* Cache configuration settings */
|
||||
#define H5C__HASH_TABLE_LEN (64 * 1024) /* must be a power of 2 */
|
||||
#define H5C__HASH_TABLE_LEN (64 * 1024) /* must be a power of 2 */
|
||||
|
||||
/* Initial allocated size of the "flush_dep_parent" array */
|
||||
#define H5C_FLUSH_DEP_PARENT_INIT 8
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
*
|
||||
* We maintain doubly linked lists of instances of H5C_cache_entry_t for a
|
||||
@@ -70,148 +66,141 @@
|
||||
|
||||
#ifdef H5C_DO_SANITY_CHECKS
|
||||
|
||||
#define H5C__GEN_DLL_PRE_REMOVE_SC(entry_ptr, list_next, list_prev, head_ptr, tail_ptr, len, list_size, fail_val) \
|
||||
do { if ((head_ptr) == NULL || (tail_ptr) == NULL || \
|
||||
(entry_ptr) == NULL || (len) <= 0 || \
|
||||
(list_size) < (entry_ptr)->size || \
|
||||
((entry_ptr)->list_prev == NULL && (head_ptr) != (entry_ptr)) || \
|
||||
((entry_ptr)->list_next == NULL && (tail_ptr) != (entry_ptr)) || \
|
||||
((len) == 1 && \
|
||||
!((head_ptr) == (entry_ptr) && (tail_ptr) == (entry_ptr) && \
|
||||
(entry_ptr)->list_next == NULL && (entry_ptr)->list_prev == NULL && \
|
||||
(list_size) == (entry_ptr)->size \
|
||||
) \
|
||||
) \
|
||||
) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fail_val), "DLL pre remove SC failed"); \
|
||||
} } while (0)
|
||||
#define H5C__GEN_DLL_PRE_REMOVE_SC(entry_ptr, list_next, list_prev, head_ptr, tail_ptr, len, list_size, \
|
||||
fail_val) \
|
||||
do { \
|
||||
if ((head_ptr) == NULL || (tail_ptr) == NULL || (entry_ptr) == NULL || (len) <= 0 || \
|
||||
(list_size) < (entry_ptr)->size || \
|
||||
((entry_ptr)->list_prev == NULL && (head_ptr) != (entry_ptr)) || \
|
||||
((entry_ptr)->list_next == NULL && (tail_ptr) != (entry_ptr)) || \
|
||||
((len) == 1 && \
|
||||
!((head_ptr) == (entry_ptr) && (tail_ptr) == (entry_ptr) && (entry_ptr)->list_next == NULL && \
|
||||
(entry_ptr)->list_prev == NULL && (list_size) == (entry_ptr)->size))) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fail_val), "DLL pre remove SC failed"); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define H5C__GEN_DLL_PRE_INSERT_SC(entry_ptr, list_next, list_prev, head_ptr, tail_ptr, len, list_size, fail_val) \
|
||||
if ((entry_ptr) == NULL || (entry_ptr)->list_next != NULL || (entry_ptr)->list_prev != NULL || \
|
||||
(((head_ptr) == NULL || (tail_ptr) == NULL) && (head_ptr) != (tail_ptr)) || \
|
||||
((len) == 0 && \
|
||||
((list_size) > 0 || (head_ptr) != NULL || (tail_ptr) != NULL) \
|
||||
) || \
|
||||
((len) == 1 && \
|
||||
((head_ptr) != (tail_ptr) || (head_ptr) == NULL || \
|
||||
(head_ptr)->size != (list_size)) \
|
||||
) || \
|
||||
((len) >= 1 && \
|
||||
((head_ptr) == NULL || (head_ptr)->list_prev != NULL || \
|
||||
(tail_ptr) == NULL || (tail_ptr)->list_next != NULL) \
|
||||
) \
|
||||
) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fail_val), "DLL pre insert SC failed"); \
|
||||
}
|
||||
#define H5C__GEN_DLL_PRE_INSERT_SC(entry_ptr, list_next, list_prev, head_ptr, tail_ptr, len, list_size, \
|
||||
fail_val) \
|
||||
if ((entry_ptr) == NULL || (entry_ptr)->list_next != NULL || (entry_ptr)->list_prev != NULL || \
|
||||
(((head_ptr) == NULL || (tail_ptr) == NULL) && (head_ptr) != (tail_ptr)) || \
|
||||
((len) == 0 && ((list_size) > 0 || (head_ptr) != NULL || (tail_ptr) != NULL)) || \
|
||||
((len) == 1 && \
|
||||
((head_ptr) != (tail_ptr) || (head_ptr) == NULL || (head_ptr)->size != (list_size))) || \
|
||||
((len) >= 1 && ((head_ptr) == NULL || (head_ptr)->list_prev != NULL || (tail_ptr) == NULL || \
|
||||
(tail_ptr)->list_next != NULL))) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fail_val), "DLL pre insert SC failed"); \
|
||||
}
|
||||
|
||||
#define H5C__GEN_DLL_PRE_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size, fail_val) \
|
||||
if ((dll_len) <= 0 || (dll_size) <= 0 || (old_size) <= 0 || \
|
||||
(old_size) > (dll_size) || (new_size) <= 0 || \
|
||||
((dll_len) == 1 && (old_size) != (dll_size)) \
|
||||
) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fail_val), "DLL pre size update SC failed"); \
|
||||
}
|
||||
#define H5C__GEN_DLL_PRE_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size, fail_val) \
|
||||
if ((dll_len) <= 0 || (dll_size) <= 0 || (old_size) <= 0 || (old_size) > (dll_size) || \
|
||||
(new_size) <= 0 || ((dll_len) == 1 && (old_size) != (dll_size))) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fail_val), "DLL pre size update SC failed"); \
|
||||
}
|
||||
|
||||
#define H5C__GEN_DLL_POST_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size, fail_val) \
|
||||
if ((new_size) > (dll_size) || ((dll_len) == 1 && (new_size) != (dll_size))) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fail_val), "DLL post size update SC failed"); \
|
||||
}
|
||||
#define H5C__GEN_DLL_POST_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size, fail_val) \
|
||||
if ((new_size) > (dll_size) || ((dll_len) == 1 && (new_size) != (dll_size))) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fail_val), "DLL post size update SC failed"); \
|
||||
}
|
||||
#else /* H5C_DO_SANITY_CHECKS */
|
||||
#define H5C__GEN_DLL_PRE_REMOVE_SC(entry_ptr, list_next, list_prev, head_ptr, tail_ptr, len, list_size, fail_val)
|
||||
#define H5C__GEN_DLL_PRE_INSERT_SC(entry_ptr, list_next, list_prev, head_ptr, tail_ptr, len, list_size, fail_val)
|
||||
#define H5C__GEN_DLL_PRE_REMOVE_SC(entry_ptr, list_next, list_prev, head_ptr, tail_ptr, len, list_size, \
|
||||
fail_val)
|
||||
#define H5C__GEN_DLL_PRE_INSERT_SC(entry_ptr, list_next, list_prev, head_ptr, tail_ptr, len, list_size, \
|
||||
fail_val)
|
||||
#define H5C__GEN_DLL_PRE_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size, fail_val)
|
||||
#define H5C__GEN_DLL_POST_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size, fail_val)
|
||||
#endif /* H5C_DO_SANITY_CHECKS */
|
||||
|
||||
#define H5C__GEN_DLL_APPEND(entry_ptr, list_next, list_prev, head_ptr, tail_ptr, len, list_size, fail_val) \
|
||||
{ \
|
||||
H5C__GEN_DLL_PRE_INSERT_SC(entry_ptr, list_next, list_prev, head_ptr, tail_ptr, len, list_size, fail_val) \
|
||||
if ((head_ptr) == NULL) { \
|
||||
(head_ptr) = (entry_ptr); \
|
||||
(tail_ptr) = (entry_ptr); \
|
||||
} \
|
||||
else { \
|
||||
(tail_ptr)->list_next = (entry_ptr); \
|
||||
(entry_ptr)->list_prev = (tail_ptr); \
|
||||
(tail_ptr) = (entry_ptr); \
|
||||
} \
|
||||
(len)++; \
|
||||
(list_size) += (entry_ptr)->size; \
|
||||
} /* H5C__GEN_DLL_APPEND() */
|
||||
#define H5C__GEN_DLL_APPEND(entry_ptr, list_next, list_prev, head_ptr, tail_ptr, len, list_size, fail_val) \
|
||||
{ \
|
||||
H5C__GEN_DLL_PRE_INSERT_SC(entry_ptr, list_next, list_prev, head_ptr, tail_ptr, len, list_size, \
|
||||
fail_val) \
|
||||
if ((head_ptr) == NULL) { \
|
||||
(head_ptr) = (entry_ptr); \
|
||||
(tail_ptr) = (entry_ptr); \
|
||||
} \
|
||||
else { \
|
||||
(tail_ptr)->list_next = (entry_ptr); \
|
||||
(entry_ptr)->list_prev = (tail_ptr); \
|
||||
(tail_ptr) = (entry_ptr); \
|
||||
} \
|
||||
(len)++; \
|
||||
(list_size) += (entry_ptr)->size; \
|
||||
} /* H5C__GEN_DLL_APPEND() */
|
||||
|
||||
#define H5C__GEN_DLL_PREPEND(entry_ptr, list_next, list_prev, head_ptr, tail_ptr, len, list_size, fail_val) \
|
||||
{ \
|
||||
H5C__GEN_DLL_PRE_INSERT_SC(entry_ptr, list_next, list_prev, head_ptr, tail_ptr, len, list_size, fail_val) \
|
||||
if ((head_ptr) == NULL) { \
|
||||
(head_ptr) = (entry_ptr); \
|
||||
(tail_ptr) = (entry_ptr); \
|
||||
} \
|
||||
else { \
|
||||
(head_ptr)->list_prev = (entry_ptr); \
|
||||
(entry_ptr)->list_next = (head_ptr); \
|
||||
(head_ptr) = (entry_ptr); \
|
||||
} \
|
||||
(len)++; \
|
||||
(list_size) += (entry_ptr)->size; \
|
||||
} /* H5C__GEN_DLL_PREPEND() */
|
||||
#define H5C__GEN_DLL_PREPEND(entry_ptr, list_next, list_prev, head_ptr, tail_ptr, len, list_size, fail_val) \
|
||||
{ \
|
||||
H5C__GEN_DLL_PRE_INSERT_SC(entry_ptr, list_next, list_prev, head_ptr, tail_ptr, len, list_size, \
|
||||
fail_val) \
|
||||
if ((head_ptr) == NULL) { \
|
||||
(head_ptr) = (entry_ptr); \
|
||||
(tail_ptr) = (entry_ptr); \
|
||||
} \
|
||||
else { \
|
||||
(head_ptr)->list_prev = (entry_ptr); \
|
||||
(entry_ptr)->list_next = (head_ptr); \
|
||||
(head_ptr) = (entry_ptr); \
|
||||
} \
|
||||
(len)++; \
|
||||
(list_size) += (entry_ptr)->size; \
|
||||
} /* H5C__GEN_DLL_PREPEND() */
|
||||
|
||||
#define H5C__GEN_DLL_REMOVE(entry_ptr, list_next, list_prev, head_ptr, tail_ptr, len, list_size, fail_val) \
|
||||
{ \
|
||||
H5C__GEN_DLL_PRE_REMOVE_SC(entry_ptr, list_next, list_prev, head_ptr, tail_ptr, len, list_size, fail_val); \
|
||||
if ((head_ptr) == (entry_ptr)) { \
|
||||
(head_ptr) = (entry_ptr)->list_next; \
|
||||
if ((head_ptr) != NULL) \
|
||||
(head_ptr)->list_prev = NULL; \
|
||||
} \
|
||||
else \
|
||||
(entry_ptr)->list_prev->list_next = (entry_ptr)->list_next; \
|
||||
if ((tail_ptr) == (entry_ptr)) { \
|
||||
(tail_ptr) = (entry_ptr)->list_prev; \
|
||||
if ((tail_ptr) != NULL) \
|
||||
(tail_ptr)->list_next = NULL; \
|
||||
} \
|
||||
else \
|
||||
(entry_ptr)->list_next->list_prev = (entry_ptr)->list_prev; \
|
||||
(entry_ptr)->list_next = NULL; \
|
||||
(entry_ptr)->list_prev = NULL; \
|
||||
(len)--; \
|
||||
(list_size) -= (entry_ptr)->size; \
|
||||
} /* H5C__GEN_DLL_REMOVE() */
|
||||
|
||||
#define H5C__GEN_DLL_UPDATE_FOR_SIZE_CHANGE(dll_len, dll_size, old_size, new_size, fail_val) \
|
||||
{ \
|
||||
H5C__GEN_DLL_PRE_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size, fail_val) \
|
||||
(dll_size) -= (old_size); \
|
||||
(dll_size) += (new_size); \
|
||||
H5C__GEN_DLL_POST_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size, fail_val) \
|
||||
} /* H5C__GEN_DLL_UPDATE_FOR_SIZE_CHANGE() */
|
||||
#define H5C__GEN_DLL_REMOVE(entry_ptr, list_next, list_prev, head_ptr, tail_ptr, len, list_size, fail_val) \
|
||||
{ \
|
||||
H5C__GEN_DLL_PRE_REMOVE_SC(entry_ptr, list_next, list_prev, head_ptr, tail_ptr, len, list_size, \
|
||||
fail_val); \
|
||||
if ((head_ptr) == (entry_ptr)) { \
|
||||
(head_ptr) = (entry_ptr)->list_next; \
|
||||
if ((head_ptr) != NULL) \
|
||||
(head_ptr)->list_prev = NULL; \
|
||||
} \
|
||||
else \
|
||||
(entry_ptr)->list_prev->list_next = (entry_ptr)->list_next; \
|
||||
if ((tail_ptr) == (entry_ptr)) { \
|
||||
(tail_ptr) = (entry_ptr)->list_prev; \
|
||||
if ((tail_ptr) != NULL) \
|
||||
(tail_ptr)->list_next = NULL; \
|
||||
} \
|
||||
else \
|
||||
(entry_ptr)->list_next->list_prev = (entry_ptr)->list_prev; \
|
||||
(entry_ptr)->list_next = NULL; \
|
||||
(entry_ptr)->list_prev = NULL; \
|
||||
(len)--; \
|
||||
(list_size) -= (entry_ptr)->size; \
|
||||
} /* H5C__GEN_DLL_REMOVE() */
|
||||
|
||||
#define H5C__GEN_DLL_UPDATE_FOR_SIZE_CHANGE(dll_len, dll_size, old_size, new_size, fail_val) \
|
||||
{ \
|
||||
H5C__GEN_DLL_PRE_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size, fail_val) \
|
||||
(dll_size) -= (old_size); \
|
||||
(dll_size) += (new_size); \
|
||||
H5C__GEN_DLL_POST_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size, fail_val) \
|
||||
} /* H5C__GEN_DLL_UPDATE_FOR_SIZE_CHANGE() */
|
||||
|
||||
/* Macros that modify the LRU/protected/pinned lists */
|
||||
#define H5C__DLL_APPEND(entry_ptr, head_ptr, tail_ptr, len, list_size, fail_val) \
|
||||
#define H5C__DLL_APPEND(entry_ptr, head_ptr, tail_ptr, len, list_size, fail_val) \
|
||||
H5C__GEN_DLL_APPEND(entry_ptr, next, prev, head_ptr, tail_ptr, len, list_size, fail_val)
|
||||
#define H5C__DLL_PREPEND(entry_ptr, head_ptr, tail_ptr, len, list_size, fail_val) \
|
||||
#define H5C__DLL_PREPEND(entry_ptr, head_ptr, tail_ptr, len, list_size, fail_val) \
|
||||
H5C__GEN_DLL_PREPEND(entry_ptr, next, prev, head_ptr, tail_ptr, len, list_size, fail_val)
|
||||
#define H5C__DLL_REMOVE(entry_ptr, head_ptr, tail_ptr, len, list_size, fail_val) \
|
||||
#define H5C__DLL_REMOVE(entry_ptr, head_ptr, tail_ptr, len, list_size, fail_val) \
|
||||
H5C__GEN_DLL_REMOVE(entry_ptr, next, prev, head_ptr, tail_ptr, len, list_size, fail_val)
|
||||
#define H5C__DLL_UPDATE_FOR_SIZE_CHANGE(dll_len, dll_size, old_size, new_size, fail_val) \
|
||||
#define H5C__DLL_UPDATE_FOR_SIZE_CHANGE(dll_len, dll_size, old_size, new_size, fail_val) \
|
||||
H5C__GEN_DLL_UPDATE_FOR_SIZE_CHANGE(dll_len, dll_size, old_size, new_size, fail_val)
|
||||
|
||||
/* Macros that modify the "auxiliary" LRU list */
|
||||
#define H5C__AUX_DLL_APPEND(entry_ptr, head_ptr, tail_ptr, len, list_size, fail_val) \
|
||||
#define H5C__AUX_DLL_APPEND(entry_ptr, head_ptr, tail_ptr, len, list_size, fail_val) \
|
||||
H5C__GEN_DLL_APPEND(entry_ptr, aux_next, aux_prev, head_ptr, tail_ptr, len, list_size, fail_val)
|
||||
#define H5C__AUX_DLL_PREPEND(entry_ptr, head_ptr, tail_ptr, len, list_size, fail_val) \
|
||||
#define H5C__AUX_DLL_PREPEND(entry_ptr, head_ptr, tail_ptr, len, list_size, fail_val) \
|
||||
H5C__GEN_DLL_PREPEND(entry_ptr, aux_next, aux_prev, head_ptr, tail_ptr, len, list_size, fail_val)
|
||||
#define H5C__AUX_DLL_REMOVE(entry_ptr, head_ptr, tail_ptr, len, list_size, fail_val) \
|
||||
#define H5C__AUX_DLL_REMOVE(entry_ptr, head_ptr, tail_ptr, len, list_size, fail_val) \
|
||||
H5C__GEN_DLL_REMOVE(entry_ptr, aux_next, aux_prev, head_ptr, tail_ptr, len, list_size, fail_val)
|
||||
|
||||
/* Macros that modify the "index" list */
|
||||
#define H5C__IL_DLL_APPEND(entry_ptr, head_ptr, tail_ptr, len, list_size, fail_val) \
|
||||
#define H5C__IL_DLL_APPEND(entry_ptr, head_ptr, tail_ptr, len, list_size, fail_val) \
|
||||
H5C__GEN_DLL_APPEND(entry_ptr, il_next, il_prev, head_ptr, tail_ptr, len, list_size, fail_val)
|
||||
#define H5C__IL_DLL_REMOVE(entry_ptr, head_ptr, tail_ptr, len, list_size, fail_val) \
|
||||
#define H5C__IL_DLL_REMOVE(entry_ptr, head_ptr, tail_ptr, len, list_size, fail_val) \
|
||||
H5C__GEN_DLL_REMOVE(entry_ptr, il_next, il_prev, head_ptr, tail_ptr, len, list_size, fail_val)
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Stats collection macros
|
||||
@@ -225,336 +214,375 @@ if ((new_size) > (dll_size) || ((dll_len) == 1 && (new_size) != (dll_size))) { \
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
#define H5C__UPDATE_CACHE_HIT_RATE_STATS(cache_ptr, hit) \
|
||||
do { \
|
||||
(cache_ptr)->cache_accesses++; \
|
||||
if (hit) \
|
||||
(cache_ptr)->cache_hits++; \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_CACHE_HIT_RATE_STATS(cache_ptr, hit) \
|
||||
do { \
|
||||
(cache_ptr)->cache_accesses++; \
|
||||
if (hit) \
|
||||
(cache_ptr)->cache_hits++; \
|
||||
} while (0)
|
||||
|
||||
#if H5C_COLLECT_CACHE_STATS
|
||||
|
||||
#define H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr) \
|
||||
do { \
|
||||
if ((cache_ptr)->index_size > (cache_ptr)->max_index_size) \
|
||||
(cache_ptr)->max_index_size = (cache_ptr)->index_size; \
|
||||
if ((cache_ptr)->clean_index_size > (cache_ptr)->max_clean_index_size) \
|
||||
(cache_ptr)->max_clean_index_size = (cache_ptr)->clean_index_size; \
|
||||
if ((cache_ptr)->dirty_index_size > (cache_ptr)->max_dirty_index_size) \
|
||||
(cache_ptr)->max_dirty_index_size = (cache_ptr)->dirty_index_size; \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr) \
|
||||
do { \
|
||||
if ((cache_ptr)->index_size > (cache_ptr)->max_index_size) \
|
||||
(cache_ptr)->max_index_size = (cache_ptr)->index_size; \
|
||||
if ((cache_ptr)->clean_index_size > (cache_ptr)->max_clean_index_size) \
|
||||
(cache_ptr)->max_clean_index_size = (cache_ptr)->clean_index_size; \
|
||||
if ((cache_ptr)->dirty_index_size > (cache_ptr)->max_dirty_index_size) \
|
||||
(cache_ptr)->max_dirty_index_size = (cache_ptr)->dirty_index_size; \
|
||||
} while (0)
|
||||
|
||||
#define H5C__UPDATE_STATS_FOR_DIRTY_PIN(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->dirty_pins[(entry_ptr)->type->id]++; \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_DIRTY_PIN(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->dirty_pins[(entry_ptr)->type->id]++; \
|
||||
} while (0)
|
||||
|
||||
#define H5C__UPDATE_STATS_FOR_UNPROTECT(cache_ptr) \
|
||||
do { \
|
||||
if ((cache_ptr)->slist_len > (cache_ptr)->max_slist_len) \
|
||||
(cache_ptr)->max_slist_len = (cache_ptr)->slist_len; \
|
||||
if ((cache_ptr)->slist_size > (cache_ptr)->max_slist_size) \
|
||||
(cache_ptr)->max_slist_size = (cache_ptr)->slist_size; \
|
||||
if ((cache_ptr)->pel_len > (cache_ptr)->max_pel_len) \
|
||||
(cache_ptr)->max_pel_len = (cache_ptr)->pel_len; \
|
||||
if ((cache_ptr)->pel_size > (cache_ptr)->max_pel_size) \
|
||||
(cache_ptr)->max_pel_size = (cache_ptr)->pel_size; \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_UNPROTECT(cache_ptr) \
|
||||
do { \
|
||||
if ((cache_ptr)->slist_len > (cache_ptr)->max_slist_len) \
|
||||
(cache_ptr)->max_slist_len = (cache_ptr)->slist_len; \
|
||||
if ((cache_ptr)->slist_size > (cache_ptr)->max_slist_size) \
|
||||
(cache_ptr)->max_slist_size = (cache_ptr)->slist_size; \
|
||||
if ((cache_ptr)->pel_len > (cache_ptr)->max_pel_len) \
|
||||
(cache_ptr)->max_pel_len = (cache_ptr)->pel_len; \
|
||||
if ((cache_ptr)->pel_size > (cache_ptr)->max_pel_size) \
|
||||
(cache_ptr)->max_pel_size = (cache_ptr)->pel_size; \
|
||||
} while (0)
|
||||
|
||||
#define H5C__UPDATE_STATS_FOR_MOVE(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
if ((cache_ptr)->flush_in_progress) \
|
||||
(cache_ptr)->cache_flush_moves[(entry_ptr)->type->id]++; \
|
||||
if ((entry_ptr)->flush_in_progress) \
|
||||
(cache_ptr)->entry_flush_moves[(entry_ptr)->type->id]++; \
|
||||
(cache_ptr)->moves[(entry_ptr)->type->id]++; \
|
||||
(cache_ptr)->entries_relocated_counter++; \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_MOVE(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
if ((cache_ptr)->flush_in_progress) \
|
||||
(cache_ptr)->cache_flush_moves[(entry_ptr)->type->id]++; \
|
||||
if ((entry_ptr)->flush_in_progress) \
|
||||
(cache_ptr)->entry_flush_moves[(entry_ptr)->type->id]++; \
|
||||
(cache_ptr)->moves[(entry_ptr)->type->id]++; \
|
||||
(cache_ptr)->entries_relocated_counter++; \
|
||||
} while (0)
|
||||
|
||||
#define H5C__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE(cache_ptr, entry_ptr, new_size) \
|
||||
do { \
|
||||
if ((cache_ptr)->flush_in_progress) \
|
||||
(cache_ptr)->cache_flush_size_changes[(entry_ptr)->type->id]++; \
|
||||
if ((entry_ptr)->flush_in_progress) \
|
||||
(cache_ptr)->entry_flush_size_changes[(entry_ptr)->type->id]++; \
|
||||
if ((entry_ptr)->size < (new_size)) { \
|
||||
(cache_ptr)->size_increases[(entry_ptr)->type->id]++; \
|
||||
H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr); \
|
||||
if ((cache_ptr)->slist_size > (cache_ptr)->max_slist_size) \
|
||||
(cache_ptr)->max_slist_size = (cache_ptr)->slist_size; \
|
||||
if ((cache_ptr)->pl_size > (cache_ptr)->max_pl_size) \
|
||||
(cache_ptr)->max_pl_size = (cache_ptr)->pl_size; \
|
||||
} else if ((entry_ptr)->size > (new_size)) { \
|
||||
(cache_ptr)->size_decreases[(entry_ptr)->type->id]++; \
|
||||
} \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE(cache_ptr, entry_ptr, new_size) \
|
||||
do { \
|
||||
if ((cache_ptr)->flush_in_progress) \
|
||||
(cache_ptr)->cache_flush_size_changes[(entry_ptr)->type->id]++; \
|
||||
if ((entry_ptr)->flush_in_progress) \
|
||||
(cache_ptr)->entry_flush_size_changes[(entry_ptr)->type->id]++; \
|
||||
if ((entry_ptr)->size < (new_size)) { \
|
||||
(cache_ptr)->size_increases[(entry_ptr)->type->id]++; \
|
||||
H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr); \
|
||||
if ((cache_ptr)->slist_size > (cache_ptr)->max_slist_size) \
|
||||
(cache_ptr)->max_slist_size = (cache_ptr)->slist_size; \
|
||||
if ((cache_ptr)->pl_size > (cache_ptr)->max_pl_size) \
|
||||
(cache_ptr)->max_pl_size = (cache_ptr)->pl_size; \
|
||||
} \
|
||||
else if ((entry_ptr)->size > (new_size)) { \
|
||||
(cache_ptr)->size_decreases[(entry_ptr)->type->id]++; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define H5C__UPDATE_STATS_FOR_HT_INSERTION(cache_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->total_ht_insertions++; \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_HT_INSERTION(cache_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->total_ht_insertions++; \
|
||||
} while (0)
|
||||
|
||||
#define H5C__UPDATE_STATS_FOR_HT_DELETION(cache_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->total_ht_deletions++; \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_HT_DELETION(cache_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->total_ht_deletions++; \
|
||||
} while (0)
|
||||
|
||||
#define H5C__UPDATE_STATS_FOR_HT_SEARCH(cache_ptr, success, depth) \
|
||||
do { \
|
||||
if (success) { \
|
||||
(cache_ptr)->successful_ht_searches++; \
|
||||
(cache_ptr)->total_successful_ht_search_depth += depth; \
|
||||
} else { \
|
||||
(cache_ptr)->failed_ht_searches++; \
|
||||
(cache_ptr)->total_failed_ht_search_depth += depth; \
|
||||
} \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_HT_SEARCH(cache_ptr, success, depth) \
|
||||
do { \
|
||||
if (success) { \
|
||||
(cache_ptr)->successful_ht_searches++; \
|
||||
(cache_ptr)->total_successful_ht_search_depth += depth; \
|
||||
} \
|
||||
else { \
|
||||
(cache_ptr)->failed_ht_searches++; \
|
||||
(cache_ptr)->total_failed_ht_search_depth += depth; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define H5C__UPDATE_STATS_FOR_UNPIN(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->unpins[(entry_ptr)->type->id]++; \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_UNPIN(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->unpins[(entry_ptr)->type->id]++; \
|
||||
} while (0)
|
||||
|
||||
#define H5C__UPDATE_STATS_FOR_PREFETCH(cache_ptr, dirty) \
|
||||
do { \
|
||||
(cache_ptr)->prefetches++; \
|
||||
if (dirty) \
|
||||
(cache_ptr)->dirty_prefetches++; \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_PREFETCH(cache_ptr, dirty) \
|
||||
do { \
|
||||
(cache_ptr)->prefetches++; \
|
||||
if (dirty) \
|
||||
(cache_ptr)->dirty_prefetches++; \
|
||||
} while (0)
|
||||
|
||||
#define H5C__UPDATE_STATS_FOR_PREFETCH_HIT(cache_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->prefetch_hits++; \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_PREFETCH_HIT(cache_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->prefetch_hits++; \
|
||||
} while (0)
|
||||
|
||||
#define H5C__UPDATE_STATS_FOR_SLIST_SCAN_RESTART(cache_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->slist_scan_restarts++; \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_SLIST_SCAN_RESTART(cache_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->slist_scan_restarts++; \
|
||||
} while (0)
|
||||
|
||||
#define H5C__UPDATE_STATS_FOR_LRU_SCAN_RESTART(cache_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->LRU_scan_restarts++; \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_LRU_SCAN_RESTART(cache_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->LRU_scan_restarts++; \
|
||||
} while (0)
|
||||
|
||||
#define H5C__UPDATE_STATS_FOR_INDEX_SCAN_RESTART(cache_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->index_scan_restarts++; \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_INDEX_SCAN_RESTART(cache_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->index_scan_restarts++; \
|
||||
} while (0)
|
||||
|
||||
#if H5C_COLLECT_CACHE_ENTRY_STATS
|
||||
|
||||
#define H5C__RESET_CACHE_ENTRY_STATS(entry_ptr) \
|
||||
do { \
|
||||
(entry_ptr)->accesses = 0; \
|
||||
(entry_ptr)->clears = 0; \
|
||||
(entry_ptr)->flushes = 0; \
|
||||
(entry_ptr)->pins = 0; \
|
||||
} while (0)
|
||||
#define H5C__RESET_CACHE_ENTRY_STATS(entry_ptr) \
|
||||
do { \
|
||||
(entry_ptr)->accesses = 0; \
|
||||
(entry_ptr)->clears = 0; \
|
||||
(entry_ptr)->flushes = 0; \
|
||||
(entry_ptr)->pins = 0; \
|
||||
} while (0)
|
||||
|
||||
#define H5C__UPDATE_STATS_FOR_CLEAR(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->clears[(entry_ptr)->type->id]++; \
|
||||
if((entry_ptr)->is_pinned) \
|
||||
(cache_ptr)->pinned_clears[(entry_ptr)->type->id]++; \
|
||||
(entry_ptr)->clears++; \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_CLEAR(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->clears[(entry_ptr)->type->id]++; \
|
||||
if ((entry_ptr)->is_pinned) \
|
||||
(cache_ptr)->pinned_clears[(entry_ptr)->type->id]++; \
|
||||
(entry_ptr)->clears++; \
|
||||
} while (0)
|
||||
|
||||
#define H5C__UPDATE_STATS_FOR_FLUSH(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->flushes[(entry_ptr)->type->id]++; \
|
||||
if((entry_ptr)->is_pinned) \
|
||||
(cache_ptr)->pinned_flushes[(entry_ptr)->type->id]++; \
|
||||
(entry_ptr)->flushes++; \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_FLUSH(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->flushes[(entry_ptr)->type->id]++; \
|
||||
if ((entry_ptr)->is_pinned) \
|
||||
(cache_ptr)->pinned_flushes[(entry_ptr)->type->id]++; \
|
||||
(entry_ptr)->flushes++; \
|
||||
} while (0)
|
||||
|
||||
#define H5C__UPDATE_STATS_FOR_EVICTION(cache_ptr, entry_ptr, take_ownership) \
|
||||
do { \
|
||||
if (take_ownership) \
|
||||
(cache_ptr)->take_ownerships[(entry_ptr)->type->id]++; \
|
||||
else \
|
||||
(cache_ptr)->evictions[(entry_ptr)->type->id]++; \
|
||||
if ((entry_ptr)->accesses > (cache_ptr)->max_accesses[(entry_ptr)->type->id]) \
|
||||
(cache_ptr)->max_accesses[(entry_ptr)->type->id] = (entry_ptr)->accesses; \
|
||||
if ((entry_ptr)->accesses < (cache_ptr)->min_accesses[(entry_ptr)->type->id]) \
|
||||
(cache_ptr)->min_accesses[(entry_ptr)->type->id] = (entry_ptr)->accesses; \
|
||||
if ((entry_ptr)->clears > (cache_ptr)->max_clears[(entry_ptr)->type->id]) \
|
||||
(cache_ptr)->max_clears[(entry_ptr)->type->id] = (entry_ptr)->clears; \
|
||||
if ((entry_ptr)->flushes > (cache_ptr)->max_flushes[(entry_ptr)->type->id]) \
|
||||
(cache_ptr)->max_flushes[(entry_ptr)->type->id] = (entry_ptr)->flushes; \
|
||||
if ((entry_ptr)->size > (cache_ptr)->max_size[(entry_ptr)->type->id]) \
|
||||
(cache_ptr)->max_size[(entry_ptr)->type->id] = (entry_ptr)->size; \
|
||||
if ((entry_ptr)->pins > (cache_ptr)->max_pins[(entry_ptr)->type->id]) \
|
||||
(cache_ptr)->max_pins[(entry_ptr)->type->id] = (entry_ptr)->pins; \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_EVICTION(cache_ptr, entry_ptr, take_ownership) \
|
||||
do { \
|
||||
if (take_ownership) \
|
||||
(cache_ptr)->take_ownerships[(entry_ptr)->type->id]++; \
|
||||
else \
|
||||
(cache_ptr)->evictions[(entry_ptr)->type->id]++; \
|
||||
if ((entry_ptr)->accesses > (cache_ptr)->max_accesses[(entry_ptr)->type->id]) \
|
||||
(cache_ptr)->max_accesses[(entry_ptr)->type->id] = (entry_ptr)->accesses; \
|
||||
if ((entry_ptr)->accesses < (cache_ptr)->min_accesses[(entry_ptr)->type->id]) \
|
||||
(cache_ptr)->min_accesses[(entry_ptr)->type->id] = (entry_ptr)->accesses; \
|
||||
if ((entry_ptr)->clears > (cache_ptr)->max_clears[(entry_ptr)->type->id]) \
|
||||
(cache_ptr)->max_clears[(entry_ptr)->type->id] = (entry_ptr)->clears; \
|
||||
if ((entry_ptr)->flushes > (cache_ptr)->max_flushes[(entry_ptr)->type->id]) \
|
||||
(cache_ptr)->max_flushes[(entry_ptr)->type->id] = (entry_ptr)->flushes; \
|
||||
if ((entry_ptr)->size > (cache_ptr)->max_size[(entry_ptr)->type->id]) \
|
||||
(cache_ptr)->max_size[(entry_ptr)->type->id] = (entry_ptr)->size; \
|
||||
if ((entry_ptr)->pins > (cache_ptr)->max_pins[(entry_ptr)->type->id]) \
|
||||
(cache_ptr)->max_pins[(entry_ptr)->type->id] = (entry_ptr)->pins; \
|
||||
} while (0)
|
||||
|
||||
#define H5C__UPDATE_STATS_FOR_INSERTION(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->insertions[(entry_ptr)->type->id]++; \
|
||||
if ((entry_ptr)->is_pinned) { \
|
||||
(cache_ptr)->pinned_insertions[(entry_ptr)->type->id]++; \
|
||||
(cache_ptr)->pins[(entry_ptr)->type->id]++; \
|
||||
(entry_ptr)->pins++; \
|
||||
if ((cache_ptr)->pel_len > (cache_ptr)->max_pel_len) \
|
||||
(cache_ptr)->max_pel_len = (cache_ptr)->pel_len; \
|
||||
if ((cache_ptr)->pel_size > (cache_ptr)->max_pel_size) \
|
||||
(cache_ptr)->max_pel_size = (cache_ptr)->pel_size; \
|
||||
} \
|
||||
if ((cache_ptr)->index_len > (cache_ptr)->max_index_len) \
|
||||
(cache_ptr)->max_index_len = (cache_ptr)->index_len; \
|
||||
H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr); \
|
||||
if ((cache_ptr)->slist_len > (cache_ptr)->max_slist_len) \
|
||||
(cache_ptr)->max_slist_len = (cache_ptr)->slist_len; \
|
||||
if ((cache_ptr)->slist_size > (cache_ptr)->max_slist_size) \
|
||||
(cache_ptr)->max_slist_size = (cache_ptr)->slist_size; \
|
||||
if ((entry_ptr)->size > (cache_ptr)->max_size[(entry_ptr)->type->id]) \
|
||||
(cache_ptr)->max_size[(entry_ptr)->type->id] = (entry_ptr)->size; \
|
||||
(cache_ptr)->entries_inserted_counter++; \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_INSERTION(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->insertions[(entry_ptr)->type->id]++; \
|
||||
if ((entry_ptr)->is_pinned) { \
|
||||
(cache_ptr)->pinned_insertions[(entry_ptr)->type->id]++; \
|
||||
(cache_ptr)->pins[(entry_ptr)->type->id]++; \
|
||||
(entry_ptr)->pins++; \
|
||||
if ((cache_ptr)->pel_len > (cache_ptr)->max_pel_len) \
|
||||
(cache_ptr)->max_pel_len = (cache_ptr)->pel_len; \
|
||||
if ((cache_ptr)->pel_size > (cache_ptr)->max_pel_size) \
|
||||
(cache_ptr)->max_pel_size = (cache_ptr)->pel_size; \
|
||||
} \
|
||||
if ((cache_ptr)->index_len > (cache_ptr)->max_index_len) \
|
||||
(cache_ptr)->max_index_len = (cache_ptr)->index_len; \
|
||||
H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr); \
|
||||
if ((cache_ptr)->slist_len > (cache_ptr)->max_slist_len) \
|
||||
(cache_ptr)->max_slist_len = (cache_ptr)->slist_len; \
|
||||
if ((cache_ptr)->slist_size > (cache_ptr)->max_slist_size) \
|
||||
(cache_ptr)->max_slist_size = (cache_ptr)->slist_size; \
|
||||
if ((entry_ptr)->size > (cache_ptr)->max_size[(entry_ptr)->type->id]) \
|
||||
(cache_ptr)->max_size[(entry_ptr)->type->id] = (entry_ptr)->size; \
|
||||
(cache_ptr)->entries_inserted_counter++; \
|
||||
} while (0)
|
||||
|
||||
#define H5C__UPDATE_STATS_FOR_PROTECT(cache_ptr, entry_ptr, hit) \
|
||||
do { \
|
||||
if (hit) \
|
||||
(cache_ptr)->hits[(entry_ptr)->type->id]++; \
|
||||
else \
|
||||
(cache_ptr)->misses[(entry_ptr)->type->id]++; \
|
||||
if (!(entry_ptr)->is_read_only) \
|
||||
(cache_ptr)->write_protects[(entry_ptr)->type->id]++; \
|
||||
else { \
|
||||
(cache_ptr)->read_protects[(entry_ptr)->type->id]++; \
|
||||
if ((entry_ptr)->ro_ref_count > (cache_ptr)->max_read_protects[(entry_ptr)->type->id]) \
|
||||
(cache_ptr)->max_read_protects[(entry_ptr)->type->id] = (entry_ptr)->ro_ref_count; \
|
||||
} \
|
||||
if ((cache_ptr)->index_len > (cache_ptr)->max_index_len) \
|
||||
(cache_ptr)->max_index_len = (cache_ptr)->index_len; \
|
||||
H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr); \
|
||||
if ((cache_ptr)->pl_len > (cache_ptr)->max_pl_len) \
|
||||
(cache_ptr)->max_pl_len = (cache_ptr)->pl_len; \
|
||||
if ((cache_ptr)->pl_size > (cache_ptr)->max_pl_size) \
|
||||
(cache_ptr)->max_pl_size = (cache_ptr)->pl_size; \
|
||||
if ((entry_ptr)->size > (cache_ptr)->max_size[(entry_ptr)->type->id]) \
|
||||
(cache_ptr)->max_size[(entry_ptr)->type->id] = (entry_ptr)->size; \
|
||||
(entry_ptr)->accesses++; \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_PROTECT(cache_ptr, entry_ptr, hit) \
|
||||
do { \
|
||||
if (hit) \
|
||||
(cache_ptr)->hits[(entry_ptr)->type->id]++; \
|
||||
else \
|
||||
(cache_ptr)->misses[(entry_ptr)->type->id]++; \
|
||||
if (!(entry_ptr)->is_read_only) \
|
||||
(cache_ptr)->write_protects[(entry_ptr)->type->id]++; \
|
||||
else { \
|
||||
(cache_ptr)->read_protects[(entry_ptr)->type->id]++; \
|
||||
if ((entry_ptr)->ro_ref_count > (cache_ptr)->max_read_protects[(entry_ptr)->type->id]) \
|
||||
(cache_ptr)->max_read_protects[(entry_ptr)->type->id] = (entry_ptr)->ro_ref_count; \
|
||||
} \
|
||||
if ((cache_ptr)->index_len > (cache_ptr)->max_index_len) \
|
||||
(cache_ptr)->max_index_len = (cache_ptr)->index_len; \
|
||||
H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr); \
|
||||
if ((cache_ptr)->pl_len > (cache_ptr)->max_pl_len) \
|
||||
(cache_ptr)->max_pl_len = (cache_ptr)->pl_len; \
|
||||
if ((cache_ptr)->pl_size > (cache_ptr)->max_pl_size) \
|
||||
(cache_ptr)->max_pl_size = (cache_ptr)->pl_size; \
|
||||
if ((entry_ptr)->size > (cache_ptr)->max_size[(entry_ptr)->type->id]) \
|
||||
(cache_ptr)->max_size[(entry_ptr)->type->id] = (entry_ptr)->size; \
|
||||
(entry_ptr)->accesses++; \
|
||||
} while (0)
|
||||
|
||||
#define H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->pins[(entry_ptr)->type->id]++; \
|
||||
(entry_ptr)->pins++; \
|
||||
if ((cache_ptr)->pel_len > (cache_ptr)->max_pel_len) \
|
||||
(cache_ptr)->max_pel_len = (cache_ptr)->pel_len; \
|
||||
if ((cache_ptr)->pel_size > (cache_ptr)->max_pel_size) \
|
||||
(cache_ptr)->max_pel_size = (cache_ptr)->pel_size; \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->pins[(entry_ptr)->type->id]++; \
|
||||
(entry_ptr)->pins++; \
|
||||
if ((cache_ptr)->pel_len > (cache_ptr)->max_pel_len) \
|
||||
(cache_ptr)->max_pel_len = (cache_ptr)->pel_len; \
|
||||
if ((cache_ptr)->pel_size > (cache_ptr)->max_pel_size) \
|
||||
(cache_ptr)->max_pel_size = (cache_ptr)->pel_size; \
|
||||
} while (0)
|
||||
|
||||
#else /* H5C_COLLECT_CACHE_ENTRY_STATS */
|
||||
|
||||
#define H5C__RESET_CACHE_ENTRY_STATS(entry_ptr)
|
||||
|
||||
#define H5C__UPDATE_STATS_FOR_CLEAR(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->clears[(entry_ptr)->type->id]++; \
|
||||
if((entry_ptr)->is_pinned) \
|
||||
(cache_ptr)->pinned_clears[(entry_ptr)->type->id]++; \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_CLEAR(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->clears[(entry_ptr)->type->id]++; \
|
||||
if ((entry_ptr)->is_pinned) \
|
||||
(cache_ptr)->pinned_clears[(entry_ptr)->type->id]++; \
|
||||
} while (0)
|
||||
|
||||
#define H5C__UPDATE_STATS_FOR_FLUSH(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->flushes[(entry_ptr)->type->id]++; \
|
||||
if ((entry_ptr)->is_pinned) \
|
||||
(cache_ptr)->pinned_flushes[(entry_ptr)->type->id]++; \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_FLUSH(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->flushes[(entry_ptr)->type->id]++; \
|
||||
if ((entry_ptr)->is_pinned) \
|
||||
(cache_ptr)->pinned_flushes[(entry_ptr)->type->id]++; \
|
||||
} while (0)
|
||||
|
||||
#define H5C__UPDATE_STATS_FOR_EVICTION(cache_ptr, entry_ptr, take_ownership) \
|
||||
do { \
|
||||
if (take_ownership) \
|
||||
(cache_ptr)->take_ownerships[(entry_ptr)->type->id]++; \
|
||||
else \
|
||||
(cache_ptr)->evictions[(entry_ptr)->type->id]++; \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_EVICTION(cache_ptr, entry_ptr, take_ownership) \
|
||||
do { \
|
||||
if (take_ownership) \
|
||||
(cache_ptr)->take_ownerships[(entry_ptr)->type->id]++; \
|
||||
else \
|
||||
(cache_ptr)->evictions[(entry_ptr)->type->id]++; \
|
||||
} while (0)
|
||||
|
||||
#define H5C__UPDATE_STATS_FOR_INSERTION(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->insertions[(entry_ptr)->type->id]++; \
|
||||
if ((entry_ptr)->is_pinned) { \
|
||||
(cache_ptr)->pinned_insertions[(entry_ptr)->type->id]++; \
|
||||
(cache_ptr)->pins[(entry_ptr)->type->id]++; \
|
||||
if ((cache_ptr)->pel_len > (cache_ptr)->max_pel_len) \
|
||||
(cache_ptr)->max_pel_len = (cache_ptr)->pel_len; \
|
||||
if ((cache_ptr)->pel_size > (cache_ptr)->max_pel_size) \
|
||||
(cache_ptr)->max_pel_size = (cache_ptr)->pel_size; \
|
||||
} \
|
||||
if ((cache_ptr)->index_len > (cache_ptr)->max_index_len) \
|
||||
(cache_ptr)->max_index_len = (cache_ptr)->index_len; \
|
||||
H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr) \
|
||||
if ((cache_ptr)->slist_len > (cache_ptr)->max_slist_len) \
|
||||
(cache_ptr)->max_slist_len = (cache_ptr)->slist_len; \
|
||||
if ((cache_ptr)->slist_size > (cache_ptr)->max_slist_size) \
|
||||
(cache_ptr)->max_slist_size = (cache_ptr)->slist_size; \
|
||||
(cache_ptr)->entries_inserted_counter++; \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_INSERTION(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->insertions[(entry_ptr)->type->id]++; \
|
||||
if ((entry_ptr)->is_pinned) { \
|
||||
(cache_ptr)->pinned_insertions[(entry_ptr)->type->id]++; \
|
||||
(cache_ptr)->pins[(entry_ptr)->type->id]++; \
|
||||
if ((cache_ptr)->pel_len > (cache_ptr)->max_pel_len) \
|
||||
(cache_ptr)->max_pel_len = (cache_ptr)->pel_len; \
|
||||
if ((cache_ptr)->pel_size > (cache_ptr)->max_pel_size) \
|
||||
(cache_ptr)->max_pel_size = (cache_ptr)->pel_size; \
|
||||
} \
|
||||
if ((cache_ptr)->index_len > (cache_ptr)->max_index_len) \
|
||||
(cache_ptr)->max_index_len = (cache_ptr)->index_len; \
|
||||
H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr) \
|
||||
if ((cache_ptr)->slist_len > (cache_ptr)->max_slist_len) \
|
||||
(cache_ptr)->max_slist_len = (cache_ptr)->slist_len; \
|
||||
if ((cache_ptr)->slist_size > (cache_ptr)->max_slist_size) \
|
||||
(cache_ptr)->max_slist_size = (cache_ptr)->slist_size; \
|
||||
(cache_ptr)->entries_inserted_counter++; \
|
||||
} while (0)
|
||||
|
||||
#define H5C__UPDATE_STATS_FOR_PROTECT(cache_ptr, entry_ptr, hit) \
|
||||
do { \
|
||||
if (hit) \
|
||||
(cache_ptr)->hits[(entry_ptr)->type->id]++; \
|
||||
else \
|
||||
(cache_ptr)->misses[(entry_ptr)->type->id]++; \
|
||||
if (!(entry_ptr)->is_read_only) \
|
||||
(cache_ptr)->write_protects[(entry_ptr)->type->id]++; \
|
||||
else { \
|
||||
(cache_ptr)->read_protects[(entry_ptr)->type->id]++; \
|
||||
if ((entry_ptr)->ro_ref_count > \
|
||||
(cache_ptr)->max_read_protects[(entry_ptr)->type->id]) \
|
||||
(cache_ptr)->max_read_protects[(entry_ptr)->type->id] = \
|
||||
(entry_ptr)->ro_ref_count; \
|
||||
} \
|
||||
if ((cache_ptr)->index_len > (cache_ptr)->max_index_len) \
|
||||
(cache_ptr)->max_index_len = (cache_ptr)->index_len; \
|
||||
H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr) \
|
||||
if ((cache_ptr)->pl_len > (cache_ptr)->max_pl_len) \
|
||||
(cache_ptr)->max_pl_len = (cache_ptr)->pl_len; \
|
||||
if ((cache_ptr)->pl_size > (cache_ptr)->max_pl_size) \
|
||||
(cache_ptr)->max_pl_size = (cache_ptr)->pl_size; \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_PROTECT(cache_ptr, entry_ptr, hit) \
|
||||
do { \
|
||||
if (hit) \
|
||||
(cache_ptr)->hits[(entry_ptr)->type->id]++; \
|
||||
else \
|
||||
(cache_ptr)->misses[(entry_ptr)->type->id]++; \
|
||||
if (!(entry_ptr)->is_read_only) \
|
||||
(cache_ptr)->write_protects[(entry_ptr)->type->id]++; \
|
||||
else { \
|
||||
(cache_ptr)->read_protects[(entry_ptr)->type->id]++; \
|
||||
if ((entry_ptr)->ro_ref_count > (cache_ptr)->max_read_protects[(entry_ptr)->type->id]) \
|
||||
(cache_ptr)->max_read_protects[(entry_ptr)->type->id] = (entry_ptr)->ro_ref_count; \
|
||||
} \
|
||||
if ((cache_ptr)->index_len > (cache_ptr)->max_index_len) \
|
||||
(cache_ptr)->max_index_len = (cache_ptr)->index_len; \
|
||||
H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr) \
|
||||
if ((cache_ptr)->pl_len > (cache_ptr)->max_pl_len) \
|
||||
(cache_ptr)->max_pl_len = (cache_ptr)->pl_len; \
|
||||
if ((cache_ptr)->pl_size > (cache_ptr)->max_pl_size) \
|
||||
(cache_ptr)->max_pl_size = (cache_ptr)->pl_size; \
|
||||
} while (0)
|
||||
|
||||
#define H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->pins[(entry_ptr)->type->id]++; \
|
||||
if ((cache_ptr)->pel_len > (cache_ptr)->max_pel_len) \
|
||||
(cache_ptr)->max_pel_len = (cache_ptr)->pel_len; \
|
||||
if ((cache_ptr)->pel_size > (cache_ptr)->max_pel_size) \
|
||||
(cache_ptr)->max_pel_size = (cache_ptr)->pel_size; \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->pins[(entry_ptr)->type->id]++; \
|
||||
if ((cache_ptr)->pel_len > (cache_ptr)->max_pel_len) \
|
||||
(cache_ptr)->max_pel_len = (cache_ptr)->pel_len; \
|
||||
if ((cache_ptr)->pel_size > (cache_ptr)->max_pel_size) \
|
||||
(cache_ptr)->max_pel_size = (cache_ptr)->pel_size; \
|
||||
} while (0)
|
||||
|
||||
#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
|
||||
|
||||
#else /* H5C_COLLECT_CACHE_STATS */
|
||||
|
||||
#define H5C__RESET_CACHE_ENTRY_STATS(entry_ptr) do {} while(0)
|
||||
#define H5C__UPDATE_STATS_FOR_DIRTY_PIN(cache_ptr, entry_ptr) do {} while(0)
|
||||
#define H5C__UPDATE_STATS_FOR_UNPROTECT(cache_ptr) do {} while(0)
|
||||
#define H5C__UPDATE_STATS_FOR_MOVE(cache_ptr, entry_ptr) do {} while(0)
|
||||
#define H5C__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE(cache_ptr, entry_ptr, new_size) do {} while(0)
|
||||
#define H5C__UPDATE_STATS_FOR_HT_INSERTION(cache_ptr) do {} while(0)
|
||||
#define H5C__UPDATE_STATS_FOR_HT_DELETION(cache_ptr) do {} while(0)
|
||||
#define H5C__UPDATE_STATS_FOR_HT_SEARCH(cache_ptr, success, depth) do {} while(0)
|
||||
#define H5C__UPDATE_STATS_FOR_INSERTION(cache_ptr, entry_ptr) do {} while(0)
|
||||
#define H5C__UPDATE_STATS_FOR_CLEAR(cache_ptr, entry_ptr) do {} while(0)
|
||||
#define H5C__UPDATE_STATS_FOR_FLUSH(cache_ptr, entry_ptr) do {} while(0)
|
||||
#define H5C__UPDATE_STATS_FOR_EVICTION(cache_ptr, entry_ptr, take_ownership) do {} while(0)
|
||||
#define H5C__UPDATE_STATS_FOR_PROTECT(cache_ptr, entry_ptr, hit) do {} while(0)
|
||||
#define H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr) do {} while(0)
|
||||
#define H5C__UPDATE_STATS_FOR_UNPIN(cache_ptr, entry_ptr) do {} while(0)
|
||||
#define H5C__UPDATE_STATS_FOR_PREFETCH(cache_ptr, dirty) do {} while(0)
|
||||
#define H5C__UPDATE_STATS_FOR_PREFETCH_HIT(cache_ptr) do {} while(0)
|
||||
#define H5C__UPDATE_STATS_FOR_SLIST_SCAN_RESTART(cache_ptr) do {} while(0)
|
||||
#define H5C__UPDATE_STATS_FOR_LRU_SCAN_RESTART(cache_ptr) do {} while(0)
|
||||
#define H5C__UPDATE_STATS_FOR_INDEX_SCAN_RESTART(cache_ptr) do {} while(0)
|
||||
#define H5C__RESET_CACHE_ENTRY_STATS(entry_ptr) \
|
||||
do { \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_DIRTY_PIN(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_UNPROTECT(cache_ptr) \
|
||||
do { \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_MOVE(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE(cache_ptr, entry_ptr, new_size) \
|
||||
do { \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_HT_INSERTION(cache_ptr) \
|
||||
do { \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_HT_DELETION(cache_ptr) \
|
||||
do { \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_HT_SEARCH(cache_ptr, success, depth) \
|
||||
do { \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_INSERTION(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_CLEAR(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_FLUSH(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_EVICTION(cache_ptr, entry_ptr, take_ownership) \
|
||||
do { \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_PROTECT(cache_ptr, entry_ptr, hit) \
|
||||
do { \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_UNPIN(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_PREFETCH(cache_ptr, dirty) \
|
||||
do { \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_PREFETCH_HIT(cache_ptr) \
|
||||
do { \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_SLIST_SCAN_RESTART(cache_ptr) \
|
||||
do { \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_LRU_SCAN_RESTART(cache_ptr) \
|
||||
do { \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_STATS_FOR_INDEX_SCAN_RESTART(cache_ptr) \
|
||||
do { \
|
||||
} while (0)
|
||||
|
||||
#endif /* H5C_COLLECT_CACHE_STATS */
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Hash table access and manipulation macros:
|
||||
@@ -564,263 +592,210 @@ do { \
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
#define H5C__HASH_MASK ((size_t)(H5C__HASH_TABLE_LEN - 1) << 3)
|
||||
#define H5C__HASH_FCN(x) (int)((unsigned)((x) & H5C__HASH_MASK) >> 3)
|
||||
#define H5C__HASH_MASK ((size_t)(H5C__HASH_TABLE_LEN - 1) << 3)
|
||||
#define H5C__HASH_FCN(x) (int)((unsigned)((x)&H5C__HASH_MASK) >> 3)
|
||||
|
||||
#define H5C__POST_HT_SHIFT_TO_FRONT_SC_CMP(cache_ptr, entry_ptr, k) \
|
||||
((cache_ptr) == NULL || (cache_ptr)->index[k] != (entry_ptr) || \
|
||||
(entry_ptr)->ht_prev != NULL \
|
||||
)
|
||||
#define H5C__PRE_HT_SEARCH_SC_CMP(cache_ptr, entry_addr) \
|
||||
((cache_ptr) == NULL || \
|
||||
(cache_ptr)->index_size != \
|
||||
((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) || \
|
||||
!H5_addr_defined(entry_addr) || \
|
||||
H5C__HASH_FCN(entry_addr) < 0 || \
|
||||
H5C__HASH_FCN(entry_addr) >= H5C__HASH_TABLE_LEN \
|
||||
)
|
||||
#define H5C__POST_SUC_HT_SEARCH_SC_CMP(cache_ptr, entry_ptr, k) \
|
||||
((cache_ptr) == NULL || (cache_ptr)->index_len < 1 || \
|
||||
(entry_ptr) == NULL || \
|
||||
(cache_ptr)->index_size < (entry_ptr)->size || \
|
||||
(cache_ptr)->index_size != \
|
||||
((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) || \
|
||||
(entry_ptr)->size <= 0 || \
|
||||
(cache_ptr)->index[k] == NULL || \
|
||||
((cache_ptr)->index[k] != (entry_ptr) && (entry_ptr)->ht_prev == NULL) || \
|
||||
((cache_ptr)->index[k] == (entry_ptr) && (entry_ptr)->ht_prev != NULL) || \
|
||||
((entry_ptr)->ht_prev != NULL && (entry_ptr)->ht_prev->ht_next != (entry_ptr)) || \
|
||||
((entry_ptr)->ht_next != NULL && (entry_ptr)->ht_next->ht_prev != (entry_ptr)) \
|
||||
)
|
||||
#define H5C__POST_HT_SHIFT_TO_FRONT_SC_CMP(cache_ptr, entry_ptr, k) \
|
||||
((cache_ptr) == NULL || (cache_ptr)->index[k] != (entry_ptr) || (entry_ptr)->ht_prev != NULL)
|
||||
#define H5C__PRE_HT_SEARCH_SC_CMP(cache_ptr, entry_addr) \
|
||||
((cache_ptr) == NULL || \
|
||||
(cache_ptr)->index_size != ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) || \
|
||||
!H5_addr_defined(entry_addr) || H5C__HASH_FCN(entry_addr) < 0 || \
|
||||
H5C__HASH_FCN(entry_addr) >= H5C__HASH_TABLE_LEN)
|
||||
#define H5C__POST_SUC_HT_SEARCH_SC_CMP(cache_ptr, entry_ptr, k) \
|
||||
((cache_ptr) == NULL || (cache_ptr)->index_len < 1 || (entry_ptr) == NULL || \
|
||||
(cache_ptr)->index_size < (entry_ptr)->size || \
|
||||
(cache_ptr)->index_size != ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) || \
|
||||
(entry_ptr)->size <= 0 || (cache_ptr)->index[k] == NULL || \
|
||||
((cache_ptr)->index[k] != (entry_ptr) && (entry_ptr)->ht_prev == NULL) || \
|
||||
((cache_ptr)->index[k] == (entry_ptr) && (entry_ptr)->ht_prev != NULL) || \
|
||||
((entry_ptr)->ht_prev != NULL && (entry_ptr)->ht_prev->ht_next != (entry_ptr)) || \
|
||||
((entry_ptr)->ht_next != NULL && (entry_ptr)->ht_next->ht_prev != (entry_ptr)))
|
||||
|
||||
#ifdef H5C_DO_SANITY_CHECKS
|
||||
|
||||
#define H5C__PRE_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val) \
|
||||
if ((cache_ptr) == NULL || \
|
||||
(entry_ptr) == NULL || !H5_addr_defined((entry_ptr)->addr) || \
|
||||
(entry_ptr)->ht_next != NULL || (entry_ptr)->ht_prev != NULL || \
|
||||
(entry_ptr)->size <= 0 || \
|
||||
H5C__HASH_FCN((entry_ptr)->addr) < 0 || \
|
||||
H5C__HASH_FCN((entry_ptr)->addr) >= H5C__HASH_TABLE_LEN || \
|
||||
(cache_ptr)->index_size != \
|
||||
((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->clean_index_size || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->dirty_index_size || \
|
||||
(entry_ptr)->ring <= H5C_RING_UNDEFINED || \
|
||||
(entry_ptr)->ring >= H5C_RING_NTYPES || \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring] > (cache_ptr)->index_len || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] > (cache_ptr)->index_size || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] != \
|
||||
((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] + \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) || \
|
||||
(cache_ptr)->index_len != (cache_ptr)->il_len || \
|
||||
(cache_ptr)->index_size != (cache_ptr)->il_size \
|
||||
) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val, "pre HT insert SC failed"); \
|
||||
}
|
||||
#define H5C__PRE_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val) \
|
||||
if ((cache_ptr) == NULL || (entry_ptr) == NULL || !H5_addr_defined((entry_ptr)->addr) || \
|
||||
(entry_ptr)->ht_next != NULL || (entry_ptr)->ht_prev != NULL || (entry_ptr)->size <= 0 || \
|
||||
H5C__HASH_FCN((entry_ptr)->addr) < 0 || H5C__HASH_FCN((entry_ptr)->addr) >= H5C__HASH_TABLE_LEN || \
|
||||
(cache_ptr)->index_size != ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->clean_index_size || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->dirty_index_size || \
|
||||
(entry_ptr)->ring <= H5C_RING_UNDEFINED || (entry_ptr)->ring >= H5C_RING_NTYPES || \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring] > (cache_ptr)->index_len || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] > (cache_ptr)->index_size || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] != \
|
||||
((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] + \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) || \
|
||||
(cache_ptr)->index_len != (cache_ptr)->il_len || (cache_ptr)->index_size != (cache_ptr)->il_size) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val, "pre HT insert SC failed"); \
|
||||
}
|
||||
|
||||
#define H5C__POST_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val) \
|
||||
if ((cache_ptr) == NULL || \
|
||||
(cache_ptr)->index_size != \
|
||||
((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->clean_index_size || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->dirty_index_size || \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring] == 0 || \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring] > (cache_ptr)->index_len || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] > (cache_ptr)->index_size || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] != \
|
||||
((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] + \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) || \
|
||||
(cache_ptr)->index_len != (cache_ptr)->il_len || \
|
||||
(cache_ptr)->index_size != (cache_ptr)->il_size \
|
||||
) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val, "post HT insert SC failed"); \
|
||||
}
|
||||
#define H5C__POST_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val) \
|
||||
if ((cache_ptr) == NULL || \
|
||||
(cache_ptr)->index_size != ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->clean_index_size || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->dirty_index_size || \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring] == 0 || \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring] > (cache_ptr)->index_len || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] > (cache_ptr)->index_size || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] != \
|
||||
((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] + \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) || \
|
||||
(cache_ptr)->index_len != (cache_ptr)->il_len || (cache_ptr)->index_size != (cache_ptr)->il_size) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val, "post HT insert SC failed"); \
|
||||
}
|
||||
|
||||
#define H5C__PRE_HT_REMOVE_SC(cache_ptr, entry_ptr, fail_val) \
|
||||
if ( (cache_ptr) == NULL || (cache_ptr)->index_len < 1 || \
|
||||
(entry_ptr) == NULL || \
|
||||
(cache_ptr)->index_size < (entry_ptr)->size || \
|
||||
!H5_addr_defined((entry_ptr)->addr) || \
|
||||
(entry_ptr)->size <= 0 || \
|
||||
H5C__HASH_FCN((entry_ptr)->addr) < 0 || \
|
||||
H5C__HASH_FCN((entry_ptr)->addr) >= H5C__HASH_TABLE_LEN || \
|
||||
(cache_ptr)->index[H5C__HASH_FCN((entry_ptr)->addr)] == NULL || \
|
||||
((cache_ptr)->index[H5C__HASH_FCN((entry_ptr)->addr)] != (entry_ptr) && \
|
||||
(entry_ptr)->ht_prev == NULL) || \
|
||||
((cache_ptr)->index[H5C__HASH_FCN((entry_ptr)->addr)] == (entry_ptr) && \
|
||||
(entry_ptr)->ht_prev != NULL) || \
|
||||
(cache_ptr)->index_size != \
|
||||
((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->clean_index_size || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->dirty_index_size || \
|
||||
(entry_ptr)->ring <= H5C_RING_UNDEFINED || \
|
||||
(entry_ptr)->ring >= H5C_RING_NTYPES || \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring] <= 0 || \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring] > (cache_ptr)->index_len || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] < (entry_ptr)->size || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] > (cache_ptr)->index_size || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] != \
|
||||
((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] + \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) || \
|
||||
(cache_ptr)->index_len != (cache_ptr)->il_len || \
|
||||
(cache_ptr)->index_size != (cache_ptr)->il_size \
|
||||
) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fail_val), "pre HT remove SC failed"); \
|
||||
}
|
||||
#define H5C__PRE_HT_REMOVE_SC(cache_ptr, entry_ptr, fail_val) \
|
||||
if ((cache_ptr) == NULL || (cache_ptr)->index_len < 1 || (entry_ptr) == NULL || \
|
||||
(cache_ptr)->index_size < (entry_ptr)->size || !H5_addr_defined((entry_ptr)->addr) || \
|
||||
(entry_ptr)->size <= 0 || H5C__HASH_FCN((entry_ptr)->addr) < 0 || \
|
||||
H5C__HASH_FCN((entry_ptr)->addr) >= H5C__HASH_TABLE_LEN || \
|
||||
(cache_ptr)->index[H5C__HASH_FCN((entry_ptr)->addr)] == NULL || \
|
||||
((cache_ptr)->index[H5C__HASH_FCN((entry_ptr)->addr)] != (entry_ptr) && \
|
||||
(entry_ptr)->ht_prev == NULL) || \
|
||||
((cache_ptr)->index[H5C__HASH_FCN((entry_ptr)->addr)] == (entry_ptr) && \
|
||||
(entry_ptr)->ht_prev != NULL) || \
|
||||
(cache_ptr)->index_size != ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->clean_index_size || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->dirty_index_size || \
|
||||
(entry_ptr)->ring <= H5C_RING_UNDEFINED || (entry_ptr)->ring >= H5C_RING_NTYPES || \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring] <= 0 || \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring] > (cache_ptr)->index_len || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] < (entry_ptr)->size || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] > (cache_ptr)->index_size || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] != \
|
||||
((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] + \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) || \
|
||||
(cache_ptr)->index_len != (cache_ptr)->il_len || (cache_ptr)->index_size != (cache_ptr)->il_size) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fail_val), "pre HT remove SC failed"); \
|
||||
}
|
||||
|
||||
#define H5C__POST_HT_REMOVE_SC(cache_ptr, entry_ptr, fail_val) \
|
||||
if ((cache_ptr) == NULL || \
|
||||
(entry_ptr) == NULL || !H5_addr_defined((entry_ptr)->addr) || \
|
||||
(entry_ptr)->size <= 0 || \
|
||||
(entry_ptr)->ht_next != NULL || \
|
||||
(entry_ptr)->ht_prev != NULL || \
|
||||
(cache_ptr)->index_size != \
|
||||
((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->clean_index_size || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->dirty_index_size || \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring] > (cache_ptr)->index_len || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] > (cache_ptr)->index_size || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] != \
|
||||
((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] + \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) || \
|
||||
(cache_ptr)->index_len != (cache_ptr)->il_len || \
|
||||
(cache_ptr)->index_size != (cache_ptr)->il_size \
|
||||
) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fail_val), "post HT remove SC failed"); \
|
||||
}
|
||||
#define H5C__POST_HT_REMOVE_SC(cache_ptr, entry_ptr, fail_val) \
|
||||
if ((cache_ptr) == NULL || (entry_ptr) == NULL || !H5_addr_defined((entry_ptr)->addr) || \
|
||||
(entry_ptr)->size <= 0 || (entry_ptr)->ht_next != NULL || (entry_ptr)->ht_prev != NULL || \
|
||||
(cache_ptr)->index_size != ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->clean_index_size || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->dirty_index_size || \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring] > (cache_ptr)->index_len || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] > (cache_ptr)->index_size || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] != \
|
||||
((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] + \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) || \
|
||||
(cache_ptr)->index_len != (cache_ptr)->il_len || (cache_ptr)->index_size != (cache_ptr)->il_size) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fail_val), "post HT remove SC failed"); \
|
||||
}
|
||||
|
||||
#define H5C__PRE_HT_SEARCH_SC(cache_ptr, entry_addr, fail_val) \
|
||||
if (H5C__PRE_HT_SEARCH_SC_CMP(cache_ptr, entry_addr)) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fail_val), "pre HT search SC failed"); \
|
||||
}
|
||||
#define H5C__PRE_HT_SEARCH_SC(cache_ptr, entry_addr, fail_val) \
|
||||
if (H5C__PRE_HT_SEARCH_SC_CMP(cache_ptr, entry_addr)) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fail_val), "pre HT search SC failed"); \
|
||||
}
|
||||
|
||||
#define H5C__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, k, fail_val) \
|
||||
if(H5C__POST_SUC_HT_SEARCH_SC_CMP(cache_ptr, entry_ptr, k)) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fail_val), "post successful HT search SC failed"); \
|
||||
}
|
||||
#define H5C__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, k, fail_val) \
|
||||
if (H5C__POST_SUC_HT_SEARCH_SC_CMP(cache_ptr, entry_ptr, k)) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fail_val), "post successful HT search SC failed"); \
|
||||
}
|
||||
|
||||
#define H5C__POST_HT_SHIFT_TO_FRONT_SC(cache_ptr, entry_ptr, k, fail_val) \
|
||||
if(H5C__POST_HT_SHIFT_TO_FRONT_SC_CMP(cache_ptr, entry_ptr, k)) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fail_val), "post HT shift to front SC failed"); \
|
||||
}
|
||||
#define H5C__POST_HT_SHIFT_TO_FRONT_SC(cache_ptr, entry_ptr, k, fail_val) \
|
||||
if (H5C__POST_HT_SHIFT_TO_FRONT_SC_CMP(cache_ptr, entry_ptr, k)) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fail_val), "post HT shift to front SC failed"); \
|
||||
}
|
||||
|
||||
#define H5C__PRE_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size, \
|
||||
entry_ptr, was_clean, fail_val) \
|
||||
if ((cache_ptr) == NULL || \
|
||||
(cache_ptr)->index_len <= 0 || (cache_ptr)->index_size <= 0 || \
|
||||
(new_size) <= 0 || (old_size) > (cache_ptr)->index_size || \
|
||||
((cache_ptr)->index_len == 1 && (cache_ptr)->index_size != (old_size)) || \
|
||||
(cache_ptr)->index_size != \
|
||||
((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->clean_index_size || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->dirty_index_size || \
|
||||
((!(was_clean) || (cache_ptr)->clean_index_size < (old_size)) && \
|
||||
((was_clean) || (cache_ptr)->dirty_index_size < (old_size))) || \
|
||||
(entry_ptr) == NULL || \
|
||||
(entry_ptr)->ring <= H5C_RING_UNDEFINED || \
|
||||
(entry_ptr)->ring >= H5C_RING_NTYPES || \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring] <= 0 || \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring] > (cache_ptr)->index_len || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] > (cache_ptr)->index_size || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] != \
|
||||
((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] + \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) || \
|
||||
(cache_ptr)->index_len != (cache_ptr)->il_len || \
|
||||
(cache_ptr)->index_size != (cache_ptr)->il_size \
|
||||
) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fail_val), "pre HT entry size change SC failed"); \
|
||||
}
|
||||
#define H5C__PRE_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size, entry_ptr, was_clean, fail_val) \
|
||||
if ((cache_ptr) == NULL || (cache_ptr)->index_len <= 0 || (cache_ptr)->index_size <= 0 || \
|
||||
(new_size) <= 0 || (old_size) > (cache_ptr)->index_size || \
|
||||
((cache_ptr)->index_len == 1 && (cache_ptr)->index_size != (old_size)) || \
|
||||
(cache_ptr)->index_size != ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->clean_index_size || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->dirty_index_size || \
|
||||
((!(was_clean) || (cache_ptr)->clean_index_size < (old_size)) && \
|
||||
((was_clean) || (cache_ptr)->dirty_index_size < (old_size))) || \
|
||||
(entry_ptr) == NULL || (entry_ptr)->ring <= H5C_RING_UNDEFINED || \
|
||||
(entry_ptr)->ring >= H5C_RING_NTYPES || (cache_ptr)->index_ring_len[(entry_ptr)->ring] <= 0 || \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring] > (cache_ptr)->index_len || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] > (cache_ptr)->index_size || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] != \
|
||||
((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] + \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) || \
|
||||
(cache_ptr)->index_len != (cache_ptr)->il_len || (cache_ptr)->index_size != (cache_ptr)->il_size) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fail_val), "pre HT entry size change SC failed"); \
|
||||
}
|
||||
|
||||
#define H5C__POST_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size, \
|
||||
entry_ptr, fail_val) \
|
||||
if ((cache_ptr) == NULL || \
|
||||
(cache_ptr)->index_len <= 0 || (cache_ptr)->index_size <= 0 || \
|
||||
(new_size) > (cache_ptr)->index_size || \
|
||||
(cache_ptr)->index_size != \
|
||||
((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->clean_index_size || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->dirty_index_size || \
|
||||
((!((entry_ptr)->is_dirty ) || (cache_ptr)->dirty_index_size < (new_size)) && \
|
||||
((entry_ptr)->is_dirty || (cache_ptr)->clean_index_size < (new_size)) \
|
||||
) || \
|
||||
((cache_ptr)->index_len == 1 && (cache_ptr)->index_size != (new_size)) || \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring] > (cache_ptr)->index_len || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] > (cache_ptr)->index_size || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] != \
|
||||
((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] + \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) || \
|
||||
(cache_ptr)->index_len != (cache_ptr)->il_len || \
|
||||
(cache_ptr)->index_size != (cache_ptr)->il_size \
|
||||
) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fail_val), "post HT entry size change SC failed"); \
|
||||
}
|
||||
#define H5C__POST_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size, entry_ptr, fail_val) \
|
||||
if ((cache_ptr) == NULL || (cache_ptr)->index_len <= 0 || (cache_ptr)->index_size <= 0 || \
|
||||
(new_size) > (cache_ptr)->index_size || \
|
||||
(cache_ptr)->index_size != ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->clean_index_size || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->dirty_index_size || \
|
||||
((!((entry_ptr)->is_dirty) || (cache_ptr)->dirty_index_size < (new_size)) && \
|
||||
((entry_ptr)->is_dirty || (cache_ptr)->clean_index_size < (new_size))) || \
|
||||
((cache_ptr)->index_len == 1 && (cache_ptr)->index_size != (new_size)) || \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring] > (cache_ptr)->index_len || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] > (cache_ptr)->index_size || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] != \
|
||||
((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] + \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) || \
|
||||
(cache_ptr)->index_len != (cache_ptr)->il_len || (cache_ptr)->index_size != (cache_ptr)->il_size) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fail_val), "post HT entry size change SC failed"); \
|
||||
}
|
||||
|
||||
#define H5C__PRE_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr, fail_val) \
|
||||
if ((cache_ptr) == NULL || (cache_ptr)->index_len <= 0 || \
|
||||
(entry_ptr) == NULL || (entry_ptr)->is_dirty != false || \
|
||||
(cache_ptr)->index_size < (entry_ptr)->size || \
|
||||
(cache_ptr)->dirty_index_size < (entry_ptr)->size || \
|
||||
(cache_ptr)->index_size != ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) || \
|
||||
(cache_ptr)->index_size < ((cache_ptr)->clean_index_size) || \
|
||||
(cache_ptr)->index_size < ((cache_ptr)->dirty_index_size) || \
|
||||
(entry_ptr)->ring <= H5C_RING_UNDEFINED || \
|
||||
(entry_ptr)->ring >= H5C_RING_NTYPES || \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring] <= 0 || \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring] > (cache_ptr)->index_len || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] > (cache_ptr)->index_size || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] != \
|
||||
((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] + \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) \
|
||||
) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fail_val), "pre HT update for entry clean SC failed"); \
|
||||
}
|
||||
#define H5C__PRE_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr, fail_val) \
|
||||
if ((cache_ptr) == NULL || (cache_ptr)->index_len <= 0 || (entry_ptr) == NULL || \
|
||||
(entry_ptr)->is_dirty != false || (cache_ptr)->index_size < (entry_ptr)->size || \
|
||||
(cache_ptr)->dirty_index_size < (entry_ptr)->size || \
|
||||
(cache_ptr)->index_size != ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) || \
|
||||
(cache_ptr)->index_size < ((cache_ptr)->clean_index_size) || \
|
||||
(cache_ptr)->index_size < ((cache_ptr)->dirty_index_size) || \
|
||||
(entry_ptr)->ring <= H5C_RING_UNDEFINED || (entry_ptr)->ring >= H5C_RING_NTYPES || \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring] <= 0 || \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring] > (cache_ptr)->index_len || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] > (cache_ptr)->index_size || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] != \
|
||||
((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] + \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring])) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fail_val), "pre HT update for entry clean SC failed"); \
|
||||
}
|
||||
|
||||
#define H5C__PRE_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr, fail_val) \
|
||||
if ((cache_ptr) == NULL || (cache_ptr)->index_len <= 0 || \
|
||||
(entry_ptr) == NULL || (entry_ptr)->is_dirty != true || \
|
||||
(cache_ptr)->index_size < (entry_ptr)->size || \
|
||||
(cache_ptr)->clean_index_size < (entry_ptr)->size || \
|
||||
(cache_ptr)->index_size != ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->clean_index_size || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->dirty_index_size || \
|
||||
(entry_ptr)->ring <= H5C_RING_UNDEFINED || \
|
||||
(entry_ptr)->ring >= H5C_RING_NTYPES || \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring] <= 0 || \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring] > (cache_ptr)->index_len || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] > (cache_ptr)->index_size || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] != \
|
||||
((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] + \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) \
|
||||
) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fail_val), "pre HT update for entry dirty SC failed"); \
|
||||
}
|
||||
#define H5C__PRE_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr, fail_val) \
|
||||
if ((cache_ptr) == NULL || (cache_ptr)->index_len <= 0 || (entry_ptr) == NULL || \
|
||||
(entry_ptr)->is_dirty != true || (cache_ptr)->index_size < (entry_ptr)->size || \
|
||||
(cache_ptr)->clean_index_size < (entry_ptr)->size || \
|
||||
(cache_ptr)->index_size != ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->clean_index_size || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->dirty_index_size || \
|
||||
(entry_ptr)->ring <= H5C_RING_UNDEFINED || (entry_ptr)->ring >= H5C_RING_NTYPES || \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring] <= 0 || \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring] > (cache_ptr)->index_len || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] > (cache_ptr)->index_size || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] != \
|
||||
((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] + \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring])) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fail_val), "pre HT update for entry dirty SC failed"); \
|
||||
}
|
||||
|
||||
#define H5C__POST_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr, fail_val) \
|
||||
if ((cache_ptr)->index_size != ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->clean_index_size || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->dirty_index_size || \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring] > (cache_ptr)->index_len || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] > (cache_ptr)->index_size || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] != \
|
||||
((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] + \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) \
|
||||
) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fail_val), "post HT update for entry clean SC failed"); \
|
||||
}
|
||||
#define H5C__POST_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr, fail_val) \
|
||||
if ((cache_ptr)->index_size != ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->clean_index_size || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->dirty_index_size || \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring] > (cache_ptr)->index_len || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] > (cache_ptr)->index_size || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] != \
|
||||
((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] + \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring])) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fail_val), "post HT update for entry clean SC failed"); \
|
||||
}
|
||||
|
||||
#define H5C__POST_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr, fail_val) \
|
||||
if ((cache_ptr)->index_size != ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->clean_index_size || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->dirty_index_size || \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring] > (cache_ptr)->index_len || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] > (cache_ptr)->index_size || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] != \
|
||||
((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] + \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) \
|
||||
) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fail_val), "post HT update for entry dirty SC failed"); \
|
||||
}
|
||||
#define H5C__POST_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr, fail_val) \
|
||||
if ((cache_ptr)->index_size != ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->clean_index_size || \
|
||||
(cache_ptr)->index_size < (cache_ptr)->dirty_index_size || \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring] > (cache_ptr)->index_len || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] > (cache_ptr)->index_size || \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] != \
|
||||
((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] + \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring])) { \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fail_val), "post HT update for entry dirty SC failed"); \
|
||||
}
|
||||
|
||||
#else /* H5C_DO_SANITY_CHECKS */
|
||||
|
||||
@@ -840,153 +815,149 @@ if ((cache_ptr)->index_size != ((cache_ptr)->clean_index_size + (cache_ptr)->dir
|
||||
|
||||
#endif /* H5C_DO_SANITY_CHECKS */
|
||||
|
||||
#define H5C__INSERT_IN_INDEX(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
int k; \
|
||||
H5C__PRE_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val) \
|
||||
k = H5C__HASH_FCN((entry_ptr)->addr); \
|
||||
if ((cache_ptr)->index[k] != NULL) { \
|
||||
(entry_ptr)->ht_next = (cache_ptr)->index[k]; \
|
||||
(entry_ptr)->ht_next->ht_prev = (entry_ptr); \
|
||||
} \
|
||||
(cache_ptr)->index[k] = (entry_ptr); \
|
||||
(cache_ptr)->index_len++; \
|
||||
(cache_ptr)->index_size += (entry_ptr)->size; \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring]++; \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] += (entry_ptr)->size; \
|
||||
if ((entry_ptr)->is_dirty) { \
|
||||
(cache_ptr)->dirty_index_size += (entry_ptr)->size; \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring] += (entry_ptr)->size; \
|
||||
} \
|
||||
else { \
|
||||
(cache_ptr)->clean_index_size += (entry_ptr)->size; \
|
||||
(cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] += (entry_ptr)->size; \
|
||||
} \
|
||||
if ((entry_ptr)->flush_me_last) { \
|
||||
(cache_ptr)->num_last_entries++; \
|
||||
assert((cache_ptr)->num_last_entries <= 2); \
|
||||
} \
|
||||
H5C__IL_DLL_APPEND((entry_ptr), (cache_ptr)->il_head, (cache_ptr)->il_tail, (cache_ptr)->il_len, \
|
||||
(cache_ptr)->il_size, fail_val); \
|
||||
H5C__UPDATE_STATS_FOR_HT_INSERTION(cache_ptr); \
|
||||
H5C__POST_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val); \
|
||||
} while (0)
|
||||
|
||||
#define H5C__INSERT_IN_INDEX(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
int k; \
|
||||
H5C__PRE_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val) \
|
||||
k = H5C__HASH_FCN((entry_ptr)->addr); \
|
||||
if((cache_ptr)->index[k] != NULL) { \
|
||||
(entry_ptr)->ht_next = (cache_ptr)->index[k]; \
|
||||
(entry_ptr)->ht_next->ht_prev = (entry_ptr); \
|
||||
} \
|
||||
(cache_ptr)->index[k] = (entry_ptr); \
|
||||
(cache_ptr)->index_len++; \
|
||||
(cache_ptr)->index_size += (entry_ptr)->size; \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring]++; \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] += (entry_ptr)->size; \
|
||||
if((entry_ptr)->is_dirty) { \
|
||||
(cache_ptr)->dirty_index_size += (entry_ptr)->size; \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring] += (entry_ptr)->size; \
|
||||
} else { \
|
||||
(cache_ptr)->clean_index_size += (entry_ptr)->size; \
|
||||
(cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] += (entry_ptr)->size; \
|
||||
} \
|
||||
if((entry_ptr)->flush_me_last) { \
|
||||
(cache_ptr)->num_last_entries++; \
|
||||
assert((cache_ptr)->num_last_entries <= 2); \
|
||||
} \
|
||||
H5C__IL_DLL_APPEND((entry_ptr), (cache_ptr)->il_head, \
|
||||
(cache_ptr)->il_tail, (cache_ptr)->il_len, \
|
||||
(cache_ptr)->il_size, fail_val); \
|
||||
H5C__UPDATE_STATS_FOR_HT_INSERTION(cache_ptr); \
|
||||
H5C__POST_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val); \
|
||||
} while (0)
|
||||
#define H5C__DELETE_FROM_INDEX(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
int k; \
|
||||
H5C__PRE_HT_REMOVE_SC(cache_ptr, entry_ptr, fail_val) \
|
||||
k = H5C__HASH_FCN((entry_ptr)->addr); \
|
||||
if ((entry_ptr)->ht_next) \
|
||||
(entry_ptr)->ht_next->ht_prev = (entry_ptr)->ht_prev; \
|
||||
if ((entry_ptr)->ht_prev) \
|
||||
(entry_ptr)->ht_prev->ht_next = (entry_ptr)->ht_next; \
|
||||
if ((cache_ptr)->index[k] == (entry_ptr)) \
|
||||
(cache_ptr)->index[k] = (entry_ptr)->ht_next; \
|
||||
(entry_ptr)->ht_next = NULL; \
|
||||
(entry_ptr)->ht_prev = NULL; \
|
||||
(cache_ptr)->index_len--; \
|
||||
(cache_ptr)->index_size -= (entry_ptr)->size; \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring]--; \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] -= (entry_ptr)->size; \
|
||||
if ((entry_ptr)->is_dirty) { \
|
||||
(cache_ptr)->dirty_index_size -= (entry_ptr)->size; \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring] -= (entry_ptr)->size; \
|
||||
} \
|
||||
else { \
|
||||
(cache_ptr)->clean_index_size -= (entry_ptr)->size; \
|
||||
(cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] -= (entry_ptr)->size; \
|
||||
} \
|
||||
if ((entry_ptr)->flush_me_last) { \
|
||||
(cache_ptr)->num_last_entries--; \
|
||||
assert((cache_ptr)->num_last_entries <= 1); \
|
||||
} \
|
||||
H5C__IL_DLL_REMOVE((entry_ptr), (cache_ptr)->il_head, (cache_ptr)->il_tail, (cache_ptr)->il_len, \
|
||||
(cache_ptr)->il_size, fail_val); \
|
||||
H5C__UPDATE_STATS_FOR_HT_DELETION(cache_ptr); \
|
||||
H5C__POST_HT_REMOVE_SC(cache_ptr, entry_ptr, fail_val); \
|
||||
} while (0)
|
||||
|
||||
#define H5C__DELETE_FROM_INDEX(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
int k; \
|
||||
H5C__PRE_HT_REMOVE_SC(cache_ptr, entry_ptr, fail_val) \
|
||||
k = H5C__HASH_FCN((entry_ptr)->addr); \
|
||||
if((entry_ptr)->ht_next) \
|
||||
(entry_ptr)->ht_next->ht_prev = (entry_ptr)->ht_prev; \
|
||||
if((entry_ptr)->ht_prev) \
|
||||
(entry_ptr)->ht_prev->ht_next = (entry_ptr)->ht_next; \
|
||||
if((cache_ptr)->index[k] == (entry_ptr)) \
|
||||
(cache_ptr)->index[k] = (entry_ptr)->ht_next; \
|
||||
(entry_ptr)->ht_next = NULL; \
|
||||
(entry_ptr)->ht_prev = NULL; \
|
||||
(cache_ptr)->index_len--; \
|
||||
(cache_ptr)->index_size -= (entry_ptr)->size; \
|
||||
(cache_ptr)->index_ring_len[(entry_ptr)->ring]--; \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] -= (entry_ptr)->size; \
|
||||
if((entry_ptr)->is_dirty) { \
|
||||
(cache_ptr)->dirty_index_size -= (entry_ptr)->size; \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring] -= (entry_ptr)->size; \
|
||||
} else { \
|
||||
(cache_ptr)->clean_index_size -= (entry_ptr)->size; \
|
||||
(cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] -= (entry_ptr)->size; \
|
||||
} \
|
||||
if((entry_ptr)->flush_me_last) { \
|
||||
(cache_ptr)->num_last_entries--; \
|
||||
assert((cache_ptr)->num_last_entries <= 1); \
|
||||
} \
|
||||
H5C__IL_DLL_REMOVE((entry_ptr), (cache_ptr)->il_head, \
|
||||
(cache_ptr)->il_tail, (cache_ptr)->il_len, \
|
||||
(cache_ptr)->il_size, fail_val); \
|
||||
H5C__UPDATE_STATS_FOR_HT_DELETION(cache_ptr); \
|
||||
H5C__POST_HT_REMOVE_SC(cache_ptr, entry_ptr, fail_val); \
|
||||
} while (0)
|
||||
#define H5C__SEARCH_INDEX(cache_ptr, entry_addr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
int k; \
|
||||
int depth = 0; \
|
||||
H5C__PRE_HT_SEARCH_SC(cache_ptr, entry_addr, fail_val); \
|
||||
k = H5C__HASH_FCN(entry_addr); \
|
||||
(entry_ptr) = (cache_ptr)->index[k]; \
|
||||
while (entry_ptr) { \
|
||||
if (H5_addr_eq(entry_addr, (entry_ptr)->addr)) { \
|
||||
H5C__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, k, fail_val); \
|
||||
if ((entry_ptr) != (cache_ptr)->index[k]) { \
|
||||
if ((entry_ptr)->ht_next) \
|
||||
(entry_ptr)->ht_next->ht_prev = (entry_ptr)->ht_prev; \
|
||||
assert((entry_ptr)->ht_prev != NULL); \
|
||||
(entry_ptr)->ht_prev->ht_next = (entry_ptr)->ht_next; \
|
||||
(cache_ptr)->index[k]->ht_prev = (entry_ptr); \
|
||||
(entry_ptr)->ht_next = (cache_ptr)->index[k]; \
|
||||
(entry_ptr)->ht_prev = NULL; \
|
||||
(cache_ptr)->index[k] = (entry_ptr); \
|
||||
H5C__POST_HT_SHIFT_TO_FRONT_SC(cache_ptr, entry_ptr, k, fail_val); \
|
||||
} \
|
||||
break; \
|
||||
} \
|
||||
(entry_ptr) = (entry_ptr)->ht_next; \
|
||||
(depth)++; \
|
||||
} \
|
||||
H5C__UPDATE_STATS_FOR_HT_SEARCH(cache_ptr, ((entry_ptr) != NULL), depth); \
|
||||
} while (0)
|
||||
|
||||
#define H5C__SEARCH_INDEX(cache_ptr, entry_addr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
int k; \
|
||||
int depth = 0; \
|
||||
H5C__PRE_HT_SEARCH_SC(cache_ptr, entry_addr, fail_val); \
|
||||
k = H5C__HASH_FCN(entry_addr); \
|
||||
(entry_ptr) = (cache_ptr)->index[k]; \
|
||||
while(entry_ptr) { \
|
||||
if(H5_addr_eq(entry_addr, (entry_ptr)->addr)) { \
|
||||
H5C__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, k, fail_val); \
|
||||
if((entry_ptr) != (cache_ptr)->index[k]) { \
|
||||
if((entry_ptr)->ht_next) \
|
||||
(entry_ptr)->ht_next->ht_prev = (entry_ptr)->ht_prev; \
|
||||
assert((entry_ptr)->ht_prev != NULL); \
|
||||
(entry_ptr)->ht_prev->ht_next = (entry_ptr)->ht_next; \
|
||||
(cache_ptr)->index[k]->ht_prev = (entry_ptr); \
|
||||
(entry_ptr)->ht_next = (cache_ptr)->index[k]; \
|
||||
(entry_ptr)->ht_prev = NULL; \
|
||||
(cache_ptr)->index[k] = (entry_ptr); \
|
||||
H5C__POST_HT_SHIFT_TO_FRONT_SC(cache_ptr, entry_ptr, k, fail_val); \
|
||||
} \
|
||||
break; \
|
||||
} \
|
||||
(entry_ptr) = (entry_ptr)->ht_next; \
|
||||
(depth)++; \
|
||||
} \
|
||||
H5C__UPDATE_STATS_FOR_HT_SEARCH(cache_ptr, ((entry_ptr) != NULL), depth); \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_INDEX_FOR_ENTRY_CLEAN(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
H5C__PRE_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr, fail_val); \
|
||||
(cache_ptr)->dirty_index_size -= (entry_ptr)->size; \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring] -= (entry_ptr)->size; \
|
||||
(cache_ptr)->clean_index_size += (entry_ptr)->size; \
|
||||
(cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] += (entry_ptr)->size; \
|
||||
H5C__POST_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr, fail_val); \
|
||||
} while (0)
|
||||
|
||||
#define H5C__UPDATE_INDEX_FOR_ENTRY_CLEAN(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
H5C__PRE_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr, fail_val); \
|
||||
(cache_ptr)->dirty_index_size -= (entry_ptr)->size; \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring] -= (entry_ptr)->size; \
|
||||
(cache_ptr)->clean_index_size += (entry_ptr)->size; \
|
||||
(cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] += (entry_ptr)->size; \
|
||||
H5C__POST_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr, fail_val); \
|
||||
} while (0)
|
||||
|
||||
#define H5C__UPDATE_INDEX_FOR_ENTRY_DIRTY(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
H5C__PRE_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr, fail_val); \
|
||||
(cache_ptr)->clean_index_size -= (entry_ptr)->size; \
|
||||
(cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] -= (entry_ptr)->size; \
|
||||
(cache_ptr)->dirty_index_size += (entry_ptr)->size; \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring] += (entry_ptr)->size; \
|
||||
H5C__POST_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr, fail_val); \
|
||||
} while (0)
|
||||
|
||||
#define H5C__UPDATE_INDEX_FOR_SIZE_CHANGE(cache_ptr, old_size, new_size, \
|
||||
entry_ptr, was_clean, fail_val) \
|
||||
do { \
|
||||
H5C__PRE_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size, \
|
||||
entry_ptr, was_clean, fail_val); \
|
||||
(cache_ptr)->index_size -= (old_size); \
|
||||
(cache_ptr)->index_size += (new_size); \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] -= (old_size); \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] += (new_size); \
|
||||
if(was_clean) { \
|
||||
(cache_ptr)->clean_index_size -= (old_size); \
|
||||
(cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] -= (old_size); \
|
||||
} else { \
|
||||
(cache_ptr)->dirty_index_size -= (old_size); \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring] -= (old_size); \
|
||||
} \
|
||||
if((entry_ptr)->is_dirty) { \
|
||||
(cache_ptr)->dirty_index_size += (new_size); \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring] += (new_size); \
|
||||
} else { \
|
||||
(cache_ptr)->clean_index_size += (new_size); \
|
||||
(cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] += (new_size); \
|
||||
} \
|
||||
H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->il_len, \
|
||||
(cache_ptr)->il_size, \
|
||||
(old_size), (new_size), (fail_val)); \
|
||||
H5C__POST_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size, \
|
||||
entry_ptr, fail_val); \
|
||||
} while (0)
|
||||
#define H5C__UPDATE_INDEX_FOR_ENTRY_DIRTY(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
H5C__PRE_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr, fail_val); \
|
||||
(cache_ptr)->clean_index_size -= (entry_ptr)->size; \
|
||||
(cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] -= (entry_ptr)->size; \
|
||||
(cache_ptr)->dirty_index_size += (entry_ptr)->size; \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring] += (entry_ptr)->size; \
|
||||
H5C__POST_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr, fail_val); \
|
||||
} while (0)
|
||||
|
||||
#define H5C__UPDATE_INDEX_FOR_SIZE_CHANGE(cache_ptr, old_size, new_size, entry_ptr, was_clean, fail_val) \
|
||||
do { \
|
||||
H5C__PRE_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size, entry_ptr, was_clean, fail_val); \
|
||||
(cache_ptr)->index_size -= (old_size); \
|
||||
(cache_ptr)->index_size += (new_size); \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] -= (old_size); \
|
||||
(cache_ptr)->index_ring_size[(entry_ptr)->ring] += (new_size); \
|
||||
if (was_clean) { \
|
||||
(cache_ptr)->clean_index_size -= (old_size); \
|
||||
(cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] -= (old_size); \
|
||||
} \
|
||||
else { \
|
||||
(cache_ptr)->dirty_index_size -= (old_size); \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring] -= (old_size); \
|
||||
} \
|
||||
if ((entry_ptr)->is_dirty) { \
|
||||
(cache_ptr)->dirty_index_size += (new_size); \
|
||||
(cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring] += (new_size); \
|
||||
} \
|
||||
else { \
|
||||
(cache_ptr)->clean_index_size += (new_size); \
|
||||
(cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] += (new_size); \
|
||||
} \
|
||||
H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->il_len, (cache_ptr)->il_size, (old_size), (new_size), \
|
||||
(fail_val)); \
|
||||
H5C__POST_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size, entry_ptr, fail_val); \
|
||||
} while (0)
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
@@ -996,8 +967,7 @@ do { \
|
||||
|
||||
#ifdef H5C_DO_SLIST_SANITY_CHECKS
|
||||
|
||||
#define H5C__ENTRY_IN_SLIST(cache_ptr, entry_ptr) \
|
||||
H5C__entry_in_skip_list((cache_ptr), (entry_ptr))
|
||||
#define H5C__ENTRY_IN_SLIST(cache_ptr, entry_ptr) H5C__entry_in_skip_list((cache_ptr), (entry_ptr))
|
||||
|
||||
#else /* H5C_DO_SLIST_SANITY_CHECKS */
|
||||
|
||||
@@ -1005,24 +975,23 @@ do { \
|
||||
|
||||
#endif /* H5C_DO_SLIST_SANITY_CHECKS */
|
||||
|
||||
|
||||
#ifdef H5C_DO_SANITY_CHECKS
|
||||
|
||||
#define H5C__SLIST_INSERT_ENTRY_SC(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->slist_len_increase++; \
|
||||
(cache_ptr)->slist_size_increase += (int64_t)((entry_ptr)->size); \
|
||||
} while (0) /* H5C__SLIST_INSERT_ENTRY_SC() */
|
||||
#define H5C__SLIST_REMOVE_ENTRY_SC(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->slist_len_increase--; \
|
||||
(cache_ptr)->slist_size_increase -= (int64_t)((entry_ptr)->size); \
|
||||
} while (0) /* H5C__SLIST_REMOVE_ENTRY_SC() */
|
||||
#define H5C__SLIST_UPDATE_FOR_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size) \
|
||||
do { \
|
||||
(cache_ptr)->slist_size_increase -= (int64_t)(old_size); \
|
||||
(cache_ptr)->slist_size_increase += (int64_t)(new_size); \
|
||||
} while (0) /* H5C__SLIST_UPDATE_FOR_ENTRY_SIZE_CHANGE_SC() */
|
||||
#define H5C__SLIST_INSERT_ENTRY_SC(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->slist_len_increase++; \
|
||||
(cache_ptr)->slist_size_increase += (int64_t)((entry_ptr)->size); \
|
||||
} while (0) /* H5C__SLIST_INSERT_ENTRY_SC() */
|
||||
#define H5C__SLIST_REMOVE_ENTRY_SC(cache_ptr, entry_ptr) \
|
||||
do { \
|
||||
(cache_ptr)->slist_len_increase--; \
|
||||
(cache_ptr)->slist_size_increase -= (int64_t)((entry_ptr)->size); \
|
||||
} while (0) /* H5C__SLIST_REMOVE_ENTRY_SC() */
|
||||
#define H5C__SLIST_UPDATE_FOR_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size) \
|
||||
do { \
|
||||
(cache_ptr)->slist_size_increase -= (int64_t)(old_size); \
|
||||
(cache_ptr)->slist_size_increase += (int64_t)(new_size); \
|
||||
} while (0) /* H5C__SLIST_UPDATE_FOR_ENTRY_SIZE_CHANGE_SC() */
|
||||
|
||||
#else /* H5C_DO_SANITY_CHECKS */
|
||||
|
||||
@@ -1032,7 +1001,6 @@ do { \
|
||||
|
||||
#endif /* H5C_DO_SANITY_CHECKS */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* Macro: H5C__INSERT_ENTRY_IN_SLIST
|
||||
@@ -1046,43 +1014,41 @@ do { \
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#define H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
assert(cache_ptr); \
|
||||
\
|
||||
if((cache_ptr)->slist_enabled) { \
|
||||
assert(entry_ptr); \
|
||||
assert((entry_ptr)->size > 0); \
|
||||
assert(H5_addr_defined((entry_ptr)->addr)); \
|
||||
assert(!(entry_ptr)->in_slist); \
|
||||
assert(!H5C__ENTRY_IN_SLIST((cache_ptr), (entry_ptr))); \
|
||||
assert((entry_ptr)->ring > H5C_RING_UNDEFINED); \
|
||||
assert((entry_ptr)->ring < H5C_RING_NTYPES); \
|
||||
assert((cache_ptr)->slist_ring_len[(entry_ptr)->ring] <= \
|
||||
(cache_ptr)->slist_len); \
|
||||
assert((cache_ptr)->slist_ring_size[(entry_ptr)->ring] <= \
|
||||
(cache_ptr)->slist_size); \
|
||||
assert((cache_ptr)->slist_ptr); \
|
||||
\
|
||||
if(H5SL_insert((cache_ptr)->slist_ptr, entry_ptr, &((entry_ptr)->addr)) < 0) \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, (fail_val), "can't insert entry in skip list"); \
|
||||
\
|
||||
(entry_ptr)->in_slist = true; \
|
||||
(cache_ptr)->slist_changed = true; \
|
||||
(cache_ptr)->slist_len++; \
|
||||
(cache_ptr)->slist_size += (entry_ptr)->size; \
|
||||
((cache_ptr)->slist_ring_len[(entry_ptr)->ring])++; \
|
||||
((cache_ptr)->slist_ring_size[(entry_ptr)->ring]) += (entry_ptr)->size;\
|
||||
H5C__SLIST_INSERT_ENTRY_SC(cache_ptr, entry_ptr); \
|
||||
\
|
||||
assert((cache_ptr)->slist_len > 0); \
|
||||
assert((cache_ptr)->slist_size > 0); \
|
||||
} else { /* slist disabled */ \
|
||||
assert((cache_ptr)->slist_len == 0); \
|
||||
assert((cache_ptr)->slist_size == 0); \
|
||||
} \
|
||||
} while (0) /* H5C__INSERT_ENTRY_IN_SLIST */
|
||||
|
||||
#define H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
assert(cache_ptr); \
|
||||
\
|
||||
if ((cache_ptr)->slist_enabled) { \
|
||||
assert(entry_ptr); \
|
||||
assert((entry_ptr)->size > 0); \
|
||||
assert(H5_addr_defined((entry_ptr)->addr)); \
|
||||
assert(!(entry_ptr)->in_slist); \
|
||||
assert(!H5C__ENTRY_IN_SLIST((cache_ptr), (entry_ptr))); \
|
||||
assert((entry_ptr)->ring > H5C_RING_UNDEFINED); \
|
||||
assert((entry_ptr)->ring < H5C_RING_NTYPES); \
|
||||
assert((cache_ptr)->slist_ring_len[(entry_ptr)->ring] <= (cache_ptr)->slist_len); \
|
||||
assert((cache_ptr)->slist_ring_size[(entry_ptr)->ring] <= (cache_ptr)->slist_size); \
|
||||
assert((cache_ptr)->slist_ptr); \
|
||||
\
|
||||
if (H5SL_insert((cache_ptr)->slist_ptr, entry_ptr, &((entry_ptr)->addr)) < 0) \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, (fail_val), "can't insert entry in skip list"); \
|
||||
\
|
||||
(entry_ptr)->in_slist = true; \
|
||||
(cache_ptr)->slist_changed = true; \
|
||||
(cache_ptr)->slist_len++; \
|
||||
(cache_ptr)->slist_size += (entry_ptr)->size; \
|
||||
((cache_ptr)->slist_ring_len[(entry_ptr)->ring])++; \
|
||||
((cache_ptr)->slist_ring_size[(entry_ptr)->ring]) += (entry_ptr)->size; \
|
||||
H5C__SLIST_INSERT_ENTRY_SC(cache_ptr, entry_ptr); \
|
||||
\
|
||||
assert((cache_ptr)->slist_len > 0); \
|
||||
assert((cache_ptr)->slist_size > 0); \
|
||||
} \
|
||||
else { /* slist disabled */ \
|
||||
assert((cache_ptr)->slist_len == 0); \
|
||||
assert((cache_ptr)->slist_size == 0); \
|
||||
} \
|
||||
} while (0) /* H5C__INSERT_ENTRY_IN_SLIST */
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
@@ -1094,45 +1060,43 @@ do { \
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#define H5C__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr, during_flush, fail_val) \
|
||||
do { \
|
||||
assert(cache_ptr); \
|
||||
\
|
||||
if((cache_ptr)->slist_enabled) { \
|
||||
assert(entry_ptr); \
|
||||
assert(!(entry_ptr)->is_read_only); \
|
||||
assert((entry_ptr)->ro_ref_count == 0); \
|
||||
assert((entry_ptr)->size > 0); \
|
||||
assert((entry_ptr)->in_slist); \
|
||||
assert((cache_ptr)->slist_ptr); \
|
||||
assert((entry_ptr)->ring > H5C_RING_UNDEFINED); \
|
||||
assert((entry_ptr)->ring < H5C_RING_NTYPES); \
|
||||
assert((cache_ptr)->slist_ring_len[(entry_ptr)->ring] <= \
|
||||
(cache_ptr)->slist_len); \
|
||||
assert((cache_ptr)->slist_ring_size[(entry_ptr)->ring] <= \
|
||||
(cache_ptr)->slist_size); \
|
||||
assert((cache_ptr)->slist_size >= (entry_ptr)->size); \
|
||||
\
|
||||
if(H5SL_remove((cache_ptr)->slist_ptr, &(entry_ptr)->addr) != (entry_ptr) ) \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, (fail_val), "can't delete entry from skip list"); \
|
||||
\
|
||||
assert((cache_ptr)->slist_len > 0); \
|
||||
if(!(during_flush)) \
|
||||
(cache_ptr)->slist_changed = true; \
|
||||
(cache_ptr)->slist_len--; \
|
||||
assert((cache_ptr)->slist_size >= (entry_ptr)->size); \
|
||||
(cache_ptr)->slist_size -= (entry_ptr)->size; \
|
||||
(cache_ptr)->slist_ring_len[(entry_ptr)->ring]--; \
|
||||
assert((cache_ptr)->slist_ring_size[(entry_ptr)->ring] >= (entry_ptr)->size); \
|
||||
((cache_ptr)->slist_ring_size[(entry_ptr)->ring]) -= (entry_ptr)->size;\
|
||||
H5C__SLIST_REMOVE_ENTRY_SC(cache_ptr, entry_ptr); \
|
||||
(entry_ptr)->in_slist = false; \
|
||||
} else { /* slist disabled */ \
|
||||
assert((cache_ptr)->slist_len == 0); \
|
||||
assert((cache_ptr)->slist_size == 0); \
|
||||
} \
|
||||
} while (0) /* H5C__REMOVE_ENTRY_FROM_SLIST */
|
||||
|
||||
#define H5C__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr, during_flush, fail_val) \
|
||||
do { \
|
||||
assert(cache_ptr); \
|
||||
\
|
||||
if ((cache_ptr)->slist_enabled) { \
|
||||
assert(entry_ptr); \
|
||||
assert(!(entry_ptr)->is_read_only); \
|
||||
assert((entry_ptr)->ro_ref_count == 0); \
|
||||
assert((entry_ptr)->size > 0); \
|
||||
assert((entry_ptr)->in_slist); \
|
||||
assert((cache_ptr)->slist_ptr); \
|
||||
assert((entry_ptr)->ring > H5C_RING_UNDEFINED); \
|
||||
assert((entry_ptr)->ring < H5C_RING_NTYPES); \
|
||||
assert((cache_ptr)->slist_ring_len[(entry_ptr)->ring] <= (cache_ptr)->slist_len); \
|
||||
assert((cache_ptr)->slist_ring_size[(entry_ptr)->ring] <= (cache_ptr)->slist_size); \
|
||||
assert((cache_ptr)->slist_size >= (entry_ptr)->size); \
|
||||
\
|
||||
if (H5SL_remove((cache_ptr)->slist_ptr, &(entry_ptr)->addr) != (entry_ptr)) \
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, (fail_val), "can't delete entry from skip list"); \
|
||||
\
|
||||
assert((cache_ptr)->slist_len > 0); \
|
||||
if (!(during_flush)) \
|
||||
(cache_ptr)->slist_changed = true; \
|
||||
(cache_ptr)->slist_len--; \
|
||||
assert((cache_ptr)->slist_size >= (entry_ptr)->size); \
|
||||
(cache_ptr)->slist_size -= (entry_ptr)->size; \
|
||||
(cache_ptr)->slist_ring_len[(entry_ptr)->ring]--; \
|
||||
assert((cache_ptr)->slist_ring_size[(entry_ptr)->ring] >= (entry_ptr)->size); \
|
||||
((cache_ptr)->slist_ring_size[(entry_ptr)->ring]) -= (entry_ptr)->size; \
|
||||
H5C__SLIST_REMOVE_ENTRY_SC(cache_ptr, entry_ptr); \
|
||||
(entry_ptr)->in_slist = false; \
|
||||
} \
|
||||
else { /* slist disabled */ \
|
||||
assert((cache_ptr)->slist_len == 0); \
|
||||
assert((cache_ptr)->slist_size == 0); \
|
||||
} \
|
||||
} while (0) /* H5C__REMOVE_ENTRY_FROM_SLIST */
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
@@ -1144,43 +1108,39 @@ do {
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#define H5C__UPDATE_SLIST_FOR_SIZE_CHANGE(cache_ptr, old_size, new_size) \
|
||||
do { \
|
||||
assert(cache_ptr); \
|
||||
\
|
||||
if((cache_ptr)->slist_enabled) { \
|
||||
assert((old_size) > 0); \
|
||||
assert((new_size) > 0); \
|
||||
assert((old_size) <= (cache_ptr)->slist_size); \
|
||||
assert((cache_ptr)->slist_len > 0); \
|
||||
assert((cache_ptr)->slist_len > 1 || \
|
||||
(cache_ptr)->slist_size == (old_size)); \
|
||||
assert((entry_ptr)->ring > H5C_RING_UNDEFINED); \
|
||||
assert((entry_ptr)->ring < H5C_RING_NTYPES); \
|
||||
assert((cache_ptr)->slist_ring_len[(entry_ptr)->ring] <= \
|
||||
(cache_ptr)->slist_len); \
|
||||
assert((cache_ptr)->slist_ring_size[(entry_ptr)->ring] <= \
|
||||
(cache_ptr)->slist_size); \
|
||||
\
|
||||
(cache_ptr)->slist_size -= (old_size); \
|
||||
(cache_ptr)->slist_size += (new_size); \
|
||||
\
|
||||
assert((cache_ptr)->slist_ring_size[(entry_ptr)->ring] >= (old_size)); \
|
||||
\
|
||||
(cache_ptr)->slist_ring_size[(entry_ptr)->ring] -= (old_size); \
|
||||
(cache_ptr)->slist_ring_size[(entry_ptr)->ring] += (new_size); \
|
||||
\
|
||||
H5C__SLIST_UPDATE_FOR_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size); \
|
||||
\
|
||||
assert((new_size) <= (cache_ptr)->slist_size); \
|
||||
assert((cache_ptr)->slist_len > 1 || \
|
||||
(cache_ptr)->slist_size == (new_size)); \
|
||||
} else { /* slist disabled */ \
|
||||
assert((cache_ptr)->slist_len == 0); \
|
||||
assert((cache_ptr)->slist_size == 0); \
|
||||
} \
|
||||
} while (0) /* H5C__UPDATE_SLIST_FOR_SIZE_CHANGE */
|
||||
|
||||
#define H5C__UPDATE_SLIST_FOR_SIZE_CHANGE(cache_ptr, old_size, new_size) \
|
||||
do { \
|
||||
assert(cache_ptr); \
|
||||
\
|
||||
if ((cache_ptr)->slist_enabled) { \
|
||||
assert((old_size) > 0); \
|
||||
assert((new_size) > 0); \
|
||||
assert((old_size) <= (cache_ptr)->slist_size); \
|
||||
assert((cache_ptr)->slist_len > 0); \
|
||||
assert((cache_ptr)->slist_len > 1 || (cache_ptr)->slist_size == (old_size)); \
|
||||
assert((entry_ptr)->ring > H5C_RING_UNDEFINED); \
|
||||
assert((entry_ptr)->ring < H5C_RING_NTYPES); \
|
||||
assert((cache_ptr)->slist_ring_len[(entry_ptr)->ring] <= (cache_ptr)->slist_len); \
|
||||
assert((cache_ptr)->slist_ring_size[(entry_ptr)->ring] <= (cache_ptr)->slist_size); \
|
||||
\
|
||||
(cache_ptr)->slist_size -= (old_size); \
|
||||
(cache_ptr)->slist_size += (new_size); \
|
||||
\
|
||||
assert((cache_ptr)->slist_ring_size[(entry_ptr)->ring] >= (old_size)); \
|
||||
\
|
||||
(cache_ptr)->slist_ring_size[(entry_ptr)->ring] -= (old_size); \
|
||||
(cache_ptr)->slist_ring_size[(entry_ptr)->ring] += (new_size); \
|
||||
\
|
||||
H5C__SLIST_UPDATE_FOR_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size); \
|
||||
\
|
||||
assert((new_size) <= (cache_ptr)->slist_size); \
|
||||
assert((cache_ptr)->slist_len > 1 || (cache_ptr)->slist_size == (new_size)); \
|
||||
} \
|
||||
else { /* slist disabled */ \
|
||||
assert((cache_ptr)->slist_len == 0); \
|
||||
assert((cache_ptr)->slist_size == 0); \
|
||||
} \
|
||||
} while (0) /* H5C__UPDATE_SLIST_FOR_SIZE_CHANGE */
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
@@ -1190,201 +1150,162 @@ do { \
|
||||
|
||||
#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
|
||||
|
||||
#define H5C__UPDATE_RP_FOR_EVICTION_CD_LRU(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
/* If the entry is clean when it is evicted, it should be on the \
|
||||
* clean LRU list, if it was dirty, it should be on the dirty LRU list. \
|
||||
* Remove it from the appropriate list according to the value of the \
|
||||
* dirty flag. \
|
||||
*/ \
|
||||
if((entry_ptr)->is_dirty) { \
|
||||
H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->dLRU_head_ptr, \
|
||||
(cache_ptr)->dLRU_tail_ptr, \
|
||||
(cache_ptr)->dLRU_list_len, \
|
||||
(cache_ptr)->dLRU_list_size, (fail_val)) \
|
||||
} else { \
|
||||
H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
|
||||
(cache_ptr)->cLRU_tail_ptr, \
|
||||
(cache_ptr)->cLRU_list_len, \
|
||||
(cache_ptr)->cLRU_list_size, (fail_val)) \
|
||||
} \
|
||||
} while (0) /* H5C__UPDATE_RP_FOR_EVICTION_CD_LRU() */
|
||||
#define H5C__UPDATE_RP_FOR_EVICTION_CD_LRU(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
/* If the entry is clean when it is evicted, it should be on the \
|
||||
* clean LRU list, if it was dirty, it should be on the dirty LRU list. \
|
||||
* Remove it from the appropriate list according to the value of the \
|
||||
* dirty flag. \
|
||||
*/ \
|
||||
if ((entry_ptr)->is_dirty) { \
|
||||
H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->dLRU_head_ptr, (cache_ptr)->dLRU_tail_ptr, \
|
||||
(cache_ptr)->dLRU_list_len, (cache_ptr)->dLRU_list_size, (fail_val)) \
|
||||
} \
|
||||
else { \
|
||||
H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->cLRU_head_ptr, (cache_ptr)->cLRU_tail_ptr, \
|
||||
(cache_ptr)->cLRU_list_len, (cache_ptr)->cLRU_list_size, (fail_val)) \
|
||||
} \
|
||||
} while (0) /* H5C__UPDATE_RP_FOR_EVICTION_CD_LRU() */
|
||||
|
||||
#define H5C__UPDATE_RP_FOR_FLUSH_CD_LRU(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
/* An entry being flushed or cleared, may not be dirty. Use the \
|
||||
* dirty flag to infer whether the entry is on the clean or dirty \
|
||||
* LRU list, and remove it. Then insert it at the head of the \
|
||||
* clean LRU list. \
|
||||
* \
|
||||
* The function presumes that a dirty entry will be either cleared \
|
||||
* or flushed shortly, so it is OK if we put a dirty entry on the \
|
||||
* clean LRU list. \
|
||||
*/ \
|
||||
if((entry_ptr)->is_dirty) { \
|
||||
H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->dLRU_head_ptr, \
|
||||
(cache_ptr)->dLRU_tail_ptr, \
|
||||
(cache_ptr)->dLRU_list_len, \
|
||||
(cache_ptr)->dLRU_list_size, (fail_val)) \
|
||||
} else { \
|
||||
H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
|
||||
(cache_ptr)->cLRU_tail_ptr, \
|
||||
(cache_ptr)->cLRU_list_len, \
|
||||
(cache_ptr)->cLRU_list_size, (fail_val)) \
|
||||
} \
|
||||
\
|
||||
H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
|
||||
(cache_ptr)->cLRU_tail_ptr, \
|
||||
(cache_ptr)->cLRU_list_len, \
|
||||
(cache_ptr)->cLRU_list_size, (fail_val)) \
|
||||
} while (0) /* H5C__UPDATE_RP_FOR_FLUSH_CD_LRU() */
|
||||
#define H5C__UPDATE_RP_FOR_FLUSH_CD_LRU(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
/* An entry being flushed or cleared, may not be dirty. Use the \
|
||||
* dirty flag to infer whether the entry is on the clean or dirty \
|
||||
* LRU list, and remove it. Then insert it at the head of the \
|
||||
* clean LRU list. \
|
||||
* \
|
||||
* The function presumes that a dirty entry will be either cleared \
|
||||
* or flushed shortly, so it is OK if we put a dirty entry on the \
|
||||
* clean LRU list. \
|
||||
*/ \
|
||||
if ((entry_ptr)->is_dirty) { \
|
||||
H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->dLRU_head_ptr, (cache_ptr)->dLRU_tail_ptr, \
|
||||
(cache_ptr)->dLRU_list_len, (cache_ptr)->dLRU_list_size, (fail_val)) \
|
||||
} \
|
||||
else { \
|
||||
H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->cLRU_head_ptr, (cache_ptr)->cLRU_tail_ptr, \
|
||||
(cache_ptr)->cLRU_list_len, (cache_ptr)->cLRU_list_size, (fail_val)) \
|
||||
} \
|
||||
\
|
||||
H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr, (cache_ptr)->cLRU_tail_ptr, \
|
||||
(cache_ptr)->cLRU_list_len, (cache_ptr)->cLRU_list_size, (fail_val)) \
|
||||
} while (0) /* H5C__UPDATE_RP_FOR_FLUSH_CD_LRU() */
|
||||
|
||||
#define H5C__UPDATE_RP_FOR_INSERT_APPEND_CD_LRU(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
/* Insert the entry at the _tail_ of the clean or dirty LRU list as \
|
||||
* appropriate. \
|
||||
*/ \
|
||||
if((entry_ptr)->is_dirty) { \
|
||||
H5C__AUX_DLL_APPEND((entry_ptr), (cache_ptr)->dLRU_head_ptr, \
|
||||
(cache_ptr)->dLRU_tail_ptr, \
|
||||
(cache_ptr)->dLRU_list_len, \
|
||||
(cache_ptr)->dLRU_list_size, (fail_val)); \
|
||||
} else { \
|
||||
H5C__AUX_DLL_APPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
|
||||
(cache_ptr)->cLRU_tail_ptr, \
|
||||
(cache_ptr)->cLRU_list_len, \
|
||||
(cache_ptr)->cLRU_list_size, (fail_val)); \
|
||||
} \
|
||||
} while (0) /* H5C__UPDATE_RP_FOR_INSERT_APPEND_CD_LRU() */
|
||||
#define H5C__UPDATE_RP_FOR_INSERT_APPEND_CD_LRU(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
/* Insert the entry at the _tail_ of the clean or dirty LRU list as \
|
||||
* appropriate. \
|
||||
*/ \
|
||||
if ((entry_ptr)->is_dirty) { \
|
||||
H5C__AUX_DLL_APPEND((entry_ptr), (cache_ptr)->dLRU_head_ptr, (cache_ptr)->dLRU_tail_ptr, \
|
||||
(cache_ptr)->dLRU_list_len, (cache_ptr)->dLRU_list_size, (fail_val)); \
|
||||
} \
|
||||
else { \
|
||||
H5C__AUX_DLL_APPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr, (cache_ptr)->cLRU_tail_ptr, \
|
||||
(cache_ptr)->cLRU_list_len, (cache_ptr)->cLRU_list_size, (fail_val)); \
|
||||
} \
|
||||
} while (0) /* H5C__UPDATE_RP_FOR_INSERT_APPEND_CD_LRU() */
|
||||
|
||||
#define H5C__UPDATE_RP_FOR_INSERTION_CD_LRU(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
/* Insert the entry at the head of the clean or dirty LRU list as \
|
||||
* appropriate. \
|
||||
*/ \
|
||||
if((entry_ptr)->is_dirty) { \
|
||||
H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->dLRU_head_ptr, \
|
||||
(cache_ptr)->dLRU_tail_ptr, \
|
||||
(cache_ptr)->dLRU_list_len, \
|
||||
(cache_ptr)->dLRU_list_size, (fail_val)) \
|
||||
} else { \
|
||||
H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
|
||||
(cache_ptr)->cLRU_tail_ptr, \
|
||||
(cache_ptr)->cLRU_list_len, \
|
||||
(cache_ptr)->cLRU_list_size, (fail_val)) \
|
||||
} \
|
||||
} while(0) /* H5C__UPDATE_RP_FOR_INSERTION_CD_LRU() */
|
||||
#define H5C__UPDATE_RP_FOR_INSERTION_CD_LRU(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
/* Insert the entry at the head of the clean or dirty LRU list as \
|
||||
* appropriate. \
|
||||
*/ \
|
||||
if ((entry_ptr)->is_dirty) { \
|
||||
H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->dLRU_head_ptr, (cache_ptr)->dLRU_tail_ptr, \
|
||||
(cache_ptr)->dLRU_list_len, (cache_ptr)->dLRU_list_size, (fail_val)) \
|
||||
} \
|
||||
else { \
|
||||
H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr, (cache_ptr)->cLRU_tail_ptr, \
|
||||
(cache_ptr)->cLRU_list_len, (cache_ptr)->cLRU_list_size, (fail_val)) \
|
||||
} \
|
||||
} while (0) /* H5C__UPDATE_RP_FOR_INSERTION_CD_LRU() */
|
||||
|
||||
#define H5C__UPDATE_RP_FOR_PROTECT_CD_LRU(cache_ptr, entry_ptr, fail_val) \
|
||||
{ \
|
||||
/* Remove the entry from the clean or dirty LRU list as appropriate */ \
|
||||
if((entry_ptr)->is_dirty) { \
|
||||
H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->dLRU_head_ptr, \
|
||||
(cache_ptr)->dLRU_tail_ptr, \
|
||||
(cache_ptr)->dLRU_list_len, \
|
||||
(cache_ptr)->dLRU_list_size, (fail_val)) \
|
||||
} else { \
|
||||
H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
|
||||
(cache_ptr)->cLRU_tail_ptr, \
|
||||
(cache_ptr)->cLRU_list_len, \
|
||||
(cache_ptr)->cLRU_list_size, (fail_val)) \
|
||||
} \
|
||||
} while (0) /* H5C__UPDATE_RP_FOR_PROTECT_CD_LRU() */
|
||||
#define H5C__UPDATE_RP_FOR_PROTECT_CD_LRU(cache_ptr, entry_ptr, fail_val) \
|
||||
{ \
|
||||
/* Remove the entry from the clean or dirty LRU list as appropriate */ \
|
||||
if ((entry_ptr)->is_dirty) { \
|
||||
H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->dLRU_head_ptr, (cache_ptr)->dLRU_tail_ptr, \
|
||||
(cache_ptr)->dLRU_list_len, (cache_ptr)->dLRU_list_size, (fail_val)) \
|
||||
} \
|
||||
else { \
|
||||
H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->cLRU_head_ptr, (cache_ptr)->cLRU_tail_ptr, \
|
||||
(cache_ptr)->cLRU_list_len, (cache_ptr)->cLRU_list_size, (fail_val)) \
|
||||
} \
|
||||
} \
|
||||
while (0) /* H5C__UPDATE_RP_FOR_PROTECT_CD_LRU() */
|
||||
|
||||
#define H5C__UPDATE_RP_FOR_MOVE_CD_LRU(cache_ptr, entry_ptr, was_dirty, fail_val) \
|
||||
do { \
|
||||
/* Remove the entry from either the clean or dirty LRU list as \
|
||||
* indicated by the was_dirty parameter \
|
||||
*/ \
|
||||
if(was_dirty) { \
|
||||
H5C__AUX_DLL_REMOVE((entry_ptr), \
|
||||
(cache_ptr)->dLRU_head_ptr, \
|
||||
(cache_ptr)->dLRU_tail_ptr, \
|
||||
(cache_ptr)->dLRU_list_len, \
|
||||
(cache_ptr)->dLRU_list_size, (fail_val)); \
|
||||
\
|
||||
} else { \
|
||||
H5C__AUX_DLL_REMOVE((entry_ptr), \
|
||||
(cache_ptr)->cLRU_head_ptr, \
|
||||
(cache_ptr)->cLRU_tail_ptr, \
|
||||
(cache_ptr)->cLRU_list_len, \
|
||||
(cache_ptr)->cLRU_list_size, (fail_val)); \
|
||||
} \
|
||||
\
|
||||
/* Insert the entry at the head of either the clean or dirty \
|
||||
* LRU list as appropriate. \
|
||||
*/ \
|
||||
if((entry_ptr)->is_dirty) { \
|
||||
H5C__AUX_DLL_PREPEND((entry_ptr), \
|
||||
(cache_ptr)->dLRU_head_ptr, \
|
||||
(cache_ptr)->dLRU_tail_ptr, \
|
||||
(cache_ptr)->dLRU_list_len, \
|
||||
(cache_ptr)->dLRU_list_size, (fail_val)); \
|
||||
} else { \
|
||||
H5C__AUX_DLL_PREPEND((entry_ptr), \
|
||||
(cache_ptr)->cLRU_head_ptr, \
|
||||
(cache_ptr)->cLRU_tail_ptr, \
|
||||
(cache_ptr)->cLRU_list_len, \
|
||||
(cache_ptr)->cLRU_list_size, (fail_val)); \
|
||||
} \
|
||||
} while (0) /* H5C__UPDATE_RP_FOR_MOVE_CD_LRU() */
|
||||
#define H5C__UPDATE_RP_FOR_MOVE_CD_LRU(cache_ptr, entry_ptr, was_dirty, fail_val) \
|
||||
do { \
|
||||
/* Remove the entry from either the clean or dirty LRU list as \
|
||||
* indicated by the was_dirty parameter \
|
||||
*/ \
|
||||
if (was_dirty) { \
|
||||
H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->dLRU_head_ptr, (cache_ptr)->dLRU_tail_ptr, \
|
||||
(cache_ptr)->dLRU_list_len, (cache_ptr)->dLRU_list_size, (fail_val)); \
|
||||
} \
|
||||
else { \
|
||||
H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->cLRU_head_ptr, (cache_ptr)->cLRU_tail_ptr, \
|
||||
(cache_ptr)->cLRU_list_len, (cache_ptr)->cLRU_list_size, (fail_val)); \
|
||||
} \
|
||||
\
|
||||
/* Insert the entry at the head of either the clean or dirty \
|
||||
* LRU list as appropriate. \
|
||||
*/ \
|
||||
if ((entry_ptr)->is_dirty) { \
|
||||
H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->dLRU_head_ptr, (cache_ptr)->dLRU_tail_ptr, \
|
||||
(cache_ptr)->dLRU_list_len, (cache_ptr)->dLRU_list_size, (fail_val)); \
|
||||
} \
|
||||
else { \
|
||||
H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr, (cache_ptr)->cLRU_tail_ptr, \
|
||||
(cache_ptr)->cLRU_list_len, (cache_ptr)->cLRU_list_size, (fail_val)); \
|
||||
} \
|
||||
} while (0) /* H5C__UPDATE_RP_FOR_MOVE_CD_LRU() */
|
||||
|
||||
#define H5C__UPDATE_RP_FOR_SIZE_CHANGE_CD_LRU(cache_ptr, entry_ptr, new_size, fail_val) \
|
||||
do { \
|
||||
/* Update the size of the clean or dirty LRU list as \
|
||||
* appropriate. \
|
||||
*/ \
|
||||
if((entry_ptr)->is_dirty) { \
|
||||
H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->dLRU_list_len, \
|
||||
(cache_ptr)->dLRU_list_size, \
|
||||
(entry_ptr)->size, \
|
||||
(new_size), (fail_val)) \
|
||||
\
|
||||
} else { \
|
||||
H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->cLRU_list_len, \
|
||||
(cache_ptr)->cLRU_list_size, \
|
||||
(entry_ptr)->size, \
|
||||
(new_size), (fail_val)) \
|
||||
} \
|
||||
} while (0) /* H5C__UPDATE_RP_FOR_SIZE_CHANGE_CD_LRU() */
|
||||
#define H5C__UPDATE_RP_FOR_SIZE_CHANGE_CD_LRU(cache_ptr, entry_ptr, new_size, fail_val) \
|
||||
do { \
|
||||
/* Update the size of the clean or dirty LRU list as \
|
||||
* appropriate. \
|
||||
*/ \
|
||||
if ((entry_ptr)->is_dirty) { \
|
||||
H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->dLRU_list_len, (cache_ptr)->dLRU_list_size, \
|
||||
(entry_ptr)->size, (new_size), (fail_val)) \
|
||||
} \
|
||||
else { \
|
||||
H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->cLRU_list_len, (cache_ptr)->cLRU_list_size, \
|
||||
(entry_ptr)->size, (new_size), (fail_val)) \
|
||||
} \
|
||||
} while (0) /* H5C__UPDATE_RP_FOR_SIZE_CHANGE_CD_LRU() */
|
||||
|
||||
#define H5C__UPDATE_RP_FOR_UNPIN_CD_LRU(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
/* Insert the entry at the head of either the clean \
|
||||
* or dirty LRU list as appropriate. \
|
||||
*/ \
|
||||
if((entry_ptr)->is_dirty) { \
|
||||
H5C__AUX_DLL_PREPEND((entry_ptr), \
|
||||
(cache_ptr)->dLRU_head_ptr, \
|
||||
(cache_ptr)->dLRU_tail_ptr, \
|
||||
(cache_ptr)->dLRU_list_len, \
|
||||
(cache_ptr)->dLRU_list_size, (fail_val)) \
|
||||
} else { \
|
||||
H5C__AUX_DLL_PREPEND((entry_ptr), \
|
||||
(cache_ptr)->cLRU_head_ptr, \
|
||||
(cache_ptr)->cLRU_tail_ptr, \
|
||||
(cache_ptr)->cLRU_list_len, \
|
||||
(cache_ptr)->cLRU_list_size, (fail_val)) \
|
||||
} \
|
||||
} while (0) /* H5C__UPDATE_RP_FOR_UNPIN_CD_LRU() */
|
||||
#define H5C__UPDATE_RP_FOR_UNPIN_CD_LRU(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
/* Insert the entry at the head of either the clean \
|
||||
* or dirty LRU list as appropriate. \
|
||||
*/ \
|
||||
if ((entry_ptr)->is_dirty) { \
|
||||
H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->dLRU_head_ptr, (cache_ptr)->dLRU_tail_ptr, \
|
||||
(cache_ptr)->dLRU_list_len, (cache_ptr)->dLRU_list_size, (fail_val)) \
|
||||
} \
|
||||
else { \
|
||||
H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr, (cache_ptr)->cLRU_tail_ptr, \
|
||||
(cache_ptr)->cLRU_list_len, (cache_ptr)->cLRU_list_size, (fail_val)) \
|
||||
} \
|
||||
} while (0) /* H5C__UPDATE_RP_FOR_UNPIN_CD_LRU() */
|
||||
|
||||
#define H5C__UPDATE_RP_FOR_UNPROTECT_CD_LRU(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
/* Insert the entry at the head of either the clean or \
|
||||
* dirty LRU list as appropriate. \
|
||||
*/ \
|
||||
if((entry_ptr)->is_dirty) { \
|
||||
H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->dLRU_head_ptr, \
|
||||
(cache_ptr)->dLRU_tail_ptr, \
|
||||
(cache_ptr)->dLRU_list_len, \
|
||||
(cache_ptr)->dLRU_list_size, (fail_val)) \
|
||||
} else { \
|
||||
H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr, \
|
||||
(cache_ptr)->cLRU_tail_ptr, \
|
||||
(cache_ptr)->cLRU_list_len, \
|
||||
(cache_ptr)->cLRU_list_size, (fail_val)) \
|
||||
} \
|
||||
} while (0) /* H5C__UPDATE_RP_FOR_UNPROTECT_CD_LRU() */
|
||||
#define H5C__UPDATE_RP_FOR_UNPROTECT_CD_LRU(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
/* Insert the entry at the head of either the clean or \
|
||||
* dirty LRU list as appropriate. \
|
||||
*/ \
|
||||
if ((entry_ptr)->is_dirty) { \
|
||||
H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->dLRU_head_ptr, (cache_ptr)->dLRU_tail_ptr, \
|
||||
(cache_ptr)->dLRU_list_len, (cache_ptr)->dLRU_list_size, (fail_val)) \
|
||||
} \
|
||||
else { \
|
||||
H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr, (cache_ptr)->cLRU_tail_ptr, \
|
||||
(cache_ptr)->cLRU_list_len, (cache_ptr)->cLRU_list_size, (fail_val)) \
|
||||
} \
|
||||
} while (0) /* H5C__UPDATE_RP_FOR_UNPROTECT_CD_LRU() */
|
||||
|
||||
#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
|
||||
|
||||
@@ -1410,25 +1331,23 @@ do { \
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#define H5C__UPDATE_RP_FOR_EVICTION(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
assert(cache_ptr); \
|
||||
assert(entry_ptr); \
|
||||
assert(!(entry_ptr)->is_protected); \
|
||||
assert(!(entry_ptr)->is_read_only); \
|
||||
assert((entry_ptr)->ro_ref_count == 0); \
|
||||
assert(!(entry_ptr)->is_pinned); \
|
||||
assert((entry_ptr)->size > 0); \
|
||||
\
|
||||
/* Remove the entry from the LRU list */ \
|
||||
H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
|
||||
(cache_ptr)->LRU_tail_ptr, (cache_ptr)->LRU_list_len, \
|
||||
(cache_ptr)->LRU_list_size, (fail_val)) \
|
||||
\
|
||||
/* Remove the entry from the clean & dirty LRU lists, if enabled */ \
|
||||
H5C__UPDATE_RP_FOR_EVICTION_CD_LRU(cache_ptr, entry_ptr, fail_val); \
|
||||
} while (0) /* H5C__UPDATE_RP_FOR_EVICTION */
|
||||
|
||||
#define H5C__UPDATE_RP_FOR_EVICTION(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
assert(cache_ptr); \
|
||||
assert(entry_ptr); \
|
||||
assert(!(entry_ptr)->is_protected); \
|
||||
assert(!(entry_ptr)->is_read_only); \
|
||||
assert((entry_ptr)->ro_ref_count == 0); \
|
||||
assert(!(entry_ptr)->is_pinned); \
|
||||
assert((entry_ptr)->size > 0); \
|
||||
\
|
||||
/* Remove the entry from the LRU list */ \
|
||||
H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, (cache_ptr)->LRU_tail_ptr, \
|
||||
(cache_ptr)->LRU_list_len, (cache_ptr)->LRU_list_size, (fail_val)) \
|
||||
\
|
||||
/* Remove the entry from the clean & dirty LRU lists, if enabled */ \
|
||||
H5C__UPDATE_RP_FOR_EVICTION_CD_LRU(cache_ptr, entry_ptr, fail_val); \
|
||||
} while (0) /* H5C__UPDATE_RP_FOR_EVICTION */
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
@@ -1440,34 +1359,29 @@ do {
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#define H5C__UPDATE_RP_FOR_FLUSH(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
assert(cache_ptr); \
|
||||
assert(entry_ptr); \
|
||||
assert(!(entry_ptr)->is_protected); \
|
||||
assert(!(entry_ptr)->is_read_only); \
|
||||
assert((entry_ptr)->ro_ref_count == 0); \
|
||||
assert((entry_ptr)->size > 0); \
|
||||
\
|
||||
if(!(entry_ptr)->is_pinned) { \
|
||||
/* Remove the entry from its location in the LRU list \
|
||||
* and re-insert it at the head of the list. \
|
||||
*/ \
|
||||
H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
|
||||
(cache_ptr)->LRU_tail_ptr, \
|
||||
(cache_ptr)->LRU_list_len, \
|
||||
(cache_ptr)->LRU_list_size, (fail_val)) \
|
||||
\
|
||||
H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
|
||||
(cache_ptr)->LRU_tail_ptr, \
|
||||
(cache_ptr)->LRU_list_len, \
|
||||
(cache_ptr)->LRU_list_size, (fail_val)) \
|
||||
\
|
||||
/* Maintain the clean & dirty LRU lists, if enabled */ \
|
||||
H5C__UPDATE_RP_FOR_FLUSH_CD_LRU(cache_ptr, entry_ptr, fail_val); \
|
||||
} \
|
||||
} while (0) /* H5C__UPDATE_RP_FOR_FLUSH */
|
||||
|
||||
#define H5C__UPDATE_RP_FOR_FLUSH(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
assert(cache_ptr); \
|
||||
assert(entry_ptr); \
|
||||
assert(!(entry_ptr)->is_protected); \
|
||||
assert(!(entry_ptr)->is_read_only); \
|
||||
assert((entry_ptr)->ro_ref_count == 0); \
|
||||
assert((entry_ptr)->size > 0); \
|
||||
\
|
||||
if (!(entry_ptr)->is_pinned) { \
|
||||
/* Remove the entry from its location in the LRU list \
|
||||
* and re-insert it at the head of the list. \
|
||||
*/ \
|
||||
H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, (cache_ptr)->LRU_tail_ptr, \
|
||||
(cache_ptr)->LRU_list_len, (cache_ptr)->LRU_list_size, (fail_val)) \
|
||||
\
|
||||
H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, (cache_ptr)->LRU_tail_ptr, \
|
||||
(cache_ptr)->LRU_list_len, (cache_ptr)->LRU_list_size, (fail_val)) \
|
||||
\
|
||||
/* Maintain the clean & dirty LRU lists, if enabled */ \
|
||||
H5C__UPDATE_RP_FOR_FLUSH_CD_LRU(cache_ptr, entry_ptr, fail_val); \
|
||||
} \
|
||||
} while (0) /* H5C__UPDATE_RP_FOR_FLUSH */
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
@@ -1483,32 +1397,28 @@ do { \
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#define H5C__UPDATE_RP_FOR_INSERT_APPEND(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
assert(cache_ptr); \
|
||||
assert(entry_ptr); \
|
||||
assert(!(entry_ptr)->is_protected); \
|
||||
assert(!(entry_ptr)->is_read_only); \
|
||||
assert((entry_ptr)->ro_ref_count == 0 ); \
|
||||
assert((entry_ptr)->size > 0 ); \
|
||||
\
|
||||
if((entry_ptr)->is_pinned) { \
|
||||
H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->pel_head_ptr, \
|
||||
(cache_ptr)->pel_tail_ptr, \
|
||||
(cache_ptr)->pel_len, \
|
||||
(cache_ptr)->pel_size, (fail_val)) \
|
||||
} else { \
|
||||
/* Insert the entry at the tail of the LRU list. */ \
|
||||
H5C__DLL_APPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
|
||||
(cache_ptr)->LRU_tail_ptr, \
|
||||
(cache_ptr)->LRU_list_len, \
|
||||
(cache_ptr)->LRU_list_size, (fail_val)) \
|
||||
\
|
||||
/* Maintain the clean & dirty LRU lists, if enabled */ \
|
||||
H5C__UPDATE_RP_FOR_INSERT_APPEND_CD_LRU(cache_ptr, entry_ptr, fail_val); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define H5C__UPDATE_RP_FOR_INSERT_APPEND(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
assert(cache_ptr); \
|
||||
assert(entry_ptr); \
|
||||
assert(!(entry_ptr)->is_protected); \
|
||||
assert(!(entry_ptr)->is_read_only); \
|
||||
assert((entry_ptr)->ro_ref_count == 0); \
|
||||
assert((entry_ptr)->size > 0); \
|
||||
\
|
||||
if ((entry_ptr)->is_pinned) { \
|
||||
H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->pel_head_ptr, (cache_ptr)->pel_tail_ptr, \
|
||||
(cache_ptr)->pel_len, (cache_ptr)->pel_size, (fail_val)) \
|
||||
} \
|
||||
else { \
|
||||
/* Insert the entry at the tail of the LRU list. */ \
|
||||
H5C__DLL_APPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, (cache_ptr)->LRU_tail_ptr, \
|
||||
(cache_ptr)->LRU_list_len, (cache_ptr)->LRU_list_size, (fail_val)) \
|
||||
\
|
||||
/* Maintain the clean & dirty LRU lists, if enabled */ \
|
||||
H5C__UPDATE_RP_FOR_INSERT_APPEND_CD_LRU(cache_ptr, entry_ptr, fail_val); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
@@ -1520,33 +1430,28 @@ do { \
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#define H5C__UPDATE_RP_FOR_INSERTION(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
assert(cache_ptr); \
|
||||
assert(entry_ptr); \
|
||||
assert(!(entry_ptr)->is_protected); \
|
||||
assert(!(entry_ptr)->is_read_only); \
|
||||
assert((entry_ptr)->ro_ref_count == 0); \
|
||||
assert((entry_ptr)->size > 0); \
|
||||
\
|
||||
if((entry_ptr)->is_pinned) { \
|
||||
H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->pel_head_ptr, \
|
||||
(cache_ptr)->pel_tail_ptr, \
|
||||
(cache_ptr)->pel_len, \
|
||||
(cache_ptr)->pel_size, (fail_val)) \
|
||||
\
|
||||
} else { \
|
||||
/* Insert the entry at the head of the LRU list. */ \
|
||||
H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
|
||||
(cache_ptr)->LRU_tail_ptr, \
|
||||
(cache_ptr)->LRU_list_len, \
|
||||
(cache_ptr)->LRU_list_size, (fail_val)) \
|
||||
\
|
||||
/* Maintain the clean & dirty LRU lists, if enabled */ \
|
||||
H5C__UPDATE_RP_FOR_INSERTION_CD_LRU(cache_ptr, entry_ptr, fail_val); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define H5C__UPDATE_RP_FOR_INSERTION(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
assert(cache_ptr); \
|
||||
assert(entry_ptr); \
|
||||
assert(!(entry_ptr)->is_protected); \
|
||||
assert(!(entry_ptr)->is_read_only); \
|
||||
assert((entry_ptr)->ro_ref_count == 0); \
|
||||
assert((entry_ptr)->size > 0); \
|
||||
\
|
||||
if ((entry_ptr)->is_pinned) { \
|
||||
H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->pel_head_ptr, (cache_ptr)->pel_tail_ptr, \
|
||||
(cache_ptr)->pel_len, (cache_ptr)->pel_size, (fail_val)) \
|
||||
} \
|
||||
else { \
|
||||
/* Insert the entry at the head of the LRU list. */ \
|
||||
H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, (cache_ptr)->LRU_tail_ptr, \
|
||||
(cache_ptr)->LRU_list_len, (cache_ptr)->LRU_list_size, (fail_val)) \
|
||||
\
|
||||
/* Maintain the clean & dirty LRU lists, if enabled */ \
|
||||
H5C__UPDATE_RP_FOR_INSERTION_CD_LRU(cache_ptr, entry_ptr, fail_val); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
@@ -1563,40 +1468,34 @@ do { \
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#define H5C__UPDATE_RP_FOR_PROTECT(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
assert(cache_ptr); \
|
||||
assert(entry_ptr); \
|
||||
assert(!(entry_ptr)->is_protected); \
|
||||
assert(!(entry_ptr)->is_read_only); \
|
||||
assert((entry_ptr)->ro_ref_count == 0); \
|
||||
assert((entry_ptr)->size > 0); \
|
||||
\
|
||||
if((entry_ptr)->is_pinned) { \
|
||||
H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pel_head_ptr, \
|
||||
(cache_ptr)->pel_tail_ptr, \
|
||||
(cache_ptr)->pel_len, \
|
||||
(cache_ptr)->pel_size, (fail_val)) \
|
||||
} else { \
|
||||
/* Remove the entry from the LRU list. */ \
|
||||
H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
|
||||
(cache_ptr)->LRU_tail_ptr, \
|
||||
(cache_ptr)->LRU_list_len, \
|
||||
(cache_ptr)->LRU_list_size, (fail_val)) \
|
||||
\
|
||||
/* Maintain the clean & dirty LRU lists, if enabled */ \
|
||||
H5C__UPDATE_RP_FOR_PROTECT_CD_LRU(cache_ptr, entry_ptr, fail_val); \
|
||||
} \
|
||||
\
|
||||
/* Regardless of whether the entry is pinned, add it to the protected \
|
||||
* list. \
|
||||
*/ \
|
||||
H5C__DLL_APPEND((entry_ptr), (cache_ptr)->pl_head_ptr, \
|
||||
(cache_ptr)->pl_tail_ptr, \
|
||||
(cache_ptr)->pl_len, \
|
||||
(cache_ptr)->pl_size, (fail_val)) \
|
||||
} while (0) /* H5C__UPDATE_RP_FOR_PROTECT */
|
||||
|
||||
#define H5C__UPDATE_RP_FOR_PROTECT(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
assert(cache_ptr); \
|
||||
assert(entry_ptr); \
|
||||
assert(!(entry_ptr)->is_protected); \
|
||||
assert(!(entry_ptr)->is_read_only); \
|
||||
assert((entry_ptr)->ro_ref_count == 0); \
|
||||
assert((entry_ptr)->size > 0); \
|
||||
\
|
||||
if ((entry_ptr)->is_pinned) { \
|
||||
H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pel_head_ptr, (cache_ptr)->pel_tail_ptr, \
|
||||
(cache_ptr)->pel_len, (cache_ptr)->pel_size, (fail_val)) \
|
||||
} \
|
||||
else { \
|
||||
/* Remove the entry from the LRU list. */ \
|
||||
H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, (cache_ptr)->LRU_tail_ptr, \
|
||||
(cache_ptr)->LRU_list_len, (cache_ptr)->LRU_list_size, (fail_val)) \
|
||||
\
|
||||
/* Maintain the clean & dirty LRU lists, if enabled */ \
|
||||
H5C__UPDATE_RP_FOR_PROTECT_CD_LRU(cache_ptr, entry_ptr, fail_val); \
|
||||
} \
|
||||
\
|
||||
/* Regardless of whether the entry is pinned, add it to the protected \
|
||||
* list. \
|
||||
*/ \
|
||||
H5C__DLL_APPEND((entry_ptr), (cache_ptr)->pl_head_ptr, (cache_ptr)->pl_tail_ptr, \
|
||||
(cache_ptr)->pl_len, (cache_ptr)->pl_size, (fail_val)) \
|
||||
} while (0) /* H5C__UPDATE_RP_FOR_PROTECT */
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
@@ -1608,32 +1507,27 @@ do { \
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#define H5C__UPDATE_RP_FOR_MOVE(cache_ptr, entry_ptr, was_dirty, fail_val) \
|
||||
do { \
|
||||
assert(cache_ptr); \
|
||||
assert(entry_ptr); \
|
||||
assert(!(entry_ptr)->is_read_only); \
|
||||
assert((entry_ptr)->ro_ref_count == 0); \
|
||||
assert((entry_ptr)->size > 0); \
|
||||
\
|
||||
if(!(entry_ptr)->is_pinned && !(entry_ptr)->is_protected) { \
|
||||
/* Remove the entry from the LRU list, and re-insert it at the head. \
|
||||
*/ \
|
||||
H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, \
|
||||
(cache_ptr)->LRU_tail_ptr, \
|
||||
(cache_ptr)->LRU_list_len, \
|
||||
(cache_ptr)->LRU_list_size, (fail_val)) \
|
||||
\
|
||||
H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
|
||||
(cache_ptr)->LRU_tail_ptr, \
|
||||
(cache_ptr)->LRU_list_len, \
|
||||
(cache_ptr)->LRU_list_size, (fail_val)) \
|
||||
\
|
||||
/* Maintain the clean & dirty LRU lists, if enabled */ \
|
||||
H5C__UPDATE_RP_FOR_MOVE_CD_LRU(cache_ptr, entry_ptr, was_dirty, fail_val); \
|
||||
} \
|
||||
} while (0) /* H5C__UPDATE_RP_FOR_MOVE */
|
||||
|
||||
#define H5C__UPDATE_RP_FOR_MOVE(cache_ptr, entry_ptr, was_dirty, fail_val) \
|
||||
do { \
|
||||
assert(cache_ptr); \
|
||||
assert(entry_ptr); \
|
||||
assert(!(entry_ptr)->is_read_only); \
|
||||
assert((entry_ptr)->ro_ref_count == 0); \
|
||||
assert((entry_ptr)->size > 0); \
|
||||
\
|
||||
if (!(entry_ptr)->is_pinned && !(entry_ptr)->is_protected) { \
|
||||
/* Remove the entry from the LRU list, and re-insert it at the head. \
|
||||
*/ \
|
||||
H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr, (cache_ptr)->LRU_tail_ptr, \
|
||||
(cache_ptr)->LRU_list_len, (cache_ptr)->LRU_list_size, (fail_val)) \
|
||||
\
|
||||
H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, (cache_ptr)->LRU_tail_ptr, \
|
||||
(cache_ptr)->LRU_list_len, (cache_ptr)->LRU_list_size, (fail_val)) \
|
||||
\
|
||||
/* Maintain the clean & dirty LRU lists, if enabled */ \
|
||||
H5C__UPDATE_RP_FOR_MOVE_CD_LRU(cache_ptr, entry_ptr, was_dirty, fail_val); \
|
||||
} \
|
||||
} while (0) /* H5C__UPDATE_RP_FOR_MOVE */
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
@@ -1657,16 +1551,13 @@ do { \
|
||||
|
||||
#ifdef H5_HAVE_PARALLEL
|
||||
|
||||
#define H5C__UPDATE_RP_FOR_SIZE_CHANGE_COLL(cache_ptr, entry_ptr, new_size, fail_val) \
|
||||
do { \
|
||||
if((entry_ptr)->coll_access) { \
|
||||
H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->coll_list_len, \
|
||||
(cache_ptr)->coll_list_size, \
|
||||
(entry_ptr)->size, \
|
||||
(new_size), (fail_val)); \
|
||||
\
|
||||
} \
|
||||
} while (0) /* H5C__UPDATE_RP_FOR_SIZE_CHANGE_COLL() */
|
||||
#define H5C__UPDATE_RP_FOR_SIZE_CHANGE_COLL(cache_ptr, entry_ptr, new_size, fail_val) \
|
||||
do { \
|
||||
if ((entry_ptr)->coll_access) { \
|
||||
H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->coll_list_len, (cache_ptr)->coll_list_size, \
|
||||
(entry_ptr)->size, (new_size), (fail_val)); \
|
||||
} \
|
||||
} while (0) /* H5C__UPDATE_RP_FOR_SIZE_CHANGE_COLL() */
|
||||
|
||||
#else /* H5_HAVE_PARALLEL */
|
||||
|
||||
@@ -1674,36 +1565,32 @@ do { \
|
||||
|
||||
#endif /* H5_HAVE_PARALLEL */
|
||||
|
||||
#define H5C__UPDATE_RP_FOR_SIZE_CHANGE(cache_ptr, entry_ptr, new_size, fail_val) \
|
||||
do { \
|
||||
assert(cache_ptr); \
|
||||
assert(entry_ptr); \
|
||||
assert(!(entry_ptr)->is_protected); \
|
||||
assert(!(entry_ptr)->is_read_only); \
|
||||
assert((entry_ptr)->ro_ref_count == 0); \
|
||||
assert((entry_ptr)->size > 0 ); \
|
||||
assert(new_size > 0 ); \
|
||||
\
|
||||
/* Maintain the collective access list, if enabled */ \
|
||||
H5C__UPDATE_RP_FOR_SIZE_CHANGE_COLL(cache_ptr, entry_ptr, new_size, fail_val); \
|
||||
\
|
||||
if((entry_ptr)->is_pinned) { \
|
||||
H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->pel_len, \
|
||||
(cache_ptr)->pel_size, \
|
||||
(entry_ptr)->size, \
|
||||
(new_size), (fail_val)) \
|
||||
} else { \
|
||||
/* Update the size of the LRU list */ \
|
||||
H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->LRU_list_len, \
|
||||
(cache_ptr)->LRU_list_size, \
|
||||
(entry_ptr)->size, \
|
||||
(new_size), (fail_val)) \
|
||||
\
|
||||
/* Maintain the clean & dirty LRU lists, if enabled */ \
|
||||
H5C__UPDATE_RP_FOR_SIZE_CHANGE_CD_LRU(cache_ptr, entry_ptr, new_size, fail_val); \
|
||||
} \
|
||||
} while (0) /* H5C__UPDATE_RP_FOR_SIZE_CHANGE */
|
||||
|
||||
#define H5C__UPDATE_RP_FOR_SIZE_CHANGE(cache_ptr, entry_ptr, new_size, fail_val) \
|
||||
do { \
|
||||
assert(cache_ptr); \
|
||||
assert(entry_ptr); \
|
||||
assert(!(entry_ptr)->is_protected); \
|
||||
assert(!(entry_ptr)->is_read_only); \
|
||||
assert((entry_ptr)->ro_ref_count == 0); \
|
||||
assert((entry_ptr)->size > 0); \
|
||||
assert(new_size > 0); \
|
||||
\
|
||||
/* Maintain the collective access list, if enabled */ \
|
||||
H5C__UPDATE_RP_FOR_SIZE_CHANGE_COLL(cache_ptr, entry_ptr, new_size, fail_val); \
|
||||
\
|
||||
if ((entry_ptr)->is_pinned) { \
|
||||
H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->pel_len, (cache_ptr)->pel_size, (entry_ptr)->size, \
|
||||
(new_size), (fail_val)) \
|
||||
} \
|
||||
else { \
|
||||
/* Update the size of the LRU list */ \
|
||||
H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->LRU_list_len, (cache_ptr)->LRU_list_size, \
|
||||
(entry_ptr)->size, (new_size), (fail_val)) \
|
||||
\
|
||||
/* Maintain the clean & dirty LRU lists, if enabled */ \
|
||||
H5C__UPDATE_RP_FOR_SIZE_CHANGE_CD_LRU(cache_ptr, entry_ptr, new_size, fail_val); \
|
||||
} \
|
||||
} while (0) /* H5C__UPDATE_RP_FOR_SIZE_CHANGE */
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
@@ -1719,33 +1606,29 @@ do { \
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#define H5C__UPDATE_RP_FOR_UNPIN(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
assert(cache_ptr); \
|
||||
assert(entry_ptr); \
|
||||
assert(!(entry_ptr)->is_protected); \
|
||||
assert(!(entry_ptr)->is_read_only); \
|
||||
assert((entry_ptr)->ro_ref_count == 0 ); \
|
||||
assert((entry_ptr)->is_pinned); \
|
||||
assert((entry_ptr)->size > 0); \
|
||||
\
|
||||
/* Regardless of the replacement policy, remove the entry from the \
|
||||
* pinned entry list. \
|
||||
*/ \
|
||||
H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pel_head_ptr, \
|
||||
(cache_ptr)->pel_tail_ptr, (cache_ptr)->pel_len, \
|
||||
(cache_ptr)->pel_size, (fail_val)); \
|
||||
\
|
||||
/* Insert the entry at the head of the LRU list. */ \
|
||||
H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
|
||||
(cache_ptr)->LRU_tail_ptr, \
|
||||
(cache_ptr)->LRU_list_len, \
|
||||
(cache_ptr)->LRU_list_size, (fail_val)); \
|
||||
\
|
||||
/* Maintain the clean & dirty LRU lists, if enabled */ \
|
||||
H5C__UPDATE_RP_FOR_UNPIN_CD_LRU(cache_ptr, entry_ptr, fail_val); \
|
||||
} while(0) /* H5C__UPDATE_RP_FOR_UNPIN */
|
||||
|
||||
#define H5C__UPDATE_RP_FOR_UNPIN(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
assert(cache_ptr); \
|
||||
assert(entry_ptr); \
|
||||
assert(!(entry_ptr)->is_protected); \
|
||||
assert(!(entry_ptr)->is_read_only); \
|
||||
assert((entry_ptr)->ro_ref_count == 0); \
|
||||
assert((entry_ptr)->is_pinned); \
|
||||
assert((entry_ptr)->size > 0); \
|
||||
\
|
||||
/* Regardless of the replacement policy, remove the entry from the \
|
||||
* pinned entry list. \
|
||||
*/ \
|
||||
H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pel_head_ptr, (cache_ptr)->pel_tail_ptr, \
|
||||
(cache_ptr)->pel_len, (cache_ptr)->pel_size, (fail_val)); \
|
||||
\
|
||||
/* Insert the entry at the head of the LRU list. */ \
|
||||
H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, (cache_ptr)->LRU_tail_ptr, \
|
||||
(cache_ptr)->LRU_list_len, (cache_ptr)->LRU_list_size, (fail_val)); \
|
||||
\
|
||||
/* Maintain the clean & dirty LRU lists, if enabled */ \
|
||||
H5C__UPDATE_RP_FOR_UNPIN_CD_LRU(cache_ptr, entry_ptr, fail_val); \
|
||||
} while (0) /* H5C__UPDATE_RP_FOR_UNPIN */
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
@@ -1761,47 +1644,41 @@ do { \
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#define H5C__UPDATE_RP_FOR_UNPROTECT(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
assert(cache_ptr); \
|
||||
assert(entry_ptr); \
|
||||
assert((entry_ptr)->is_protected); \
|
||||
assert((entry_ptr)->size > 0); \
|
||||
\
|
||||
/* Regardless of the replacement policy, remove the entry from the \
|
||||
* protected list. \
|
||||
*/ \
|
||||
H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pl_head_ptr, \
|
||||
(cache_ptr)->pl_tail_ptr, (cache_ptr)->pl_len, \
|
||||
(cache_ptr)->pl_size, (fail_val)) \
|
||||
\
|
||||
if((entry_ptr)->is_pinned) { \
|
||||
H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->pel_head_ptr, \
|
||||
(cache_ptr)->pel_tail_ptr, \
|
||||
(cache_ptr)->pel_len, \
|
||||
(cache_ptr)->pel_size, (fail_val)) \
|
||||
} else { \
|
||||
/* Insert the entry at the head of the LRU list. */ \
|
||||
H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, \
|
||||
(cache_ptr)->LRU_tail_ptr, \
|
||||
(cache_ptr)->LRU_list_len, \
|
||||
(cache_ptr)->LRU_list_size, (fail_val)) \
|
||||
\
|
||||
/* Maintain the clean & dirty LRU lists, if enabled */ \
|
||||
H5C__UPDATE_RP_FOR_UNPROTECT_CD_LRU(cache_ptr, entry_ptr, fail_val); \
|
||||
} \
|
||||
} while (0) /* H5C__UPDATE_RP_FOR_UNPROTECT */
|
||||
|
||||
#define H5C__UPDATE_RP_FOR_UNPROTECT(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
assert(cache_ptr); \
|
||||
assert(entry_ptr); \
|
||||
assert((entry_ptr)->is_protected); \
|
||||
assert((entry_ptr)->size > 0); \
|
||||
\
|
||||
/* Regardless of the replacement policy, remove the entry from the \
|
||||
* protected list. \
|
||||
*/ \
|
||||
H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pl_head_ptr, (cache_ptr)->pl_tail_ptr, \
|
||||
(cache_ptr)->pl_len, (cache_ptr)->pl_size, (fail_val)) \
|
||||
\
|
||||
if ((entry_ptr)->is_pinned) { \
|
||||
H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->pel_head_ptr, (cache_ptr)->pel_tail_ptr, \
|
||||
(cache_ptr)->pel_len, (cache_ptr)->pel_size, (fail_val)) \
|
||||
} \
|
||||
else { \
|
||||
/* Insert the entry at the head of the LRU list. */ \
|
||||
H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr, (cache_ptr)->LRU_tail_ptr, \
|
||||
(cache_ptr)->LRU_list_len, (cache_ptr)->LRU_list_size, (fail_val)) \
|
||||
\
|
||||
/* Maintain the clean & dirty LRU lists, if enabled */ \
|
||||
H5C__UPDATE_RP_FOR_UNPROTECT_CD_LRU(cache_ptr, entry_ptr, fail_val); \
|
||||
} \
|
||||
} while (0) /* H5C__UPDATE_RP_FOR_UNPROTECT */
|
||||
|
||||
#ifdef H5_HAVE_PARALLEL
|
||||
|
||||
/* Macros that modify the "collective I/O" LRU list */
|
||||
#define H5C__COLL_DLL_PREPEND(entry_ptr, head_ptr, tail_ptr, len, list_size, fail_val) \
|
||||
#define H5C__COLL_DLL_PREPEND(entry_ptr, head_ptr, tail_ptr, len, list_size, fail_val) \
|
||||
H5C__GEN_DLL_PREPEND(entry_ptr, coll_next, coll_prev, head_ptr, tail_ptr, len, list_size, fail_val)
|
||||
#define H5C__COLL_DLL_REMOVE(entry_ptr, head_ptr, tail_ptr, len, list_size, fail_val) \
|
||||
#define H5C__COLL_DLL_REMOVE(entry_ptr, head_ptr, tail_ptr, len, list_size, fail_val) \
|
||||
H5C__GEN_DLL_REMOVE(entry_ptr, coll_next, coll_prev, head_ptr, tail_ptr, len, list_size, fail_val)
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* Macro: H5C__INSERT_IN_COLL_LIST
|
||||
@@ -1811,18 +1688,15 @@ do { \
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#define H5C__INSERT_IN_COLL_LIST(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
assert(cache_ptr); \
|
||||
assert(entry_ptr); \
|
||||
\
|
||||
/* Insert the entry at the head of the list. */ \
|
||||
H5C__COLL_DLL_PREPEND((entry_ptr), (cache_ptr)->coll_head_ptr, \
|
||||
(cache_ptr)->coll_tail_ptr, \
|
||||
(cache_ptr)->coll_list_len, \
|
||||
(cache_ptr)->coll_list_size, (fail_val)) \
|
||||
} while (0) /* H5C__INSERT_IN_COLL_LIST */
|
||||
|
||||
#define H5C__INSERT_IN_COLL_LIST(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
assert(cache_ptr); \
|
||||
assert(entry_ptr); \
|
||||
\
|
||||
/* Insert the entry at the head of the list. */ \
|
||||
H5C__COLL_DLL_PREPEND((entry_ptr), (cache_ptr)->coll_head_ptr, (cache_ptr)->coll_tail_ptr, \
|
||||
(cache_ptr)->coll_list_len, (cache_ptr)->coll_list_size, (fail_val)) \
|
||||
} while (0) /* H5C__INSERT_IN_COLL_LIST */
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
@@ -1833,18 +1707,15 @@ do { \
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#define H5C__REMOVE_FROM_COLL_LIST(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
assert(cache_ptr); \
|
||||
assert(entry_ptr); \
|
||||
\
|
||||
/* Remove the entry from the list. */ \
|
||||
H5C__COLL_DLL_REMOVE((entry_ptr), (cache_ptr)->coll_head_ptr, \
|
||||
(cache_ptr)->coll_tail_ptr, \
|
||||
(cache_ptr)->coll_list_len, \
|
||||
(cache_ptr)->coll_list_size, (fail_val)) \
|
||||
} while (0) /* H5C__REMOVE_FROM_COLL_LIST */
|
||||
|
||||
#define H5C__REMOVE_FROM_COLL_LIST(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
assert(cache_ptr); \
|
||||
assert(entry_ptr); \
|
||||
\
|
||||
/* Remove the entry from the list. */ \
|
||||
H5C__COLL_DLL_REMOVE((entry_ptr), (cache_ptr)->coll_head_ptr, (cache_ptr)->coll_tail_ptr, \
|
||||
(cache_ptr)->coll_list_len, (cache_ptr)->coll_list_size, (fail_val)) \
|
||||
} while (0) /* H5C__REMOVE_FROM_COLL_LIST */
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
@@ -1855,25 +1726,20 @@ do { \
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#define H5C__MOVE_TO_TOP_IN_COLL_LIST(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
assert(cache_ptr); \
|
||||
assert(entry_ptr); \
|
||||
\
|
||||
/* Remove entry and insert at the head of the list. */ \
|
||||
H5C__COLL_DLL_REMOVE((entry_ptr), (cache_ptr)->coll_head_ptr, \
|
||||
(cache_ptr)->coll_tail_ptr, \
|
||||
(cache_ptr)->coll_list_len, \
|
||||
(cache_ptr)->coll_list_size, (fail_val)) \
|
||||
\
|
||||
H5C__COLL_DLL_PREPEND((entry_ptr), (cache_ptr)->coll_head_ptr, \
|
||||
(cache_ptr)->coll_tail_ptr, \
|
||||
(cache_ptr)->coll_list_len, \
|
||||
(cache_ptr)->coll_list_size, (fail_val)) \
|
||||
\
|
||||
} while (0) /* H5C__MOVE_TO_TOP_IN_COLL_LIST */
|
||||
#endif /* H5_HAVE_PARALLEL */
|
||||
|
||||
#define H5C__MOVE_TO_TOP_IN_COLL_LIST(cache_ptr, entry_ptr, fail_val) \
|
||||
do { \
|
||||
assert(cache_ptr); \
|
||||
assert(entry_ptr); \
|
||||
\
|
||||
/* Remove entry and insert at the head of the list. */ \
|
||||
H5C__COLL_DLL_REMOVE((entry_ptr), (cache_ptr)->coll_head_ptr, (cache_ptr)->coll_tail_ptr, \
|
||||
(cache_ptr)->coll_list_len, (cache_ptr)->coll_list_size, (fail_val)) \
|
||||
\
|
||||
H5C__COLL_DLL_PREPEND((entry_ptr), (cache_ptr)->coll_head_ptr, (cache_ptr)->coll_tail_ptr, \
|
||||
(cache_ptr)->coll_list_len, (cache_ptr)->coll_list_size, (fail_val)) \
|
||||
\
|
||||
} while (0) /* H5C__MOVE_TO_TOP_IN_COLL_LIST */
|
||||
#endif /* H5_HAVE_PARALLEL */
|
||||
|
||||
/****************************/
|
||||
/* Package Private Typedefs */
|
||||
@@ -1908,16 +1774,15 @@ do { \
|
||||
*
|
||||
****************************************************************************/
|
||||
typedef struct H5C_tag_info_t {
|
||||
haddr_t tag; /* Tag (address) of the entries (must be first, for skiplist) */
|
||||
H5C_cache_entry_t *head; /* Head of the list of entries for this tag */
|
||||
size_t entry_cnt; /* Number of entries on list */
|
||||
bool corked; /* Whether this object is corked */
|
||||
haddr_t tag; /* Tag (address) of the entries (must be first, for skiplist) */
|
||||
H5C_cache_entry_t *head; /* Head of the list of entries for this tag */
|
||||
size_t entry_cnt; /* Number of entries on list */
|
||||
bool corked; /* Whether this object is corked */
|
||||
|
||||
/* Hash table fields */
|
||||
UT_hash_handle hh; /* Hash table handle (must be LAST) */
|
||||
UT_hash_handle hh; /* Hash table handle (must be LAST) */
|
||||
} H5C_tag_info_t;
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
*
|
||||
* structure H5C_t
|
||||
@@ -2997,237 +2862,237 @@ typedef struct H5C_tag_info_t {
|
||||
*
|
||||
****************************************************************************/
|
||||
struct H5C_t {
|
||||
bool flush_in_progress;
|
||||
H5C_log_info_t * log_info;
|
||||
void * aux_ptr;
|
||||
int32_t max_type_id;
|
||||
const H5C_class_t * const *class_table_ptr;
|
||||
size_t max_cache_size;
|
||||
size_t min_clean_size;
|
||||
bool flush_in_progress;
|
||||
H5C_log_info_t *log_info;
|
||||
void *aux_ptr;
|
||||
int32_t max_type_id;
|
||||
const H5C_class_t *const *class_table_ptr;
|
||||
size_t max_cache_size;
|
||||
size_t min_clean_size;
|
||||
H5C_write_permitted_func_t check_write_permitted;
|
||||
bool write_permitted;
|
||||
H5C_log_flush_func_t log_flush;
|
||||
bool evictions_enabled;
|
||||
bool close_warning_received;
|
||||
bool write_permitted;
|
||||
H5C_log_flush_func_t log_flush;
|
||||
bool evictions_enabled;
|
||||
bool close_warning_received;
|
||||
|
||||
/* Fields for maintaining the [hash table] index of entries */
|
||||
uint32_t index_len;
|
||||
size_t index_size;
|
||||
uint32_t index_ring_len[H5C_RING_NTYPES];
|
||||
size_t index_ring_size[H5C_RING_NTYPES];
|
||||
size_t clean_index_size;
|
||||
size_t clean_index_ring_size[H5C_RING_NTYPES];
|
||||
size_t dirty_index_size;
|
||||
size_t dirty_index_ring_size[H5C_RING_NTYPES];
|
||||
H5C_cache_entry_t * index[H5C__HASH_TABLE_LEN];
|
||||
uint32_t il_len;
|
||||
size_t il_size;
|
||||
H5C_cache_entry_t * il_head;
|
||||
H5C_cache_entry_t * il_tail;
|
||||
uint32_t index_len;
|
||||
size_t index_size;
|
||||
uint32_t index_ring_len[H5C_RING_NTYPES];
|
||||
size_t index_ring_size[H5C_RING_NTYPES];
|
||||
size_t clean_index_size;
|
||||
size_t clean_index_ring_size[H5C_RING_NTYPES];
|
||||
size_t dirty_index_size;
|
||||
size_t dirty_index_ring_size[H5C_RING_NTYPES];
|
||||
H5C_cache_entry_t *index[H5C__HASH_TABLE_LEN];
|
||||
uint32_t il_len;
|
||||
size_t il_size;
|
||||
H5C_cache_entry_t *il_head;
|
||||
H5C_cache_entry_t *il_tail;
|
||||
|
||||
/* Fields to detect entries removed during scans */
|
||||
int64_t entries_removed_counter;
|
||||
H5C_cache_entry_t * last_entry_removed_ptr;
|
||||
H5C_cache_entry_t * entry_watched_for_removal;
|
||||
int64_t entries_removed_counter;
|
||||
H5C_cache_entry_t *last_entry_removed_ptr;
|
||||
H5C_cache_entry_t *entry_watched_for_removal;
|
||||
|
||||
/* Fields for maintaining list of in-order entries, for flushing */
|
||||
bool slist_enabled;
|
||||
bool slist_changed;
|
||||
uint32_t slist_len;
|
||||
size_t slist_size;
|
||||
uint32_t slist_ring_len[H5C_RING_NTYPES];
|
||||
size_t slist_ring_size[H5C_RING_NTYPES];
|
||||
H5SL_t * slist_ptr;
|
||||
uint32_t num_last_entries;
|
||||
bool slist_enabled;
|
||||
bool slist_changed;
|
||||
uint32_t slist_len;
|
||||
size_t slist_size;
|
||||
uint32_t slist_ring_len[H5C_RING_NTYPES];
|
||||
size_t slist_ring_size[H5C_RING_NTYPES];
|
||||
H5SL_t *slist_ptr;
|
||||
uint32_t num_last_entries;
|
||||
#ifdef H5C_DO_SANITY_CHECKS
|
||||
int32_t slist_len_increase;
|
||||
int64_t slist_size_increase;
|
||||
int32_t slist_len_increase;
|
||||
int64_t slist_size_increase;
|
||||
#endif /* H5C_DO_SANITY_CHECKS */
|
||||
|
||||
/* Fields for maintaining list of tagged entries */
|
||||
H5C_tag_info_t * tag_list;
|
||||
bool ignore_tags;
|
||||
uint32_t num_objs_corked;
|
||||
H5C_tag_info_t *tag_list;
|
||||
bool ignore_tags;
|
||||
uint32_t num_objs_corked;
|
||||
|
||||
/* Fields for tracking protected entries */
|
||||
uint32_t pl_len;
|
||||
size_t pl_size;
|
||||
H5C_cache_entry_t * pl_head_ptr;
|
||||
H5C_cache_entry_t * pl_tail_ptr;
|
||||
uint32_t pl_len;
|
||||
size_t pl_size;
|
||||
H5C_cache_entry_t *pl_head_ptr;
|
||||
H5C_cache_entry_t *pl_tail_ptr;
|
||||
|
||||
/* Fields for tracking pinned entries */
|
||||
uint32_t pel_len;
|
||||
size_t pel_size;
|
||||
H5C_cache_entry_t * pel_head_ptr;
|
||||
H5C_cache_entry_t * pel_tail_ptr;
|
||||
uint32_t pel_len;
|
||||
size_t pel_size;
|
||||
H5C_cache_entry_t *pel_head_ptr;
|
||||
H5C_cache_entry_t *pel_tail_ptr;
|
||||
|
||||
/* Fields for complete LRU list of entries */
|
||||
uint32_t LRU_list_len;
|
||||
size_t LRU_list_size;
|
||||
H5C_cache_entry_t * LRU_head_ptr;
|
||||
H5C_cache_entry_t * LRU_tail_ptr;
|
||||
uint32_t LRU_list_len;
|
||||
size_t LRU_list_size;
|
||||
H5C_cache_entry_t *LRU_head_ptr;
|
||||
H5C_cache_entry_t *LRU_tail_ptr;
|
||||
|
||||
#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
|
||||
/* Fields for clean LRU list of entries */
|
||||
uint32_t cLRU_list_len;
|
||||
size_t cLRU_list_size;
|
||||
H5C_cache_entry_t * cLRU_head_ptr;
|
||||
H5C_cache_entry_t * cLRU_tail_ptr;
|
||||
uint32_t cLRU_list_len;
|
||||
size_t cLRU_list_size;
|
||||
H5C_cache_entry_t *cLRU_head_ptr;
|
||||
H5C_cache_entry_t *cLRU_tail_ptr;
|
||||
|
||||
/* Fields for dirty LRU list of entries */
|
||||
uint32_t dLRU_list_len;
|
||||
size_t dLRU_list_size;
|
||||
H5C_cache_entry_t * dLRU_head_ptr;
|
||||
H5C_cache_entry_t * dLRU_tail_ptr;
|
||||
uint32_t dLRU_list_len;
|
||||
size_t dLRU_list_size;
|
||||
H5C_cache_entry_t *dLRU_head_ptr;
|
||||
H5C_cache_entry_t *dLRU_tail_ptr;
|
||||
#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
|
||||
|
||||
#ifdef H5_HAVE_PARALLEL
|
||||
/* Fields for collective metadata reads */
|
||||
uint32_t coll_list_len;
|
||||
size_t coll_list_size;
|
||||
H5C_cache_entry_t * coll_head_ptr;
|
||||
H5C_cache_entry_t * coll_tail_ptr;
|
||||
uint32_t coll_list_len;
|
||||
size_t coll_list_size;
|
||||
H5C_cache_entry_t *coll_head_ptr;
|
||||
H5C_cache_entry_t *coll_tail_ptr;
|
||||
|
||||
/* Fields for collective metadata writes */
|
||||
H5SL_t * coll_write_list;
|
||||
H5SL_t *coll_write_list;
|
||||
#endif /* H5_HAVE_PARALLEL */
|
||||
|
||||
/* Fields for automatic cache size adjustment */
|
||||
bool size_increase_possible;
|
||||
bool flash_size_increase_possible;
|
||||
bool size_increase_possible;
|
||||
bool flash_size_increase_possible;
|
||||
size_t flash_size_increase_threshold;
|
||||
bool size_decrease_possible;
|
||||
bool resize_enabled;
|
||||
bool cache_full;
|
||||
bool size_decreased;
|
||||
bool resize_in_progress;
|
||||
bool msic_in_progress;
|
||||
bool size_decrease_possible;
|
||||
bool resize_enabled;
|
||||
bool cache_full;
|
||||
bool size_decreased;
|
||||
bool resize_in_progress;
|
||||
bool msic_in_progress;
|
||||
H5C_auto_size_ctl_t resize_ctl;
|
||||
|
||||
/* Fields for epoch markers used in automatic cache size adjustment */
|
||||
int32_t epoch_markers_active;
|
||||
bool epoch_marker_active[H5C__MAX_EPOCH_MARKERS];
|
||||
int32_t epoch_marker_ringbuf[H5C__MAX_EPOCH_MARKERS+1];
|
||||
int32_t epoch_marker_ringbuf_first;
|
||||
int32_t epoch_marker_ringbuf_last;
|
||||
int32_t epoch_marker_ringbuf_size;
|
||||
H5C_cache_entry_t epoch_markers[H5C__MAX_EPOCH_MARKERS];
|
||||
int32_t epoch_markers_active;
|
||||
bool epoch_marker_active[H5C__MAX_EPOCH_MARKERS];
|
||||
int32_t epoch_marker_ringbuf[H5C__MAX_EPOCH_MARKERS + 1];
|
||||
int32_t epoch_marker_ringbuf_first;
|
||||
int32_t epoch_marker_ringbuf_last;
|
||||
int32_t epoch_marker_ringbuf_size;
|
||||
H5C_cache_entry_t epoch_markers[H5C__MAX_EPOCH_MARKERS];
|
||||
|
||||
/* Fields for cache hit rate collection */
|
||||
int64_t cache_hits;
|
||||
int64_t cache_accesses;
|
||||
int64_t cache_hits;
|
||||
int64_t cache_accesses;
|
||||
|
||||
/* fields supporting generation of a cache image on file close */
|
||||
H5C_cache_image_ctl_t image_ctl;
|
||||
bool serialization_in_progress;
|
||||
bool load_image;
|
||||
bool image_loaded;
|
||||
bool delete_image;
|
||||
haddr_t image_addr;
|
||||
hsize_t image_len;
|
||||
hsize_t image_data_len;
|
||||
int64_t entries_loaded_counter;
|
||||
int64_t entries_inserted_counter;
|
||||
int64_t entries_relocated_counter;
|
||||
int64_t entry_fd_height_change_counter;
|
||||
uint32_t num_entries_in_image;
|
||||
H5C_image_entry_t * image_entries;
|
||||
void * image_buffer;
|
||||
bool serialization_in_progress;
|
||||
bool load_image;
|
||||
bool image_loaded;
|
||||
bool delete_image;
|
||||
haddr_t image_addr;
|
||||
hsize_t image_len;
|
||||
hsize_t image_data_len;
|
||||
int64_t entries_loaded_counter;
|
||||
int64_t entries_inserted_counter;
|
||||
int64_t entries_relocated_counter;
|
||||
int64_t entry_fd_height_change_counter;
|
||||
uint32_t num_entries_in_image;
|
||||
H5C_image_entry_t *image_entries;
|
||||
void *image_buffer;
|
||||
|
||||
/* Free Space Manager Related fields */
|
||||
bool rdfsm_settled;
|
||||
bool mdfsm_settled;
|
||||
bool rdfsm_settled;
|
||||
bool mdfsm_settled;
|
||||
|
||||
#if H5C_COLLECT_CACHE_STATS
|
||||
/* stats fields */
|
||||
int64_t hits[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t misses[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t write_protects[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t read_protects[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int32_t max_read_protects[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t insertions[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t pinned_insertions[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t clears[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t flushes[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t evictions[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t take_ownerships[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t moves[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t entry_flush_moves[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t cache_flush_moves[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t pins[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t unpins[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t dirty_pins[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t pinned_flushes[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t pinned_clears[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t size_increases[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t size_decreases[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t entry_flush_size_changes[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t cache_flush_size_changes[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t hits[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t misses[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t write_protects[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t read_protects[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int32_t max_read_protects[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t insertions[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t pinned_insertions[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t clears[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t flushes[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t evictions[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t take_ownerships[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t moves[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t entry_flush_moves[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t cache_flush_moves[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t pins[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t unpins[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t dirty_pins[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t pinned_flushes[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t pinned_clears[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t size_increases[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t size_decreases[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t entry_flush_size_changes[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int64_t cache_flush_size_changes[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
|
||||
/* Fields for hash table operations */
|
||||
int64_t total_ht_insertions;
|
||||
int64_t total_ht_deletions;
|
||||
int64_t successful_ht_searches;
|
||||
int64_t total_successful_ht_search_depth;
|
||||
int64_t failed_ht_searches;
|
||||
int64_t total_failed_ht_search_depth;
|
||||
uint32_t max_index_len;
|
||||
size_t max_index_size;
|
||||
size_t max_clean_index_size;
|
||||
size_t max_dirty_index_size;
|
||||
int64_t total_ht_insertions;
|
||||
int64_t total_ht_deletions;
|
||||
int64_t successful_ht_searches;
|
||||
int64_t total_successful_ht_search_depth;
|
||||
int64_t failed_ht_searches;
|
||||
int64_t total_failed_ht_search_depth;
|
||||
uint32_t max_index_len;
|
||||
size_t max_index_size;
|
||||
size_t max_clean_index_size;
|
||||
size_t max_dirty_index_size;
|
||||
|
||||
/* Fields for in-order skip list */
|
||||
uint32_t max_slist_len;
|
||||
size_t max_slist_size;
|
||||
uint32_t max_slist_len;
|
||||
size_t max_slist_size;
|
||||
|
||||
/* Fields for protected entry list */
|
||||
uint32_t max_pl_len;
|
||||
size_t max_pl_size;
|
||||
uint32_t max_pl_len;
|
||||
size_t max_pl_size;
|
||||
|
||||
/* Fields for pinned entry list */
|
||||
uint32_t max_pel_len;
|
||||
size_t max_pel_size;
|
||||
uint32_t max_pel_len;
|
||||
size_t max_pel_size;
|
||||
|
||||
/* Fields for tracking 'make space in cache' (msic) operations */
|
||||
int64_t calls_to_msic;
|
||||
int64_t total_entries_skipped_in_msic;
|
||||
int64_t total_dirty_pf_entries_skipped_in_msic;
|
||||
int64_t total_entries_scanned_in_msic;
|
||||
int32_t max_entries_skipped_in_msic;
|
||||
int32_t max_dirty_pf_entries_skipped_in_msic;
|
||||
int32_t max_entries_scanned_in_msic;
|
||||
int64_t entries_scanned_to_make_space;
|
||||
int64_t calls_to_msic;
|
||||
int64_t total_entries_skipped_in_msic;
|
||||
int64_t total_dirty_pf_entries_skipped_in_msic;
|
||||
int64_t total_entries_scanned_in_msic;
|
||||
int32_t max_entries_skipped_in_msic;
|
||||
int32_t max_dirty_pf_entries_skipped_in_msic;
|
||||
int32_t max_entries_scanned_in_msic;
|
||||
int64_t entries_scanned_to_make_space;
|
||||
|
||||
/* Fields for tracking skip list scan restarts */
|
||||
int64_t slist_scan_restarts;
|
||||
int64_t LRU_scan_restarts;
|
||||
int64_t index_scan_restarts;
|
||||
int64_t slist_scan_restarts;
|
||||
int64_t LRU_scan_restarts;
|
||||
int64_t index_scan_restarts;
|
||||
|
||||
/* Fields for tracking cache image operations */
|
||||
int32_t images_created;
|
||||
int32_t images_read;
|
||||
int32_t images_loaded;
|
||||
hsize_t last_image_size;
|
||||
int32_t images_created;
|
||||
int32_t images_read;
|
||||
int32_t images_loaded;
|
||||
hsize_t last_image_size;
|
||||
|
||||
/* Fields for tracking prefetched entries */
|
||||
int64_t prefetches;
|
||||
int64_t dirty_prefetches;
|
||||
int64_t prefetch_hits;
|
||||
int64_t prefetches;
|
||||
int64_t dirty_prefetches;
|
||||
int64_t prefetch_hits;
|
||||
|
||||
#if H5C_COLLECT_CACHE_ENTRY_STATS
|
||||
int32_t max_accesses[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int32_t min_accesses[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int32_t max_clears[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int32_t max_flushes[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
size_t max_size[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int32_t max_pins[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int32_t max_accesses[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int32_t min_accesses[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int32_t max_clears[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int32_t max_flushes[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
size_t max_size[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
int32_t max_pins[H5C__MAX_NUM_TYPE_IDS + 1];
|
||||
#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
|
||||
#endif /* H5C_COLLECT_CACHE_STATS */
|
||||
|
||||
char prefix[H5C__PREFIX_LEN];
|
||||
char prefix[H5C__PREFIX_LEN];
|
||||
|
||||
#ifndef NDEBUG
|
||||
int64_t get_entry_ptr_from_addr_counter;
|
||||
int64_t get_entry_ptr_from_addr_counter;
|
||||
#endif
|
||||
|
||||
}; /* H5C_t */
|
||||
@@ -3235,12 +3100,10 @@ struct H5C_t {
|
||||
/* Define typedef for tagged cache entry iteration callbacks */
|
||||
typedef int (*H5C_tag_iter_cb_t)(H5C_cache_entry_t *entry, void *ctx);
|
||||
|
||||
|
||||
/*****************************/
|
||||
/* Package Private Variables */
|
||||
/*****************************/
|
||||
|
||||
|
||||
/******************************/
|
||||
/* Package Private Prototypes */
|
||||
/******************************/
|
||||
@@ -3253,19 +3116,17 @@ H5_DLL herr_t H5C__autoadjust__ageout__remove_excess_markers(H5C_t *cache_ptr);
|
||||
H5_DLL herr_t H5C__flash_increase_cache_size(H5C_t *cache_ptr, size_t old_entry_size, size_t new_entry_size);
|
||||
H5_DLL herr_t H5C__flush_invalidate_cache(H5F_t *f, unsigned flags);
|
||||
H5_DLL herr_t H5C__flush_ring(H5F_t *f, H5C_ring_t ring, unsigned flags);
|
||||
H5_DLL herr_t H5C__flush_single_entry(H5F_t *f, H5C_cache_entry_t *entry_ptr,
|
||||
unsigned flags);
|
||||
H5_DLL herr_t H5C__flush_single_entry(H5F_t *f, H5C_cache_entry_t *entry_ptr, unsigned flags);
|
||||
H5_DLL herr_t H5C__generate_cache_image(H5F_t *f, H5C_t *cache_ptr);
|
||||
H5_DLL herr_t H5C__load_cache_image(H5F_t *f);
|
||||
H5_DLL herr_t H5C__make_space_in_cache(H5F_t * f, size_t space_needed,
|
||||
bool write_permitted);
|
||||
H5_DLL herr_t H5C__make_space_in_cache(H5F_t *f, size_t space_needed, bool write_permitted);
|
||||
H5_DLL herr_t H5C__serialize_cache(H5F_t *f);
|
||||
H5_DLL herr_t H5C__serialize_single_entry(H5F_t *f, H5C_t *cache_ptr, H5C_cache_entry_t *entry_ptr);
|
||||
H5_DLL herr_t H5C__iter_tagged_entries(H5C_t *cache, haddr_t tag, bool match_global,
|
||||
H5C_tag_iter_cb_t cb, void *cb_ctx);
|
||||
H5_DLL herr_t H5C__iter_tagged_entries(H5C_t *cache, haddr_t tag, bool match_global, H5C_tag_iter_cb_t cb,
|
||||
void *cb_ctx);
|
||||
|
||||
/* Routines for operating on entry tags */
|
||||
H5_DLL herr_t H5C__tag_entry(H5C_t * cache_ptr, H5C_cache_entry_t * entry_ptr);
|
||||
H5_DLL herr_t H5C__tag_entry(H5C_t *cache_ptr, H5C_cache_entry_t *entry_ptr);
|
||||
H5_DLL herr_t H5C__untag_entry(H5C_t *cache, H5C_cache_entry_t *entry);
|
||||
|
||||
/* Routines for operating on cache images */
|
||||
@@ -3288,4 +3149,3 @@ H5_DLL herr_t H5C__verify_cork_tag_test(hid_t fid, H5O_token_t tag_token, bool s
|
||||
#endif /* H5C_TESTING */
|
||||
|
||||
#endif /* H5Cpkg_H */
|
||||
/* clang-format on */
|
||||
|
||||
@@ -179,7 +179,6 @@ H5Dcreate2(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id, hid_t
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE7("i", "i*siiiii", loc_id, name, type_id, space_id, lcpl_id, dcpl_id, dapl_id);
|
||||
|
||||
/* Create the dataset synchronously */
|
||||
if ((ret_value = H5D__create_api_common(loc_id, name, type_id, space_id, lcpl_id, dcpl_id, dapl_id, NULL,
|
||||
@@ -210,8 +209,6 @@ H5Dcreate_async(const char *app_file, const char *app_func, unsigned app_line, h
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE11("i", "*s*sIui*siiiiii", app_file, app_func, app_line, loc_id, name, type_id, space_id, lcpl_id,
|
||||
dcpl_id, dapl_id, es_id);
|
||||
|
||||
/* Set up request token pointer for asynchronous operation */
|
||||
if (H5ES_NONE != es_id)
|
||||
@@ -278,7 +275,6 @@ H5Dcreate_anon(hid_t loc_id, hid_t type_id, hid_t space_id, hid_t dcpl_id, hid_t
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE5("i", "iiiii", loc_id, type_id, space_id, dcpl_id, dapl_id);
|
||||
|
||||
/* Check arguments */
|
||||
if (H5P_DEFAULT == dcpl_id)
|
||||
@@ -396,7 +392,6 @@ H5Dopen2(hid_t loc_id, const char *name, hid_t dapl_id)
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE3("i", "i*si", loc_id, name, dapl_id);
|
||||
|
||||
/* Open the dataset synchronously */
|
||||
if ((ret_value = H5D__open_api_common(loc_id, name, dapl_id, NULL, NULL)) < 0)
|
||||
@@ -426,7 +421,6 @@ H5Dopen_async(const char *app_file, const char *app_func, unsigned app_line, hid
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE7("i", "*s*sIui*sii", app_file, app_func, app_line, loc_id, name, dapl_id, es_id);
|
||||
|
||||
/* Set up request token pointer for asynchronous operation */
|
||||
if (H5ES_NONE != es_id)
|
||||
@@ -468,7 +462,6 @@ H5Dclose(hid_t dset_id)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE1("e", "i", dset_id);
|
||||
|
||||
/* Check args */
|
||||
if (H5I_DATASET != H5I_get_type(dset_id))
|
||||
@@ -503,7 +496,6 @@ H5Dclose_async(const char *app_file, const char *app_func, unsigned app_line, hi
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE5("e", "*s*sIuii", app_file, app_func, app_line, dset_id, es_id);
|
||||
|
||||
/* Check args */
|
||||
if (H5I_DATASET != H5I_get_type(dset_id))
|
||||
@@ -604,7 +596,6 @@ H5Dget_space(hid_t dset_id)
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE1("i", "i", dset_id);
|
||||
|
||||
/* Get the dataset's dataspace synchronously */
|
||||
if ((ret_value = H5D__get_space_api_common(dset_id, NULL, NULL)) < 0)
|
||||
@@ -636,7 +627,6 @@ H5Dget_space_async(const char *app_file, const char *app_func, unsigned app_line
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE5("i", "*s*sIuii", app_file, app_func, app_line, dset_id, es_id);
|
||||
|
||||
/* Set up request token pointer for asynchronous operation */
|
||||
if (H5ES_NONE != es_id)
|
||||
@@ -679,7 +669,6 @@ H5Dget_space_status(hid_t dset_id, H5D_space_status_t *allocation /*out*/)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*Ds", dset_id, allocation);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
|
||||
@@ -718,7 +707,6 @@ H5Dget_type(hid_t dset_id)
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE1("i", "i", dset_id);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
|
||||
@@ -760,7 +748,6 @@ H5Dget_create_plist(hid_t dset_id)
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE1("i", "i", dset_id);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
|
||||
@@ -819,7 +806,6 @@ H5Dget_access_plist(hid_t dset_id)
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE1("i", "i", dset_id);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
|
||||
@@ -864,7 +850,6 @@ H5Dget_storage_size(hid_t dset_id)
|
||||
hsize_t ret_value = 0; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(0)
|
||||
H5TRACE1("h", "i", dset_id);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
|
||||
@@ -906,7 +891,6 @@ H5Dget_offset(hid_t dset_id)
|
||||
haddr_t ret_value = HADDR_UNDEF; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(HADDR_UNDEF)
|
||||
H5TRACE1("a", "i", dset_id);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
|
||||
@@ -1053,7 +1037,6 @@ H5Dread(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id, hid_t file_space_i
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE6("e", "iiiii*x", dset_id, mem_type_id, mem_space_id, file_space_id, dxpl_id, buf);
|
||||
|
||||
/* Read the data */
|
||||
if (H5D__read_api_common(1, &dset_id, &mem_type_id, &mem_space_id, &file_space_id, dxpl_id, &buf, NULL,
|
||||
@@ -1083,8 +1066,6 @@ H5Dread_async(const char *app_file, const char *app_func, unsigned app_line, hid
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE10("e", "*s*sIuiiiii*xi", app_file, app_func, app_line, dset_id, mem_type_id, mem_space_id,
|
||||
file_space_id, dxpl_id, buf, es_id);
|
||||
|
||||
/* Set up request token pointer for asynchronous operation */
|
||||
if (H5ES_NONE != es_id)
|
||||
@@ -1124,7 +1105,6 @@ H5Dread_multi(size_t count, hid_t dset_id[], hid_t mem_type_id[], hid_t mem_spac
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE7("e", "z*i*i*i*ii**x", count, dset_id, mem_type_id, mem_space_id, file_space_id, dxpl_id, buf);
|
||||
|
||||
if (count == 0)
|
||||
HGOTO_DONE(SUCCEED);
|
||||
@@ -1159,8 +1139,6 @@ H5Dread_multi_async(const char *app_file, const char *app_func, unsigned app_lin
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE11("e", "*s*sIuz*i*i*i*ii**xi", app_file, app_func, app_line, count, dset_id, mem_type_id,
|
||||
mem_space_id, file_space_id, dxpl_id, buf, es_id);
|
||||
|
||||
/* Set up request token pointer for asynchronous operation */
|
||||
if (H5ES_NONE != es_id)
|
||||
@@ -1201,7 +1179,6 @@ H5Dread_chunk(hid_t dset_id, hid_t dxpl_id, const hsize_t *offset, uint32_t *fil
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE5("e", "ii*h*Iu*x", dset_id, dxpl_id, offset, filters, buf);
|
||||
|
||||
/* Check arguments */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
|
||||
@@ -1363,7 +1340,6 @@ H5Dwrite(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id, hid_t file_space_
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE6("e", "iiiii*x", dset_id, mem_type_id, mem_space_id, file_space_id, dxpl_id, buf);
|
||||
|
||||
/* Write the data */
|
||||
if (H5D__write_api_common(1, &dset_id, &mem_type_id, &mem_space_id, &file_space_id, dxpl_id, &buf, NULL,
|
||||
@@ -1394,8 +1370,6 @@ H5Dwrite_async(const char *app_file, const char *app_func, unsigned app_line, hi
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE10("e", "*s*sIuiiiii*xi", app_file, app_func, app_line, dset_id, mem_type_id, mem_space_id,
|
||||
file_space_id, dxpl_id, buf, es_id);
|
||||
|
||||
/* Set up request token pointer for asynchronous operation */
|
||||
if (H5ES_NONE != es_id)
|
||||
@@ -1435,7 +1409,6 @@ H5Dwrite_multi(size_t count, hid_t dset_id[], hid_t mem_type_id[], hid_t mem_spa
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE7("e", "z*i*i*i*ii**x", count, dset_id, mem_type_id, mem_space_id, file_space_id, dxpl_id, buf);
|
||||
|
||||
if (count == 0)
|
||||
HGOTO_DONE(SUCCEED);
|
||||
@@ -1470,8 +1443,6 @@ H5Dwrite_multi_async(const char *app_file, const char *app_func, unsigned app_li
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE11("e", "*s*sIuz*i*i*i*ii**xi", app_file, app_func, app_line, count, dset_id, mem_type_id,
|
||||
mem_space_id, file_space_id, dxpl_id, buf, es_id);
|
||||
|
||||
/* Set up request token pointer for asynchronous operation */
|
||||
if (H5ES_NONE != es_id)
|
||||
@@ -1514,7 +1485,6 @@ H5Dwrite_chunk(hid_t dset_id, hid_t dxpl_id, uint32_t filters, const hsize_t *of
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE6("e", "iiIu*hz*x", dset_id, dxpl_id, filters, offset, data_size, buf);
|
||||
|
||||
/* Check arguments */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
|
||||
@@ -1581,7 +1551,6 @@ H5Dscatter(H5D_scatter_func_t op, void *op_data, hid_t type_id, hid_t dst_space_
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE5("e", "DS*xii*x", op, op_data, type_id, dst_space_id, dst_buf);
|
||||
|
||||
/* Check args */
|
||||
if (op == NULL)
|
||||
@@ -1674,7 +1643,6 @@ H5Dgather(hid_t src_space_id, const void *src_buf, hid_t type_id, size_t dst_buf
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE7("e", "i*xiz*xDg*x", src_space_id, src_buf, type_id, dst_buf_size, dst_buf, op, op_data);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (src_space = (H5S_t *)H5I_object_verify(src_space_id, H5I_DATASPACE)))
|
||||
@@ -1774,7 +1742,6 @@ H5Dfill(const void *fill, hid_t fill_type_id, void *buf, hid_t buf_type_id, hid_
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE5("e", "*xi*xii", fill, fill_type_id, buf, buf_type_id, space_id);
|
||||
|
||||
/* Check args */
|
||||
if (buf == NULL)
|
||||
@@ -1859,7 +1826,6 @@ H5Diterate(void *buf, hid_t type_id, hid_t space_id, H5D_operator_t op, void *op
|
||||
herr_t ret_value; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE5("e", "*xiiDO*x", buf, type_id, space_id, op, operator_data);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == op)
|
||||
@@ -1906,7 +1872,6 @@ H5Dvlen_get_buf_size(hid_t dataset_id, hid_t type_id, hid_t space_id, hsize_t *s
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE4("e", "iii*h", dataset_id, type_id, space_id, size);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object(dataset_id)))
|
||||
@@ -2007,7 +1972,6 @@ H5Dset_extent(hid_t dset_id, const hsize_t size[])
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*h", dset_id, size);
|
||||
|
||||
/* Change a datset's dimensions synchronously */
|
||||
if ((ret_value = H5D__set_extent_api_common(dset_id, size, NULL, NULL)) < 0)
|
||||
@@ -2036,7 +2000,6 @@ H5Dset_extent_async(const char *app_file, const char *app_func, unsigned app_lin
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE6("e", "*s*sIui*hi", app_file, app_func, app_line, dset_id, size, es_id);
|
||||
|
||||
/* Set up request token pointer for asynchronous operation */
|
||||
if (H5ES_NONE != es_id)
|
||||
@@ -2075,7 +2038,6 @@ H5Dflush(hid_t dset_id)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE1("e", "i", dset_id);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
|
||||
@@ -2117,7 +2079,6 @@ H5Drefresh(hid_t dset_id)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE1("e", "i", dset_id);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
|
||||
@@ -2161,7 +2122,6 @@ H5Dformat_convert(hid_t dset_id)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE1("e", "i", dset_id);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
|
||||
@@ -2201,7 +2161,6 @@ H5Dget_chunk_index_type(hid_t dset_id, H5D_chunk_index_t *idx_type /*out*/)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*Dk", dset_id, idx_type);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
|
||||
@@ -2243,7 +2202,6 @@ H5Dget_chunk_storage_size(hid_t dset_id, const hsize_t *offset, hsize_t *chunk_n
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3("e", "i*h*h", dset_id, offset, chunk_nbytes);
|
||||
|
||||
/* Check arguments */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
|
||||
@@ -2294,7 +2252,6 @@ H5Dget_num_chunks(hid_t dset_id, hid_t fspace_id, hsize_t *nchunks /*out*/)
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3("e", "ii*h", dset_id, fspace_id, nchunks);
|
||||
|
||||
/* Check arguments */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
|
||||
@@ -2346,7 +2303,6 @@ H5Dget_chunk_info(hid_t dset_id, hid_t fspace_id, hsize_t chk_index, hsize_t *of
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE7("e", "iih*h*Iu*a*h", dset_id, fspace_id, chk_index, offset, filter_mask, addr, size);
|
||||
|
||||
/* Check arguments */
|
||||
if (NULL == offset && NULL == filter_mask && NULL == addr && NULL == size)
|
||||
@@ -2415,7 +2371,6 @@ H5Dget_chunk_info_by_coord(hid_t dset_id, const hsize_t *offset, unsigned *filte
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE5("e", "i*h*Iu*a*h", dset_id, offset, filter_mask, addr, size);
|
||||
|
||||
/* Check arguments */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
|
||||
@@ -2466,7 +2421,6 @@ H5Dchunk_iter(hid_t dset_id, hid_t dxpl_id, H5D_chunk_iter_op_t op, void *op_dat
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE4("e", "iix*x", dset_id, dxpl_id, op, op_data);
|
||||
|
||||
/* Check arguments */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
|
||||
|
||||
@@ -66,7 +66,6 @@ H5Ddebug(hid_t dset_id)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE1("e", "i", dset_id);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (dset = (H5D_t *)H5VL_object_verify(dset_id, H5I_DATASET)))
|
||||
|
||||
@@ -103,7 +103,6 @@ H5Dcreate1(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id, hid_t
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE5("i", "i*siii", loc_id, name, type_id, space_id, dcpl_id);
|
||||
|
||||
/* Check arguments */
|
||||
if (!name)
|
||||
@@ -172,7 +171,6 @@ H5Dopen1(hid_t loc_id, const char *name)
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE2("i", "i*s", loc_id, name);
|
||||
|
||||
/* Check args */
|
||||
if (!name)
|
||||
@@ -232,7 +230,6 @@ H5Dextend(hid_t dset_id, const hsize_t size[])
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*h", dset_id, size);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
|
||||
@@ -311,7 +308,6 @@ H5Dvlen_reclaim(hid_t type_id, hid_t space_id, hid_t dxpl_id, void *buf)
|
||||
herr_t ret_value; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE4("e", "iii*x", type_id, space_id, dxpl_id, buf);
|
||||
|
||||
/* Check args */
|
||||
if (buf == NULL)
|
||||
|
||||
+2
-2
@@ -1184,8 +1184,8 @@ H5D__piece_io(H5D_io_info_t *io_info)
|
||||
HGOTO_ERROR(H5E_IO, H5E_OPENERROR, FAIL, "couldn't open debugging log file");
|
||||
|
||||
/* Print a short header for this I/O operation */
|
||||
time_now = HDtime(NULL);
|
||||
fprintf(debug_log_file, "##### %s", HDasctime(HDlocaltime(&time_now)));
|
||||
time_now = time(NULL);
|
||||
fprintf(debug_log_file, "##### %s", asctime(localtime(&time_now)));
|
||||
|
||||
debug_stream = debug_log_file;
|
||||
}
|
||||
|
||||
+13
-2
@@ -138,6 +138,8 @@ typedef enum H5D_vds_view_t {
|
||||
*
|
||||
* \return \herr_t
|
||||
*
|
||||
* \since 1.10.0
|
||||
*
|
||||
*/
|
||||
typedef herr_t (*H5D_append_cb_t)(hid_t dataset_id, hsize_t *cur_dims, void *op_data);
|
||||
//! <!-- [H5D_append_cb_t_snip] -->
|
||||
@@ -156,6 +158,8 @@ typedef herr_t (*H5D_append_cb_t)(hid_t dataset_id, hsize_t *cur_dims, void *op_
|
||||
* the operation
|
||||
* \return \herr_t_iter
|
||||
*
|
||||
* \since 1.10.2
|
||||
*
|
||||
*/
|
||||
typedef herr_t (*H5D_operator_t)(void *elem, hid_t type_id, unsigned ndim, const hsize_t *point,
|
||||
void *operator_data);
|
||||
@@ -186,6 +190,8 @@ typedef herr_t (*H5D_operator_t)(void *elem, hid_t type_id, unsigned ndim, const
|
||||
* been returned. The callback function should return zero (0)
|
||||
* to indicate success, and a negative value to indicate failure.
|
||||
*
|
||||
* \since 1.10.2
|
||||
*
|
||||
*/
|
||||
typedef herr_t (*H5D_scatter_func_t)(const void **src_buf /*out*/, size_t *src_buf_bytes_used /*out*/,
|
||||
void *op_data);
|
||||
@@ -204,7 +210,7 @@ typedef herr_t (*H5D_scatter_func_t)(const void **src_buf /*out*/, size_t *src_b
|
||||
* \param[in,out] op_data User-defined pointer to data required by the callback
|
||||
* function; a pass-through of the \p op_data pointer
|
||||
* provided with the H5Dgather() function call.
|
||||
* \returns \herr_t
|
||||
* \return \herr_t
|
||||
*
|
||||
* \details The callback function should process, store, or otherwise make use
|
||||
* of the data returned in dst_buf before it returns, because the
|
||||
@@ -214,6 +220,8 @@ typedef herr_t (*H5D_scatter_func_t)(const void **src_buf /*out*/, size_t *src_b
|
||||
* function should return zero (0) to indicate success, and a negative
|
||||
* value to indicate failure.
|
||||
*
|
||||
* \since 1.10.2
|
||||
*
|
||||
*/
|
||||
typedef herr_t (*H5D_gather_func_t)(const void *dst_buf, size_t dst_buf_bytes_used, void *op_data);
|
||||
//! <!-- [H5D_gather_func_t_snip] -->
|
||||
@@ -228,12 +236,15 @@ typedef herr_t (*H5D_gather_func_t)(const void *dst_buf, size_t dst_buf_bytes_us
|
||||
* \param[in] size Chunk size in bytes, 0 if the chunk does not exist
|
||||
* \param[in,out] op_data Pointer to any user-defined data associated with
|
||||
* the operation.
|
||||
* \returns \li Zero (#H5_ITER_CONT) causes the iterator to continue, returning
|
||||
* \return \li Zero (#H5_ITER_CONT) causes the iterator to continue, returning
|
||||
* zero when all elements have been processed.
|
||||
* \li A positive value (#H5_ITER_STOP) causes the iterator to
|
||||
* immediately return that value, indicating short-circuit success.
|
||||
* \li A negative (#H5_ITER_ERROR) causes the iterator to immediately
|
||||
* return that value, indicating failure.
|
||||
*
|
||||
* \since 1.14.0
|
||||
*
|
||||
*/
|
||||
typedef int (*H5D_chunk_iter_op_t)(const hsize_t *offset, unsigned filter_mask, haddr_t addr, hsize_t size,
|
||||
void *op_data);
|
||||
|
||||
@@ -390,7 +390,6 @@ H5Eregister_class(const char *cls_name, const char *lib_name, const char *versio
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE3("i", "*s*s*s", cls_name, lib_name, version);
|
||||
|
||||
/* Check arguments */
|
||||
if (cls_name == NULL || lib_name == NULL || version == NULL)
|
||||
@@ -469,7 +468,6 @@ H5Eunregister_class(hid_t class_id)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE1("e", "i", class_id);
|
||||
|
||||
/* Check arguments */
|
||||
if (H5I_ERROR_CLASS != H5I_get_type(class_id))
|
||||
@@ -534,7 +532,6 @@ H5Eget_class_name(hid_t class_id, char *name /*out*/, size_t size)
|
||||
ssize_t ret_value = -1; /* Return value */
|
||||
|
||||
FUNC_ENTER_API((-1))
|
||||
H5TRACE3("Zs", "i*sz", class_id, name, size);
|
||||
|
||||
/* Get the error class */
|
||||
if (NULL == (cls = (H5E_cls_t *)H5I_object_verify(class_id, H5I_ERROR_CLASS)))
|
||||
@@ -632,7 +629,6 @@ H5Eclose_msg(hid_t err_id)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE1("e", "i", err_id);
|
||||
|
||||
/* Check arguments */
|
||||
if (H5I_ERROR_MSG != H5I_get_type(err_id))
|
||||
@@ -689,7 +685,6 @@ H5Ecreate_msg(hid_t class_id, H5E_type_t msg_type, const char *msg_str)
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE3("i", "iEt*s", class_id, msg_type, msg_str);
|
||||
|
||||
/* Check arguments */
|
||||
if (msg_type != H5E_MAJOR && msg_type != H5E_MINOR)
|
||||
@@ -774,7 +769,6 @@ H5Eget_msg(hid_t msg_id, H5E_type_t *type /*out*/, char *msg_str /*out*/, size_t
|
||||
ssize_t ret_value = -1; /* Return value */
|
||||
|
||||
FUNC_ENTER_API_NOCLEAR((-1))
|
||||
H5TRACE4("Zs", "i*Et*sz", msg_id, type, msg_str, size);
|
||||
|
||||
/* Get the message object */
|
||||
if (NULL == (msg = (H5E_msg_t *)H5I_object_verify(msg_id, H5I_ERROR_MSG)))
|
||||
@@ -805,7 +799,6 @@ H5Ecreate_stack(void)
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE0("i", "");
|
||||
|
||||
/* Allocate a new error stack */
|
||||
if (NULL == (stk = H5FL_CALLOC(H5E_t)))
|
||||
@@ -841,7 +834,6 @@ H5Eget_current_stack(void)
|
||||
|
||||
/* Don't clear the error stack! :-) */
|
||||
FUNC_ENTER_API_NOCLEAR(H5I_INVALID_HID)
|
||||
H5TRACE0("i", "");
|
||||
|
||||
/* Get the current stack */
|
||||
if (NULL == (stk = H5E__get_current_stack()))
|
||||
@@ -947,7 +939,6 @@ H5Eset_current_stack(hid_t err_stack)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE1("e", "i", err_stack);
|
||||
|
||||
if (err_stack != H5E_DEFAULT) {
|
||||
if (NULL == (estack = (H5E_t *)H5I_object_verify(err_stack, H5I_ERROR_STACK)))
|
||||
@@ -1045,7 +1036,6 @@ H5Eclose_stack(hid_t stack_id)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE1("e", "i", stack_id);
|
||||
|
||||
if (H5E_DEFAULT != stack_id) {
|
||||
/* Check arguments */
|
||||
@@ -1108,7 +1098,6 @@ H5Eget_num(hid_t error_stack_id)
|
||||
|
||||
/* Don't clear the error stack! :-) */
|
||||
FUNC_ENTER_API_NOCLEAR((-1))
|
||||
H5TRACE1("Zs", "i", error_stack_id);
|
||||
|
||||
/* Need to check for errors */
|
||||
if (error_stack_id == H5E_DEFAULT) {
|
||||
@@ -1169,7 +1158,6 @@ H5Epop(hid_t err_stack, size_t count)
|
||||
|
||||
/* Don't clear the error stack! :-) */
|
||||
FUNC_ENTER_API_NOCLEAR(FAIL)
|
||||
H5TRACE2("e", "iz", err_stack, count);
|
||||
|
||||
/* Need to check for errors */
|
||||
if (err_stack == H5E_DEFAULT) {
|
||||
@@ -1228,7 +1216,6 @@ H5Epush2(hid_t err_stack, const char *file, const char *func, unsigned line, hid
|
||||
|
||||
/* Don't clear the error stack! :-) */
|
||||
FUNC_ENTER_API_NOCLEAR(FAIL)
|
||||
H5TRACE8("e", "i*s*sIuiii*s", err_stack, file, func, line, cls_id, maj_id, min_id, fmt);
|
||||
|
||||
if (err_stack == H5E_DEFAULT)
|
||||
estack = NULL;
|
||||
@@ -1287,7 +1274,6 @@ H5Eclear2(hid_t err_stack)
|
||||
|
||||
/* Don't clear the error stack! :-) */
|
||||
FUNC_ENTER_API_NOCLEAR(FAIL)
|
||||
H5TRACE1("e", "i", err_stack);
|
||||
|
||||
/* Need to check for errors */
|
||||
if (err_stack == H5E_DEFAULT)
|
||||
@@ -1327,7 +1313,6 @@ H5Eprint2(hid_t err_stack, FILE *stream)
|
||||
|
||||
/* Don't clear the error stack! :-) */
|
||||
FUNC_ENTER_API_NOCLEAR(FAIL)
|
||||
/*NO TRACE*/
|
||||
|
||||
/* Print error stack */
|
||||
if ((ret_value = H5E__print2(err_stack, stream)) < 0)
|
||||
@@ -1394,7 +1379,6 @@ H5Ewalk2(hid_t err_stack, H5E_direction_t direction, H5E_walk2_t stack_func, voi
|
||||
|
||||
/* Don't clear the error stack! :-) */
|
||||
FUNC_ENTER_API_NOCLEAR(FAIL)
|
||||
/*NO TRACE*/
|
||||
|
||||
/* Need to check for errors */
|
||||
if (err_stack == H5E_DEFAULT) {
|
||||
@@ -1440,7 +1424,6 @@ H5Eget_auto2(hid_t estack_id, H5E_auto2_t *func /*out*/, void **client_data /*ou
|
||||
|
||||
/* Don't clear the error stack! :-) */
|
||||
FUNC_ENTER_API_NOCLEAR(FAIL)
|
||||
H5TRACE3("e", "i*EA**x", estack_id, func, client_data);
|
||||
|
||||
if (estack_id == H5E_DEFAULT) {
|
||||
if (NULL == (estack = H5E__get_my_stack()))
|
||||
@@ -1499,7 +1482,6 @@ H5Eset_auto2(hid_t estack_id, H5E_auto2_t func, void *client_data)
|
||||
|
||||
/* Don't clear the error stack! :-) */
|
||||
FUNC_ENTER_API_NOCLEAR(FAIL)
|
||||
H5TRACE3("e", "iEA*x", estack_id, func, client_data);
|
||||
|
||||
if (estack_id == H5E_DEFAULT) {
|
||||
if (NULL == (estack = H5E__get_my_stack()))
|
||||
@@ -1557,7 +1539,6 @@ H5Eauto_is_v2(hid_t estack_id, unsigned *is_stack)
|
||||
|
||||
/* Don't clear the error stack! :-) */
|
||||
FUNC_ENTER_API_NOCLEAR(FAIL)
|
||||
H5TRACE2("e", "i*Iu", estack_id, is_stack);
|
||||
|
||||
if (estack_id == H5E_DEFAULT) {
|
||||
if (NULL == (estack = H5E__get_my_stack()))
|
||||
@@ -1601,7 +1582,6 @@ H5Eappend_stack(hid_t dst_stack_id, hid_t src_stack_id, hbool_t close_source_sta
|
||||
|
||||
/* Don't clear the error stack! :-) */
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3("e", "iib", dst_stack_id, src_stack_id, close_source_stack);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (dst_stack = (H5E_t *)H5I_object_verify(dst_stack_id, H5I_ERROR_STACK)))
|
||||
|
||||
-14
@@ -83,7 +83,6 @@ H5EScreate(void)
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE0("i", "");
|
||||
|
||||
/* Create the new event set object */
|
||||
if (NULL == (es = H5ES__create()))
|
||||
@@ -117,7 +116,6 @@ H5ESinsert_request(hid_t es_id, hid_t connector_id, void *request)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3("e", "ii*x", es_id, connector_id, request);
|
||||
|
||||
/* Check arguments */
|
||||
if (NULL == (es = H5I_object_verify(es_id, H5I_EVENTSET)))
|
||||
@@ -160,7 +158,6 @@ H5ESget_count(hid_t es_id, size_t *count /*out*/)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*z", es_id, count);
|
||||
|
||||
/* Passing H5ES_NONE is valid, but a no-op */
|
||||
if (H5ES_NONE != es_id) {
|
||||
@@ -201,7 +198,6 @@ H5ESget_op_counter(hid_t es_id, uint64_t *op_counter /*out*/)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*UL", es_id, op_counter);
|
||||
|
||||
/* Passing H5ES_NONE is valid, but a no-op */
|
||||
if (H5ES_NONE != es_id) {
|
||||
@@ -251,7 +247,6 @@ H5ESget_requests(hid_t es_id, H5_iter_order_t order, hid_t *connector_ids, void
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE6("e", "iIo*i**xz*z", es_id, order, connector_ids, requests, array_len, count);
|
||||
|
||||
/* Check arguments */
|
||||
if (NULL == (es = H5I_object_verify(es_id, H5I_EVENTSET)))
|
||||
@@ -303,7 +298,6 @@ H5ESwait(hid_t es_id, uint64_t timeout, size_t *num_in_progress /*out*/, hbool_t
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE4("e", "iUL*z*b", es_id, timeout, num_in_progress, op_failed);
|
||||
|
||||
/* Passing H5ES_NONE is valid, but a no-op */
|
||||
if (H5ES_NONE != es_id) {
|
||||
@@ -343,7 +337,6 @@ H5EScancel(hid_t es_id, size_t *num_not_canceled /*out*/, hbool_t *op_failed /*o
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3("e", "i*z*b", es_id, num_not_canceled, op_failed);
|
||||
|
||||
/* Passing H5ES_NONE is valid, but a no-op */
|
||||
if (H5ES_NONE != es_id) {
|
||||
@@ -383,7 +376,6 @@ H5ESget_err_status(hid_t es_id, hbool_t *err_status /*out*/)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*b", es_id, err_status);
|
||||
|
||||
/* Passing H5ES_NONE is valid, but a no-op */
|
||||
if (H5ES_NONE != es_id) {
|
||||
@@ -422,7 +414,6 @@ H5ESget_err_count(hid_t es_id, size_t *num_errs /*out*/)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*z", es_id, num_errs);
|
||||
|
||||
/* Passing H5ES_NONE is valid, but a no-op */
|
||||
if (H5ES_NONE != es_id) {
|
||||
@@ -466,7 +457,6 @@ H5ESget_err_info(hid_t es_id, size_t num_err_info, H5ES_err_info_t err_info[] /*
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE4("e", "iz*#*z", es_id, num_err_info, err_info, num_cleared);
|
||||
|
||||
/* Passing H5ES_NONE is valid, but a no-op */
|
||||
if (H5ES_NONE != es_id) {
|
||||
@@ -507,7 +497,6 @@ H5ESfree_err_info(size_t num_err_info, H5ES_err_info_t err_info[])
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "z*#", num_err_info, err_info);
|
||||
|
||||
/* Check arguments */
|
||||
if (0 == num_err_info)
|
||||
@@ -550,7 +539,6 @@ H5ESregister_insert_func(hid_t es_id, H5ES_event_insert_func_t func, void *ctx)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3("e", "iEI*x", es_id, func, ctx);
|
||||
|
||||
/* Passing H5ES_NONE is valid, but a no-op */
|
||||
if (H5ES_NONE != es_id) {
|
||||
@@ -592,7 +580,6 @@ H5ESregister_complete_func(hid_t es_id, H5ES_event_complete_func_t func, void *c
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3("e", "iEC*x", es_id, func, ctx);
|
||||
|
||||
/* Passing H5ES_NONE is valid, but a no-op */
|
||||
if (H5ES_NONE != es_id) {
|
||||
@@ -632,7 +619,6 @@ H5ESclose(hid_t es_id)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE1("e", "i", es_id);
|
||||
|
||||
/* Passing H5ES_NONE is valid, but a no-op */
|
||||
if (H5ES_NONE != es_id) {
|
||||
|
||||
+12
-12
@@ -150,7 +150,7 @@ extern "C" {
|
||||
*
|
||||
* \brief Creates an event set
|
||||
*
|
||||
* \returns \hid_t{event set}
|
||||
* \return \hid_t{event set}
|
||||
*
|
||||
* \details H5EScreate() creates a new event set and returns a corresponding
|
||||
* event set identifier.
|
||||
@@ -170,7 +170,7 @@ H5_DLL hid_t H5EScreate(void);
|
||||
* the event set to complete
|
||||
* \param[out] num_in_progress The number of operations still in progress
|
||||
* \param[out] err_occurred Flag if an operation in the event set failed
|
||||
* \returns \herr_t
|
||||
* \return \herr_t
|
||||
*
|
||||
* \details H5ESwait() waits for operations in an event set \p es_id to wait
|
||||
* with \p timeout.
|
||||
@@ -201,7 +201,7 @@ H5_DLL herr_t H5ESwait(hid_t es_id, uint64_t timeout, size_t *num_in_progress, h
|
||||
* \es_id
|
||||
* \param[out] num_not_canceled The number of events not canceled
|
||||
* \param[out] err_occurred Status indicating if error is present in the event set
|
||||
* \returns \herr_t
|
||||
* \return \herr_t
|
||||
*
|
||||
* \details H5EScancel() attempts to cancel operations in an event set specified
|
||||
* by \p es_id. H5ES_NONE is a valid value for \p es_id, but functions as a no-op.
|
||||
@@ -218,7 +218,7 @@ H5_DLL herr_t H5EScancel(hid_t es_id, size_t *num_not_canceled, hbool_t *err_occ
|
||||
*
|
||||
* \es_id
|
||||
* \param[out] count The number of events in the event set
|
||||
* \returns \herr_t
|
||||
* \return \herr_t
|
||||
*
|
||||
* \details H5ESget_count() retrieves number of events in an event set specified
|
||||
* by \p es_id.
|
||||
@@ -235,7 +235,7 @@ H5_DLL herr_t H5ESget_count(hid_t es_id, size_t *count);
|
||||
*
|
||||
* \es_id
|
||||
* \param[out] counter The accumulative counter value for an event set
|
||||
* \returns \herr_t
|
||||
* \return \herr_t
|
||||
*
|
||||
* \details H5ESget_op_counter() retrieves the current accumulative count of
|
||||
* event set operations since the event set creation of \p es_id.
|
||||
@@ -257,7 +257,7 @@ H5_DLL herr_t H5ESget_op_counter(hid_t es_id, uint64_t *counter);
|
||||
* \es_id
|
||||
* \param[out] err_occurred Status indicating if error is present in the event
|
||||
* set
|
||||
* \returns \herr_t
|
||||
* \return \herr_t
|
||||
*
|
||||
* \details H5ESget_err_status() checks if event set specified by es_id has
|
||||
* failed operations.
|
||||
@@ -274,7 +274,7 @@ H5_DLL herr_t H5ESget_err_status(hid_t es_id, hbool_t *err_occurred);
|
||||
*
|
||||
* \es_id
|
||||
* \param[out] num_errs Number of errors
|
||||
* \returns \herr_t
|
||||
* \return \herr_t
|
||||
*
|
||||
* \details H5ESget_err_count() retrieves the number of failed operations in an
|
||||
* event set specified by \p es_id.
|
||||
@@ -296,7 +296,7 @@ H5_DLL herr_t H5ESget_err_count(hid_t es_id, size_t *num_errs);
|
||||
* \param[in] num_err_info The number of elements in \p err_info array
|
||||
* \param[out] err_info Array of structures
|
||||
* \param[out] err_cleared Number of cleared errors
|
||||
* \returns \herr_t
|
||||
* \return \herr_t
|
||||
*
|
||||
* \details H5ESget_err_info() retrieves information about failed operations in
|
||||
* an event set specified by \p es_id. The strings retrieved for each
|
||||
@@ -318,7 +318,7 @@ H5_DLL herr_t H5ESget_err_info(hid_t es_id, size_t num_err_info, H5ES_err_info_t
|
||||
*
|
||||
* \param[in] num_err_info The number of elements in \p err_info array
|
||||
* \param[in] err_info Array of structures
|
||||
* \returns \herr_t
|
||||
* \return \herr_t
|
||||
*
|
||||
* \since 1.14.0
|
||||
*
|
||||
@@ -334,7 +334,7 @@ H5_DLL herr_t H5ESfree_err_info(size_t num_err_info, H5ES_err_info_t err_info[])
|
||||
* \es_id
|
||||
* \param[in] func The insert function to register
|
||||
* \param[in] ctx User-specified information (context) to pass to \p func
|
||||
* \returns \herr_t
|
||||
* \return \herr_t
|
||||
*
|
||||
* \details Only one insert callback can be registered for each event set.
|
||||
* Registering a new callback will replace the existing one.
|
||||
@@ -354,7 +354,7 @@ H5_DLL herr_t H5ESregister_insert_func(hid_t es_id, H5ES_event_insert_func_t fun
|
||||
* \es_id
|
||||
* \param[in] func The completion function to register
|
||||
* \param[in] ctx User-specified information (context) to pass to \p func
|
||||
* \returns \herr_t
|
||||
* \return \herr_t
|
||||
*
|
||||
* \details Only one complete callback can be registered for each event set.
|
||||
* Registering a new callback will replace the existing one.
|
||||
@@ -371,7 +371,7 @@ H5_DLL herr_t H5ESregister_complete_func(hid_t es_id, H5ES_event_complete_func_t
|
||||
* \brief Terminates access to an event set
|
||||
*
|
||||
* \es_id
|
||||
* \returns \herr_t
|
||||
* \return \herr_t
|
||||
*
|
||||
* \details H5ESclose() terminates access to an event set specified by \p es_id.
|
||||
*
|
||||
|
||||
@@ -86,7 +86,6 @@ H5Eget_major(H5E_major_t maj)
|
||||
char *ret_value; /* Return value */
|
||||
|
||||
FUNC_ENTER_API_NOCLEAR(NULL)
|
||||
H5TRACE1("*s", "i", maj);
|
||||
|
||||
/* Get the message object */
|
||||
if (NULL == (msg = (H5E_msg_t *)H5I_object_verify(maj, H5I_ERROR_MSG)))
|
||||
@@ -135,7 +134,6 @@ H5Eget_minor(H5E_minor_t min)
|
||||
char *ret_value; /* Return value */
|
||||
|
||||
FUNC_ENTER_API_NOCLEAR(NULL)
|
||||
H5TRACE1("*s", "i", min);
|
||||
|
||||
/* Get the message object */
|
||||
if (NULL == (msg = (H5E_msg_t *)H5I_object_verify(min, H5I_ERROR_MSG)))
|
||||
@@ -188,7 +186,6 @@ H5Epush1(const char *file, const char *func, unsigned line, H5E_major_t maj, H5E
|
||||
|
||||
/* Don't clear the error stack! :-) */
|
||||
FUNC_ENTER_API_NOCLEAR(FAIL)
|
||||
H5TRACE6("e", "*s*sIuii*s", file, func, line, maj, min, str);
|
||||
|
||||
/* Push the error on the default error stack */
|
||||
if (H5E__push_stack(NULL, file, func, line, H5E_ERR_CLS_g, maj, min, str) < 0)
|
||||
@@ -215,7 +212,6 @@ H5Eclear1(void)
|
||||
|
||||
/* Don't clear the error stack! :-) */
|
||||
FUNC_ENTER_API_NOCLEAR(FAIL)
|
||||
H5TRACE0("e", "");
|
||||
|
||||
/* Clear the default error stack */
|
||||
if (H5E_clear_stack(NULL) < 0)
|
||||
@@ -246,7 +242,6 @@ H5Eprint1(FILE *stream)
|
||||
|
||||
/* Don't clear the error stack! :-) */
|
||||
FUNC_ENTER_API_NOCLEAR(FAIL)
|
||||
/*NO TRACE*/
|
||||
|
||||
if (NULL == (estack = H5E__get_my_stack()))
|
||||
HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, FAIL, "can't get current error stack");
|
||||
@@ -279,7 +274,6 @@ H5Ewalk1(H5E_direction_t direction, H5E_walk1_t func, void *client_data)
|
||||
|
||||
/* Don't clear the error stack! :-) */
|
||||
FUNC_ENTER_API_NOCLEAR(FAIL)
|
||||
/*NO TRACE*/
|
||||
|
||||
if (NULL == (estack = H5E__get_my_stack()))
|
||||
HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, FAIL, "can't get current error stack");
|
||||
@@ -315,7 +309,6 @@ H5Eget_auto1(H5E_auto1_t *func /*out*/, void **client_data /*out*/)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "*Ea**x", func, client_data);
|
||||
|
||||
/* Retrieve default error stack */
|
||||
if (NULL == (estack = H5E__get_my_stack()))
|
||||
@@ -365,7 +358,6 @@ H5Eset_auto1(H5E_auto1_t func, void *client_data)
|
||||
|
||||
/* Don't clear the error stack! :-) */
|
||||
FUNC_ENTER_API_NOCLEAR(FAIL)
|
||||
H5TRACE2("e", "Ea*x", func, client_data);
|
||||
|
||||
if (NULL == (estack = H5E__get_my_stack()))
|
||||
HGOTO_ERROR(H5E_ERROR, H5E_CANTGET, FAIL, "can't get current error stack");
|
||||
|
||||
@@ -176,6 +176,9 @@ extern "C" {
|
||||
* \param[in] client_data Pointer to client data in the format expected by the
|
||||
* user-defined function
|
||||
* \return \herr_t
|
||||
*
|
||||
* \since 1.8.0
|
||||
*
|
||||
*/
|
||||
typedef herr_t (*H5E_walk2_t)(unsigned n, const H5E_error2_t *err_desc, void *client_data);
|
||||
//! <!-- [H5E_walk2_t_snip] -->
|
||||
@@ -188,6 +191,9 @@ typedef herr_t (*H5E_walk2_t)(unsigned n, const H5E_error2_t *err_desc, void *cl
|
||||
* \param[in] client_data Pointer to client data in the format expected by the
|
||||
* user-defined function
|
||||
* \return \herr_t
|
||||
*
|
||||
* \since 1.8.0
|
||||
*
|
||||
*/
|
||||
typedef herr_t (*H5E_auto2_t)(hid_t estack, void *client_data);
|
||||
//! <!-- [H5E_auto2_t_snip] -->
|
||||
|
||||
@@ -116,7 +116,6 @@ H5Fget_create_plist(hid_t file_id)
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE1("i", "i", file_id);
|
||||
|
||||
/* check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object(file_id)))
|
||||
@@ -163,7 +162,6 @@ H5Fget_access_plist(hid_t file_id)
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE1("i", "i", file_id);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object(file_id)))
|
||||
@@ -226,7 +224,6 @@ H5Fget_obj_count(hid_t file_id, unsigned types)
|
||||
ssize_t ret_value = 0; /* Return value */
|
||||
|
||||
FUNC_ENTER_API((-1))
|
||||
H5TRACE2("Zs", "iIu", file_id, types);
|
||||
|
||||
/* Check arguments */
|
||||
if (0 == (types & H5F_OBJ_ALL))
|
||||
@@ -344,7 +341,6 @@ H5Fget_obj_ids(hid_t file_id, unsigned types, size_t max_objs, hid_t *oid_list /
|
||||
ssize_t ret_value = 0; /* Return value */
|
||||
|
||||
FUNC_ENTER_API((-1))
|
||||
H5TRACE4("Zs", "iIuz*i", file_id, types, max_objs, oid_list);
|
||||
|
||||
/* Check arguments */
|
||||
if (0 == (types & H5F_OBJ_ALL))
|
||||
@@ -437,7 +433,6 @@ H5Fget_vfd_handle(hid_t file_id, hid_t fapl_id, void **file_handle /*out*/)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3("e", "ii**x", file_id, fapl_id, file_handle);
|
||||
|
||||
/* Check args */
|
||||
if (!file_handle)
|
||||
@@ -479,7 +474,6 @@ H5Fis_accessible(const char *filename, hid_t fapl_id)
|
||||
htri_t ret_value; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("t", "*si", filename, fapl_id);
|
||||
|
||||
/* Check args */
|
||||
if (!filename || !*filename)
|
||||
@@ -653,7 +647,6 @@ H5Fcreate(const char *filename, unsigned flags, hid_t fcpl_id, hid_t fapl_id)
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE4("i", "*sIuii", filename, flags, fcpl_id, fapl_id);
|
||||
|
||||
/* Create the file synchronously */
|
||||
if ((ret_value = H5F__create_api_common(filename, flags, fcpl_id, fapl_id, NULL)) < 0)
|
||||
@@ -692,7 +685,6 @@ H5Fcreate_async(const char *app_file, const char *app_func, unsigned app_line, c
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE8("i", "*s*sIu*sIuiii", app_file, app_func, app_line, filename, flags, fcpl_id, fapl_id, es_id);
|
||||
|
||||
/* Set up request token pointer for asynchronous operation */
|
||||
if (H5ES_NONE != es_id)
|
||||
@@ -829,7 +821,6 @@ H5Fopen(const char *filename, unsigned flags, hid_t fapl_id)
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE3("i", "*sIui", filename, flags, fapl_id);
|
||||
|
||||
/* Open the file synchronously */
|
||||
if ((ret_value = H5F__open_api_common(filename, flags, fapl_id, NULL)) < 0)
|
||||
@@ -869,7 +860,6 @@ H5Fopen_async(const char *app_file, const char *app_func, unsigned app_line, con
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE7("i", "*s*sIu*sIuii", app_file, app_func, app_line, filename, flags, fapl_id, es_id);
|
||||
|
||||
/* Set up request token pointer for asynchronous operation */
|
||||
if (H5ES_NONE != es_id)
|
||||
@@ -975,7 +965,6 @@ H5Fflush(hid_t object_id, H5F_scope_t scope)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "iFs", object_id, scope);
|
||||
|
||||
/* Flush the file synchronously */
|
||||
if (H5F__flush_api_common(object_id, scope, NULL, NULL) < 0)
|
||||
@@ -1005,7 +994,6 @@ H5Fflush_async(const char *app_file, const char *app_func, unsigned app_line, hi
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE6("e", "*s*sIuiFsi", app_file, app_func, app_line, object_id, scope, es_id);
|
||||
|
||||
/* Set up request token pointer for asynchronous operation */
|
||||
if (H5ES_NONE != es_id)
|
||||
@@ -1047,7 +1035,6 @@ H5Fclose(hid_t file_id)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE1("e", "i", file_id);
|
||||
|
||||
/* Check arguments */
|
||||
if (H5I_FILE != H5I_get_type(file_id))
|
||||
@@ -1082,7 +1069,6 @@ H5Fclose_async(const char *app_file, const char *app_func, unsigned app_line, hi
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE5("e", "*s*sIuii", app_file, app_func, app_line, file_id, es_id);
|
||||
|
||||
/* Check arguments */
|
||||
if (H5I_FILE != H5I_get_type(file_id))
|
||||
@@ -1143,7 +1129,6 @@ H5Fdelete(const char *filename, hid_t fapl_id)
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "*si", filename, fapl_id);
|
||||
|
||||
/* Check args */
|
||||
if (!filename || !*filename)
|
||||
@@ -1212,7 +1197,6 @@ H5Fmount(hid_t loc_id, const char *name, hid_t child_id, hid_t plist_id)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE4("e", "i*sii", loc_id, name, child_id, plist_id);
|
||||
|
||||
/* Check arguments */
|
||||
loc_type = H5I_get_type(loc_id);
|
||||
@@ -1329,7 +1313,6 @@ H5Funmount(hid_t loc_id, const char *name)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*s", loc_id, name);
|
||||
|
||||
/* Check arguments */
|
||||
loc_type = H5I_get_type(loc_id);
|
||||
@@ -1466,7 +1449,6 @@ H5Freopen(hid_t file_id)
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE1("i", "i", file_id);
|
||||
|
||||
/* Reopen the file synchronously */
|
||||
if ((ret_value = H5F__reopen_api_common(file_id, NULL)) < 0)
|
||||
@@ -1506,7 +1488,6 @@ H5Freopen_async(const char *app_file, const char *app_func, unsigned app_line, h
|
||||
hid_t ret_value; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE5("i", "*s*sIuii", app_file, app_func, app_line, file_id, es_id);
|
||||
|
||||
/* Set up request token pointer for asynchronous operation */
|
||||
if (H5ES_NONE != es_id)
|
||||
@@ -1567,7 +1548,6 @@ H5Fget_intent(hid_t file_id, unsigned *intent_flags /*out*/)
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*Iu", file_id, intent_flags);
|
||||
|
||||
/* If no intent flags were passed in, exit quietly */
|
||||
if (intent_flags) {
|
||||
@@ -1607,7 +1587,6 @@ H5Fget_fileno(hid_t file_id, unsigned long *fnumber /*out*/)
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*Ul", file_id, fnumber);
|
||||
|
||||
/* If no fnumber pointer was passed in, exit quietly */
|
||||
if (fnumber) {
|
||||
@@ -1650,7 +1629,6 @@ H5Fget_freespace(hid_t file_id)
|
||||
hssize_t ret_value; /* Return value */
|
||||
|
||||
FUNC_ENTER_API((-1))
|
||||
H5TRACE1("Hs", "i", file_id);
|
||||
|
||||
/* Get the file object */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object(file_id)))
|
||||
@@ -1692,7 +1670,6 @@ H5Fget_filesize(hid_t file_id, hsize_t *size /*out*/)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*h", file_id, size);
|
||||
|
||||
/* Check args */
|
||||
if (!size)
|
||||
@@ -1760,7 +1737,6 @@ H5Fget_file_image(hid_t file_id, void *buf /*out*/, size_t buf_len)
|
||||
ssize_t ret_value; /* Return value */
|
||||
|
||||
FUNC_ENTER_API((-1))
|
||||
H5TRACE3("Zs", "i*xz", file_id, buf, buf_len);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
|
||||
@@ -1807,7 +1783,6 @@ H5Fget_mdc_config(hid_t file_id, H5AC_cache_config_t *config /*out*/)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*Cc", file_id, config);
|
||||
|
||||
/* Check args */
|
||||
if ((NULL == config) || (config->version != H5AC__CURR_CACHE_CONFIG_VERSION))
|
||||
@@ -1850,7 +1825,6 @@ H5Fset_mdc_config(hid_t file_id, const H5AC_cache_config_t *config_ptr)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*Cc", file_id, config_ptr);
|
||||
|
||||
/* Get the file object */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object(file_id)))
|
||||
@@ -1890,7 +1864,6 @@ H5Fget_mdc_hit_rate(hid_t file_id, double *hit_rate /*out*/)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*d", file_id, hit_rate);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == hit_rate)
|
||||
@@ -1935,7 +1908,6 @@ H5Fget_mdc_size(hid_t file_id, size_t *max_size /*out*/, size_t *min_clean_size
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE5("e", "i*z*z*z*Is", file_id, max_size, min_clean_size, cur_size, cur_num_entries);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
|
||||
@@ -1985,7 +1957,6 @@ H5Freset_mdc_hit_rate_stats(hid_t file_id)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE1("e", "i", file_id);
|
||||
|
||||
/* Get the file object */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object(file_id)))
|
||||
@@ -2032,7 +2003,6 @@ H5Fget_name(hid_t obj_id, char *name /*out*/, size_t size)
|
||||
ssize_t ret_value = -1; /* Return value */
|
||||
|
||||
FUNC_ENTER_API((-1))
|
||||
H5TRACE3("Zs", "i*sz", obj_id, name, size);
|
||||
|
||||
/* Check the type */
|
||||
type = H5I_get_type(obj_id);
|
||||
@@ -2085,7 +2055,6 @@ H5Fget_info2(hid_t obj_id, H5F_info2_t *finfo /*out*/)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*FI", obj_id, finfo);
|
||||
|
||||
/* Check args */
|
||||
if (!finfo)
|
||||
@@ -2134,7 +2103,6 @@ H5Fget_metadata_read_retry_info(hid_t file_id, H5F_retry_info_t *info /*out*/)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*!", file_id, info);
|
||||
|
||||
/* Check args */
|
||||
if (!info)
|
||||
@@ -2179,7 +2147,6 @@ H5Fget_free_sections(hid_t file_id, H5F_mem_t type, size_t nsects, H5F_sect_info
|
||||
ssize_t ret_value = -1; /* Return value */
|
||||
|
||||
FUNC_ENTER_API((-1))
|
||||
H5TRACE4("Zs", "iFmz*!", file_id, type, nsects, sect_info);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
|
||||
@@ -2225,7 +2192,6 @@ H5Fclear_elink_file_cache(hid_t file_id)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE1("e", "i", file_id);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
|
||||
@@ -2285,7 +2251,6 @@ H5Fstart_swmr_write(hid_t file_id)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE1("e", "i", file_id);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
|
||||
@@ -2325,7 +2290,6 @@ H5Fstart_mdc_logging(hid_t file_id)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE1("e", "i", file_id);
|
||||
|
||||
/* Sanity check */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
|
||||
@@ -2362,7 +2326,6 @@ H5Fstop_mdc_logging(hid_t file_id)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE1("e", "i", file_id);
|
||||
|
||||
/* Sanity check */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
|
||||
@@ -2400,7 +2363,6 @@ H5Fget_mdc_logging_status(hid_t file_id, hbool_t *is_enabled /*out*/, hbool_t *i
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3("e", "i*b*b", file_id, is_enabled, is_currently_logging);
|
||||
|
||||
/* Sanity check */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
|
||||
@@ -2441,7 +2403,6 @@ H5Fset_libver_bounds(hid_t file_id, H5F_libver_t low, H5F_libver_t high)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3("e", "iFvFv", file_id, low, high);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
|
||||
@@ -2484,7 +2445,6 @@ H5Fformat_convert(hid_t file_id)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE1("e", "i", file_id);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
|
||||
@@ -2523,7 +2483,6 @@ H5Freset_page_buffering_stats(hid_t file_id)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE1("e", "i", file_id);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
|
||||
@@ -2561,7 +2520,6 @@ H5Fget_page_buffering_stats(hid_t file_id, unsigned accesses[2] /*out*/, unsigne
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE6("e", "i*Iu*Iu*Iu*Iu*Iu", file_id, accesses, hits, misses, evictions, bypasses);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
|
||||
@@ -2608,7 +2566,6 @@ H5Fget_mdc_image_info(hid_t file_id, haddr_t *image_addr /*out*/, hsize_t *image
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3("e", "i*a*h", file_id, image_addr, image_len);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
|
||||
@@ -2646,7 +2603,6 @@ H5Fget_eoa(hid_t file_id, haddr_t *eoa /*out*/)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*a", file_id, eoa);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
|
||||
@@ -2689,7 +2645,6 @@ H5Fincrement_filesize(hid_t file_id, hsize_t increment)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "ih", file_id, increment);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
|
||||
@@ -2727,7 +2682,6 @@ H5Fget_dset_no_attrs_hint(hid_t file_id, hbool_t *minimize /*out*/)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*b", file_id, minimize);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == minimize)
|
||||
@@ -2767,7 +2721,6 @@ H5Fset_dset_no_attrs_hint(hid_t file_id, hbool_t minimize)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "ib", file_id, minimize);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
|
||||
|
||||
-37
@@ -207,7 +207,6 @@ H5FDregister(const H5FD_class_t *cls)
|
||||
hid_t ret_value = H5I_INVALID_HID;
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE1("i", "*FC", cls);
|
||||
|
||||
/* Check arguments */
|
||||
if (!cls)
|
||||
@@ -309,7 +308,6 @@ H5FDis_driver_registered_by_name(const char *driver_name)
|
||||
htri_t ret_value = false; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE1("t", "*s", driver_name);
|
||||
|
||||
/* Check if driver with this name is registered */
|
||||
if ((ret_value = H5FD_is_driver_registered_by_name(driver_name, NULL)) < 0)
|
||||
@@ -337,7 +335,6 @@ H5FDis_driver_registered_by_value(H5FD_class_value_t driver_value)
|
||||
htri_t ret_value = false;
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE1("t", "DV", driver_value);
|
||||
|
||||
/* Check if driver with this value is registered */
|
||||
if ((ret_value = H5FD_is_driver_registered_by_value(driver_value, NULL)) < 0)
|
||||
@@ -365,7 +362,6 @@ H5FDunregister(hid_t driver_id)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE1("e", "i", driver_id);
|
||||
|
||||
/* Check arguments */
|
||||
if (NULL == H5I_object_verify(driver_id, H5I_VFL))
|
||||
@@ -689,7 +685,6 @@ H5FDopen(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr)
|
||||
H5FD_t *ret_value = NULL;
|
||||
|
||||
FUNC_ENTER_API(NULL)
|
||||
H5TRACE4("*#", "*sIuia", name, flags, fapl_id, maxaddr);
|
||||
|
||||
/* Check arguments */
|
||||
if (H5P_DEFAULT == fapl_id)
|
||||
@@ -825,7 +820,6 @@ H5FDclose(H5FD_t *file)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE1("e", "*#", file);
|
||||
|
||||
/* Check arguments */
|
||||
if (!file)
|
||||
@@ -903,7 +897,6 @@ H5FDcmp(const H5FD_t *f1, const H5FD_t *f2)
|
||||
int ret_value = -1;
|
||||
|
||||
FUNC_ENTER_API(-1) /* return value is arbitrary */
|
||||
H5TRACE2("Is", "*#*#", f1, f2);
|
||||
|
||||
/* Call private function */
|
||||
ret_value = H5FD_cmp(f1, f2);
|
||||
@@ -973,7 +966,6 @@ H5FDquery(const H5FD_t *file, unsigned long *flags /*out*/)
|
||||
int ret_value = 0;
|
||||
|
||||
FUNC_ENTER_API((-1))
|
||||
H5TRACE2("Is", "*#*Ul", file, flags);
|
||||
|
||||
/* Check arguments */
|
||||
if (!file)
|
||||
@@ -1066,7 +1058,6 @@ H5FDalloc(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size)
|
||||
haddr_t ret_value = HADDR_UNDEF;
|
||||
|
||||
FUNC_ENTER_API(HADDR_UNDEF)
|
||||
H5TRACE4("a", "*#Mtih", file, type, dxpl_id, size);
|
||||
|
||||
/* Check arguments */
|
||||
if (!file)
|
||||
@@ -1116,7 +1107,6 @@ H5FDfree(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, hsize_t siz
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE5("e", "*#Mtiah", file, type, dxpl_id, addr, size);
|
||||
|
||||
/* Check arguments */
|
||||
if (!file)
|
||||
@@ -1159,7 +1149,6 @@ H5FDget_eoa(H5FD_t *file, H5FD_mem_t type)
|
||||
haddr_t ret_value;
|
||||
|
||||
FUNC_ENTER_API(HADDR_UNDEF)
|
||||
H5TRACE2("a", "*#Mt", file, type);
|
||||
|
||||
/* Check arguments */
|
||||
if (!file)
|
||||
@@ -1207,7 +1196,6 @@ H5FDset_eoa(H5FD_t *file, H5FD_mem_t type, haddr_t addr)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3("e", "*#Mta", file, type, addr);
|
||||
|
||||
/* Check arguments */
|
||||
if (!file)
|
||||
@@ -1255,7 +1243,6 @@ H5FDget_eof(H5FD_t *file, H5FD_mem_t type)
|
||||
haddr_t ret_value;
|
||||
|
||||
FUNC_ENTER_API(HADDR_UNDEF)
|
||||
H5TRACE2("a", "*#Mt", file, type);
|
||||
|
||||
/* Check arguments */
|
||||
if (!file)
|
||||
@@ -1405,7 +1392,6 @@ H5FDread(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, size_t size
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE6("e", "*#Mtiaz*x", file, type, dxpl_id, addr, size, buf);
|
||||
|
||||
/* Check arguments */
|
||||
if (!file)
|
||||
@@ -1451,7 +1437,6 @@ H5FDwrite(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, size_t siz
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE6("e", "*#Mtiaz*x", file, type, dxpl_id, addr, size, buf);
|
||||
|
||||
/* Check arguments */
|
||||
if (!file)
|
||||
@@ -1507,7 +1492,6 @@ H5FDread_vector(H5FD_t *file, hid_t dxpl_id, uint32_t count, H5FD_mem_t types[],
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE7("e", "*#iIu*Mt*a*z**x", file, dxpl_id, count, types, addrs, sizes, bufs);
|
||||
|
||||
/* Check arguments */
|
||||
if (!file)
|
||||
@@ -1583,7 +1567,6 @@ H5FDwrite_vector(H5FD_t *file, hid_t dxpl_id, uint32_t count, H5FD_mem_t types[]
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE7("e", "*#iIu*Mt*a*z**x", file, dxpl_id, count, types, addrs, sizes, bufs);
|
||||
|
||||
/* Check arguments */
|
||||
if (!file)
|
||||
@@ -1676,8 +1659,6 @@ H5FDread_selection(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, uint32_t count,
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE9("e", "*#MtiIu*i*i*a*z**x", file, type, dxpl_id, count, mem_space_ids, file_space_ids, offsets,
|
||||
element_sizes, bufs);
|
||||
|
||||
/* Check arguments */
|
||||
if (!file)
|
||||
@@ -1773,8 +1754,6 @@ H5FDwrite_selection(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, uint32_t count
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE9("e", "*#MtiIu*i*i*a*z**x", file, type, dxpl_id, count, mem_space_ids, file_space_ids, offsets,
|
||||
element_sizes, bufs);
|
||||
|
||||
/* Check arguments */
|
||||
if (!file)
|
||||
@@ -1877,8 +1856,6 @@ H5FDread_vector_from_selection(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, uin
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE9("e", "*#MtiIu*i*i*a*z**x", file, type, dxpl_id, count, mem_space_ids, file_space_ids, offsets,
|
||||
element_sizes, bufs);
|
||||
|
||||
/* Check arguments */
|
||||
if (!file)
|
||||
@@ -1975,8 +1952,6 @@ H5FDwrite_vector_from_selection(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, ui
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE9("e", "*#MtiIu*i*i*a*z**x", file, type, dxpl_id, count, mem_space_ids, file_space_ids, offsets,
|
||||
element_sizes, bufs);
|
||||
|
||||
/* Check arguments */
|
||||
if (!file)
|
||||
@@ -2073,8 +2048,6 @@ H5FDread_from_selection(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, uint32_t c
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE9("e", "*#MtiIu*i*i*a*z**x", file, type, dxpl_id, count, mem_space_ids, file_space_ids, offsets,
|
||||
element_sizes, bufs);
|
||||
|
||||
/* Check arguments */
|
||||
if (!file)
|
||||
@@ -2170,8 +2143,6 @@ H5FDwrite_from_selection(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, uint32_t
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE9("e", "*#MtiIu*i*i*a*z**x", file, type, dxpl_id, count, mem_space_ids, file_space_ids, offsets,
|
||||
element_sizes, bufs);
|
||||
|
||||
/* Check arguments */
|
||||
if (!file)
|
||||
@@ -2237,7 +2208,6 @@ H5FDflush(H5FD_t *file, hid_t dxpl_id, hbool_t closing)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3("e", "*#ib", file, dxpl_id, closing);
|
||||
|
||||
/* Check arguments */
|
||||
if (!file)
|
||||
@@ -2304,7 +2274,6 @@ H5FDtruncate(H5FD_t *file, hid_t dxpl_id, hbool_t closing)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3("e", "*#ib", file, dxpl_id, closing);
|
||||
|
||||
/* Check arguments */
|
||||
if (!file)
|
||||
@@ -2370,7 +2339,6 @@ H5FDlock(H5FD_t *file, hbool_t rw)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "*#b", file, rw);
|
||||
|
||||
/* Check arguments */
|
||||
if (!file)
|
||||
@@ -2429,7 +2397,6 @@ H5FDunlock(H5FD_t *file)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE1("e", "*#", file);
|
||||
|
||||
/* Check arguments */
|
||||
if (!file)
|
||||
@@ -2497,7 +2464,6 @@ H5FDctl(H5FD_t *file, uint64_t op_code, uint64_t flags, const void *input, void
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE5("e", "*#ULUL*x**x", file, op_code, flags, input, output);
|
||||
|
||||
/* Check arguments */
|
||||
if (!file)
|
||||
@@ -2616,7 +2582,6 @@ H5FDget_vfd_handle(H5FD_t *file, hid_t fapl_id, void **file_handle /*out*/)
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3("e", "*#i**x", file, fapl_id, file_handle);
|
||||
|
||||
/* Check arguments */
|
||||
if (!file)
|
||||
@@ -2760,7 +2725,6 @@ H5FDdriver_query(hid_t driver_id, unsigned long *flags /*out*/)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*Ul", driver_id, flags);
|
||||
|
||||
/* Check arguments */
|
||||
if (NULL == flags)
|
||||
@@ -2791,7 +2755,6 @@ H5FDdelete(const char *filename, hid_t fapl_id)
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "*si", filename, fapl_id);
|
||||
|
||||
/* Check arguments */
|
||||
if (!filename || !*filename)
|
||||
|
||||
+4
-8
@@ -391,7 +391,7 @@ H5FD__core_write_to_bstore(H5FD_core_t *file, haddr_t addr, size_t size)
|
||||
|
||||
if (-1 == bytes_wrote) { /* error */
|
||||
int myerrno = errno;
|
||||
time_t mytime = HDtime(NULL);
|
||||
time_t mytime = time(NULL);
|
||||
|
||||
offset = HDlseek(file->fd, 0, SEEK_CUR);
|
||||
|
||||
@@ -399,7 +399,7 @@ H5FD__core_write_to_bstore(H5FD_core_t *file, haddr_t addr, size_t size)
|
||||
"write to backing store failed: time = %s, filename = '%s', file descriptor = %d, "
|
||||
"errno = %d, error message = '%s', ptr = %p, total write size = %llu, bytes this "
|
||||
"sub-write = %llu, bytes actually written = %llu, offset = %llu",
|
||||
HDctime(&mytime), file->name, file->fd, myerrno, strerror(myerrno), (void *)ptr,
|
||||
ctime(&mytime), file->name, file->fd, myerrno, strerror(myerrno), (void *)ptr,
|
||||
(unsigned long long)size, (unsigned long long)bytes_in,
|
||||
(unsigned long long)bytes_wrote, (unsigned long long)offset);
|
||||
} /* end if */
|
||||
@@ -518,7 +518,6 @@ H5Pset_core_write_tracking(hid_t plist_id, hbool_t is_enabled, size_t page_size)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3("e", "ibz", plist_id, is_enabled, page_size);
|
||||
|
||||
/* The page size cannot be zero */
|
||||
if (page_size == 0)
|
||||
@@ -565,7 +564,6 @@ H5Pget_core_write_tracking(hid_t plist_id, hbool_t *is_enabled /*out*/, size_t *
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3("e", "i*b*z", plist_id, is_enabled, page_size);
|
||||
|
||||
/* Get the plist structure */
|
||||
if (NULL == (plist = H5P_object_verify(plist_id, H5P_FILE_ACCESS)))
|
||||
@@ -604,7 +602,6 @@ H5Pset_fapl_core(hid_t fapl_id, size_t increment, hbool_t backing_store)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3("e", "izb", fapl_id, increment, backing_store);
|
||||
|
||||
/* Check argument */
|
||||
if (NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
|
||||
@@ -642,7 +639,6 @@ H5Pget_fapl_core(hid_t fapl_id, size_t *increment /*out*/, hbool_t *backing_stor
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3("e", "i*z*b", fapl_id, increment, backing_store);
|
||||
|
||||
if (NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list");
|
||||
@@ -900,7 +896,7 @@ H5FD__core_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr
|
||||
|
||||
if (-1 == bytes_read) { /* error */
|
||||
int myerrno = errno;
|
||||
time_t mytime = HDtime(NULL);
|
||||
time_t mytime = time(NULL);
|
||||
|
||||
offset = HDlseek(file->fd, 0, SEEK_CUR);
|
||||
|
||||
@@ -909,7 +905,7 @@ H5FD__core_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr
|
||||
"file read failed: time = %s, filename = '%s', file descriptor = %d, errno = %d, "
|
||||
"error message = '%s', file->mem = %p, total read size = %llu, bytes this "
|
||||
"sub-read = %llu, bytes actually read = %llu, offset = %llu",
|
||||
HDctime(&mytime), file->name, file->fd, myerrno, strerror(myerrno),
|
||||
ctime(&mytime), file->name, file->fd, myerrno, strerror(myerrno),
|
||||
(void *)file->mem, (unsigned long long)size, (unsigned long long)bytes_in,
|
||||
(unsigned long long)bytes_read, (unsigned long long)offset);
|
||||
} /* end if */
|
||||
|
||||
@@ -263,7 +263,6 @@ H5Pset_fapl_direct(hid_t fapl_id, size_t boundary, size_t block_size, size_t cbu
|
||||
herr_t ret_value;
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE4("e", "izzz", fapl_id, boundary, block_size, cbuf_size);
|
||||
|
||||
if (NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list");
|
||||
@@ -298,7 +297,6 @@ H5Pget_fapl_direct(hid_t fapl_id, size_t *boundary /*out*/, size_t *block_size /
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE4("e", "i*z*z*z", fapl_id, boundary, block_size, cbuf_size);
|
||||
|
||||
if (NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access list");
|
||||
|
||||
@@ -336,7 +336,6 @@ H5Pset_fapl_family(hid_t fapl_id, hsize_t msize, hid_t memb_fapl_id)
|
||||
H5P_genplist_t *plist; /* Property list pointer */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3("e", "ihi", fapl_id, msize, memb_fapl_id);
|
||||
|
||||
/* Check arguments */
|
||||
if (true != H5P_isa_class(fapl_id, H5P_FILE_ACCESS))
|
||||
@@ -382,7 +381,6 @@ H5Pget_fapl_family(hid_t fapl_id, hsize_t *msize /*out*/, hid_t *memb_fapl_id /*
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3("e", "i*h*i", fapl_id, msize, memb_fapl_id);
|
||||
|
||||
if (NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access list");
|
||||
|
||||
@@ -560,7 +560,6 @@ H5Pset_fapl_hdfs(hid_t fapl_id, H5FD_hdfs_fapl_t *fa)
|
||||
herr_t ret_value = FAIL;
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*#", fapl_id, fa);
|
||||
|
||||
assert(fa != NULL);
|
||||
|
||||
@@ -600,7 +599,6 @@ H5Pget_fapl_hdfs(hid_t fapl_id, H5FD_hdfs_fapl_t *fa_dst /*out*/)
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*#", fapl_id, fa_dst);
|
||||
|
||||
#if HDFS_DEBUG
|
||||
fprintf(stdout, "called %s.\n", __func__);
|
||||
|
||||
+4
-5
@@ -299,7 +299,6 @@ H5Pset_fapl_log(hid_t fapl_id, const char *logfile, unsigned long long flags, si
|
||||
herr_t ret_value; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE4("e", "i*sULz", fapl_id, logfile, flags, buf_size);
|
||||
|
||||
/* Do this first, so that we don't try to free a wild pointer if
|
||||
* H5P_object_verify() fails.
|
||||
@@ -1228,7 +1227,7 @@ H5FD__log_read(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, had
|
||||
|
||||
if (-1 == bytes_read) { /* error */
|
||||
int myerrno = errno;
|
||||
time_t mytime = HDtime(NULL);
|
||||
time_t mytime = time(NULL);
|
||||
|
||||
offset = HDlseek(file->fd, 0, SEEK_CUR);
|
||||
|
||||
@@ -1240,7 +1239,7 @@ H5FD__log_read(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, had
|
||||
"file read failed: time = %s, filename = '%s', file descriptor = %d, errno = %d, "
|
||||
"error message = '%s', buf = %p, total read size = %llu, bytes this sub-read = %llu, "
|
||||
"bytes actually read = %llu, offset = %llu",
|
||||
HDctime(&mytime), file->filename, file->fd, myerrno, strerror(myerrno), buf,
|
||||
ctime(&mytime), file->filename, file->fd, myerrno, strerror(myerrno), buf,
|
||||
(unsigned long long)size, (unsigned long long)bytes_in,
|
||||
(unsigned long long)bytes_read, (unsigned long long)offset);
|
||||
}
|
||||
@@ -1447,7 +1446,7 @@ H5FD__log_write(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, ha
|
||||
|
||||
if (-1 == bytes_wrote) { /* error */
|
||||
int myerrno = errno;
|
||||
time_t mytime = HDtime(NULL);
|
||||
time_t mytime = time(NULL);
|
||||
|
||||
offset = HDlseek(file->fd, 0, SEEK_CUR);
|
||||
|
||||
@@ -1459,7 +1458,7 @@ H5FD__log_write(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, ha
|
||||
"file write failed: time = %s, filename = '%s', file descriptor = %d, errno = %d, "
|
||||
"error message = '%s', buf = %p, total write size = %llu, bytes this sub-write = "
|
||||
"%llu, bytes actually written = %llu, offset = %llu",
|
||||
HDctime(&mytime), file->filename, file->fd, myerrno, strerror(myerrno), buf,
|
||||
ctime(&mytime), file->filename, file->fd, myerrno, strerror(myerrno), buf,
|
||||
(unsigned long long)size, (unsigned long long)bytes_in,
|
||||
(unsigned long long)bytes_wrote, (unsigned long long)offset);
|
||||
} /* end if */
|
||||
|
||||
@@ -1263,7 +1263,6 @@ H5Pget_fapl_mirror(hid_t fapl_id, H5FD_mirror_fapl_t *fa_dst /*out*/)
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*#", fapl_id, fa_dst);
|
||||
|
||||
LOG_OP_CALL(__func__);
|
||||
|
||||
@@ -1304,7 +1303,6 @@ H5Pset_fapl_mirror(hid_t fapl_id, H5FD_mirror_fapl_t *fa)
|
||||
herr_t ret_value = FAIL;
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*#", fapl_id, fa);
|
||||
|
||||
LOG_OP_CALL(__func__);
|
||||
|
||||
|
||||
@@ -389,7 +389,6 @@ H5Pset_fapl_mpio(hid_t fapl_id, MPI_Comm comm, MPI_Info info)
|
||||
herr_t ret_value;
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3("e", "iMcMi", fapl_id, comm, info);
|
||||
|
||||
/* Check arguments */
|
||||
if (fapl_id == H5P_DEFAULT)
|
||||
@@ -439,7 +438,6 @@ H5Pget_fapl_mpio(hid_t fapl_id, MPI_Comm *comm /*out*/, MPI_Info *info /*out*/)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3("e", "i*Mc*Mi", fapl_id, comm, info);
|
||||
|
||||
/* Set comm and info in case we have problems */
|
||||
if (comm)
|
||||
@@ -503,7 +501,6 @@ H5Pset_dxpl_mpio(hid_t dxpl_id, H5FD_mpio_xfer_t xfer_mode)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "iDt", dxpl_id, xfer_mode);
|
||||
|
||||
/* Check arguments */
|
||||
if (dxpl_id == H5P_DEFAULT)
|
||||
@@ -541,7 +538,6 @@ H5Pget_dxpl_mpio(hid_t dxpl_id, H5FD_mpio_xfer_t *xfer_mode /*out*/)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*Dt", dxpl_id, xfer_mode);
|
||||
|
||||
/* Check arguments */
|
||||
if (NULL == (plist = H5P_object_verify(dxpl_id, H5P_DATASET_XFER)))
|
||||
@@ -579,7 +575,6 @@ H5Pset_dxpl_mpio_collective_opt(hid_t dxpl_id, H5FD_mpio_collective_opt_t opt_mo
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "iDc", dxpl_id, opt_mode);
|
||||
|
||||
/* Check arguments */
|
||||
if (dxpl_id == H5P_DEFAULT)
|
||||
@@ -618,7 +613,6 @@ H5Pset_dxpl_mpio_chunk_opt(hid_t dxpl_id, H5FD_mpio_chunk_opt_t opt_mode)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "iDh", dxpl_id, opt_mode);
|
||||
|
||||
/* Check arguments */
|
||||
if (dxpl_id == H5P_DEFAULT)
|
||||
@@ -655,7 +649,6 @@ H5Pset_dxpl_mpio_chunk_opt_num(hid_t dxpl_id, unsigned num_chunk_per_proc)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "iIu", dxpl_id, num_chunk_per_proc);
|
||||
|
||||
/* Check arguments */
|
||||
if (dxpl_id == H5P_DEFAULT)
|
||||
@@ -695,7 +688,6 @@ H5Pset_dxpl_mpio_chunk_opt_ratio(hid_t dxpl_id, unsigned percent_num_proc_per_ch
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "iIu", dxpl_id, percent_num_proc_per_chunk);
|
||||
|
||||
/* Check arguments */
|
||||
if (dxpl_id == H5P_DEFAULT)
|
||||
|
||||
@@ -280,8 +280,6 @@ H5Pset_fapl_split(hid_t fapl, const char *meta_ext, hid_t meta_plist_id, const c
|
||||
H5FD_multi_fapl_t fa;
|
||||
static const char *func = "H5Pset_fapl_split"; /* Function Name for error reporting */
|
||||
|
||||
/*NO TRACE*/
|
||||
|
||||
/* Clear the error stack */
|
||||
H5Eclear2(H5E_DEFAULT);
|
||||
|
||||
@@ -372,8 +370,6 @@ H5Pset_fapl_multi(hid_t fapl_id, const H5FD_mem_t *memb_map, const hid_t *memb_f
|
||||
H5FD_multi_fapl_t fa;
|
||||
static const char *func = "H5FDset_fapl_multi"; /* Function Name for error reporting */
|
||||
|
||||
/*NO TRACE*/
|
||||
|
||||
/* Clear the error stack */
|
||||
H5Eclear2(H5E_DEFAULT);
|
||||
|
||||
@@ -408,8 +404,6 @@ H5Pget_fapl_multi(hid_t fapl_id, H5FD_mem_t *memb_map /*out*/, hid_t *memb_fapl
|
||||
H5FD_mem_t mt;
|
||||
static const char *func = "H5FDget_fapl_multi"; /* Function Name for error reporting */
|
||||
|
||||
/*NO TRACE*/
|
||||
|
||||
/* Clear the error stack */
|
||||
H5Eclear2(H5E_DEFAULT);
|
||||
|
||||
|
||||
+2
-5
@@ -281,7 +281,6 @@ H5Pget_fapl_onion(hid_t fapl_id, H5FD_onion_fapl_info_t *fa_out)
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*!", fapl_id, fa_out);
|
||||
|
||||
if (NULL == fa_out)
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "NULL info-out pointer");
|
||||
@@ -323,7 +322,6 @@ H5Pset_fapl_onion(hid_t fapl_id, const H5FD_onion_fapl_info_t *fa)
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*!", fapl_id, fa);
|
||||
|
||||
if (NULL == (fapl = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Not a valid FAPL ID");
|
||||
@@ -462,8 +460,8 @@ H5FD__onion_commit_new_revision_record(H5FD_onion_t *file)
|
||||
|
||||
FUNC_ENTER_PACKAGE
|
||||
|
||||
HDtime(&rawtime);
|
||||
info = HDgmtime(&rawtime);
|
||||
time(&rawtime);
|
||||
info = gmtime(&rawtime);
|
||||
strftime(rec->time_of_creation, sizeof(rec->time_of_creation), "%Y%m%dT%H%M%SZ", info);
|
||||
|
||||
rec->logical_eof = file->logical_eof;
|
||||
@@ -1667,7 +1665,6 @@ H5FDonion_get_revision_count(const char *filename, hid_t fapl_id, uint64_t *revi
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3("e", "*si*UL", filename, fapl_id, revision_count);
|
||||
|
||||
/* Check args */
|
||||
if (!filename || !strcmp(filename, ""))
|
||||
|
||||
@@ -40,7 +40,6 @@ H5FDperform_init(H5FD_init_t op)
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API_NOINIT
|
||||
/*NO TRACE*/
|
||||
|
||||
/* It is possible that an application will evaluate an
|
||||
* `H5FD_*` symbol (`H5FD_FAMILY`, `H5FD_MULTI`, `H5FD_SEC2`, etc.
|
||||
|
||||
@@ -380,7 +380,6 @@ H5Pset_fapl_ros3(hid_t fapl_id, const H5FD_ros3_fapl_t *fa)
|
||||
herr_t ret_value = FAIL;
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*#", fapl_id, fa);
|
||||
|
||||
assert(fa != NULL);
|
||||
|
||||
@@ -459,7 +458,6 @@ H5Pget_fapl_ros3(hid_t fapl_id, H5FD_ros3_fapl_t *fa_dst /*out*/)
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*#", fapl_id, fa_dst);
|
||||
|
||||
#if ROS3_DEBUG
|
||||
fprintf(stdout, "H5Pget_fapl_ros3() called.\n");
|
||||
@@ -608,7 +606,6 @@ H5Pget_fapl_ros3_token(hid_t fapl_id, size_t size, char *token_dst /*out*/)
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3("e", "iz*s", fapl_id, size, token_dst);
|
||||
|
||||
#if ROS3_DEBUG
|
||||
fprintf(stdout, "H5Pget_fapl_ros3_token() called.\n");
|
||||
@@ -794,7 +791,6 @@ H5Pset_fapl_ros3_token(hid_t fapl_id, const char *token)
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*s", fapl_id, token);
|
||||
|
||||
#if ROS3_DEBUG
|
||||
fprintf(stdout, "H5Pset_fapl_ros3_token() called.\n");
|
||||
|
||||
+5
-5
@@ -244,7 +244,7 @@ H5FD_s3comms_hrb_node_set(hrb_node_t **L, const char *name, const char *value)
|
||||
if (lowername == NULL)
|
||||
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "cannot make space for lowercase name copy.");
|
||||
for (i = 0; i < namelen; i++)
|
||||
lowername[i] = (char)HDtolower((int)name[i]);
|
||||
lowername[i] = (char)tolower((int)name[i]);
|
||||
lowername[namelen] = 0;
|
||||
|
||||
/* If value supplied, copy name, value, and concatenated "name: value".
|
||||
@@ -1598,8 +1598,8 @@ gmnow(void)
|
||||
struct tm *ret_value = NULL;
|
||||
|
||||
/* Doctor assert, checks against error in time() */
|
||||
if ((time_t)(-1) != HDtime(now_ptr))
|
||||
ret_value = HDgmtime(now_ptr);
|
||||
if ((time_t)(-1) != time(now_ptr))
|
||||
ret_value = gmtime(now_ptr);
|
||||
|
||||
assert(ret_value != NULL);
|
||||
|
||||
@@ -2172,7 +2172,7 @@ H5FD_s3comms_nlowercase(char *dest, const char *s, size_t len)
|
||||
H5MM_memcpy(dest, s, len);
|
||||
do {
|
||||
len--;
|
||||
dest[len] = (char)HDtolower((int)dest[len]);
|
||||
dest[len] = (char)tolower((int)dest[len]);
|
||||
} while (len > 0);
|
||||
}
|
||||
|
||||
@@ -2264,7 +2264,7 @@ H5FD_s3comms_parse_url(const char *str, parsed_url_t **_purl)
|
||||
strncpy(purl->scheme, curstr, (size_t)len);
|
||||
purl->scheme[len] = '\0';
|
||||
for (i = 0; i < len; i++)
|
||||
purl->scheme[i] = (char)HDtolower(purl->scheme[i]);
|
||||
purl->scheme[i] = (char)tolower(purl->scheme[i]);
|
||||
|
||||
/* Skip "://" */
|
||||
tmpstr += 3;
|
||||
|
||||
+4
-5
@@ -258,7 +258,6 @@ H5Pset_fapl_sec2(hid_t fapl_id)
|
||||
herr_t ret_value;
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE1("e", "i", fapl_id);
|
||||
|
||||
if (NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list");
|
||||
@@ -695,7 +694,7 @@ H5FD__sec2_read(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNU
|
||||
|
||||
if (-1 == bytes_read) { /* error */
|
||||
int myerrno = errno;
|
||||
time_t mytime = HDtime(NULL);
|
||||
time_t mytime = time(NULL);
|
||||
|
||||
offset = HDlseek(file->fd, 0, SEEK_CUR);
|
||||
|
||||
@@ -703,7 +702,7 @@ H5FD__sec2_read(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNU
|
||||
"file read failed: time = %s, filename = '%s', file descriptor = %d, errno = %d, "
|
||||
"error message = '%s', buf = %p, total read size = %llu, bytes this sub-read = %llu, "
|
||||
"bytes actually read = %llu, offset = %llu",
|
||||
HDctime(&mytime), file->filename, file->fd, myerrno, strerror(myerrno), buf,
|
||||
ctime(&mytime), file->filename, file->fd, myerrno, strerror(myerrno), buf,
|
||||
(unsigned long long)size, (unsigned long long)bytes_in,
|
||||
(unsigned long long)bytes_read, (unsigned long long)offset);
|
||||
} /* end if */
|
||||
@@ -801,7 +800,7 @@ H5FD__sec2_write(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UN
|
||||
|
||||
if (-1 == bytes_wrote) { /* error */
|
||||
int myerrno = errno;
|
||||
time_t mytime = HDtime(NULL);
|
||||
time_t mytime = time(NULL);
|
||||
|
||||
offset = HDlseek(file->fd, 0, SEEK_CUR);
|
||||
|
||||
@@ -809,7 +808,7 @@ H5FD__sec2_write(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UN
|
||||
"file write failed: time = %s, filename = '%s', file descriptor = %d, errno = %d, "
|
||||
"error message = '%s', buf = %p, total write size = %llu, bytes this sub-write = "
|
||||
"%llu, bytes actually written = %llu, offset = %llu",
|
||||
HDctime(&mytime), file->filename, file->fd, myerrno, strerror(myerrno), buf,
|
||||
ctime(&mytime), file->filename, file->fd, myerrno, strerror(myerrno), buf,
|
||||
(unsigned long long)size, (unsigned long long)bytes_in,
|
||||
(unsigned long long)bytes_wrote, (unsigned long long)offset);
|
||||
} /* end if */
|
||||
|
||||
@@ -287,7 +287,6 @@ H5Pset_fapl_splitter(hid_t fapl_id, H5FD_splitter_vfd_config_t *vfd_config)
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*#", fapl_id, vfd_config);
|
||||
|
||||
H5FD_SPLITTER_LOG_CALL(__func__);
|
||||
|
||||
@@ -335,7 +334,6 @@ H5Pget_fapl_splitter(hid_t fapl_id, H5FD_splitter_vfd_config_t *config /*out*/)
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*#", fapl_id, config);
|
||||
|
||||
H5FD_SPLITTER_LOG_CALL(__func__);
|
||||
|
||||
|
||||
@@ -292,8 +292,6 @@ H5Pset_fapl_stdio(hid_t fapl_id)
|
||||
{
|
||||
static const char *func = "H5FDset_fapl_stdio"; /*for error reporting*/
|
||||
|
||||
/*NO TRACE*/
|
||||
|
||||
/* Clear the error stack */
|
||||
H5Eclear2(H5E_DEFAULT);
|
||||
|
||||
|
||||
@@ -478,8 +478,6 @@ H5Pset_fapl_subfiling(hid_t fapl_id, const H5FD_subfiling_config_t *vfd_config)
|
||||
MPI_Info info = MPI_INFO_NULL;
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
/*NO TRACE*/
|
||||
|
||||
/* Ensure Subfiling (and therefore MPI) is initialized before doing anything */
|
||||
if (H5FD_subfiling_init() < 0)
|
||||
H5_SUBFILING_GOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "can't initialize subfiling VFD");
|
||||
@@ -560,8 +558,6 @@ H5Pget_fapl_subfiling(hid_t fapl_id, H5FD_subfiling_config_t *config_out)
|
||||
bool use_default_config = false;
|
||||
herr_t ret_value = SUCCEED;
|
||||
|
||||
/*NO TRACE*/
|
||||
|
||||
if (config_out == NULL)
|
||||
H5_SUBFILING_GOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "config_out is NULL");
|
||||
|
||||
|
||||
@@ -43,7 +43,6 @@ H5Pset_fapl_windows(hid_t fapl_id)
|
||||
herr_t ret_value;
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE1("e", "i", fapl_id);
|
||||
|
||||
if (NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list");
|
||||
|
||||
@@ -93,7 +93,6 @@ H5Fget_info1(hid_t obj_id, H5F_info1_t *finfo /*out*/)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*!", obj_id, finfo);
|
||||
|
||||
/* Check args */
|
||||
if (!finfo)
|
||||
@@ -149,7 +148,6 @@ H5Fis_hdf5(const char *name)
|
||||
htri_t ret_value; /* Return value */
|
||||
|
||||
FUNC_ENTER_API((-1))
|
||||
H5TRACE1("t", "*s", name);
|
||||
|
||||
/* Check args and all the boring stuff. */
|
||||
if (!name || !*name)
|
||||
@@ -214,7 +212,6 @@ H5Fset_latest_format(hid_t file_id, hbool_t latest_format)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "ib", file_id, latest_format);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
|
||||
|
||||
+4
-4
@@ -235,10 +235,10 @@
|
||||
* Note that the root group, indicated above by /, was automatically created when the file was created.
|
||||
*
|
||||
* h5dump is described on the
|
||||
* <a href="https://docs.hdfgroup.org/hdf5/v1_14/_view_tools_view.html#subsecViewToolsViewContent_h5dump">
|
||||
* <a href="https://\DOXURL/_view_tools_view.html#subsecViewToolsViewContent_h5dump">
|
||||
* Tools</a>
|
||||
* page under
|
||||
* <a href="https://docs.hdfgroup.org/hdf5/v1_14/_view_tools_command.html">Command-line Tools</a>.
|
||||
* <a href="https://\DOXURL/_view_tools_command.html">Command-line Tools</a>.
|
||||
* The HDF5 DDL grammar is described in the document \ref DDLBNF114.
|
||||
*
|
||||
* \subsection subsec_file_summary File Function Summaries
|
||||
@@ -712,7 +712,7 @@
|
||||
* If the application opens an HDF5 file without both determining the driver used to create the file
|
||||
* and setting up the use of that driver, the HDF5 Library will examine the superblock and the
|
||||
* driver definition block to identify the driver.
|
||||
* See the <a href="https://hdfgroup.github.io/hdf5/v1_14/_s_p_e_c.html">HDF5 File Format Specification</a>
|
||||
* See the <a href="https://\DOXURL/_s_p_e_c.html">HDF5 File Format Specification</a>
|
||||
* for detailed descriptions of the superblock and the driver definition block.
|
||||
*
|
||||
* \subsubsection subsubsec_file_alternate_drivers_sec2 The POSIX (aka SEC2) Driver
|
||||
@@ -888,7 +888,7 @@
|
||||
*
|
||||
* Additional parameters may be added to these functions in the future.
|
||||
*
|
||||
* @see <a href="https://portal.hdfgroup.org/documentation/hdf5-docs/advanced_topics/file_image_ops.html">
|
||||
* @see <a href="https://\DOCURL/advanced_topics/file_image_ops.html">
|
||||
* HDF5 File Image Operations</a>
|
||||
* section for information on more advanced usage of the Memory file driver, and
|
||||
* @see <a
|
||||
|
||||
@@ -255,7 +255,6 @@ H5Fset_mpi_atomicity(hid_t file_id, hbool_t flag)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "ib", file_id, flag);
|
||||
|
||||
/* Get the file object */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
|
||||
@@ -326,7 +325,6 @@ H5Fget_mpi_atomicity(hid_t file_id, bool *flag /*out*/)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*b", file_id, flag);
|
||||
|
||||
/* Get the file object */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
|
||||
|
||||
+9
-13
@@ -1141,7 +1141,7 @@ H5_DLL herr_t H5Fget_mdc_hit_rate(hid_t file_id, double *hit_rate_ptr);
|
||||
* or NULL if that datum is not desired
|
||||
* \param[out] cur_num_entries_ptr Pointer to the location in which the current number of entries in
|
||||
* the cache is to be returned, or NULL if that datum is not desired
|
||||
* \returns \herr_t
|
||||
* \return \herr_t
|
||||
*
|
||||
* \details H5Fget_mdc_size() queries the metadata cache of the target file for the desired size
|
||||
* information, and returns this information in the locations indicated by the pointer
|
||||
@@ -1167,7 +1167,7 @@ H5_DLL herr_t H5Fget_mdc_size(hid_t file_id, size_t *max_size_ptr, size_t *min_c
|
||||
* \brief Resets hit rate statistics counters for the target file
|
||||
*
|
||||
* \file_id
|
||||
* \returns \herr_t
|
||||
* \return \herr_t
|
||||
*
|
||||
* \details
|
||||
* \parblock
|
||||
@@ -1682,7 +1682,7 @@ H5_DLL herr_t H5Fget_page_buffering_stats(hid_t file_id, unsigned accesses[2], u
|
||||
* \file_id
|
||||
* \param[out] image_addr Offset of the cache image if it exists, or #HADDR_UNDEF if it does not
|
||||
* \param[out] image_size Length of the cache image if it exists, or 0 if it does not
|
||||
* \returns \herr_t
|
||||
* \return \herr_t
|
||||
*
|
||||
* \details
|
||||
* \parblock
|
||||
@@ -1770,7 +1770,7 @@ H5_DLL herr_t H5Fset_dset_no_attrs_hint(hid_t file_id, hbool_t minimize);
|
||||
* \param[in] flag Logical flag for atomicity setting. Valid values are:
|
||||
* \li \c 1 -- Sets MPI file access to atomic mode.
|
||||
* \li \c 0 -- Sets MPI file access to nonatomic mode.
|
||||
* \returns \herr_t
|
||||
* \return \herr_t
|
||||
*
|
||||
* \par Motivation
|
||||
* H5Fset_mpi_atomicity() is applicable only in parallel environments using MPI I/O.
|
||||
@@ -1835,7 +1835,7 @@ H5_DLL herr_t H5Fset_mpi_atomicity(hid_t file_id, hbool_t flag);
|
||||
* \param[out] flag Logical flag for atomicity setting. Valid values are:
|
||||
* \li 1 -- MPI file access is set to atomic mode.
|
||||
* \li 0 -- MPI file access is set to nonatomic mode.
|
||||
* \returns \herr_t
|
||||
* \return \herr_t
|
||||
*
|
||||
* \details H5Fget_mpi_atomicity() retrieves the current consistency semantics mode for
|
||||
* data access for the file \p file_id.
|
||||
@@ -1955,10 +1955,8 @@ H5_DLL herr_t H5Fget_info1(hid_t obj_id, H5F_info1_t *file_info);
|
||||
*
|
||||
* \return \herr_t
|
||||
*
|
||||
* \deprecated When?
|
||||
*
|
||||
* \todo In which version was this function introduced?
|
||||
* \todo In which version was this function deprecated?
|
||||
* \since 1.10.1
|
||||
* \deprecated 1.10.2 Deprecated in favor of the function H5Fset_libver_bounds()
|
||||
*
|
||||
*/
|
||||
H5_DLL herr_t H5Fset_latest_format(hid_t file_id, hbool_t latest_format);
|
||||
@@ -1971,12 +1969,10 @@ H5_DLL herr_t H5Fset_latest_format(hid_t file_id, hbool_t latest_format);
|
||||
*
|
||||
* \return \htri_t
|
||||
*
|
||||
* \deprecated When?
|
||||
*
|
||||
* \details H5Fis_hdf5() determines whether a file is in the HDF5 format.
|
||||
*
|
||||
* \todo In which version was this function deprecated?
|
||||
* \todo In which version was this function introduced?
|
||||
* \since 1.0.0
|
||||
* \deprecated 1.12.0 Deprecated in favor of the function H5Fis_accessible()
|
||||
*
|
||||
*/
|
||||
H5_DLL htri_t H5Fis_hdf5(const char *file_name);
|
||||
|
||||
@@ -224,7 +224,6 @@ H5Gcreate2(hid_t loc_id, const char *name, hid_t lcpl_id, hid_t gcpl_id, hid_t g
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE5("i", "i*siii", loc_id, name, lcpl_id, gcpl_id, gapl_id);
|
||||
|
||||
/* Create the group synchronously */
|
||||
if ((ret_value = H5G__create_api_common(loc_id, name, lcpl_id, gcpl_id, gapl_id, NULL, NULL)) < 0)
|
||||
@@ -254,8 +253,6 @@ H5Gcreate_async(const char *app_file, const char *app_func, unsigned app_line, h
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE9("i", "*s*sIui*siiii", app_file, app_func, app_line, loc_id, name, lcpl_id, gcpl_id, gapl_id,
|
||||
es_id);
|
||||
|
||||
/* Set up request token pointer for asynchronous operation */
|
||||
if (H5ES_NONE != es_id)
|
||||
@@ -322,7 +319,6 @@ H5Gcreate_anon(hid_t loc_id, hid_t gcpl_id, hid_t gapl_id)
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE3("i", "iii", loc_id, gcpl_id, gapl_id);
|
||||
|
||||
/* Check group property list */
|
||||
if (H5P_DEFAULT == gcpl_id)
|
||||
@@ -435,7 +431,6 @@ H5Gopen2(hid_t loc_id, const char *name, hid_t gapl_id)
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE3("i", "i*si", loc_id, name, gapl_id);
|
||||
|
||||
/* Open the group synchronously */
|
||||
if ((ret_value = H5G__open_api_common(loc_id, name, gapl_id, NULL, NULL)) < 0)
|
||||
@@ -465,7 +460,6 @@ H5Gopen_async(const char *app_file, const char *app_func, unsigned app_line, hid
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE7("i", "*s*sIui*sii", app_file, app_func, app_line, loc_id, name, gapl_id, es_id);
|
||||
|
||||
/* Set up request token pointer for asynchronous operation */
|
||||
if (H5ES_NONE != es_id)
|
||||
@@ -511,7 +505,6 @@ H5Gget_create_plist(hid_t group_id)
|
||||
hid_t ret_value = H5I_INVALID_HID;
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE1("i", "i", group_id);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(group_id, H5I_GROUP)))
|
||||
@@ -591,7 +584,6 @@ H5Gget_info(hid_t loc_id, H5G_info_t *group_info /*out*/)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*GI", loc_id, group_info);
|
||||
|
||||
/* Retrieve group information synchronously */
|
||||
if (H5G__get_info_api_common(loc_id, group_info, NULL, NULL) < 0)
|
||||
@@ -620,7 +612,6 @@ H5Gget_info_async(const char *app_file, const char *app_func, unsigned app_line,
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE6("e", "*s*sIui*GIi", app_file, app_func, app_line, loc_id, group_info, es_id);
|
||||
|
||||
/* Set up request token pointer for asynchronous operation */
|
||||
if (H5ES_NONE != es_id)
|
||||
@@ -699,7 +690,6 @@ H5Gget_info_by_name(hid_t loc_id, const char *name, H5G_info_t *group_info /*out
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE4("e", "i*s*GIi", loc_id, name, group_info, lapl_id);
|
||||
|
||||
/* Retrieve group information synchronously */
|
||||
if (H5G__get_info_by_name_api_common(loc_id, name, group_info, lapl_id, NULL, NULL) < 0)
|
||||
@@ -728,7 +718,6 @@ H5Gget_info_by_name_async(const char *app_file, const char *app_func, unsigned a
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE8("e", "*s*sIui*s*GIii", app_file, app_func, app_line, loc_id, name, group_info, lapl_id, es_id);
|
||||
|
||||
/* Set up request token pointer for asynchronous operation */
|
||||
if (H5ES_NONE != es_id)
|
||||
@@ -809,7 +798,6 @@ H5Gget_info_by_idx(hid_t loc_id, const char *group_name, H5_index_t idx_type, H5
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE7("e", "i*sIiIoh*GIi", loc_id, group_name, idx_type, order, n, group_info, lapl_id);
|
||||
|
||||
/* Retrieve group information synchronously */
|
||||
if (H5G__get_info_by_idx_api_common(loc_id, group_name, idx_type, order, n, group_info, lapl_id, NULL,
|
||||
@@ -840,8 +828,6 @@ H5Gget_info_by_idx_async(const char *app_file, const char *app_func, unsigned ap
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE11("e", "*s*sIui*sIiIoh*GIii", app_file, app_func, app_line, loc_id, group_name, idx_type, order,
|
||||
n, group_info, lapl_id, es_id);
|
||||
|
||||
/* Set up request token pointer for asynchronous operation */
|
||||
if (H5ES_NONE != es_id)
|
||||
@@ -880,7 +866,6 @@ H5Gclose(hid_t group_id)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE1("e", "i", group_id);
|
||||
|
||||
/* Check arguments */
|
||||
if (H5I_GROUP != H5I_get_type(group_id))
|
||||
@@ -915,7 +900,6 @@ H5Gclose_async(const char *app_file, const char *app_func, unsigned app_line, hi
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE5("e", "*s*sIuii", app_file, app_func, app_line, group_id, es_id);
|
||||
|
||||
/* Check arguments */
|
||||
if (H5I_GROUP != H5I_get_type(group_id))
|
||||
@@ -974,7 +958,6 @@ H5Gflush(hid_t group_id)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE1("e", "i", group_id);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(group_id, H5I_GROUP)))
|
||||
@@ -1013,7 +996,6 @@ H5Grefresh(hid_t group_id)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE1("e", "i", group_id);
|
||||
|
||||
/* Check args */
|
||||
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(group_id, H5I_GROUP)))
|
||||
|
||||
@@ -159,7 +159,6 @@ H5Gcreate1(hid_t loc_id, const char *name, size_t size_hint)
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE3("i", "i*sz", loc_id, name, size_hint);
|
||||
|
||||
/* Check arguments */
|
||||
if (!name || !*name)
|
||||
@@ -253,7 +252,6 @@ H5Gopen1(hid_t loc_id, const char *name)
|
||||
hid_t ret_value = H5I_INVALID_HID; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5I_INVALID_HID)
|
||||
H5TRACE2("i", "i*s", loc_id, name);
|
||||
|
||||
/* Check args */
|
||||
if (!name || !*name)
|
||||
@@ -299,7 +297,6 @@ H5Glink(hid_t cur_loc_id, H5G_link_t type, const char *cur_name, const char *new
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE4("e", "iLl*s*s", cur_loc_id, type, cur_name, new_name);
|
||||
|
||||
/* Check arguments */
|
||||
if (!cur_name || !*cur_name)
|
||||
@@ -388,7 +385,6 @@ H5Glink2(hid_t cur_loc_id, const char *cur_name, H5G_link_t type, hid_t new_loc_
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE5("e", "i*sLli*s", cur_loc_id, cur_name, type, new_loc_id, new_name);
|
||||
|
||||
/* Check arguments */
|
||||
if (!cur_name || !*cur_name)
|
||||
@@ -482,7 +478,6 @@ H5Gmove(hid_t src_loc_id, const char *src_name, const char *dst_name)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3("e", "i*s*s", src_loc_id, src_name, dst_name);
|
||||
|
||||
/* Set up collective metadata if appropriate */
|
||||
if (H5CX_set_loc(src_loc_id) < 0)
|
||||
@@ -527,7 +522,6 @@ H5Gmove2(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, const char *d
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE4("e", "i*si*s", src_loc_id, src_name, dst_loc_id, dst_name);
|
||||
|
||||
/* Set up collective metadata if appropriate */
|
||||
if (H5CX_set_loc(dst_loc_id) < 0)
|
||||
@@ -579,7 +573,6 @@ H5Gunlink(hid_t loc_id, const char *name)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*s", loc_id, name);
|
||||
|
||||
/* Check arguments */
|
||||
if (!name || !*name)
|
||||
@@ -626,7 +619,6 @@ H5Gget_linkval(hid_t loc_id, const char *name, size_t size, char *buf /*out*/)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE4("e", "i*sz*s", loc_id, name, size, buf);
|
||||
|
||||
/* Check arguments */
|
||||
if (!name || !*name)
|
||||
@@ -683,7 +675,6 @@ H5Gset_comment(hid_t loc_id, const char *name, const char *comment)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE3("e", "i*s*s", loc_id, name, comment);
|
||||
|
||||
if (!name || !*name)
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified");
|
||||
@@ -747,7 +738,6 @@ H5Gget_comment(hid_t loc_id, const char *name, size_t bufsize, char *buf /*out*/
|
||||
int ret_value; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(-1)
|
||||
H5TRACE4("Is", "i*sz*s", loc_id, name, bufsize, buf);
|
||||
|
||||
if (!name || !*name)
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, -1, "no name specified");
|
||||
@@ -821,7 +811,6 @@ H5Giterate(hid_t loc_id, const char *name, int *idx_p, H5G_iterate_t op, void *o
|
||||
herr_t ret_value; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE5("e", "i*s*IsGi*x", loc_id, name, idx_p, op, op_data);
|
||||
|
||||
/* Check args */
|
||||
if (!name || !*name)
|
||||
@@ -883,7 +872,6 @@ H5Gget_num_objs(hid_t loc_id, hsize_t *num_objs /*out*/)
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE2("e", "i*h", loc_id, num_objs);
|
||||
|
||||
/* Check args */
|
||||
id_type = H5I_get_type(loc_id);
|
||||
@@ -932,7 +920,6 @@ H5Gget_objinfo(hid_t loc_id, const char *name, hbool_t follow_link, H5G_stat_t *
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE4("e", "i*sb*Gs", loc_id, name, follow_link, statbuf);
|
||||
|
||||
/* Check arguments */
|
||||
if (!name || !*name)
|
||||
@@ -1147,7 +1134,6 @@ H5Gget_objname_by_idx(hid_t loc_id, hsize_t idx, char *name /*out*/, size_t size
|
||||
ssize_t ret_value; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE4("Zs", "ih*sz", loc_id, idx, name, size);
|
||||
|
||||
/* Set up collective metadata if appropriate */
|
||||
if (H5CX_set_loc(loc_id) < 0)
|
||||
@@ -1205,7 +1191,6 @@ H5Gget_objtype_by_idx(hid_t loc_id, hsize_t idx)
|
||||
H5G_obj_t ret_value; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(H5G_UNKNOWN)
|
||||
H5TRACE2("Go", "ih", loc_id, idx);
|
||||
|
||||
/* Set location parameters */
|
||||
loc_params.type = H5VL_OBJECT_BY_IDX;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user