VOL FEATURE

This commit is contained in:
Dana Robinson
2018-10-10 08:10:15 -07:00
parent 471150151d
commit e962df1591
177 changed files with 16622 additions and 2680 deletions
+12
View File
@@ -164,6 +164,7 @@
./examples/h5_vds-percival.c
./examples/h5_vds-percival-unlim.c
./examples/h5_vds-percival-unlim-maxmin.c
./examples/h5_vol_external_log_native.c
./examples/testh5cc.sh.in
./examples/README
@@ -576,6 +577,7 @@
./src/H5EAsblock.c
./src/H5EAstat.c
./src/H5EAtest.c
./src/H5ESpublic.h
./src/H5F.c
./src/H5Faccum.c
./src/H5Fcwfs.c
@@ -886,6 +888,14 @@
./src/H5Tvlen.c
./src/H5TS.c
./src/H5TSprivate.h
./src/H5VL.c
./src/H5VLint.c
./src/H5VLmodule.h
./src/H5VLnative.c
./src/H5VLnative.h
./src/H5VLpkg.h
./src/H5VLprivate.h
./src/H5VLpublic.h
./src/H5VM.c
./src/H5VMprivate.h
./src/H5WB.c
@@ -951,6 +961,7 @@
./test/dtypes.c
./test/dtransform.c
./test/earray.c
./test/echo_vol.c
./test/efc.c
./test/enc_dec_plist.c
./test/enc_dec_plist_cross_platform.c
@@ -1129,6 +1140,7 @@
./test/use_disable_mdc_flushes.c
./test/use.h
./test/vfd.c
./test/vol.c
./test/test_filters_le.h5
./test/test_filters_be.h5
./test/gen_filters.c
+20
View File
@@ -46,6 +46,7 @@ $Source = "";
"H5E_direction_t" => "Ed",
"H5E_error_t" => "Ee",
"H5E_type_t" => "Et",
"H5ES_status_t" => "Es",
"H5F_close_degree_t" => "Fd",
"H5F_fspace_strategy_t" => "Ff",
"H5F_file_space_type_t" => "Ff",
@@ -95,6 +96,21 @@ $Source = "";
"H5T_str_t" => "Tz",
"unsigned long" => "Ul",
"unsigned long long" => "UL",
"H5VL_attr_get_t" => "Va",
"H5VL_attr_specific_t" => "Vb",
"H5VL_dataset_get_t" => "Vc",
"H5VL_dataset_specific_t" => "Vd",
"H5VL_datatype_get_t" => "Ve",
"H5VL_datatype_specific_t" => "Vf",
"H5VL_file_get_t" => "Vg",
"H5VL_file_specific_t" => "Vh",
"H5VL_group_get_t" => "Vi",
"H5VL_group_specific_t" => "Vj",
"H5VL_link_create_type_t" => "Vk",
"H5VL_link_get_t" => "Vl",
"H5VL_link_specific_t" => "Vm",
"H5VL_object_get_t" => "Vn",
"H5VL_object_specific_t" => "Vo",
"void" => "x",
"FILE" => "x",
"H5A_operator_t" => "x",
@@ -124,6 +140,7 @@ $Source = "";
"H5G_iterate_t" => "x",
"H5G_info_t" => "x",
"H5I_free_t" => "x",
"H5I_iterate_func_t" => "x",
"H5I_search_func_t" => "x",
"H5L_class_t" => "x",
"H5L_elink_traverse_t" => "x",
@@ -147,6 +164,9 @@ $Source = "";
"H5T_cdata_t" => "x",
"H5T_conv_t" => "x",
"H5T_conv_except_func_t" => "x",
"H5VL_t" => "x",
"H5VL_class_t" => "x",
"H5VL_loc_params_t" => "x",
"H5Z_func_t" => "x",
"H5Z_filter_func_t" => "x",
"va_list" => "x",
+45 -4
View File
@@ -192,16 +192,17 @@ H5File::H5File(const H5File& original) : Group()
//--------------------------------------------------------------------------
bool H5File::isHdf5(const char* name)
{
// Calls C routine H5Fis_hdf5 to determine whether the file is in
// Calls C routine H5Fis_accessible to determine whether the file is in
// HDF5 format. It returns positive value, 0, or negative value
htri_t ret_value = H5Fis_hdf5(name);
htri_t ret_value = H5Fis_accessible(name, H5P_DEFAULT);
if (ret_value > 0)
return true;
else if (ret_value == 0)
return false;
else // Raise exception when H5Fis_hdf5 returns a negative value
else // Raise exception when H5Fis_accessible returns a negative value
{
throw FileIException("H5File::isHdf5", "H5Fis_hdf5 returned negative value");
throw FileIException("H5File::isHdf5", "H5Fis_accessible returned negative value");
}
}
@@ -217,6 +218,46 @@ bool H5File::isHdf5(const H5std_string& name)
return(isHdf5( name.c_str()));
}
//--------------------------------------------------------------------------
// Function: H5File::isAccessible (static)
///\brief Determines whether a file can be accessed as HDF5. (Static)
///\param name - IN: Name of the file
///\param access_plist - IN: File access property list. Default to
/// FileAccPropList::DEFAULT
///\return true if the file can be accessed as HDF5, and false, otherwise
///\exception H5::FileIException
// September 2018
//--------------------------------------------------------------------------
bool H5File::isAccessible(const char* name, const FileAccPropList& access_plist)
{
// Calls C routine H5Fis_accessible to determine whether the file is in
// HDF5 format. It returns positive value, 0, or negative value
hid_t access_plist_id = access_plist.getId();
htri_t ret_value = H5Fis_accessible(name, access_plist_id);
if (ret_value > 0)
return true;
else if (ret_value == 0)
return false;
else // Raise exception when H5Fis_accessible returns a negative value
{
throw FileIException("H5File::isAccessible", "H5Fis_accessible returned negative value");
}
}
//--------------------------------------------------------------------------
// Function: H5File::isAccessible (static)
///\brief This is an overloaded member function, provided for convenience.
/// It takes an \c H5std_string for \a name. (Static)
///\param name - IN: Name of the file - \c H5std_string
///\param access_plist - IN: File access property list. Default to
/// FileAccPropList::DEFAULT
// September 2018
//--------------------------------------------------------------------------
bool H5File::isAccessible(const H5std_string& name, const FileAccPropList& access_plist)
{
return(isAccessible(name.c_str(), access_plist));
}
//--------------------------------------------------------------------------
// Function: openFile
///\brief Opens an HDF5 file
+4
View File
@@ -73,6 +73,10 @@ class H5_DLLCPP H5File : public Group {
static bool isHdf5(const char* name);
static bool isHdf5(const H5std_string& name);
// Determines if a file, specified by its name, can be accessed as HDF5
static bool isAccessible(const char* name, const FileAccPropList& access_plist = FileAccPropList::DEFAULT);
static bool isAccessible(const H5std_string& name, const FileAccPropList& access_plist = FileAccPropList::DEFAULT);
// Reopens this file.
void reOpen(); // added for better name
+2
View File
@@ -176,6 +176,7 @@ H5I_type_t IdComponent::getHDFObjType() const
/// \li \c H5I_ATTR
/// \li \c H5I_REFERENCE (DEPRECATED)
/// \li \c H5I_VFL
/// \li \c H5I_VOL
/// \li \c H5I_GENPROP_CLS
/// \li \c H5I_GENPROP_LST
/// \li \c H5I_ERROR_CLASS
@@ -229,6 +230,7 @@ bool IdComponent::isValid(hid_t an_id)
/// \li \c H5I_ATTR
/// \li \c H5I_REFERENCE (DEPRECATED)
/// \li \c H5I_VFL
/// \li \c H5I_VOL
/// \li \c H5I_GENPROP_CLS
/// \li \c H5I_GENPROP_LST
/// \li \c H5I_ERROR_CLASS
+1
View File
@@ -151,6 +151,7 @@ PropList::PropList(const hid_t plist_id) : IdComponent()
case H5I_ATTR:
case H5I_REFERENCE:
case H5I_VFL:
case H5I_VOL:
case H5I_ERROR_CLASS:
case H5I_ERROR_MSG:
case H5I_ERROR_STACK:
+183 -183
View File
@@ -9,92 +9,92 @@
# If you do not have access to either file, you may request a copy from
# help@hdfgroup.org.
#
#############################################################################################
### ${CTEST_SCRIPT_ARG} is of the form OPTION=VALUE ###
### BUILD_GENERATOR required [Unix, VS2017, VS201764, VS2015, VS201564, VS2013, VS201364] ###
### ctest -S HDF5config.cmake,BUILD_GENERATOR=VS201764 -C Release -VV -O hdf5.log ###
#############################################################################################
cmake_minimum_required (VERSION 3.10)
############################################################################
# Usage:
# ctest -S HDF5config.cmake,OPTION=VALUE -C Release -VV -O test.log
# where valid options for OPTION are:
# BUILD_GENERATOR - The cmake build generator:
# Unix * Unix Makefiles
#############################################################################################
### ${CTEST_SCRIPT_ARG} is of the form OPTION=VALUE ###
### BUILD_GENERATOR required [Unix, VS2017, VS201764, VS2015, VS201564, VS2013, VS201364] ###
### ctest -S HDF5config.cmake,BUILD_GENERATOR=VS201764 -C Release -VV -O hdf5.log ###
#############################################################################################
cmake_minimum_required (VERSION 3.10)
############################################################################
# Usage:
# ctest -S HDF5config.cmake,OPTION=VALUE -C Release -VV -O test.log
# where valid options for OPTION are:
# BUILD_GENERATOR - The cmake build generator:
# Unix * Unix Makefiles
# VS2017 * Visual Studio 15 2017
# VS201764 * Visual Studio 15 2017 Win64
# VS2015 * Visual Studio 14 2015
# VS201564 * Visual Studio 14 2015 Win64
# VS2013 * Visual Studio 12 2013
# VS201364 * Visual Studio 12 2013 Win64
#
# INSTALLDIR - root folder where hdf5 is installed
# CTEST_CONFIGURATION_TYPE - Release, Debug, etc
# CTEST_SOURCE_NAME - source folder
##############################################################################
set (CTEST_SOURCE_VERSION "1.11.3")
set (CTEST_SOURCE_VERSEXT "")
##############################################################################
# handle input parameters to script.
#BUILD_GENERATOR - which CMake generator to use, required
#INSTALLDIR - HDF5-1.10.0 root folder
#CTEST_CONFIGURATION_TYPE - Release, Debug, RelWithDebInfo
#CTEST_SOURCE_NAME - name of source folder; HDF5-1.10.0
if (DEFINED CTEST_SCRIPT_ARG)
# transform ctest script arguments of the form
# script.ctest,var1=value1,var2=value2
# to variables with the respective names set to the respective values
string (REPLACE "," ";" script_args "${CTEST_SCRIPT_ARG}")
foreach (current_var ${script_args})
if ("${current_var}" MATCHES "^([^=]+)=(.+)$")
set ("${CMAKE_MATCH_1}" "${CMAKE_MATCH_2}")
endif ()
endforeach ()
endif ()
# build generator must be defined
if (NOT DEFINED BUILD_GENERATOR)
message (FATAL_ERROR "BUILD_GENERATOR must be defined - Unix, VS2017, or VS201764, VS2015, VS201564, VS2013, VS201364")
endif ()
###################################################################
### Following Line is one of [Release, RelWithDebInfo, Debug] #####
# VS2015 * Visual Studio 14 2015
# VS201564 * Visual Studio 14 2015 Win64
# VS2013 * Visual Studio 12 2013
# VS201364 * Visual Studio 12 2013 Win64
#
# INSTALLDIR - root folder where hdf5 is installed
# CTEST_CONFIGURATION_TYPE - Release, Debug, etc
# CTEST_SOURCE_NAME - source folder
##############################################################################
set (CTEST_SOURCE_VERSION "1.11.3")
set (CTEST_SOURCE_VERSEXT "")
##############################################################################
# handle input parameters to script.
#BUILD_GENERATOR - which CMake generator to use, required
#INSTALLDIR - HDF5-1.10.0 root folder
#CTEST_CONFIGURATION_TYPE - Release, Debug, RelWithDebInfo
#CTEST_SOURCE_NAME - name of source folder; HDF5-1.10.0
if (DEFINED CTEST_SCRIPT_ARG)
# transform ctest script arguments of the form
# script.ctest,var1=value1,var2=value2
# to variables with the respective names set to the respective values
string (REPLACE "," ";" script_args "${CTEST_SCRIPT_ARG}")
foreach (current_var ${script_args})
if ("${current_var}" MATCHES "^([^=]+)=(.+)$")
set ("${CMAKE_MATCH_1}" "${CMAKE_MATCH_2}")
endif ()
endforeach ()
endif ()
# build generator must be defined
if (NOT DEFINED BUILD_GENERATOR)
message (FATAL_ERROR "BUILD_GENERATOR must be defined - Unix, VS2017, or VS201764, VS2015, VS201564, VS2013, VS201364")
endif ()
###################################################################
### Following Line is one of [Release, RelWithDebInfo, Debug] #####
### (default use command line -C value)
set (CTEST_CONFIGURATION_TYPE "$ENV{CMAKE_CONFIG_TYPE}")
###################################################################
if (NOT DEFINED INSTALLDIR)
if (WIN32)
set (INSTALLDIR "C:/Program Files/HDF_Group/HDF5/${CTEST_SOURCE_VERSION}")
else ()
set (INSTALLDIR "${CTEST_SCRIPT_DIRECTORY}/HDF_Group/HDF5/${CTEST_SOURCE_VERSION}")
endif ()
endif ()
if (NOT DEFINED CTEST_CONFIGURATION_TYPE)
set (CTEST_CONFIGURATION_TYPE "Release")
endif ()
if (NOT DEFINED CTEST_SOURCE_NAME)
set (CTEST_SOURCE_NAME "hdf5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}")
endif ()
set (CTEST_BINARY_NAME "build")
set (CTEST_DASHBOARD_ROOT "${CTEST_SCRIPT_DIRECTORY}")
if (WIN32)
set (CTEST_SOURCE_DIRECTORY "${CTEST_DASHBOARD_ROOT}\\${CTEST_SOURCE_NAME}")
set (CTEST_BINARY_DIRECTORY "${CTEST_DASHBOARD_ROOT}\\${CTEST_BINARY_NAME}")
else ()
set (CTEST_SOURCE_DIRECTORY "${CTEST_DASHBOARD_ROOT}/${CTEST_SOURCE_NAME}")
set (CTEST_BINARY_DIRECTORY "${CTEST_DASHBOARD_ROOT}/${CTEST_BINARY_NAME}")
endif ()
###################################################################
######### Following describes compiler ############
if (WIN32)
set (SITE_OS_NAME "Windows")
set (SITE_OS_VERSION "WIN7")
set (CTEST_CONFIGURATION_TYPE "$ENV{CMAKE_CONFIG_TYPE}")
###################################################################
if (NOT DEFINED INSTALLDIR)
if (WIN32)
set (INSTALLDIR "C:/Program Files/HDF_Group/HDF5/${CTEST_SOURCE_VERSION}")
else ()
set (INSTALLDIR "${CTEST_SCRIPT_DIRECTORY}/HDF_Group/HDF5/${CTEST_SOURCE_VERSION}")
endif ()
endif ()
if (NOT DEFINED CTEST_CONFIGURATION_TYPE)
set (CTEST_CONFIGURATION_TYPE "Release")
endif ()
if (NOT DEFINED CTEST_SOURCE_NAME)
set (CTEST_SOURCE_NAME "hdf5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}")
endif ()
set (CTEST_BINARY_NAME "build")
set (CTEST_DASHBOARD_ROOT "${CTEST_SCRIPT_DIRECTORY}")
if (WIN32)
set (CTEST_SOURCE_DIRECTORY "${CTEST_DASHBOARD_ROOT}\\${CTEST_SOURCE_NAME}")
set (CTEST_BINARY_DIRECTORY "${CTEST_DASHBOARD_ROOT}\\${CTEST_BINARY_NAME}")
else ()
set (CTEST_SOURCE_DIRECTORY "${CTEST_DASHBOARD_ROOT}/${CTEST_SOURCE_NAME}")
set (CTEST_BINARY_DIRECTORY "${CTEST_DASHBOARD_ROOT}/${CTEST_BINARY_NAME}")
endif ()
###################################################################
######### Following describes compiler ############
if (WIN32)
set (SITE_OS_NAME "Windows")
set (SITE_OS_VERSION "WIN7")
if (${BUILD_GENERATOR} STREQUAL "VS201764")
set (CTEST_CMAKE_GENERATOR "Visual Studio 15 2017 Win64")
set (SITE_OS_BITS "64")
@@ -138,103 +138,103 @@ if (WIN32)
else ()
message (FATAL_ERROR "Invalid BUILD_GENERATOR must be - Unix, VS2017, or VS201764, VS2015, VS201564, VS2013, VS201364")
endif ()
## Set the following to unique id your computer ##
set (CTEST_SITE "WIN7${BUILD_GENERATOR}.XXXX")
else ()
set (CTEST_CMAKE_GENERATOR "Unix Makefiles")
## Set the following to unique id your computer ##
if (APPLE)
set (CTEST_SITE "MAC.XXXX")
else ()
set (CTEST_SITE "LINUX.XXXX")
endif ()
if (APPLE)
execute_process (COMMAND xcrun --find cc OUTPUT_VARIABLE XCODE_CC OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process (COMMAND xcrun --find c++ OUTPUT_VARIABLE XCODE_CXX OUTPUT_STRIP_TRAILING_WHITESPACE)
set (ENV{CC} "${XCODE_CC}")
set (ENV{CXX} "${XCODE_CXX}")
set (CTEST_USE_LAUNCHERS 1)
set (RR_WARNINGS_COMMON "-Wno-format-nonliteral -Wno-cast-align -Wno-unused -Wno-unused-variable -Wno-unused-function -Wno-self-assign -Wno-unused-parameter -Wno-sign-compare")
set (RR_WARNINGS_C "${RR_WARNINGS_COMMON} -Wno-deprecated-declarations -Wno-uninitialized")
set (RR_WARNINGS_CXX "${RR_WARNINGS_COMMON} -Woverloaded-virtual -Wshadow -Wwrite-strings -Wc++11-compat")
set (RR_FLAGS_COMMON "-g -O0 -fstack-protector-all -D_FORTIFY_SOURCE=2")
set (RR_FLAGS_C "${RR_FLAGS_COMMON}")
set (RR_FLAGS_CXX "${RR_FLAGS_COMMON}")
set (ENV{CFLAGS} "${RR_WARNINGS_C} ${RR_FLAGS_C}")
set (ENV{CXXFLAGS} "${RR_WARNINGS_CXX} ${RR_FLAGS_CXX}")
endif ()
endif ()
###################################################################
###################################################################
######### Following is for submission to CDash ############
###################################################################
set (MODEL "Experimental")
###################################################################
###################################################################
##### Following controls CDash submission #####
#set (LOCAL_SUBMIT "TRUE")
##### Following controls test process #####
#set (LOCAL_SKIP_TEST "TRUE")
#set (LOCAL_MEMCHECK_TEST "TRUE")
#set (LOCAL_COVERAGE_TEST "TRUE")
##### Following controls cpack command #####
#set (LOCAL_NO_PACKAGE "TRUE")
##### Following controls source update #####
#set (LOCAL_UPDATE "TRUE")
set (REPOSITORY_URL "https://git@bitbucket.hdfgroup.org/scm/hdffv/hdf5.git")
set (REPOSITORY_BRANCH "develop")
#uncomment to use a compressed source file: *.tar on linux or mac *.zip on windows
#set(CTEST_USE_TAR_SOURCE "${CTEST_SOURCE_VERSION}")
###################################################################
###################################################################
if (WIN32)
set (BINFILEBASE "HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-win${SITE_OS_BITS}")
include (${CTEST_SCRIPT_DIRECTORY}\\HDF5options.cmake)
include (${CTEST_SCRIPT_DIRECTORY}\\CTestScript.cmake)
if (EXISTS "${CTEST_BINARY_DIRECTORY}\\${BINFILEBASE}.exe")
file (COPY "${CTEST_BINARY_DIRECTORY}\\${BINFILEBASE}.exe" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
endif ()
if (EXISTS "${CTEST_BINARY_DIRECTORY}\\${BINFILEBASE}.msi")
file (COPY "${CTEST_BINARY_DIRECTORY}\\${BINFILEBASE}.msi" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
endif ()
if (EXISTS "${CTEST_BINARY_DIRECTORY}\\${BINFILEBASE}.zip")
file (COPY "${CTEST_BINARY_DIRECTORY}\\${BINFILEBASE}.zip" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
endif ()
else ()
set (BINFILEBASE "HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}")
include (${CTEST_SCRIPT_DIRECTORY}/HDF5options.cmake)
include (${CTEST_SCRIPT_DIRECTORY}/CTestScript.cmake)
if (APPLE)
if (EXISTS "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Darwin.dmg")
file (COPY "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Darwin.dmg" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
endif ()
if (EXISTS "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Darwin.tar.gz")
file (COPY "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Darwin.tar.gz" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
endif ()
if (EXISTS "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Darwin.sh")
file (COPY "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Darwin.sh" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
endif ()
else ()
if (CYGWIN)
if (EXISTS "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-CYGWIN.sh")
file (COPY "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-CYGWIN.sh" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
endif ()
if (EXISTS "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-CYGWIN.tar.gz")
file (COPY "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-CYGWIN.tar.gz" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
endif ()
else ()
if (EXISTS "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Linux.sh")
file (COPY "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Linux.sh" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
endif ()
if (EXISTS "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Linux.tar.gz")
file (COPY "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Linux.tar.gz" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
endif ()
endif ()
endif ()
endif ()
## Set the following to unique id your computer ##
set (CTEST_SITE "WIN7${BUILD_GENERATOR}.XXXX")
else ()
set (CTEST_CMAKE_GENERATOR "Unix Makefiles")
## Set the following to unique id your computer ##
if (APPLE)
set (CTEST_SITE "MAC.XXXX")
else ()
set (CTEST_SITE "LINUX.XXXX")
endif ()
if (APPLE)
execute_process (COMMAND xcrun --find cc OUTPUT_VARIABLE XCODE_CC OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process (COMMAND xcrun --find c++ OUTPUT_VARIABLE XCODE_CXX OUTPUT_STRIP_TRAILING_WHITESPACE)
set (ENV{CC} "${XCODE_CC}")
set (ENV{CXX} "${XCODE_CXX}")
set (CTEST_USE_LAUNCHERS 1)
set (RR_WARNINGS_COMMON "-Wno-format-nonliteral -Wno-cast-align -Wno-unused -Wno-unused-variable -Wno-unused-function -Wno-self-assign -Wno-unused-parameter -Wno-sign-compare")
set (RR_WARNINGS_C "${RR_WARNINGS_COMMON} -Wno-deprecated-declarations -Wno-uninitialized")
set (RR_WARNINGS_CXX "${RR_WARNINGS_COMMON} -Woverloaded-virtual -Wshadow -Wwrite-strings -Wc++11-compat")
set (RR_FLAGS_COMMON "-g -O0 -fstack-protector-all -D_FORTIFY_SOURCE=2")
set (RR_FLAGS_C "${RR_FLAGS_COMMON}")
set (RR_FLAGS_CXX "${RR_FLAGS_COMMON}")
set (ENV{CFLAGS} "${RR_WARNINGS_C} ${RR_FLAGS_C}")
set (ENV{CXXFLAGS} "${RR_WARNINGS_CXX} ${RR_FLAGS_CXX}")
endif ()
endif ()
###################################################################
###################################################################
######### Following is for submission to CDash ############
###################################################################
set (MODEL "Experimental")
###################################################################
###################################################################
##### Following controls CDash submission #####
#set (LOCAL_SUBMIT "TRUE")
##### Following controls test process #####
#set (LOCAL_SKIP_TEST "TRUE")
#set (LOCAL_MEMCHECK_TEST "TRUE")
#set (LOCAL_COVERAGE_TEST "TRUE")
##### Following controls cpack command #####
#set (LOCAL_NO_PACKAGE "TRUE")
##### Following controls source update #####
#set (LOCAL_UPDATE "TRUE")
set (REPOSITORY_URL "https://git@bitbucket.hdfgroup.org/scm/hdffv/hdf5.git")
set (REPOSITORY_BRANCH "develop")
#uncomment to use a compressed source file: *.tar on linux or mac *.zip on windows
#set(CTEST_USE_TAR_SOURCE "${CTEST_SOURCE_VERSION}")
###################################################################
###################################################################
if (WIN32)
set (BINFILEBASE "HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-win${SITE_OS_BITS}")
include (${CTEST_SCRIPT_DIRECTORY}\\HDF5options.cmake)
include (${CTEST_SCRIPT_DIRECTORY}\\CTestScript.cmake)
if (EXISTS "${CTEST_BINARY_DIRECTORY}\\${BINFILEBASE}.exe")
file (COPY "${CTEST_BINARY_DIRECTORY}\\${BINFILEBASE}.exe" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
endif ()
if (EXISTS "${CTEST_BINARY_DIRECTORY}\\${BINFILEBASE}.msi")
file (COPY "${CTEST_BINARY_DIRECTORY}\\${BINFILEBASE}.msi" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
endif ()
if (EXISTS "${CTEST_BINARY_DIRECTORY}\\${BINFILEBASE}.zip")
file (COPY "${CTEST_BINARY_DIRECTORY}\\${BINFILEBASE}.zip" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
endif ()
else ()
set (BINFILEBASE "HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}")
include (${CTEST_SCRIPT_DIRECTORY}/HDF5options.cmake)
include (${CTEST_SCRIPT_DIRECTORY}/CTestScript.cmake)
if (APPLE)
if (EXISTS "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Darwin.dmg")
file (COPY "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Darwin.dmg" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
endif ()
if (EXISTS "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Darwin.tar.gz")
file (COPY "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Darwin.tar.gz" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
endif ()
if (EXISTS "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Darwin.sh")
file (COPY "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Darwin.sh" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
endif ()
else ()
if (CYGWIN)
if (EXISTS "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-CYGWIN.sh")
file (COPY "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-CYGWIN.sh" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
endif ()
if (EXISTS "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-CYGWIN.tar.gz")
file (COPY "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-CYGWIN.tar.gz" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
endif ()
else ()
if (EXISTS "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Linux.sh")
file (COPY "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Linux.sh" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
endif ()
if (EXISTS "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Linux.tar.gz")
file (COPY "${CTEST_BINARY_DIRECTORY}/${BINFILEBASE}-Linux.tar.gz" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
endif ()
endif ()
endif ()
endif ()
+1
View File
@@ -37,6 +37,7 @@ set (examples
h5_vds-percival
h5_vds-percival-unlim
h5_vds-percival-unlim-maxmin
h5_vol_external_log_native
)
foreach (example ${examples})
+16 -13
View File
@@ -32,25 +32,27 @@ INSTALL_TOP_FILES = README
# it would try to compile them instead of using the h5cc script.
# Use the boilerplate in config/examples.am instead.
EXAMPLE_PROG = h5_write h5_read h5_extend_write h5_chunk_read h5_compound \
h5_crtgrpd h5_subset h5_cmprss h5_rdwt h5_crtgrpar h5_extend \
h5_crtatt h5_crtgrp h5_crtdat \
h5_group h5_select h5_attribute h5_mount h5_reference h5_drivers \
h5_ref2reg h5_extlink h5_elink_unix2win h5_shared_mesg h5_vds h5_vds-exc \
h5_vds-exclim h5_vds-eiger h5_vds-simpleIO h5_vds-percival \
h5_vds-percival-unlim h5_vds-percival-unlim-maxmin
h5_crtgrpd h5_subset h5_cmprss h5_rdwt h5_crtgrpar h5_extend \
h5_crtatt h5_crtgrp h5_crtdat \
h5_group h5_select h5_attribute h5_mount h5_reference h5_drivers \
h5_ref2reg h5_extlink h5_elink_unix2win h5_shared_mesg h5_vds h5_vds-exc \
h5_vds-exclim h5_vds-eiger h5_vds-simpleIO h5_vds-percival \
h5_vds-percival-unlim h5_vds-percival-unlim-maxmin \
h5_vol_external_log_native
TEST_SCRIPT=testh5cc.sh
TEST_EXAMPLES_SCRIPT=$(INSTALL_SCRIPT_FILES)
# Install files
# List all file that should be installed in examples directory
INSTALL_FILES = h5_write.c h5_read.c h5_extend_write.c h5_chunk_read.c \
h5_crtgrpd.c h5_subset.c h5_cmprss.c h5_rdwt.c h5_crtgrpar.c \
h5_extend.c h5_crtatt.c h5_crtgrp.c h5_crtdat.c \
h5_compound.c h5_group.c h5_select.c h5_attribute.c h5_mount.c \
h5_reference.c h5_drivers.c h5_extlink.c h5_elink_unix2win.c \
h5_ref2reg.c h5_shared_mesg.c ph5example.c h5_vds.c h5_vds-exc.c \
h5_vds-exclim.c h5_vds-eiger.c h5_vds-simpleIO.c h5_vds-percival.c \
h5_vds-percival-unlim.c h5_vds-percival-unlim-maxmin.c
h5_crtgrpd.c h5_subset.c h5_cmprss.c h5_rdwt.c h5_crtgrpar.c \
h5_extend.c h5_crtatt.c h5_crtgrp.c h5_crtdat.c \
h5_compound.c h5_group.c h5_select.c h5_attribute.c h5_mount.c \
h5_reference.c h5_drivers.c h5_extlink.c h5_elink_unix2win.c \
h5_ref2reg.c h5_shared_mesg.c ph5example.c h5_vds.c h5_vds-exc.c \
h5_vds-exclim.c h5_vds-eiger.c h5_vds-simpleIO.c h5_vds-percival.c \
h5_vds-percival-unlim.c h5_vds-percival-unlim-maxmin.c \
h5_vol_external_log_native.c
@@ -127,6 +129,7 @@ h5_vds-simpleIO: $(srcdir)/h5_vds-simpleIO.c
h5_vds-percival: $(srcdir)/h5_vds-percival.c
h5_vds-percival-unlim: $(srcdir)/h5_vds-percival-unlim.c
h5_vds-percival-unlim-maxmin: $(srcdir)/h5_vds-percival-unlim-maxmin.c
h5_vol_external_log_native: $(srcdir)/h5_vol_external_log_native.c
if BUILD_SHARED_SZIP_CONDITIONAL
LD_LIBRARY_PATH=$(LL_PATH)
+530
View File
@@ -0,0 +1,530 @@
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "hdf5.h"
#define LOG 502
static herr_t H5VL_log_init(hid_t vipl_id);
static herr_t H5VL_log_term(hid_t vtpl_id);
/* Datatype callbacks */
static void *H5VL_log_datatype_commit(void *obj, H5VL_loc_params_t loc_params, const char *name, hid_t type_id, hid_t lcpl_id, hid_t tcpl_id, hid_t tapl_id, hid_t dxpl_id, void **req);
static void *H5VL_log_datatype_open(void *obj, H5VL_loc_params_t loc_params, const char *name, hid_t tapl_id, hid_t dxpl_id, void **req);
static herr_t H5VL_log_datatype_get(void *dt, H5VL_datatype_get_t get_type, hid_t dxpl_id, void **req, va_list arguments);
static herr_t H5VL_log_datatype_close(void *dt, hid_t dxpl_id, void **req);
/* Dataset callbacks */
static void *H5VL_log_dataset_create(void *obj, H5VL_loc_params_t loc_params, const char *name, hid_t dcpl_id, hid_t dapl_id, hid_t dxpl_id, void **req);
static void *H5VL_log_dataset_open(void *obj, H5VL_loc_params_t loc_params, const char *name, hid_t dapl_id, hid_t dxpl_id, void **req);
static herr_t H5VL_log_dataset_read(void *dset, hid_t mem_type_id, hid_t mem_space_id,
hid_t file_space_id, hid_t plist_id, void *buf, void **req);
static herr_t H5VL_log_dataset_write(void *dset, hid_t mem_type_id, hid_t mem_space_id,
hid_t file_space_id, hid_t plist_id, const void *buf, void **req);
static herr_t H5VL_log_dataset_close(void *dset, hid_t dxpl_id, void **req);
/* File callbacks */
static void *H5VL_log_file_create(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id, hid_t dxpl_id, void **req);
static void *H5VL_log_file_open(const char *name, unsigned flags, hid_t fapl_id, hid_t dxpl_id, void **req);
static herr_t H5VL_log_file_get(void *file, H5VL_file_get_t get_type, hid_t dxpl_id, void **req, va_list arguments);
static herr_t H5VL_log_file_close(void *file, hid_t dxpl_id, void **req);
/* Group callbacks */
static void *H5VL_log_group_create(void *obj, H5VL_loc_params_t loc_params, const char *name, hid_t gcpl_id, hid_t gapl_id, hid_t dxpl_id, void **req);
static herr_t H5VL_log_group_close(void *grp, hid_t dxpl_id, void **req);
/* Link callbacks */
/* Object callbacks */
static void *H5VL_log_object_open(void *obj, H5VL_loc_params_t loc_params, H5I_type_t *opened_type, hid_t dxpl_id, void **req);
static herr_t H5VL_log_object_specific(void *obj, H5VL_loc_params_t loc_params, H5VL_object_specific_t specific_type, hid_t dxpl_id, void **req, va_list arguments);
hid_t native_driver_id = -1;
static const H5VL_class_t H5VL_log_g = {
0,
LOG,
"log", /* name */
H5VL_log_init, /* initialize */
H5VL_log_term, /* terminate */
sizeof(hid_t),
NULL,
NULL,
{ /* attribute_cls */
NULL, //H5VL_log_attr_create, /* create */
NULL, //H5VL_log_attr_open, /* open */
NULL, //H5VL_log_attr_read, /* read */
NULL, //H5VL_log_attr_write, /* write */
NULL, //H5VL_log_attr_get, /* get */
NULL, //H5VL_log_attr_specific, /* specific */
NULL, //H5VL_log_attr_optional, /* optional */
NULL //H5VL_log_attr_close /* close */
},
{ /* dataset_cls */
H5VL_log_dataset_create, /* create */
H5VL_log_dataset_open, /* open */
H5VL_log_dataset_read, /* read */
H5VL_log_dataset_write, /* write */
NULL, //H5VL_log_dataset_get, /* get */
NULL, //H5VL_log_dataset_specific, /* specific */
NULL, //H5VL_log_dataset_optional, /* optional */
H5VL_log_dataset_close /* close */
},
{ /* datatype_cls */
H5VL_log_datatype_commit, /* commit */
H5VL_log_datatype_open, /* open */
H5VL_log_datatype_get, /* get_size */
NULL, //H5VL_log_datatype_specific, /* specific */
NULL, //H5VL_log_datatype_optional, /* optional */
H5VL_log_datatype_close /* close */
},
{ /* file_cls */
H5VL_log_file_create, /* create */
H5VL_log_file_open, /* open */
H5VL_log_file_get, /* get */
NULL, //H5VL_log_file_specific, /* specific */
NULL, //H5VL_log_file_optional, /* optional */
H5VL_log_file_close /* close */
},
{ /* group_cls */
H5VL_log_group_create, /* create */
NULL, //H5VL_log_group_open, /* open */
NULL, //H5VL_log_group_get, /* get */
NULL, //H5VL_log_group_specific, /* specific */
NULL, //H5VL_log_group_optional, /* optional */
H5VL_log_group_close /* close */
},
{ /* link_cls */
NULL, //H5VL_log_link_create, /* create */
NULL, //H5VL_log_link_copy, /* copy */
NULL, //H5VL_log_link_move, /* move */
NULL, //H5VL_log_link_get, /* get */
NULL, //H5VL_log_link_specific, /* specific */
NULL, //H5VL_log_link_optional, /* optional */
},
{ /* object_cls */
H5VL_log_object_open, /* open */
NULL, //H5VL_log_object_copy, /* copy */
NULL, //H5VL_log_object_get, /* get */
H5VL_log_object_specific, /* specific */
NULL, //H5VL_log_object_optional, /* optional */
},
{
NULL,
NULL,
NULL
},
NULL
};
typedef struct H5VL_log_t {
void *under_object;
} H5VL_log_t;
static herr_t
visit_cb(hid_t oid, const char *name,
const H5O_info_t *oinfo, void *udata)
{
ssize_t len;
char n[25];
if(H5Iget_type(oid) == H5I_GROUP) {
len = H5VLget_driver_name(oid, n, 50);
printf ("Visiting GROUP VOL name = %s %d\n", n, len);
}
if(H5Iget_type(oid) == H5I_DATASET)
printf("visiting dataset\n");
if(H5Iget_type(oid) == H5I_DATATYPE)
printf("visiting datatype\n");
return 1;
} /* end h5_verify_cached_stabs_cb() */
int main(int argc, char **argv) {
const char file_name[]="large_dataset.h5";
const char group_name[]="/Group";
const char dataset_name[]="Data";
char fullpath[500];
hid_t file_id;
hid_t group_id;
hid_t dataspaceId;
hid_t datasetId;
hid_t acc_tpl;
hid_t under_fapl;
hid_t vol_id, vol_id2;
hid_t int_id;
hid_t attr;
hid_t space;
const unsigned int nelem=60;
int *data;
unsigned int i;
hsize_t dims[1];
ssize_t len;
char name[25];
static hsize_t ds_size[2] = {10, 20};
under_fapl = H5Pcreate (H5P_FILE_ACCESS);
H5Pset_fapl_native(under_fapl);
assert(H5VLis_registered("native") == 1);
vol_id = H5VLregister (&H5VL_log_g);
assert(vol_id > 0);
assert(H5VLis_registered("log") == 1);
vol_id2 = H5VLget_driver_id("log");
H5VLinitialize(vol_id2, H5P_DEFAULT);
H5VLclose(vol_id2);
native_driver_id = H5VLget_driver_id("native");
assert(native_driver_id > 0);
acc_tpl = H5Pcreate (H5P_FILE_ACCESS);
H5Pset_vol(acc_tpl, vol_id, &under_fapl);
file_id = H5Fcreate(file_name, H5F_ACC_TRUNC, H5P_DEFAULT, acc_tpl);
len = H5VLget_driver_name(file_id, name, 25);
printf ("FILE VOL name = %s %d\n", name, len);
group_id = H5Gcreate2(file_id, group_name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
len = H5VLget_driver_name(group_id, name, 50);
printf ("GROUP VOL name = %s %d\n", name, len);
int_id = H5Tcopy(H5T_NATIVE_INT);
H5Tcommit2(file_id, "int", int_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
len = H5VLget_driver_name(int_id, name, 50);
printf ("DT COMMIT name = %s %d\n", name, len);
H5Tclose(int_id);
int_id = H5Topen2(file_id, "int", H5P_DEFAULT);
len = H5VLget_driver_name(int_id, name, 50);
printf ("DT OPEN name = %s %d\n", name, len);
H5Tclose(int_id);
int_id = H5Oopen(file_id,"int",H5P_DEFAULT);
len = H5VLget_driver_name(int_id, name, 50);
printf ("DT OOPEN name = %s %d\n", name, len);
len = H5Fget_name(file_id, name, 50);
printf("name = %d %s\n", len, name);
data = malloc (sizeof(int)*nelem);
for(i=0;i<nelem;++i)
data[i]=i;
dims [0] = 60;
dataspaceId = H5Screate_simple(1, dims, NULL);
space = H5Screate_simple (2, ds_size, ds_size);
sprintf(fullpath,"%s/%s",group_name,dataset_name);
datasetId = H5Dcreate2(file_id,fullpath,H5T_NATIVE_INT,dataspaceId,H5P_DEFAULT,H5P_DEFAULT,H5P_DEFAULT);
H5Sclose(dataspaceId);
len = H5VLget_driver_name(datasetId, name, 50);
printf ("DSET name = %s %d\n", name, len);
H5Dwrite(datasetId, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
H5Dclose(datasetId);
H5Ovisit2(file_id, H5_INDEX_NAME, H5_ITER_NATIVE, visit_cb, NULL, H5O_INFO_ALL);
free (data);
H5Oclose(int_id);
H5Sclose (space);
H5Gclose(group_id);
#if 0
attr = H5Acreate2(group_id, "attr1", int_id, space, H5P_DEFAULT, H5P_DEFAULT);
int_id = H5Aget_type(attr);
len = H5VLget_driver_name(int_id, name, 50);
printf ("DT OPEN name = %s %d\n", name, len);
H5Aclose (attr);
int_id = H5Oopen(file_id,"int",H5P_DEFAULT);
len = H5VLget_driver_name(int_id, name, 50);
printf ("DT OOPEN name = %s %d\n", name, len);
H5Oclose(int_id);
H5Fclose(file_id);
file_id = H5Fopen(file_name, H5F_ACC_RDWR, H5P_DEFAULT);//acc_tpl);
H5Fflush(file_id, H5F_SCOPE_GLOBAL);
#endif
H5Fclose(file_id);
H5Pclose(acc_tpl);
H5Pclose(under_fapl);
H5VLclose(native_driver_id);
H5VLterminate(vol_id, H5P_DEFAULT);
H5VLunregister (vol_id);
assert(H5VLis_registered("log") == 0);
return 0;
}
static herr_t H5VL_log_init(hid_t vipl_id)
{
printf("------- LOG INIT\n");
return 0;
}
static herr_t H5VL_log_term(hid_t vtpl_id)
{
printf("------- LOG TERM\n");
return 0;
}
static void *
H5VL_log_file_create(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id, hid_t dxpl_id, void **req)
{
hid_t under_fapl;
H5VL_log_t *file;
file = (H5VL_log_t *)calloc(1, sizeof(H5VL_log_t));
under_fapl = *((hid_t *)H5Pget_vol_info(fapl_id));
file->under_object = H5VLfile_create(name, flags, fcpl_id, under_fapl, dxpl_id, req);
printf("------- LOG H5Fcreate\n");
return (void *)file;
}
static void *
H5VL_log_file_open(const char *name, unsigned flags, hid_t fapl_id, hid_t dxpl_id, void **req)
{
hid_t under_fapl;
H5VL_log_t *file;
file = (H5VL_log_t *)calloc(1, sizeof(H5VL_log_t));
under_fapl = *((hid_t *)H5Pget_vol_info(fapl_id));
file->under_object = H5VLfile_open(name, flags, under_fapl, dxpl_id, req);
printf("------- LOG H5Fopen\n");
return (void *)file;
}
static herr_t
H5VL_log_file_get(void *file, H5VL_file_get_t get_type, hid_t dxpl_id, void **req, va_list arguments)
{
H5VL_log_t *f = (H5VL_log_t *)file;
H5VLfile_get(f->under_object, native_driver_id, get_type, dxpl_id, req, arguments);
printf("------- LOG H5Fget %d\n", get_type);
return 1;
}
static herr_t
H5VL_log_file_close(void *file, hid_t dxpl_id, void **req)
{
H5VL_log_t *f = (H5VL_log_t *)file;
H5VLfile_close(f->under_object, native_driver_id, dxpl_id, req);
free(f);
printf("------- LOG H5Fclose\n");
return 1;
}
static void *
H5VL_log_group_create(void *obj, H5VL_loc_params_t loc_params, const char *name,
hid_t gcpl_id, hid_t gapl_id, hid_t dxpl_id, void **req)
{
H5VL_log_t *group;
H5VL_log_t *o = (H5VL_log_t *)obj;
group = (H5VL_log_t *)calloc(1, sizeof(H5VL_log_t));
group->under_object = H5VLgroup_create(o->under_object, loc_params, native_driver_id, name, gcpl_id, gapl_id, dxpl_id, req);
printf("------- LOG H5Gcreate\n");
return (void *)group;
}
static herr_t
H5VL_log_group_close(void *grp, hid_t dxpl_id, void **req)
{
H5VL_log_t *g = (H5VL_log_t *)grp;
H5VLgroup_close(g->under_object, native_driver_id, dxpl_id, req);
free(g);
printf("------- LOG H5Gclose\n");
return 1;
}
static void *
H5VL_log_datatype_commit(void *obj, H5VL_loc_params_t loc_params, const char *name,
hid_t type_id, hid_t lcpl_id, hid_t tcpl_id, hid_t tapl_id, hid_t dxpl_id, void **req)
{
H5VL_log_t *dt;
H5VL_log_t *o = (H5VL_log_t *)obj;
dt = (H5VL_log_t *)calloc(1, sizeof(H5VL_log_t));
dt->under_object = H5VLdatatype_commit(o->under_object, loc_params, native_driver_id, name,
type_id, lcpl_id, tcpl_id, tapl_id, dxpl_id, req);
printf("------- LOG H5Tcommit\n");
return dt;
}
static void *
H5VL_log_datatype_open(void *obj, H5VL_loc_params_t loc_params, const char *name, hid_t tapl_id, hid_t dxpl_id, void **req)
{
H5VL_log_t *dt;
H5VL_log_t *o = (H5VL_log_t *)obj;
dt = (H5VL_log_t *)calloc(1, sizeof(H5VL_log_t));
dt->under_object = H5VLdatatype_open(o->under_object, loc_params, native_driver_id, name, tapl_id, dxpl_id, req);
printf("------- LOG H5Topen\n");
return (void *)dt;
}
static herr_t
H5VL_log_datatype_get(void *dt, H5VL_datatype_get_t get_type, hid_t dxpl_id, void **req, va_list arguments)
{
H5VL_log_t *o = (H5VL_log_t *)dt;
herr_t ret_value;
ret_value = H5VLdatatype_get(o->under_object, native_driver_id, get_type, dxpl_id, req, arguments);
printf("------- LOG datatype get\n");
return ret_value;
}
static herr_t
H5VL_log_datatype_close(void *dt, hid_t dxpl_id, void **req)
{
H5VL_log_t *type = (H5VL_log_t *)dt;
assert(type->under_object);
H5VLdatatype_close(type->under_object, native_driver_id, dxpl_id, req);
free(type);
printf("------- LOG H5Tclose\n");
return 1;
}
static void *
H5VL_log_object_open(void *obj, H5VL_loc_params_t loc_params, H5I_type_t *opened_type, hid_t dxpl_id, void **req)
{
H5VL_log_t *new_obj;
H5VL_log_t *o = (H5VL_log_t *)obj;
new_obj = (H5VL_log_t *)calloc(1, sizeof(H5VL_log_t));
new_obj->under_object = H5VLobject_open(o->under_object, loc_params, native_driver_id, opened_type, dxpl_id, req);
printf("------- LOG H5Oopen\n");
return (void *)new_obj;
}
static herr_t
H5VL_log_object_specific(void *obj, H5VL_loc_params_t loc_params, H5VL_object_specific_t specific_type,
hid_t dxpl_id, void **req, va_list arguments)
{
H5VL_log_t *o = (H5VL_log_t *)obj;
H5VLobject_specific(o->under_object, loc_params, native_driver_id, specific_type, dxpl_id, req, arguments);
printf("------- LOG Object specific\n");
return 1;
}
static void *
H5VL_log_dataset_create(void *obj, H5VL_loc_params_t loc_params, const char *name, hid_t dcpl_id, hid_t dapl_id, hid_t dxpl_id, void **req)
{
H5VL_log_t *dset;
H5VL_log_t *o = (H5VL_log_t *)obj;
dset = (H5VL_log_t *)calloc(1, sizeof(H5VL_log_t));
dset->under_object = H5VLdataset_create(o->under_object, loc_params, native_driver_id, name, dcpl_id, dapl_id, dxpl_id, req);
printf("------- LOG H5Dcreate\n");
return (void *)dset;
}
static void *
H5VL_log_dataset_open(void *obj, H5VL_loc_params_t loc_params, const char *name, hid_t dapl_id, hid_t dxpl_id, void **req)
{
H5VL_log_t *dset;
H5VL_log_t *o = (H5VL_log_t *)obj;
dset = (H5VL_log_t *)calloc(1, sizeof(H5VL_log_t));
dset->under_object = H5VLdataset_open(o->under_object, loc_params, native_driver_id, name, dapl_id, dxpl_id, req);
printf("------- LOG H5Dopen\n");
return (void *)dset;
}
static herr_t
H5VL_log_dataset_read(void *dset, hid_t mem_type_id, hid_t mem_space_id,
hid_t file_space_id, hid_t plist_id, void *buf, void **req)
{
H5VL_log_t *d = (H5VL_log_t *)dset;
H5VLdataset_read(d->under_object, native_driver_id, mem_type_id, mem_space_id, file_space_id,
plist_id, buf, req);
printf("------- LOG H5Dread\n");
return 1;
}
static herr_t
H5VL_log_dataset_write(void *dset, hid_t mem_type_id, hid_t mem_space_id,
hid_t file_space_id, hid_t plist_id, const void *buf, void **req)
{
H5VL_log_t *d = (H5VL_log_t *)dset;
H5VLdataset_write(d->under_object, native_driver_id, mem_type_id, mem_space_id, file_space_id,
plist_id, buf, req);
printf("------- LOG H5Dwrite\n");
return 1;
}
static herr_t
H5VL_log_dataset_close(void *dset, hid_t dxpl_id, void **req)
{
H5VL_log_t *d = (H5VL_log_t *)dset;
H5VLdataset_close(d->under_object, native_driver_id, dxpl_id, req);
free(d);
printf("------- LOG H5Dclose\n");
return 1;
}
#if 0
static void *H5VL_log_attr_create(void *obj, H5VL_loc_params_t loc_params, const char *attr_name, hid_t acpl_id, hid_t aapl_id, hid_t dxpl_id, void **req){
static herr_t H5VL_log_attr_close(void *attr, hid_t dxpl_id, void **req){
/* Datatype callbacks */
/* Dataset callbacks */
static void *H5VL_log_dataset_create(void *obj, H5VL_loc_params_t loc_params, const char *name, hid_t dcpl_id, hid_t dapl_id, hid_t dxpl_id, void **req){
static herr_t H5VL_log_dataset_close(void *dset, hid_t dxpl_id, void **req){
/* File callbacks */
static void *H5VL_log_file_open(const char *name, unsigned flags, hid_t fapl_id, hid_t dxpl_id, void **req){
/* Group callbacks */
static void *H5VL_log_group_open(void *obj, H5VL_loc_params_t loc_params, const char *name, hid_t gapl_id, hid_t dxpl_id, void **req){
static herr_t H5VL_log_group_get(void *obj, H5VL_group_get_t get_type, hid_t dxpl_id, void **req, va_list arguments){
/* Link callbacks */
/* Object callbacks */
#endif
-46
View File
@@ -402,52 +402,6 @@ h5fget_access_plist_c (hid_t_f *file_id, hid_t_f *access_id)
return ret_value;
}
/****if* H5Ff/h5fis_hdf5_c
* NAME
* h5fis_hdf5_c
* PURPOSE
* Call H5Fis_hdf5 to determone if the file is an HDF5 file
* INPUTS
* name - name of the file
* namelen - name length
* OUTPUTS
* flag - 0 if file is not HDF5 file , positive if a file
* is an HDF5 file, and negative on failure.
* RETURNS
* 0 on success, -1 on failure
* AUTHOR
* Elena Pourmal
* Tuesday, August 3, 1999
* HISTORY
*
* SOURCE
*/
int_f
h5fis_hdf5_c (_fcd name, int_f *namelen, int_f *flag)
/******/
{
int ret_value = -1;
char *c_name;
int_f c_namelen;
htri_t status;
/*
* Convert FORTRAN name to C name
*/
c_namelen = *namelen;
c_name = (char *)HD5f2cstring(name, (size_t)c_namelen);
if (c_name == NULL) return ret_value;
/*
* Call H5Fopen function.
*/
status = H5Fis_hdf5(c_name);
*flag = (int_f)status;
if (status >= 0) ret_value = 0;
HDfree(c_name);
return ret_value;
}
/****if* H5Ff/h5fclose_c
* NAME
* h5fclose_c
+86 -14
View File
@@ -45,6 +45,18 @@ MODULE H5F
! Number of objects opened in H5open_f
INTEGER(SIZE_T) :: H5OPEN_NUM_OBJ
INTERFACE
INTEGER(C_INT) FUNCTION h5fis_accessible(name, &
access_prp_default) BIND(C,NAME='H5Fis_accessible')
IMPORT :: C_CHAR
IMPORT :: HID_T
IMPORT :: C_INT
IMPLICIT NONE
CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
INTEGER(HID_T), INTENT(IN), VALUE :: access_prp_default
END FUNCTION h5fis_accessible
END INTERFACE
CONTAINS
!****s* H5F/h5fcreate_f
!
@@ -486,6 +498,63 @@ CONTAINS
END SUBROUTINE h5fget_access_plist_f
!****s* H5F/h5fis_accessible_f
!
! NAME
! h5fis_accessible_f
!
! PURPOSE
! Determines whether a file can be accessed as HDF5.
!
! INPUTS
! name - name of the file to check
! OUTPUTS
! status - indicates if file is and HDF5 file
! hdferr - Returns 0 if successful and -1 if fails
! OPTIONAL PARAMETERS
! access_prp - file access property list identifier
! AUTHOR
! Dana Robinson
! September 2018
!
! HISTORY
! Explicit Fortran interfaces were added for
! called C functions (it is needed for Windows
! port). February 28, 2001
!
! SOURCE
SUBROUTINE h5fis_accessible_f(name, status, hdferr, access_prp)
IMPLICIT NONE
CHARACTER(LEN=*), INTENT(IN) :: name ! Name of the file
LOGICAL, INTENT(OUT) :: status ! Indicates if file
! is an HDF5 file
INTEGER, INTENT(OUT) :: hdferr ! Error code
INTEGER(HID_T), OPTIONAL, INTENT(IN) :: access_prp
! File access property list
! identifier
!*****
INTEGER(HID_T) :: access_prp_default
CHARACTER(LEN=LEN_TRIM(name)+1,KIND=C_CHAR) :: c_name
INTEGER(C_INT) :: flag ! "TRUE/FALSE/ERROR" flag from C routine
access_prp_default = H5P_DEFAULT_F
IF (PRESENT(access_prp)) access_prp_default = access_prp
c_name = TRIM(name)//C_NULL_CHAR
flag = H5Fis_accessible(c_name, access_prp_default)
hdferr = 0
IF(flag.LT.0) hdferr = -1
status = .TRUE.
IF (flag .EQ. 0) status = .FALSE.
END SUBROUTINE h5fis_accessible_f
! XXX (VOL_MERGE): This function should probably be marked as
! deprecated since H5Fis_hdf5() is deprecated.
!****s* H5F/h5fis_hdf5_f
!
! NAME
@@ -503,6 +572,12 @@ CONTAINS
! Elena Pourmal
! August 12, 1999
!
! NOTES
! The underlying HDF5 C API call (H5Fis_hdf5) has been deprecated
! in favor of the VOL-capable H5Fis_accessible(). New code should
! use h5fis_accessible_f() instead of this function in case this
! function is deprecated in the future.
!
! HISTORY
! Explicit Fortran interfaces were added for
! called C functions (it is needed for Windows
@@ -516,26 +591,23 @@ CONTAINS
! is an HDF5 file
INTEGER, INTENT(OUT) :: hdferr ! Error code
!*****
INTEGER :: namelen ! Length of the name character string
INTEGER :: flag ! "TRUE/FALSE" flag from C routine
! to define status value.
INTEGER(HID_T) :: access_prp_default
CHARACTER(LEN=LEN_TRIM(name)+1,KIND=C_CHAR) :: c_name
INTEGER(C_INT) :: flag ! "TRUE/FALSE/ERROR" flag from C routine
! to define status value.
INTERFACE
INTEGER FUNCTION h5fis_hdf5_c(name, namelen, flag) BIND(C,NAME='h5fis_hdf5_c')
IMPORT :: C_CHAR
IMPLICIT NONE
CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
INTEGER :: namelen
INTEGER :: flag
END FUNCTION h5fis_hdf5_c
END INTERFACE
c_name = TRIM(name)//C_NULL_CHAR
flag = H5Fis_accessible(c_name, H5P_DEFAULT_F)
hdferr = 0
IF(flag.LT.0) hdferr = -1
namelen = LEN_TRIM(name)
hdferr = h5fis_hdf5_c(name, namelen, flag)
status = .TRUE.
IF (flag .EQ. 0) status = .FALSE.
END SUBROUTINE h5fis_hdf5_f
!****s* H5F/h5fclose_f
!
! NAME
-1
View File
@@ -78,7 +78,6 @@ typedef struct H5O_info_t_f {
*/
H5_FCDLL int_f h5fcreate_c(_fcd name, int_f *namelen, int_f *access_flags, hid_t_f *crt_prp, hid_t_f *acc_prp, hid_t_f *file_id);
H5_FCDLL int_f h5fopen_c(_fcd name, int_f *namelen, int_f *access_flags, hid_t_f *acc_prp, hid_t_f *file_id);
H5_FCDLL int_f h5fis_hdf5_c(_fcd name, int_f *namelen, int_f *flag);
H5_FCDLL int_f h5fclose_c(hid_t_f *file_id);
H5_FCDLL int_f h5fmount_c(hid_t_f *loc_id, _fcd dsetname, int_f *namelen, hid_t_f *file_id, hid_t_f *acc_prp);
H5_FCDLL int_f h5funmount_c(hid_t_f *loc_id, _fcd dsetname, int_f *namelen);
+1
View File
@@ -94,6 +94,7 @@ H5F_mp_H5FOPEN_F
H5F_mp_H5FREOPEN_F
H5F_mp_H5FGET_CREATE_PLIST_F
H5F_mp_H5FGET_ACCESS_PLIST_F
H5F_mp_H5FIS_ACCESSIBLE_F
H5F_mp_H5FIS_HDF5_F
H5F_mp_H5FGET_NAME_F
H5F_mp_H5FGET_FILESIZE_F
+18 -1
View File
@@ -232,7 +232,24 @@ CONTAINS
CALL check("h5fclose_f",error,total_error)
!
!test whether files are in hdf5 format
!test whether files are accessible as HDF5 (new, VOL-safe, way)
!
CALL h5fis_accessible_f(fix_filename1, status, error)
CALL check("h5fis_accessible_f",error,total_error)
IF ( .NOT. status ) THEN
write(*,*) "File ", fix_filename1, " is not accessible as hdf5"
stop
END IF
CALL h5fis_accessible_f(fix_filename2, status, error)
CALL check("h5fis_accessible_f",error,total_error)
IF ( .NOT. status ) THEN
write(*,*) "File ", fix_filename2, " is not accessible as hdf5"
stop
END IF
!
!test whether files are in hdf5 format (old way)
!
CALL h5fis_hdf5_f(fix_filename1, status, error)
CALL check("h5fis_hdf5_f",error,total_error)
+6
View File
@@ -190,6 +190,7 @@ public class HDF5Constants {
public static final long H5E_UNSUPPORTED = H5E_UNSUPPORTED();
public static final long H5E_VERSION = H5E_VERSION();
public static final long H5E_VFL = H5E_VFL();
public static final long H5E_VOL = H5E_VOL();
public static final long H5E_WALK_DOWNWARD = H5E_WALK_DOWNWARD();
public static final long H5E_WALK_UPWARD = H5E_WALK_UPWARD();
public static final long H5E_WRITEERROR = H5E_WRITEERROR();
@@ -317,6 +318,7 @@ public class HDF5Constants {
public static final int H5I_REFERENCE = H5I_REFERENCE();
public static final int H5I_UNINIT = H5I_UNINIT();
public static final int H5I_VFL = H5I_VFL();
public static final int H5I_VOL = H5I_VOL();
public static final int H5L_TYPE_ERROR = H5L_TYPE_ERROR();
public static final int H5L_TYPE_HARD = H5L_TYPE_HARD();
@@ -980,6 +982,8 @@ public class HDF5Constants {
private static native final long H5E_VFL();
private static native final long H5E_VOL();
private static native final long H5E_WALK_DOWNWARD();
private static native final long H5E_WALK_UPWARD();
@@ -1224,6 +1228,8 @@ public class HDF5Constants {
private static native final int H5I_VFL();
private static native final int H5I_VOL();
private static native final int H5L_TYPE_ERROR();
private static native final int H5L_TYPE_HARD();
+4
View File
@@ -344,6 +344,8 @@ Java_hdf_hdf5lib_HDF5Constants_H5E_1VERSION(JNIEnv *env, jclass cls) { return H5
JNIEXPORT jlong JNICALL
Java_hdf_hdf5lib_HDF5Constants_H5E_1VFL(JNIEnv *env, jclass cls) { return H5E_VFL; }
JNIEXPORT jlong JNICALL
Java_hdf_hdf5lib_HDF5Constants_H5E_1VOL(JNIEnv *env, jclass cls) { return H5E_VOL; }
JNIEXPORT jlong JNICALL
Java_hdf_hdf5lib_HDF5Constants_H5E_1WALK_1DOWNWARD(JNIEnv *env, jclass cls) { return H5E_WALK_DOWNWARD; }
JNIEXPORT jlong JNICALL
Java_hdf_hdf5lib_HDF5Constants_H5E_1WALK_1UPWARD(JNIEnv *env, jclass cls) { return H5E_WALK_UPWARD; }
@@ -605,6 +607,8 @@ Java_hdf_hdf5lib_HDF5Constants_H5I_1REFERENCE(JNIEnv *env, jclass cls) { return
JNIEXPORT jint JNICALL
Java_hdf_hdf5lib_HDF5Constants_H5I_1VFL(JNIEnv *env, jclass cls) { return H5I_VFL; }
JNIEXPORT jint JNICALL
Java_hdf_hdf5lib_HDF5Constants_H5I_1VOL(JNIEnv *env, jclass cls) { return H5I_VOL; }
JNIEXPORT jint JNICALL
Java_hdf_hdf5lib_HDF5Constants_H5I_1INVALID_1HID(JNIEnv *env, jclass cls) { return H5I_INVALID_HID; }
JNIEXPORT jint JNICALL
Java_hdf_hdf5lib_HDF5Constants_H5I_1GENPROP_1CLS(JNIEnv *env, jclass cls) { return H5I_GENPROP_CLS; }
+7 -7
View File
@@ -38,7 +38,7 @@ import org.junit.rules.TestName;
public class TestH5E {
@Rule public TestName testname = new TestName();
public static final int ERRSTACK_CNT = 3;
public static final int ERRSTACK_CNT = 6;
public static final int ERRSTACK_MTY_CNT = 0;
long hdf_java_classid = -1;
@@ -79,7 +79,7 @@ public class TestH5E {
public void testH5Eget_msg_major() {
try {
H5.H5Fopen("test", 0, 1);
H5.H5Fopen("test", HDF5Constants.H5F_ACC_RDWR, HDF5Constants.H5P_DEFAULT);
}
catch (HDF5LibraryException hdferr) {
long errnum = hdferr.getMajorErrorNumber();
@@ -93,7 +93,7 @@ public class TestH5E {
fail("H5.H5Eget_msg(Throwable): " + err);
}
assertNotNull("H5.H5Eget_msg: " + msg, msg);
assertEquals("H5.H5Eget_msg: ", "Object atom", msg);
assertEquals("H5.H5Eget_msg: ", "File accessibility", msg);
assertEquals("H5.H5Eget_msg: ", HDF5Constants.H5E_MAJOR, error_msg_type[0]);
}
catch (Throwable err) {
@@ -105,7 +105,7 @@ public class TestH5E {
@Test
public void testH5Eget_msg_minor() {
try {
H5.H5Fopen("test", 0, 1);
H5.H5Fopen("test", HDF5Constants.H5F_ACC_RDWR, HDF5Constants.H5P_DEFAULT);
}
catch (HDF5LibraryException hdferr) {
long errnum = hdferr.getMinorErrorNumber();
@@ -119,7 +119,7 @@ public class TestH5E {
fail("H5.H5Eget_msg: " + err);
}
assertNotNull("H5.H5Eget_msg: " + msg, msg);
assertEquals("H5.H5Eget_msg: ", "Unable to find atom information (already closed?)", msg);
assertEquals("H5.H5Eget_msg: ", "Unable to open file", msg);
assertEquals("H5.H5Eget_msg: ", HDF5Constants.H5E_MINOR, error_msg_type[0]);
}
catch (Throwable err) {
@@ -139,7 +139,7 @@ public class TestH5E {
}
try {
H5.H5Fopen("test", 0, 1);
H5.H5Fopen("test", HDF5Constants.H5F_ACC_RDWR, HDF5Constants.H5P_DEFAULT);
}
catch (Throwable err) {
}
@@ -297,7 +297,7 @@ public class TestH5E {
fail("testH5Ewalk:H5Eset_current_stack " + err);
}
try {
H5.H5Fopen("test", 0, 1);
H5.H5Fopen("test", HDF5Constants.H5F_ACC_RDWR, HDF5Constants.H5P_DEFAULT);
}
catch (Throwable err) {
}
+11 -11
View File
@@ -29,7 +29,7 @@ import org.junit.rules.TestName;
public class TestH5Edefault {
@Rule public TestName testname = new TestName();
public static final int ERRSTACK_CNT = 3;
public static final int ERRSTACK_CNT = 6;
public static final int ERRSTACK_MTY_CNT = 0;
@Before
@@ -59,7 +59,7 @@ public class TestH5Edefault {
@Test
public void testH5Eprint() {
try {
H5.H5Fopen("test", 0, 1);
H5.H5Fopen("test", HDF5Constants.H5F_ACC_RDWR, HDF5Constants.H5P_DEFAULT);
}
catch (Throwable err) {
}
@@ -79,7 +79,7 @@ public class TestH5Edefault {
long stack_id = -1;
long stack_id_default = HDF5Constants.H5E_DEFAULT;
try {
H5.H5Fopen("test", 0, 1);
H5.H5Fopen("test", HDF5Constants.H5F_ACC_RDWR, HDF5Constants.H5P_DEFAULT);
}
catch (Throwable err) {
//default stack id will be different after exception
@@ -142,7 +142,7 @@ public class TestH5Edefault {
long num_msg_default = -1;
long stack_id = -1;
try {
H5.H5Fopen("test", 0, 1);
H5.H5Fopen("test", HDF5Constants.H5F_ACC_RDWR, HDF5Constants.H5P_DEFAULT);
}
catch (Throwable err) {
//err.printStackTrace(); //This will clear the error stack
@@ -191,7 +191,7 @@ public class TestH5Edefault {
//Generate errors on default stack
try {
H5.H5Fopen("test", 0, 1);
H5.H5Fopen("test", HDF5Constants.H5F_ACC_RDWR, HDF5Constants.H5P_DEFAULT);
}
catch (Throwable err) {
//err.printStackTrace(); //This will clear the error stack
@@ -282,7 +282,7 @@ public class TestH5Edefault {
long num_msg = -1;
long stack_id = -1;
try {
H5.H5Fopen("test", 0, 1);
H5.H5Fopen("test", HDF5Constants.H5F_ACC_RDWR, HDF5Constants.H5P_DEFAULT);
}
catch (Throwable err) {
//err.printStackTrace(); //This will clear the error stack
@@ -321,7 +321,7 @@ public class TestH5Edefault {
//Generate errors on default stack
try {
H5.H5Fopen("test", 0, 1);
H5.H5Fopen("test", HDF5Constants.H5F_ACC_RDWR, HDF5Constants.H5P_DEFAULT);
}
catch (Throwable err) {
//err.printStackTrace(); //This will clear the error stack
@@ -378,7 +378,7 @@ public class TestH5Edefault {
public void testH5Epop() throws Throwable {
long num_msg = -1;
try {
H5.H5Fopen("test", 0, 1);
H5.H5Fopen("test", HDF5Constants.H5F_ACC_RDWR, HDF5Constants.H5P_DEFAULT);
}
catch (Throwable err) {
}
@@ -419,7 +419,7 @@ public class TestH5Edefault {
@Test
public void testH5EprintInt() {
try {
H5.H5Fopen("test", 0, 1);
H5.H5Fopen("test", HDF5Constants.H5F_ACC_RDWR, HDF5Constants.H5P_DEFAULT);
}
catch (Throwable err) {
}
@@ -463,7 +463,7 @@ public class TestH5Edefault {
public void testH5Eclear2_with_msg() {
long num_msg = -1;
try {
H5.H5Fopen("test", 0, 1);
H5.H5Fopen("test", HDF5Constants.H5F_ACC_RDWR, HDF5Constants.H5P_DEFAULT);
}
catch (Throwable err) {
}
@@ -526,7 +526,7 @@ public class TestH5Edefault {
public void testH5Eget_num_with_msg() {
long num_msg = -1;
try {
H5.H5Fopen("test", 0, 1);
H5.H5Fopen("test", HDF5Constants.H5F_ACC_RDWR, HDF5Constants.H5P_DEFAULT);
}
catch (Throwable err) {
}
+32 -14
View File
@@ -34,21 +34,39 @@ OK (28 tests)
HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
#000: (file name) line (number) in H5Fopen(): unable to open file
major: File accessibilty
major: File accessibility
minor: Unable to open file
#001: (file name) line (number) in H5VL_file_open(): open failed
major: Virtual Object Layer
minor: Unable to initialize object
#002: (file name) line (number) in H5VL_native_file_open(): unable to open file
major: File accessibility
minor: Unable to open file
#003: (file name) line (number) in H5F_open(): unable to open file: name = 'test', tent_flags = 1
major: File accessibility
minor: Unable to open file
#004: (file name) line (number) in H5FD_open(): open failed
major: Virtual File Layer
minor: Unable to initialize object
#005: (file name) line (number) in H5FD_sec2_open(): unable to open file: name = 'test', errno = 2, error message = 'No such file or directory', flags = 1, o_flags = 2
major: File accessibility
minor: Unable to open file
#001: (file name) line (number) in H5F_open(): unable to retrieve VFL class
major: File accessibilty
minor: Can't get value
#002: (file name) line (number) in H5FD_get_class(): can't find object for ID
major: Object atom
minor: Unable to find atom information (already closed?)
HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
#000: (file name) line (number) in H5Fopen(): unable to open file
major: File accessibilty
major: File accessibility
minor: Unable to open file
#001: (file name) line (number) in H5VL_file_open(): open failed
major: Virtual Object Layer
minor: Unable to initialize object
#002: (file name) line (number) in H5VL_native_file_open(): unable to open file
major: File accessibility
minor: Unable to open file
#003: (file name) line (number) in H5F_open(): unable to open file: name = 'test', tent_flags = 1
major: File accessibility
minor: Unable to open file
#004: (file name) line (number) in H5FD_open(): open failed
major: Virtual File Layer
minor: Unable to initialize object
#005: (file name) line (number) in H5FD_sec2_open(): unable to open file: name = 'test', errno = 2, error message = 'No such file or directory', flags = 1, o_flags = 2
major: File accessibility
minor: Unable to open file
#001: (file name) line (number) in H5F_open(): unable to retrieve VFL class
major: File accessibilty
minor: Can't get value
#002: (file name) line (number) in H5FD_get_class(): can't find object for ID
major: Object atom
minor: Unable to find atom information (already closed?)
+24
View File
@@ -184,6 +184,14 @@ set (H5EA_HDRS
IDE_GENERATED_PROPERTIES ("H5EA" "${H5EA_HDRS}" "${H5EA_SOURCES}" )
set (H5ES_SOURCES
)
set (H5ES_HDRS
${HDF5_SRC_DIR}/H5ESpublic.h
)
IDE_GENERATED_PROPERTIES ("H5ES" "${H5ES_HDRS}" "${H5ES_SOURCES}" )
set (H5F_SOURCES
${HDF5_SRC_DIR}/H5F.c
${HDF5_SRC_DIR}/H5Faccum.c
@@ -652,6 +660,18 @@ set (H5UC_HDRS
IDE_GENERATED_PROPERTIES ("H5UC" "${H5UC_HDRS}" "${H5UC_SOURCES}" )
set (H5VL_SOURCES
${HDF5_SRC_DIR}/H5VL.c
${HDF5_SRC_DIR}/H5VLint.c
${HDF5_SRC_DIR}/H5VLnative.c
)
set (H5VL_HDRS
${HDF5_SRC_DIR}/H5VLpkg.h
${HDF5_SRC_DIR}/H5VLnative.h
${HDF5_SRC_DIR}/H5VLpublic.h
)
IDE_GENERATED_PROPERTIES ("H5VL" "${H5VL_HDRS}" "${H5VL_SOURCES}" )
set (H5VM_SOURCES
${HDF5_SRC_DIR}/H5VM.c
)
@@ -731,6 +751,7 @@ set (common_SRCS
${H5ST_SOURCES}
${H5T_SOURCES}
${H5TS_SOURCES}
${H5VL_SOURCES}
${H5VM_SOURCES}
${H5WB_SOURCES}
${H5Z_SOURCES}
@@ -746,6 +767,7 @@ set (H5_PUBLIC_HEADERS
${H5D_HDRS}
${H5E_HDRS}
${H5EA_HDRS}
${H5ES_HDRS}
${H5F_HDRS}
${H5FA_HDRS}
${H5FD_HDRS}
@@ -767,6 +789,7 @@ set (H5_PUBLIC_HEADERS
${H5S_HDRS}
${H5SM_HDRS}
${H5T_HDRS}
${H5VL_HDRS}
${H5Z_HDRS}
)
@@ -812,6 +835,7 @@ set (H5_PRIVATE_HEADERS
${HDF5_SRC_DIR}/H5STprivate.h
${HDF5_SRC_DIR}/H5Tprivate.h
${HDF5_SRC_DIR}/H5TSprivate.h
${HDF5_SRC_DIR}/H5VLprivate.h
${HDF5_SRC_DIR}/H5VMprivate.h
${HDF5_SRC_DIR}/H5WBprivate.h
${HDF5_SRC_DIR}/H5Zprivate.h
+4
View File
@@ -173,6 +173,7 @@ H5_init_library(void)
H5_debug_g.pkg[H5_PKG_S].name = "s";
H5_debug_g.pkg[H5_PKG_T].name = "t";
H5_debug_g.pkg[H5_PKG_V].name = "v";
H5_debug_g.pkg[H5_PKG_VL].name = "vl";
H5_debug_g.pkg[H5_PKG_Z].name = "z";
/*
@@ -213,6 +214,8 @@ H5_init_library(void)
*/
if(H5E_init() < 0)
HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL, "unable to initialize error interface")
if(H5VL_init() < 0)
HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL, "unable to initialize vol interface")
if(H5P_init() < 0)
HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL, "unable to initialize property list interface")
if(H5T_init() < 0)
@@ -344,6 +347,7 @@ H5_term_library(void)
pending += DOWN(AC);
pending += DOWN(Z);
pending += DOWN(FD);
pending += DOWN(VL);
pending += DOWN(PL);
/* Don't shut down the error code until other APIs which use it are shut down */
if(pending == 0)
+322 -157
View File
@@ -31,6 +31,7 @@
#include "H5MMprivate.h" /* Memory management */
#include "H5Opkg.h" /* Object headers */
#include "H5Sprivate.h" /* Dataspace functions */
#include "H5VLprivate.h" /* Virtual Object Layer */
/****************/
@@ -251,10 +252,10 @@ hid_t
H5Acreate2(hid_t loc_id, const char *attr_name, hid_t type_id, hid_t space_id,
hid_t acpl_id, hid_t aapl_id)
{
H5A_t *attr = NULL; /* Attribute created */
H5G_loc_t loc; /* Object location */
H5T_t *type; /* Datatype to use for attribute */
H5S_t *space; /* Dataspace to use for attribute */
void *attr = NULL; /* Attribute created */
H5VL_object_t *vol_obj = NULL; /* Object token of loc_id */
H5P_genplist_t *plist; /* Property list pointer */
H5VL_loc_params_t loc_params;
hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
@@ -263,35 +264,50 @@ H5Acreate2(hid_t loc_id, const char *attr_name, hid_t type_id, hid_t space_id,
/* Check arguments */
if(H5I_ATTR == H5I_get_type(loc_id))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "location is not valid for an attribute")
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a location")
if(0 == (H5F_INTENT(loc.oloc->file) & H5F_ACC_RDWR))
HGOTO_ERROR(H5E_ARGS, H5E_WRITEERROR, H5I_INVALID_HID, "no write intent on file")
if(!attr_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "attr_name parameter cannot be NULL")
if(!*attr_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "attr_name parameter cannot be an empty string")
if(NULL == (type = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a type")
if(NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a dataspace")
/* Get correct property list */
if(H5P_DEFAULT == acpl_id)
acpl_id = H5P_ATTRIBUTE_CREATE_DEFAULT;
/* Verify access property list and set up collective metadata if appropriate */
if(H5CX_set_apl(&aapl_id, H5P_CLS_AACC, loc_id, TRUE) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTSET, H5I_INVALID_HID, "can't set access property list info")
/* Get the property list structure for the acpl */
if(NULL == (plist = (H5P_genplist_t *)H5I_object(acpl_id)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
/* Set creation properties */
if(H5P_set(plist, H5VL_PROP_ATTR_TYPE_ID, &type_id) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5I_INVALID_HID, "can't set property value for datatype id")
if(H5P_set(plist, H5VL_PROP_ATTR_SPACE_ID, &space_id) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5I_INVALID_HID, "can't set property value for space id")
/* Get the location object */
if(NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid location identifier")
/* Set location parameters */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(loc_id);
/* Create the attribute */
if(NULL == (attr = H5A__create(&loc, attr_name, type, space, acpl_id)))
if(NULL == (attr = H5VL_attr_create(vol_obj->data, loc_params, vol_obj->driver->cls, attr_name,
acpl_id, aapl_id, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, H5I_INVALID_HID, "unable to create attribute")
/* Register the new attribute and get an ID for it */
if((ret_value = H5I_register(H5I_ATTR, attr, TRUE)) < 0)
if((ret_value = H5VL_register_id(H5I_ATTR, attr, vol_obj->driver, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to atomize attribute handle")
done:
/* Cleanup on failure */
if(H5I_INVALID_HID == ret_value)
if(attr && H5A__close(attr) < 0)
if(attr && H5VL_attr_close(attr, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, H5I_INVALID_HID, "can't close attribute")
FUNC_LEAVE_API(ret_value)
@@ -333,10 +349,10 @@ H5Acreate_by_name(hid_t loc_id, const char *obj_name, const char *attr_name,
hid_t type_id, hid_t space_id, hid_t acpl_id, hid_t aapl_id,
hid_t lapl_id)
{
H5A_t *attr = NULL; /* Attribute created */
H5G_loc_t loc; /* Object location */
H5T_t *type; /* Datatype to use for attribute */
H5S_t *space; /* Dataspace to use for attribute */
void *attr = NULL; /* attr token from VOL plugin */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5P_genplist_t *plist; /* Property list pointer */
H5VL_loc_params_t loc_params;
hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
@@ -346,18 +362,14 @@ H5Acreate_by_name(hid_t loc_id, const char *obj_name, const char *attr_name,
/* Check arguments */
if(H5I_ATTR == H5I_get_type(loc_id))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "location is not valid for an attribute")
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a location")
if(0 == (H5F_INTENT(loc.oloc->file) & H5F_ACC_RDWR))
HGOTO_ERROR(H5E_ARGS, H5E_WRITEERROR, H5I_INVALID_HID, "no write intent on file")
if(!obj_name || !*obj_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "no object name")
if(!attr_name || !*attr_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "no attribute name")
if(NULL == (type = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a type")
if(NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a dataspace")
/* Get correct property list */
if(H5P_DEFAULT == acpl_id)
acpl_id = H5P_ATTRIBUTE_CREATE_DEFAULT;
/* Verify access property list and set up collective metadata if appropriate */
if(H5CX_set_apl(&aapl_id, H5P_CLS_AACC, loc_id, TRUE) < 0)
@@ -369,18 +381,39 @@ H5Acreate_by_name(hid_t loc_id, const char *obj_name, const char *attr_name,
H5CX_set_lapl(lapl_id);
}
/* Get the plist structure */
if(NULL == (plist = (H5P_genplist_t *)H5I_object(acpl_id)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, H5I_INVALID_HID, "can't find object for ID")
/* Set creation properties */
if(H5P_set(plist, H5VL_PROP_ATTR_TYPE_ID, &type_id) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5I_INVALID_HID, "can't set property value for datatype id")
if(H5P_set(plist, H5VL_PROP_ATTR_SPACE_ID, &space_id) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5I_INVALID_HID, "can't set property value for space id")
/* Set up location struct */
loc_params.type = H5VL_OBJECT_BY_NAME;
loc_params.obj_type = H5I_get_type(loc_id);
loc_params.loc_data.loc_by_name.name = obj_name;
loc_params.loc_data.loc_by_name.lapl_id = lapl_id;
/* Get the location object */
if(NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid location identifier")
/* Create the attribute */
if(NULL == (attr = H5A__create_by_name(&loc, obj_name, attr_name, type, space, acpl_id)))
if(NULL == (attr = H5VL_attr_create(vol_obj->data, loc_params, vol_obj->driver->cls, attr_name,
acpl_id, aapl_id, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, H5I_INVALID_HID, "unable to create attribute")
/* Register the new attribute and get an ID for it */
if((ret_value = H5I_register(H5I_ATTR, attr, TRUE)) < 0)
if((ret_value = H5VL_register_id(H5I_ATTR, attr, vol_obj->driver, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to atomize attribute handle")
done:
/* Cleanup on failure */
if(H5I_INVALID_HID == ret_value)
if(attr && H5A__close(attr) < 0)
if(attr && H5VL_attr_close (attr, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, H5I_INVALID_HID, "can't close attribute")
FUNC_LEAVE_API(ret_value)
@@ -409,8 +442,9 @@ done:
hid_t
H5Aopen(hid_t loc_id, const char *attr_name, hid_t aapl_id)
{
H5G_loc_t loc; /* Object location */
H5A_t *attr = NULL; /* Attribute opened */
void *attr = NULL; /* attr token from VOL driver */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
hid_t ret_value = H5I_INVALID_HID;
FUNC_ENTER_API(H5I_INVALID_HID)
@@ -419,8 +453,6 @@ H5Aopen(hid_t loc_id, const char *attr_name, hid_t aapl_id)
/* Check arguments */
if(H5I_ATTR == H5I_get_type(loc_id))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "location is not valid for an attribute")
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a location")
if(!attr_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "name parameter cannot be NULL")
if(!*attr_name)
@@ -430,18 +462,27 @@ H5Aopen(hid_t loc_id, const char *attr_name, hid_t aapl_id)
if(H5CX_set_apl(&aapl_id, H5P_CLS_AACC, loc_id, FALSE) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTSET, H5I_INVALID_HID, "can't set access property list info")
/* Set location struct fields */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(loc_id);
/* Get the location object */
if(NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid location identifier")
/* Open the attribute */
if(NULL == (attr = H5A__open(&loc, attr_name)))
if(NULL == (attr = H5VL_attr_open(vol_obj->data, loc_params, vol_obj->driver->cls,
attr_name, aapl_id, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, H5I_INVALID_HID, "unable to open attribute: '%s'", attr_name)
/* Register the attribute and get an ID for it */
if((ret_value = H5I_register(H5I_ATTR, attr, TRUE)) < 0)
if((ret_value = H5VL_register_id(H5I_ATTR, attr, vol_obj->driver, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to atomize attribute handle")
done:
/* Cleanup on failure */
if(H5I_INVALID_HID == ret_value)
if(attr && H5A__close(attr) < 0)
if(attr && H5VL_attr_close(attr, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, H5I_INVALID_HID, "can't close attribute")
FUNC_LEAVE_API(ret_value)
@@ -473,8 +514,9 @@ hid_t
H5Aopen_by_name(hid_t loc_id, const char *obj_name, const char *attr_name,
hid_t aapl_id, hid_t lapl_id)
{
H5G_loc_t loc; /* Object location */
H5A_t *attr = NULL; /* Attribute opened */
void *attr = NULL; /* attr token from VOL driver */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
hid_t ret_value = H5I_INVALID_HID;
FUNC_ENTER_API(H5I_INVALID_HID)
@@ -483,8 +525,6 @@ H5Aopen_by_name(hid_t loc_id, const char *obj_name, const char *attr_name,
/* Check arguments */
if(H5I_ATTR == H5I_get_type(loc_id))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "location is not valid for an attribute")
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a location")
if(!obj_name || !*obj_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "no object name")
if(!attr_name || !*attr_name)
@@ -500,19 +540,32 @@ H5Aopen_by_name(hid_t loc_id, const char *obj_name, const char *attr_name,
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not link access property list ID")
H5CX_set_lapl(lapl_id);
}
else
lapl_id = H5P_LINK_ACCESS_DEFAULT;
/* Fill in location struct fields */
loc_params.type = H5VL_OBJECT_BY_NAME;
loc_params.loc_data.loc_by_name.name = obj_name;
loc_params.loc_data.loc_by_name.lapl_id = lapl_id;
loc_params.obj_type = H5I_get_type(loc_id);
/* Get the location object */
if (NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid location identifier")
/* Open the attribute */
if(NULL == (attr = H5A__open_by_name(&loc, obj_name, attr_name)))
if(NULL == (attr = H5VL_attr_open(vol_obj->data, loc_params, vol_obj->driver->cls,
attr_name, aapl_id, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, H5I_INVALID_HID, "can't open attribute")
/* Register the attribute and get an ID for it */
if((ret_value = H5I_register(H5I_ATTR, attr, TRUE)) < 0)
if((ret_value = H5VL_register_id(H5I_ATTR, attr, vol_obj->driver, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to atomize attribute handle")
done:
/* Cleanup on failure */
if(H5I_INVALID_HID == ret_value)
if(attr && H5A__close(attr) < 0)
if(attr && H5VL_attr_close (attr, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, H5I_INVALID_HID, "can't close attribute")
FUNC_LEAVE_API(ret_value)
@@ -547,8 +600,9 @@ hid_t
H5Aopen_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
H5_iter_order_t order, hsize_t n, hid_t aapl_id, hid_t lapl_id)
{
H5A_t *attr = NULL; /* Attribute opened */
H5G_loc_t loc; /* Object location */
void *attr = NULL; /* Attribute opened */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
@@ -558,8 +612,6 @@ H5Aopen_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
/* Check arguments */
if(H5I_ATTR == H5I_get_type(loc_id))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "location is not valid for an attribute")
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a location")
if(!obj_name || !*obj_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "no object name")
if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
@@ -577,19 +629,35 @@ H5Aopen_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not link access property list ID")
H5CX_set_lapl(lapl_id);
}
else
lapl_id = H5P_LINK_ACCESS_DEFAULT;
/* Fill in location struct parameters */
loc_params.type = H5VL_OBJECT_BY_IDX;
loc_params.loc_data.loc_by_idx.name = obj_name;
loc_params.loc_data.loc_by_idx.idx_type = idx_type;
loc_params.loc_data.loc_by_idx.order = order;
loc_params.loc_data.loc_by_idx.n = n;
loc_params.loc_data.loc_by_idx.lapl_id = lapl_id;
loc_params.obj_type = H5I_get_type(loc_id);
/* Get the location object */
if(NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid location identifier")
/* Open the attribute */
if(NULL == (attr = H5A__open_by_idx(&loc, obj_name, idx_type, order, n)))
if(NULL == (attr = H5VL_attr_open(vol_obj->data, loc_params, vol_obj->driver->cls,
NULL, aapl_id, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, H5I_INVALID_HID, "unable to open attribute")
/* Register the attribute and get an ID for it */
if((ret_value = H5I_register(H5I_ATTR, attr, TRUE)) < 0)
if((ret_value = H5VL_register_id(H5I_ATTR, attr, vol_obj->driver, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to atomize attribute handle")
done:
/* Cleanup on failure */
if(H5I_INVALID_HID == ret_value)
if(attr && H5A__close(attr) < 0)
if(attr && H5VL_attr_close(attr, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, H5I_INVALID_HID, "can't close attribute")
FUNC_LEAVE_API(ret_value)
@@ -615,17 +683,16 @@ done:
herr_t
H5Awrite(hid_t attr_id, hid_t dtype_id, const void *buf)
{
H5A_t *attr; /* Attribute object for ID */
H5T_t *mem_type; /* Memory datatype */
H5VL_object_t *vol_obj; /* Attribute object for ID */
herr_t ret_value; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE3("e", "ii*x", attr_id, dtype_id, buf);
/* Check arguments */
if(NULL == (attr = (H5A_t *)H5I_object_verify(attr_id, H5I_ATTR)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(attr_id, H5I_ATTR)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an attribute")
if(NULL == (mem_type = (H5T_t *)H5I_object_verify(dtype_id, H5I_DATATYPE)))
if(H5I_DATATYPE != H5I_get_type(dtype_id))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
if(NULL == buf)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "buf parameter can't be NULL")
@@ -635,7 +702,8 @@ H5Awrite(hid_t attr_id, hid_t dtype_id, const void *buf)
HGOTO_ERROR(H5E_ATTR, H5E_CANTSET, FAIL, "can't set collective metadata read")
/* Write the attribute data */
if((ret_value = H5A__write(attr, mem_type, buf)) < 0)
if((ret_value = H5VL_attr_write(vol_obj->data, vol_obj->driver->cls,
dtype_id, buf, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_WRITEERROR, FAIL, "unable to write attribute")
done:
@@ -662,23 +730,23 @@ done:
herr_t
H5Aread(hid_t attr_id, hid_t dtype_id, void *buf)
{
H5A_t *attr; /* Attribute object for ID */
H5T_t *mem_type; /* Memory datatype */
H5VL_object_t *vol_obj; /* Attribute object for ID */
herr_t ret_value; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE3("e", "ii*x", attr_id, dtype_id, buf);
/* Check arguments */
if(NULL == (attr = (H5A_t *)H5I_object_verify(attr_id, H5I_ATTR)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(attr_id, H5I_ATTR)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an attribute")
if(NULL == (mem_type = (H5T_t *)H5I_object_verify(dtype_id, H5I_DATATYPE)))
if(H5I_DATATYPE != H5I_get_type(dtype_id))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
if(NULL == buf)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "buf parameter can't be NULL")
/* Read the attribute data */
if((ret_value = H5A__read(attr, mem_type, buf)) < 0)
if((ret_value = H5VL_attr_read(vol_obj->data, vol_obj->driver->cls,
dtype_id, buf, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_READERROR, FAIL, "unable to read attribute")
done:
@@ -705,18 +773,19 @@ done:
hid_t
H5Aget_space(hid_t attr_id)
{
H5A_t *attr = NULL; /* Attribute object for ID */
H5VL_object_t *vol_obj = NULL; /* Attribute object for 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 == (attr = (H5A_t *)H5I_object_verify(attr_id, H5I_ATTR)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(attr_id, H5I_ATTR)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not an attribute")
/* Get the dataspace */
if((ret_value = H5A_get_space(attr)) < 0)
if(H5VL_attr_get(vol_obj->data, vol_obj->driver->cls, H5VL_ATTR_GET_SPACE,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, &ret_value) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, H5I_INVALID_HID, "unable to get dataspace of attribute")
done:
@@ -743,18 +812,19 @@ done:
hid_t
H5Aget_type(hid_t attr_id)
{
H5A_t *attr = NULL; /* Attribute object for ID */
H5VL_object_t *vol_obj = NULL; /* Attribute object for 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 == (attr = (H5A_t *)H5I_object_verify(attr_id, H5I_ATTR)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(attr_id, H5I_ATTR)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not an attribute")
/* Get the datatype */
if((ret_value = H5A__get_type(attr)) < 0)
if(H5VL_attr_get(vol_obj->data, vol_obj->driver->cls, H5VL_ATTR_GET_TYPE,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, &ret_value) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, H5I_INVALID_HID, "unable to get datatype of attribute")
done:
@@ -784,7 +854,7 @@ done:
hid_t
H5Aget_create_plist(hid_t attr_id)
{
H5A_t *attr = NULL; /* Attribute object for ID */
H5VL_object_t *vol_obj = NULL; /* Attribute object for ID */
hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
@@ -793,11 +863,12 @@ H5Aget_create_plist(hid_t attr_id)
HDassert(H5P_LST_ATTRIBUTE_CREATE_ID_g != -1);
/* Check arguments */
if(NULL == (attr = (H5A_t *)H5I_object_verify(attr_id, H5I_ATTR)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(attr_id, H5I_ATTR)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not an attribute")
/* Get the acpl */
if((ret_value = H5A__get_create_plist(attr)) < 0)
if(H5VL_attr_get(vol_obj->data, vol_obj->driver->cls, H5VL_ATTR_GET_ACPL,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, &ret_value) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, H5I_INVALID_HID, "unable to get creation property list for attribute")
done:
@@ -829,20 +900,27 @@ done:
ssize_t
H5Aget_name(hid_t attr_id, size_t buf_size, char *buf)
{
H5A_t *attr = NULL; /* Attribute object for ID */
H5VL_object_t *vol_obj = NULL; /* Attribute object for ID */
H5VL_loc_params_t loc_params;
ssize_t ret_value = -1;
FUNC_ENTER_API((-1))
H5TRACE3("Zs", "iz*s", attr_id, buf_size, buf);
/* check arguments */
if(NULL == (attr = (H5A_t *)H5I_object_verify(attr_id, H5I_ATTR)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(attr_id, H5I_ATTR)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, (-1), "not an attribute")
if(!buf && buf_size)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, (-1), "buf cannot be NULL if buf_size is non-zero")
/* Set location struct parameters */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(attr_id);
/* Get the attribute name */
if((ret_value = H5A__get_name(attr, buf_size, buf)) < 0)
if(H5VL_attr_get(vol_obj->data, vol_obj->driver->cls, H5VL_ATTR_GET_NAME,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL,
loc_params, buf_size, buf, &ret_value) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, (-1), "unable to get attribute name")
done:
@@ -872,8 +950,8 @@ H5Aget_name_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
H5_iter_order_t order, hsize_t n, char *name /*out*/, size_t size,
hid_t lapl_id)
{
H5G_loc_t loc; /* Object location */
H5A_t *attr = NULL; /* Attribute object for name */
H5VL_object_t *vol_obj;
H5VL_loc_params_t loc_params;
ssize_t ret_value; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -883,8 +961,6 @@ H5Aget_name_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
/* Check args */
if(H5I_ATTR == H5I_get_type(loc_id))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!obj_name || !*obj_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
@@ -896,25 +972,24 @@ H5Aget_name_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, loc_id, FALSE) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTSET, FAIL, "can't set access property list info")
/* Open the attribute on the object header */
if(NULL == (attr = H5A__open_by_idx(&loc, obj_name, idx_type, order, n)))
HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "can't open attribute")
/* Get the object */
if(NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid object identifier")
/* Get the length of the name */
ret_value = (ssize_t)HDstrlen(attr->shared->name);
loc_params.type = H5VL_OBJECT_BY_IDX;
loc_params.loc_data.loc_by_idx.name = obj_name;
loc_params.loc_data.loc_by_idx.idx_type = idx_type;
loc_params.loc_data.loc_by_idx.order = order;
loc_params.loc_data.loc_by_idx.n = n;
loc_params.loc_data.loc_by_idx.lapl_id = lapl_id;
loc_params.obj_type = H5I_get_type(loc_id);
/* Get the name and store in the user's buffer */
if(name) {
HDstrncpy(name, attr->shared->name, MIN((size_t)(ret_value + 1), size));
if((size_t)ret_value >= size)
name[size - 1]='\0';
}
/* Get the name */
if(H5VL_attr_get(vol_obj->data, vol_obj->driver->cls, H5VL_ATTR_GET_NAME,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, loc_params, size, name, &ret_value) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "unable to get name")
done:
/* Release resources */
if(attr && H5A__close(attr) < 0)
HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "can't close attribute")
FUNC_LEAVE_API(ret_value)
} /* end H5Aget_name_by_idx() */
@@ -939,18 +1014,20 @@ done:
hsize_t
H5Aget_storage_size(hid_t attr_id)
{
H5A_t *attr; /* Attribute object for ID */
H5VL_object_t *vol_obj;
hsize_t ret_value; /* Return value */
FUNC_ENTER_API(0)
H5TRACE1("h", "i", attr_id);
/* Check arguments */
if(NULL == (attr = (H5A_t *)H5I_object_verify(attr_id, H5I_ATTR)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(attr_id, H5I_ATTR)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not an attribute")
/* Get the storage size */
ret_value = attr->shared->data_size;
if(H5VL_attr_get(vol_obj->data, vol_obj->driver->cls, H5VL_ATTR_GET_STORAGE_SIZE,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, &ret_value) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, 0, "unable to get acpl")
done:
FUNC_LEAVE_API(ret_value)
@@ -973,18 +1050,23 @@ done:
herr_t
H5Aget_info(hid_t attr_id, H5A_info_t *ainfo)
{
H5A_t *attr; /* Attribute object for name */
H5VL_object_t *vol_obj;
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE2("e", "i*x", attr_id, ainfo);
/* Check arguments */
if(NULL == (attr = (H5A_t *)H5I_object_verify(attr_id, H5I_ATTR)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(attr_id, H5I_ATTR)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an attribute")
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(attr_id);
/* Get the attribute information */
if(H5A__get_info(attr, ainfo) < 0)
if(H5VL_attr_get(vol_obj->data, vol_obj->driver->cls, H5VL_ATTR_GET_INFO,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, loc_params, ainfo) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "unable to get attribute info")
done:
@@ -1009,8 +1091,8 @@ herr_t
H5Aget_info_by_name(hid_t loc_id, const char *obj_name, const char *attr_name,
H5A_info_t *ainfo, hid_t lapl_id)
{
H5G_loc_t loc; /* Object location */
H5A_t *attr = NULL; /* Attribute object for name */
H5VL_object_t *vol_obj;
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -1019,8 +1101,6 @@ H5Aget_info_by_name(hid_t loc_id, const char *obj_name, const char *attr_name,
/* Check args */
if(H5I_ATTR == H5I_get_type(loc_id))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!obj_name || !*obj_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no object name")
if(!attr_name || !*attr_name)
@@ -1032,19 +1112,21 @@ H5Aget_info_by_name(hid_t loc_id, const char *obj_name, const char *attr_name,
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, loc_id, FALSE) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTSET, FAIL, "can't set access property list info")
/* Open the attribute on the object header */
if(NULL == (attr = H5A__open_by_name(&loc, obj_name, attr_name)))
HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "can't open attribute")
loc_params.type = H5VL_OBJECT_BY_NAME;
loc_params.loc_data.loc_by_name.name = obj_name;
loc_params.loc_data.loc_by_name.lapl_id = lapl_id;
loc_params.obj_type = H5I_get_type(loc_id);
/* Get the object */
if(NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid object identifier")
/* Get the attribute information */
if(H5A__get_info(attr, ainfo) < 0)
if(H5VL_attr_get(vol_obj->data, vol_obj->driver->cls, H5VL_ATTR_GET_INFO,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, loc_params, ainfo, attr_name) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "unable to get attribute info")
done:
/* Release resources */
if(attr && H5A__close(attr) < 0)
HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "can't close attribute")
FUNC_LEAVE_API(ret_value)
} /* end H5Aget_info_by_name() */
@@ -1067,8 +1149,8 @@ herr_t
H5Aget_info_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
H5_iter_order_t order, hsize_t n, H5A_info_t *ainfo, hid_t lapl_id)
{
H5G_loc_t loc; /* Object location */
H5A_t *attr = NULL; /* Attribute object for name */
H5VL_object_t *vol_obj;
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -1078,8 +1160,6 @@ H5Aget_info_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
/* Check args */
if(H5I_ATTR == H5I_get_type(loc_id))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!obj_name || !*obj_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
@@ -1093,19 +1173,24 @@ H5Aget_info_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, loc_id, FALSE) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTSET, FAIL, "can't set access property list info")
/* Open the attribute on the object header */
if(NULL == (attr = H5A__open_by_idx(&loc, obj_name, idx_type, order, n)))
HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "can't open attribute")
loc_params.type = H5VL_OBJECT_BY_IDX;
loc_params.loc_data.loc_by_idx.name = obj_name;
loc_params.loc_data.loc_by_idx.idx_type = idx_type;
loc_params.loc_data.loc_by_idx.order = order;
loc_params.loc_data.loc_by_idx.n = n;
loc_params.loc_data.loc_by_idx.lapl_id = lapl_id;
loc_params.obj_type = H5I_get_type(loc_id);
/* Get the object */
if(NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid object identifier")
/* Get the attribute information */
if(H5A__get_info(attr, ainfo) < 0)
if(H5VL_attr_get(vol_obj->data, vol_obj->driver->cls, H5VL_ATTR_GET_INFO,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, loc_params, ainfo) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "unable to get attribute info")
done:
/* Release resources */
if(attr && H5A__close(attr) < 0)
HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "can't close attribute")
FUNC_LEAVE_API(ret_value)
} /* end H5Aget_info_by_idx() */
@@ -1138,9 +1223,14 @@ H5Arename(hid_t loc_id, const char *old_name, const char *new_name)
/* Avoid thrashing things if the names are the same */
if(HDstrcmp(old_name, new_name)) {
H5G_loc_t loc; /* Object location */
if(H5G_loc(loc_id, &loc) < 0)
H5VL_object_t *vol_obj;
H5VL_loc_params_t loc_params;
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(loc_id);
/* Get the location object */
if(NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Set up collective metadata if appropriate */
@@ -1148,7 +1238,8 @@ H5Arename(hid_t loc_id, const char *old_name, const char *new_name)
HGOTO_ERROR(H5E_ATTR, H5E_CANTSET, FAIL, "can't set collective metadata read")
/* Rename the attribute */
if(H5O__attr_rename(loc.oloc, old_name, new_name) < 0)
if((ret_value = H5VL_attr_specific(vol_obj->data, loc_params, vol_obj->driver->cls, H5VL_ATTR_RENAME,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, old_name, new_name)) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTRENAME, FAIL, "can't rename attribute")
}
@@ -1191,18 +1282,25 @@ H5Arename_by_name(hid_t loc_id, const char *obj_name, const char *old_attr_name,
/* Avoid thrashing things if the names are the same */
if(HDstrcmp(old_attr_name, new_attr_name)) {
H5G_loc_t loc; /* Object location */
H5VL_object_t *vol_obj;
H5VL_loc_params_t loc_params;
/* Verify access property list and set up collective metadata if appropriate */
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, loc_id, TRUE) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTSET, FAIL, "can't set access property list info")
loc_params.type = H5VL_OBJECT_BY_NAME;
loc_params.loc_data.loc_by_name.name = obj_name;
loc_params.loc_data.loc_by_name.lapl_id = lapl_id;
loc_params.obj_type = H5I_get_type(loc_id);
/* Get the location object */
if(H5G_loc(loc_id, &loc) < 0)
if(NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Rename the attribute */
if(H5A__rename_by_name(loc, obj_name, old_attr_name, new_attr_name) < 0)
if((ret_value = H5VL_attr_specific(vol_obj->data, loc_params, vol_obj->driver->cls, H5VL_ATTR_RENAME,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, old_attr_name, new_attr_name)) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTRENAME, FAIL, "can't rename attribute")
}
@@ -1256,6 +1354,8 @@ herr_t
H5Aiterate2(hid_t loc_id, H5_index_t idx_type, H5_iter_order_t order,
hsize_t *idx, H5A_operator2_t op, void *op_data)
{
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
herr_t ret_value; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -1269,9 +1369,18 @@ H5Aiterate2(hid_t loc_id, H5_index_t idx_type, H5_iter_order_t order,
if(order <= H5_ITER_UNKNOWN || order >= H5_ITER_N)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid iteration order specified")
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(loc_id);
/* get the loc object */
if(NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Iterate over attributes */
if((ret_value = H5A__iterate(loc_id, idx_type, order, idx, op, op_data)) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_BADITER, FAIL, "error iterating over attributes")
if((ret_value = H5VL_attr_specific(vol_obj->data, loc_params, vol_obj->driver->cls, H5VL_ATTR_ITER,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL,
idx_type, order, idx, op, op_data)) < 0)
HERROR(H5E_ATTR, H5E_BADITER, "error iterating over attributes");
done:
FUNC_LEAVE_API(ret_value)
@@ -1326,7 +1435,8 @@ H5Aiterate_by_name(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
H5_iter_order_t order, hsize_t *idx, H5A_operator2_t op, void *op_data,
hid_t lapl_id)
{
H5G_loc_t loc; /* Object location */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -1336,8 +1446,6 @@ H5Aiterate_by_name(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
/* check arguments */
if(H5I_ATTR == H5I_get_type(loc_id))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!obj_name || !*obj_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no object name")
if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
@@ -1349,9 +1457,20 @@ H5Aiterate_by_name(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, loc_id, FALSE) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTSET, FAIL, "can't set access property list info")
loc_params.type = H5VL_OBJECT_BY_NAME;
loc_params.obj_type = H5I_get_type(loc_id);
loc_params.loc_data.loc_by_name.name = obj_name;
loc_params.loc_data.loc_by_name.lapl_id = lapl_id;
/* get the loc object */
if(NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Iterate over attributes */
if((ret_value = H5A__iterate_by_name(&loc, obj_name, idx_type, order, idx, op, op_data)) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_BADITER, FAIL, "attribute iteration failed");
if((ret_value = H5VL_attr_specific(vol_obj->data, loc_params, vol_obj->driver->cls, H5VL_ATTR_ITER,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL,
idx_type, order, idx, op, op_data)) < 0)
HERROR(H5E_ATTR, H5E_BADITER, "attribute iteration failed");
done:
FUNC_LEAVE_API(ret_value)
@@ -1375,7 +1494,8 @@ done:
herr_t
H5Adelete(hid_t loc_id, const char *name)
{
H5G_loc_t loc; /* Object location */
H5VL_object_t *vol_obj = NULL;
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -1384,8 +1504,6 @@ H5Adelete(hid_t loc_id, const char *name)
/* Check arguments */
if(H5I_ATTR == H5I_get_type(loc_id))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "name parameter cannot be NULL")
if(!*name)
@@ -1395,8 +1513,17 @@ H5Adelete(hid_t loc_id, const char *name)
if(H5CX_set_loc(loc_id) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTSET, FAIL, "can't set collective metadata read")
/* Fill in location struct fields */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(loc_id);
/* Get the object */
if(NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid object identifier")
/* Delete the attribute */
if(H5O__attr_remove(loc.oloc, name) < 0)
if((ret_value = H5VL_attr_specific(vol_obj->data, loc_params, vol_obj->driver->cls, H5VL_ATTR_DELETE,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, name)) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete attribute")
done:
@@ -1424,7 +1551,8 @@ herr_t
H5Adelete_by_name(hid_t loc_id, const char *obj_name, const char *attr_name,
hid_t lapl_id)
{
H5G_loc_t loc; /* Object location */
H5VL_object_t *vol_obj;
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -1433,8 +1561,6 @@ H5Adelete_by_name(hid_t loc_id, const char *obj_name, const char *attr_name,
/* Check arguments */
if(H5I_ATTR == H5I_get_type(loc_id))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!obj_name || !*obj_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no object name")
if(!attr_name || !*attr_name)
@@ -1444,8 +1570,19 @@ H5Adelete_by_name(hid_t loc_id, const char *obj_name, const char *attr_name,
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, loc_id, TRUE) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTSET, FAIL, "can't set access property list info")
/* Fill in location struct fields */
loc_params.type = H5VL_OBJECT_BY_NAME;
loc_params.loc_data.loc_by_name.name = obj_name;
loc_params.loc_data.loc_by_name.lapl_id = lapl_id;
loc_params.obj_type = H5I_get_type(loc_id);
/* Get the object */
if(NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid object identifier")
/* Delete the attribute */
if(H5A__delete_by_name(&loc, obj_name, attr_name) < 0)
if((ret_value = H5VL_attr_specific(vol_obj->data, loc_params, vol_obj->driver->cls, H5VL_ATTR_DELETE,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, attr_name)) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete attribute")
done:
@@ -1481,7 +1618,8 @@ herr_t
H5Adelete_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
H5_iter_order_t order, hsize_t n, hid_t lapl_id)
{
H5G_loc_t loc; /* Object location */
H5VL_object_t *vol_obj;
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -1490,8 +1628,6 @@ H5Adelete_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
/* check arguments */
if(H5I_ATTR == H5I_get_type(loc_id))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!obj_name || !*obj_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no object name")
if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
@@ -1503,8 +1639,21 @@ H5Adelete_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, loc_id, TRUE) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTSET, FAIL, "can't set access property list info")
/* Delete the attribute from the location */
if(H5A__delete_by_idx(&loc, obj_name, idx_type, order, n) < 0)
loc_params.type = H5VL_OBJECT_BY_IDX;
loc_params.loc_data.loc_by_idx.name = obj_name;
loc_params.loc_data.loc_by_idx.idx_type = idx_type;
loc_params.loc_data.loc_by_idx.order = order;
loc_params.loc_data.loc_by_idx.n = n;
loc_params.loc_data.loc_by_idx.lapl_id = lapl_id;
loc_params.obj_type = H5I_get_type(loc_id);
/* get the object */
if(NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid object identifier")
/* Delete the attribute through the VOL */
if((ret_value = H5VL_attr_specific(vol_obj->data, loc_params, vol_obj->driver->cls, H5VL_ATTR_DELETE,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, NULL)) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete attribute")
done:
@@ -1561,7 +1710,8 @@ done:
htri_t
H5Aexists(hid_t obj_id, const char *attr_name)
{
H5G_loc_t loc; /* Object location */
H5VL_object_t *vol_obj;
H5VL_loc_params_t loc_params;
htri_t ret_value; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -1570,13 +1720,19 @@ H5Aexists(hid_t obj_id, const char *attr_name)
/* Check arguments */
if(H5I_ATTR == H5I_get_type(obj_id))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
if(H5G_loc(obj_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!attr_name || !*attr_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no attribute name")
/* get the object */
if(NULL == (vol_obj = H5VL_get_object(obj_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid object identifier")
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(obj_id);
/* Check if the attribute exists */
if((ret_value = H5O__attr_exists(loc.oloc, attr_name)) < 0)
if(H5VL_attr_specific(vol_obj->data, loc_params, vol_obj->driver->cls, H5VL_ATTR_EXISTS,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, attr_name, &ret_value) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "unable to determine if attribute exists")
done:
@@ -1601,7 +1757,8 @@ htri_t
H5Aexists_by_name(hid_t loc_id, const char *obj_name, const char *attr_name,
hid_t lapl_id)
{
H5G_loc_t loc; /* Object location */
H5VL_object_t *vol_obj;
H5VL_loc_params_t loc_params;
htri_t ret_value; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -1610,8 +1767,6 @@ H5Aexists_by_name(hid_t loc_id, const char *obj_name, const char *attr_name,
/* check arguments */
if(H5I_ATTR == H5I_get_type(loc_id))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!obj_name || !*obj_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no object name")
if(!attr_name || !*attr_name)
@@ -1621,8 +1776,18 @@ H5Aexists_by_name(hid_t loc_id, const char *obj_name, const char *attr_name,
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, loc_id, FALSE) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTSET, FAIL, "can't set access property list info")
/* get the object */
if(NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid object identifier")
loc_params.type = H5VL_OBJECT_BY_NAME;
loc_params.loc_data.loc_by_name.name = obj_name;
loc_params.loc_data.loc_by_name.lapl_id = lapl_id;
loc_params.obj_type = H5I_get_type(loc_id);
/* Check existence of attribute */
if((ret_value = H5A__exists_by_name(loc, obj_name, attr_name)) < 0)
if(H5VL_attr_specific(vol_obj->data, loc_params, vol_obj->driver->cls, H5VL_ATTR_EXISTS,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, attr_name, &ret_value) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "unable to determine if attribute exists")
done:
+83 -75
View File
@@ -43,6 +43,7 @@
#include "H5Eprivate.h" /* Error handling */
#include "H5Iprivate.h" /* IDs */
#include "H5Opkg.h" /* Object headers */
#include "H5VLprivate.h" /* Virtual object layer */
/****************/
@@ -113,10 +114,10 @@ hid_t
H5Acreate1(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id,
hid_t acpl_id)
{
H5A_t *attr = NULL; /* Attribute created */
H5G_loc_t loc; /* Object location */
H5T_t *type; /* Datatype to use for attribute */
H5S_t *space; /* Dataspace to use for attribute */
void *attr = NULL; /* attr token from VOL plugin */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
H5P_genplist_t *plist; /* Property list pointer */
hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
@@ -125,33 +126,48 @@ H5Acreate1(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id,
/* Check arguments */
if(H5I_ATTR == H5I_get_type(loc_id))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "location is not valid for an attribute")
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a location")
if(0 == (H5F_INTENT(loc.oloc->file) & H5F_ACC_RDWR))
HGOTO_ERROR(H5E_ARGS, H5E_WRITEERROR, H5I_INVALID_HID, "no write intent on file")
if(!name || !*name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "no name")
if(NULL == (type = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a type")
if(NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a dataspace")
/* Set up collective metadata if appropriate */
if(H5CX_set_loc(loc_id) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTSET, H5I_INVALID_HID, "can't set collective metadata read")
/* Get correct property list */
if(H5P_DEFAULT == acpl_id)
acpl_id = H5P_ATTRIBUTE_CREATE_DEFAULT;
/* Get the plist structure */
if(NULL == (plist = (H5P_genplist_t *)H5I_object(acpl_id)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, H5I_INVALID_HID, "can't find object for ID")
/* Set creation properties */
if(H5P_set(plist, H5VL_PROP_ATTR_TYPE_ID, &type_id) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5I_INVALID_HID, "can't set property value for datatype id")
if(H5P_set(plist, H5VL_PROP_ATTR_SPACE_ID, &space_id) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5I_INVALID_HID, "can't set property value for space id")
/* Set location parameters */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(loc_id);
/* Get the location object */
if(NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid location identifier")
/* Create the attribute */
if(NULL == (attr = H5A__create(&loc, name, type, space, acpl_id)))
if(NULL == (attr = H5VL_attr_create(vol_obj->data, loc_params, vol_obj->driver->cls, name,
acpl_id, H5P_DEFAULT, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, H5I_INVALID_HID, "unable to create attribute")
/* Register the new attribute and get an ID for it */
if((ret_value = H5I_register(H5I_ATTR, attr, TRUE)) < 0)
if((ret_value = H5VL_register_id(H5I_ATTR, attr, vol_obj->driver, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register attribute for ID")
done:
/* Clean up on failure */
if(H5I_INVALID_HID == ret_value)
if(attr && H5A__close(attr) < 0)
if(attr && H5VL_attr_close(attr, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, H5I_INVALID_HID, "can't close attribute")
FUNC_LEAVE_API(ret_value)
@@ -183,8 +199,9 @@ done:
hid_t
H5Aopen_name(hid_t loc_id, const char *name)
{
H5G_loc_t loc; /* Object location */
H5A_t *attr = NULL; /* Attribute opened */
void *attr = NULL; /* attr token from VOL plugin */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
@@ -193,23 +210,30 @@ H5Aopen_name(hid_t loc_id, const char *name)
/* Check arguments */
if(H5I_ATTR == H5I_get_type(loc_id))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "location is not valid for an attribute")
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a location")
if(!name || !*name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "no name")
/* Set location parameters */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(loc_id);
/* Get the location object */
if (NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid location identifier")
/* Open the attribute */
if(NULL == (attr = H5A__open_by_name(&loc, ".", name)))
HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, H5I_INVALID_HID, "can't open attribute: '%s'", name)
if (NULL == (attr = H5VL_attr_open(vol_obj->data, loc_params, vol_obj->driver->cls,
name, H5P_DEFAULT, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, H5I_INVALID_HID, "unable to open attribute")
/* Register the attribute and get an ID for it */
if((ret_value = H5I_register(H5I_ATTR, attr, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register attribute for ID")
if ((ret_value = H5VL_register_id(H5I_ATTR, attr, vol_obj->driver, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to atomize attribute handle")
done:
/* Clean up on failure */
if(H5I_INVALID_HID == ret_value)
if(attr && H5A__close(attr) < 0)
if(attr && H5VL_attr_close(attr, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, H5I_INVALID_HID, "can't close attribute")
FUNC_LEAVE_API(ret_value)
@@ -241,8 +265,9 @@ done:
hid_t
H5Aopen_idx(hid_t loc_id, unsigned idx)
{
H5G_loc_t loc; /* Object location */
H5A_t *attr = NULL; /* Attribute opened */
void *attr = NULL; /* attr token from VOL plugin */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
@@ -250,22 +275,34 @@ H5Aopen_idx(hid_t loc_id, unsigned idx)
/* Check arguments */
if(H5I_ATTR == H5I_get_type(loc_id))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "location is not valid for an attribute")
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "location is not valid for an attribute")
/* Set location parameters */
loc_params.type = H5VL_OBJECT_BY_IDX;
loc_params.loc_data.loc_by_idx.name = ".";
loc_params.loc_data.loc_by_idx.idx_type = H5_INDEX_CRT_ORDER;
loc_params.loc_data.loc_by_idx.order = H5_ITER_INC;
loc_params.loc_data.loc_by_idx.n = (hsize_t)idx;
loc_params.loc_data.loc_by_idx.lapl_id = H5P_LINK_ACCESS_DEFAULT;
loc_params.obj_type = H5I_get_type(loc_id);
/* Get the location object */
if(NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid location identifier")
/* Open the attribute */
if(NULL == (attr = H5A__open_by_idx(&loc, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)idx)))
if(NULL == (attr = H5VL_attr_open(vol_obj->data, loc_params, vol_obj->driver->cls,
NULL, H5P_DEFAULT, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, H5I_INVALID_HID, "unable to open attribute")
/* Register the attribute and get an ID for it */
if((ret_value = H5I_register(H5I_ATTR, attr, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register attribute for ID")
if((ret_value = H5VL_register_id(H5I_ATTR, attr, vol_obj->driver, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to atomize attribute handle")
done:
/* Clean up on failure */
if(H5I_INVALID_HID == ret_value)
if(attr && H5A__close(attr) < 0)
if(attr && H5VL_attr_close(attr, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, H5I_INVALID_HID, "can't close attribute")
FUNC_LEAVE_API(ret_value)
@@ -293,56 +330,27 @@ done:
int
H5Aget_num_attrs(hid_t loc_id)
{
H5O_loc_t *loc; /* Object location for attribute */
void *obj;
H5VL_object_t *vol_obj;
H5VL_loc_params_t loc_params;
H5O_info_t oinfo;
int ret_value = -1;
FUNC_ENTER_API((-1))
H5TRACE1("Is", "i", loc_id);
if(H5I_BADID == H5I_get_type(loc_id))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, (-1), "bad location ID")
if(H5I_FILE == H5I_get_type(loc_id) || H5I_ATTR == H5I_get_type(loc_id))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, (-1), "location is not valid for an attribute")
if(NULL == (obj = H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADATOM, (-1), "illegal object atom")
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(loc_id);
switch(H5I_get_type (loc_id)) {
case H5I_DATASET:
if(NULL == (loc = H5D_oloc((H5D_t*)obj)))
HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, (-1), "can't get location for object")
break;
/* get the location object */
if(NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, (-1), "invalid location identifier")
case H5I_DATATYPE:
if(NULL == (loc = H5T_oloc((H5T_t*)obj)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, (-1), "target datatype is not committed")
break;
/* Get the number of attributes for the object */
if(H5VL_object_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT,
H5_REQUEST_NULL, H5VL_OBJECT_GET_INFO, loc_params, &oinfo, H5O_INFO_ALL) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, (-1), "unable to get attribute count for object")
case H5I_GROUP:
if(NULL == (loc = H5G_oloc((H5G_t*)obj)))
HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, (-1), "can't get location for object")
break;
case H5I_UNINIT:
case H5I_BADID:
case H5I_FILE:
case H5I_DATASPACE:
case H5I_ATTR:
case H5I_REFERENCE:
case H5I_VFL:
case H5I_GENPROP_CLS:
case H5I_GENPROP_LST:
case H5I_ERROR_CLASS:
case H5I_ERROR_MSG:
case H5I_ERROR_STACK:
case H5I_NTYPES:
default:
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, (-1), "inappropriate attribute target")
}
/* Look up the # of attributes for the object */
if((ret_value = H5O__attr_count(loc)) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTCOUNT, (-1), "can't get attribute count for object")
H5_CHECKED_ASSIGN(ret_value, int, oinfo.num_attrs, hsize_t);
done:
FUNC_LEAVE_API(ret_value)
+60 -76
View File
@@ -42,6 +42,8 @@
#include "H5MMprivate.h" /* Memory management */
#include "H5Opkg.h" /* Object headers */
#include "H5SMprivate.h" /* Shared Object Header Messages */
#include "H5VLprivate.h" /* Virtual Object Layer */
#include "H5VLnative.h" /* Native VOL driver */
/****************/
@@ -404,11 +406,11 @@ done:
/*-------------------------------------------------------------------------
* Function: H5A__open
* Function: H5A__open
*
* Purpose: Open an attribute in an object header
* Purpose: Open an attribute in an object header
*
* Return: Non-negative on success/Negative on failure
* Return: SUCCEED/FAIL
*
* Programmer: Quincey Koziol
* December 9, 2017
@@ -917,8 +919,18 @@ H5A__get_type(H5A_t *attr)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, H5I_INVALID_HID, "unable to lock transient datatype")
/* Atomize */
if ((ret_value = H5I_register(H5I_DATATYPE, dt, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register datatype")
if (H5T_is_named(dt)) {
/* If this is a committed datatype, we need to recreate the
* two level IDs, where the VOL object is a copy of the
* returned datatype
*/
if ((ret_value = H5VL_native_register(H5I_DATATYPE, dt, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to atomize file handle")
}
else {
if ((ret_value = H5I_register(H5I_DATATYPE, dt, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register datatype")
}
done:
if(H5I_INVALID_HID == ret_value)
@@ -1134,20 +1146,23 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
H5A__close_cb(H5A_t *attr)
H5A__close_cb(H5VL_object_t *attr_vol_obj)
{
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_PACKAGE
/* Sanity check */
HDassert(attr);
HDassert(attr->shared);
HDassert(attr_vol_obj);
/* Close the attribute */
if(H5A__close(attr) < 0)
if((ret_value = H5VL_attr_close(attr_vol_obj->data, attr_vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "problem closing attribute")
/* Free the VOL object */
if(H5VL_free_object(attr_vol_obj) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTDEC, FAIL, "unable to free VOL object")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5A__close_cb() */
@@ -2339,7 +2354,7 @@ H5A__attr_post_copy_file(const H5O_loc_t *src_oloc, const H5A_t *attr_src,
HDassert(file_src);
HDassert(file_dst);
if(H5T_is_named(attr_src->shared->dt)) {
if (H5T_is_named(attr_src->shared->dt)) {
H5O_loc_t *src_oloc_dt; /* Pointer to source datatype's object location */
H5O_loc_t *dst_oloc_dt; /* Pointer to dest. datatype's object location */
@@ -2596,16 +2611,20 @@ H5A__iterate_common(hid_t loc_id, H5_index_t idx_type, H5_iter_order_t order,
*
* Return: SUCCEED/FAIL
*
* Programmer: Quincey Koziol
* December 6, 2017
*
*-------------------------------------------------------------------------
*/
herr_t
H5A__iterate(hid_t loc_id, H5_index_t idx_type, H5_iter_order_t order,
H5A__iterate(const H5G_loc_t *loc, const char *obj_name, H5_index_t idx_type, H5_iter_order_t order,
hsize_t *idx, H5A_operator2_t op, void *op_data)
{
H5G_loc_t obj_loc; /* Location used to open group */
H5G_name_t obj_path; /* Opened object group hier. path */
H5O_loc_t obj_oloc; /* Opened object object location */
hbool_t loc_found = FALSE; /* Entry at 'obj_name' found */
hid_t obj_loc_id = (-1); /* ID for object located */
H5A_attr_iter_op_t attr_op; /* Attribute operator */
void *temp_obj = NULL;
H5I_type_t obj_type;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_PACKAGE
@@ -2614,11 +2633,37 @@ H5A__iterate(hid_t loc_id, H5_index_t idx_type, H5_iter_order_t order,
attr_op.op_type = H5A_ATTR_OP_APP2;
attr_op.u.app_op2 = op;
/* Set up opened group location to fill in */
obj_loc.oloc = &obj_oloc;
obj_loc.path = &obj_path;
H5G_loc_reset(&obj_loc);
/* Find the object's location */
if(H5G_loc_find(loc, obj_name, &obj_loc) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "object not found");
loc_found = TRUE;
/* Open the object */
if(NULL == (temp_obj = H5O_open_by_loc(&obj_loc, &obj_type)))
HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open object");
/* Get an ID for the object */
if((obj_loc_id = H5VL_native_register(obj_type, temp_obj, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register datatype");
/* Call internal attribute iteration routine */
if((ret_value = H5A__iterate_common(loc_id, idx_type, order, idx, &attr_op, op_data)) < 0)
if((ret_value = H5A__iterate_common(obj_loc_id, idx_type, order, idx, &attr_op, op_data)) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_BADITER, FAIL, "error iterating over attributes")
done:
/* Release resources */
if(obj_loc_id != H5I_INVALID_HID) {
if(H5I_dec_app_ref(obj_loc_id) < 0)
HDONE_ERROR(H5E_ATTR, H5E_CANTDEC, FAIL, "unable to close temporary object");
}
else if(loc_found && H5G_loc_free(&obj_loc) < 0)
HDONE_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't free location");
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5A__iterate() */
@@ -2666,67 +2711,6 @@ done:
} /* H5A__iterate_old() */
#endif /* H5_NO_DEPRECATED_SYMBOLS */
/*-------------------------------------------------------------------------
* Function: H5A__iterate_by_name
*
* Purpose: Private version of H5Aiterate_by_name
*
* Return: SUCCEED/FAIL
*
* Programmer: Quincey Koziol
* December 6, 2017
*
*-------------------------------------------------------------------------
*/
herr_t
H5A__iterate_by_name(const H5G_loc_t *loc, const char *obj_name, H5_index_t idx_type, H5_iter_order_t order, hsize_t *idx, H5A_operator2_t op,
void *op_data)
{
H5G_loc_t obj_loc; /* Location used to open group */
H5G_name_t obj_path; /* Opened object group hier. path */
H5O_loc_t obj_oloc; /* Opened object object location */
hbool_t loc_found = FALSE; /* Entry at 'obj_name' found */
hid_t obj_loc_id = (-1); /* ID for object located */
H5A_attr_iter_op_t attr_op; /* Attribute operator */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_PACKAGE
/* Set up opened group location to fill in */
obj_loc.oloc = &obj_oloc;
obj_loc.path = &obj_path;
H5G_loc_reset(&obj_loc);
/* Find the object's location */
if(H5G_loc_find(loc, obj_name, &obj_loc/*out*/) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "object not found")
loc_found = TRUE;
/* Open the object */
if((obj_loc_id = H5O_open_by_loc(&obj_loc, TRUE)) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open object")
/* Build attribute operator info */
attr_op.op_type = H5A_ATTR_OP_APP2;
attr_op.u.app_op2 = op;
/* Call attribute iteration routine */
if((ret_value = H5A__iterate_common(obj_loc_id, idx_type, order, idx, &attr_op, op_data)) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_BADITER, FAIL, "error iterating over attributes")
done:
/* Release resources */
if(obj_loc_id > 0) {
if(H5I_dec_app_ref(obj_loc_id) < 0)
HDONE_ERROR(H5E_ATTR, H5E_CANTDEC, FAIL, "unable to close temporary object")
}
else if(loc_found && H5G_loc_free(&obj_loc) < 0)
HDONE_ERROR(H5E_ATTR, H5E_CANTRELEASE, FAIL, "can't free location")
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5A__iterate_by_name() */
/*-------------------------------------------------------------------------
* Function: H5A__delete_by_name
+2 -5
View File
@@ -198,16 +198,13 @@ H5_DLL herr_t H5A__get_info(const H5A_t *attr, H5A_info_t *ainfo);
H5_DLL hid_t H5A__get_create_plist(H5A_t* attr);
H5_DLL herr_t H5A__free(H5A_t *attr);
H5_DLL herr_t H5A__close(H5A_t *attr);
H5_DLL herr_t H5A__close_cb(H5A_t *attr);
H5_DLL herr_t H5A__close_cb(H5VL_object_t *attr_vol_obj);
H5_DLL htri_t H5A__get_ainfo(H5F_t *f, H5O_t *oh, H5O_ainfo_t *ainfo);
H5_DLL herr_t H5A__set_version(const H5F_t *f, H5A_t *attr);
H5_DLL herr_t H5A__rename_by_name(H5G_loc_t loc, const char *obj_name, const char *old_attr_name,
const char *new_attr_name);
H5_DLL herr_t H5A__iterate(hid_t loc_id, H5_index_t idx_type, H5_iter_order_t order,
H5_DLL herr_t H5A__iterate(const H5G_loc_t *loc, const char *obj_name,H5_index_t idx_type, H5_iter_order_t order,
hsize_t *idx, H5A_operator2_t op, void *op_data);
H5_DLL herr_t H5A__iterate_by_name(const H5G_loc_t *loc, const char *obj_name,
H5_index_t idx_type, H5_iter_order_t order, hsize_t *idx, H5A_operator2_t op,
void *op_data);
#ifndef H5_NO_DEPRECATED_SYMBOLS
H5_DLL herr_t H5A__iterate_old(hid_t loc_id, unsigned *attr_num,
H5A_operator1_t op, void *op_data);
+3 -2
View File
@@ -38,6 +38,7 @@
#include "H5Eprivate.h" /* Error handling */
#include "H5Iprivate.h" /* IDs */
#include "H5SMprivate.h" /* Shared object header messages */
#include "H5VLprivate.h" /* Virtual Object Layer */
/****************/
@@ -96,7 +97,7 @@ H5A__is_shared_test(hid_t attr_id)
FUNC_ENTER_PACKAGE
/* Check arguments */
if(NULL == (attr = (H5A_t *)H5I_object_verify(attr_id, H5I_ATTR)))
if(NULL == (attr = (H5A_t *)H5VL_object_verify(attr_id, H5I_ATTR)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an attribute")
/* Check if attribute is shared */
@@ -129,7 +130,7 @@ H5A__get_shared_rc_test(hid_t attr_id, hsize_t *ref_count)
FUNC_ENTER_PACKAGE
/* Check arguments */
if(NULL == (attr = (H5A_t *)H5I_object_verify(attr_id, H5I_ATTR)))
if(NULL == (attr = (H5A_t *)H5VL_object_verify(attr_id, H5I_ATTR)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an attribute")
/* Push API context */
+4
View File
@@ -2472,7 +2472,11 @@ H5CX__pop_common(void)
H5CX_node_t **head = H5CX_get_my_context(); /* Get the pointer to the head of the API context, for this thread */
H5CX_node_t *ret_value = NULL; /* Return value */
#ifdef H5_HAVE_PARALLEL
FUNC_ENTER_STATIC
#else
FUNC_ENTER_STATIC_NOERR
#endif
/* Sanity check */
HDassert(head && *head);
+2 -1
View File
@@ -40,6 +40,7 @@
#include "H5Eprivate.h" /* Error handling */
#include "H5Fpkg.h" /* Files */
#include "H5Iprivate.h" /* IDs */
#include "H5VLprivate.h" /* Virtual Object Layer */
/****************/
@@ -142,7 +143,7 @@ H5C__verify_cork_tag_test(hid_t fid, haddr_t tag, hbool_t status)
FUNC_ENTER_PACKAGE
/* Get file pointer */
if(NULL == (f = (H5F_t *)H5I_object_verify(fid, H5I_FILE)))
if(NULL == (f = (H5F_t *)H5VL_object_verify(fid, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
/* Get cache pointer */
+142 -134
View File
@@ -27,6 +27,7 @@
#include "H5Eprivate.h" /* Error handling */
#include "H5FLprivate.h" /* Free lists */
#include "H5Iprivate.h" /* IDs */
#include "H5VLprivate.h" /* Virtual Object Layer */
/****************/
@@ -102,9 +103,10 @@ hid_t
H5Dcreate2(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id,
hid_t lcpl_id, hid_t dcpl_id, hid_t dapl_id)
{
H5D_t *dset = NULL; /* New dataset's info */
H5G_loc_t loc; /* Object location to insert dataset into */
const H5S_t *space; /* Dataspace for dataset */
void *dset = NULL; /* New dataset's info */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
H5P_genplist_t *plist = NULL; /* Property list pointer */
hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
@@ -112,16 +114,10 @@ H5Dcreate2(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id,
dapl_id);
/* Check arguments */
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a location ID")
if(!name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "name parameter cannot be NULL")
if(!*name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "name parameter cannot be an empty string")
if(H5I_DATATYPE != H5I_get_type(type_id))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a datatype ID")
if(NULL == (space = (const H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a dataspace ID")
/* Get link creation property list */
if(H5P_DEFAULT == lcpl_id)
@@ -141,17 +137,38 @@ H5Dcreate2(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id,
if(H5CX_set_apl(&dapl_id, H5P_CLS_DACC, loc_id, TRUE) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, H5I_INVALID_HID, "can't set access property list info")
/* Get the property list structure for the dcpl */
if(NULL == (plist = (H5P_genplist_t *)H5I_object(dcpl_id)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, H5I_INVALID_HID, "can't find object for ID")
/* Get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid location identifier")
/* Set creation properties */
if(H5P_set(plist, H5VL_PROP_DSET_TYPE_ID, &type_id) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5I_INVALID_HID, "can't set property value for datatype id")
if(H5P_set(plist, H5VL_PROP_DSET_SPACE_ID, &space_id) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5I_INVALID_HID, "can't set property value for space id")
if(H5P_set(plist, H5VL_PROP_DSET_LCPL_ID, &lcpl_id) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5I_INVALID_HID, "can't set property value for lcpl id")
/* Set location parameters */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(loc_id);
/* Create the dataset */
if(NULL == (dset = H5D__create_named(&loc, name, type_id, space, lcpl_id, dcpl_id, dapl_id)))
if(NULL == (dset = H5VL_dataset_create(vol_obj->data, loc_params, vol_obj->driver->cls,
name, dcpl_id, dapl_id, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, H5I_INVALID_HID, "unable to create dataset")
/* Get an atom for the dataset */
if((ret_value = H5I_register(H5I_DATASET, dset, TRUE)) < 0)
if((ret_value = H5VL_register_id(H5I_DATASET, dset, vol_obj->driver, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to atomize dataset handle")
done:
if(H5I_INVALID_HID == ret_value)
if(dset && H5D_close(dset) < 0)
if(dset && H5VL_dataset_close(dset, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, H5I_INVALID_HID, "unable to release dataset")
FUNC_LEAVE_API(ret_value)
@@ -194,21 +211,16 @@ hid_t
H5Dcreate_anon(hid_t loc_id, hid_t type_id, hid_t space_id, hid_t dcpl_id,
hid_t dapl_id)
{
H5G_loc_t loc; /* Object location to insert dataset into */
H5D_t *dset = NULL; /* New dataset's info */
const H5S_t *space; /* Dataspace for dataset */
void *dset = NULL; /* dset token from VOL plugin */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
H5P_genplist_t *plist; /* Property list pointer */
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(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a location ID")
if(H5I_DATATYPE != H5I_get_type(type_id))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a datatype ID")
if(NULL == (space = (const H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a dataspace ID")
if(H5P_DEFAULT == dcpl_id)
dcpl_id = H5P_DATASET_CREATE_DEFAULT;
else
@@ -219,31 +231,38 @@ H5Dcreate_anon(hid_t loc_id, hid_t type_id, hid_t space_id, hid_t dcpl_id,
if(H5CX_set_apl(&dapl_id, H5P_CLS_DACC, loc_id, TRUE) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, H5I_INVALID_HID, "can't set access property list info")
/* get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid location identifier")
/* Get the plist structure */
if(NULL == (plist = (H5P_genplist_t *)H5I_object(dcpl_id)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, H5I_INVALID_HID, "can't find object for ID")
/* set creation properties */
if(H5P_set(plist, H5VL_PROP_DSET_TYPE_ID, &type_id) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5I_INVALID_HID, "can't set property value for datatype id")
if(H5P_set(plist, H5VL_PROP_DSET_SPACE_ID, &space_id) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5I_INVALID_HID, "can't set property value for space id")
/* Set location parameters */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(loc_id);
/* Create the dataset */
if(NULL == (dset = H5D__create(loc.oloc->file, type_id, space, dcpl_id, dapl_id)))
if(NULL == (dset = H5VL_dataset_create(vol_obj->data, loc_params, vol_obj->driver->cls,
NULL, dcpl_id, dapl_id,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, H5I_INVALID_HID, "unable to create dataset")
/* Get an atom for the dataset */
if((ret_value = H5I_register(H5I_DATASET, dset, TRUE)) < 0)
if((ret_value = H5VL_register_id(H5I_DATASET, dset, vol_obj->driver, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register dataset")
done:
/* Release the dataset's object header, if it was created */
if(dset) {
H5O_loc_t *oloc; /* Object location for dataset */
/* Get the new dataset's object location */
if(NULL == (oloc = H5D_oloc(dset)))
HDONE_ERROR(H5E_DATASET, H5E_CANTGET, H5I_INVALID_HID, "unable to get object location of dataset")
/* Decrement refcount on dataset's object header in memory */
if(H5O_dec_rc_by_loc(oloc) < 0)
HDONE_ERROR(H5E_DATASET, H5E_CANTDEC, H5I_INVALID_HID, "unable to decrement refcount on newly created object")
} /* end if */
/* Cleanup on failure */
if(H5I_INVALID_HID == ret_value)
if(dset && H5D_close(dset) < 0)
if(dset && H5VL_dataset_close (dset, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, H5I_INVALID_HID, "unable to release dataset")
FUNC_LEAVE_API(ret_value)
@@ -268,16 +287,15 @@ done:
hid_t
H5Dopen2(hid_t loc_id, const char *name, hid_t dapl_id)
{
H5D_t *dset = NULL;
H5G_loc_t loc; /* Object location of group */
void *dset = NULL; /* dset token from VOL plugin */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
H5TRACE3("i", "i*si", loc_id, name, dapl_id);
/* Check args */
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "name parameter cannot be NULL")
if(!*name)
@@ -287,17 +305,26 @@ H5Dopen2(hid_t loc_id, const char *name, hid_t dapl_id)
if(H5CX_set_apl(&dapl_id, H5P_CLS_DACC, loc_id, FALSE) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, H5I_INVALID_HID, "can't set access property list info")
/* get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid location identifier")
/* Set the location parameters */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(loc_id);
/* Open the dataset */
if(NULL == (dset = H5D__open_name(&loc, name, dapl_id)))
if(NULL == (dset = H5VL_dataset_open(vol_obj->data, loc_params, vol_obj->driver->cls, name,
dapl_id, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, H5I_INVALID_HID, "unable to open dataset")
/* Register an atom for the dataset */
if((ret_value = H5I_register(H5I_DATASET, dset, TRUE)) < 0)
if((ret_value = H5VL_register_id(H5I_DATASET, dset, vol_obj->driver, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "can't register dataset atom")
done:
if(H5I_INVALID_HID == ret_value)
if(dset && H5D_close(dset) < 0)
if(dset && H5VL_dataset_close(dset, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, H5I_INVALID_HID, "unable to release dataset")
FUNC_LEAVE_API(ret_value)
} /* end H5Dopen2() */
@@ -323,7 +350,7 @@ H5Dclose(hid_t dset_id)
H5TRACE1("e", "i", dset_id);
/* Check args */
if(NULL == H5I_object_verify(dset_id, H5I_DATASET))
if(H5I_DATASET != H5I_get_type(dset_id))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset ID")
/* Decrement the counter on the dataset. It will be freed if the count
@@ -353,18 +380,19 @@ done:
hid_t
H5Dget_space(hid_t dset_id)
{
H5D_t *dset = NULL; /* Dataset structure */
H5VL_object_t *vol_obj = NULL; /* Dataset structure */
hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
H5TRACE1("i", "i", dset_id);
/* Check args */
if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid dataset identifier")
/* Get the dataspace */
if((ret_value = H5D__get_space(dset)) < 0)
if(H5VL_dataset_get(vol_obj->data, vol_obj->driver->cls, H5VL_DATASET_GET_SPACE,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, &ret_value) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, H5I_INVALID_HID, "unable to get dataspace")
done:
@@ -384,18 +412,19 @@ done:
herr_t
H5Dget_space_status(hid_t dset_id, H5D_space_status_t *allocation)
{
H5D_t *dset = NULL; /* Dataset structure */
H5VL_object_t *vol_obj = NULL; /* Dataset structure */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE2("e", "i*Ds", dset_id, allocation);
/* Check args */
if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid dataset identifier")
/* Get dataspace status */
if(H5D__get_space_status(dset, allocation) < 0)
if((ret_value = H5VL_dataset_get(vol_obj->data, vol_obj->driver->cls, H5VL_DATASET_GET_SPACE_STATUS,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, allocation)) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to get space status")
done:
@@ -419,18 +448,19 @@ done:
hid_t
H5Dget_type(hid_t dset_id)
{
H5D_t *dset; /* Dataset structure */
H5VL_object_t *vol_obj; /* Dataset structure */
hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
H5TRACE1("i", "i", dset_id);
/* Check args */
if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid dataset identifier")
/* get the datatype */
if((ret_value = H5D__get_type(dset)) < 0)
if(H5VL_dataset_get(vol_obj->data, vol_obj->driver->cls, H5VL_DATASET_GET_TYPE,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, &ret_value) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, H5I_INVALID_HID, "unable to get datatype")
done:
@@ -457,18 +487,19 @@ done:
hid_t
H5Dget_create_plist(hid_t dset_id)
{
H5D_t *dataset; /* Dataset structure */
H5VL_object_t *vol_obj; /* Dataset structure */
hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
H5TRACE1("i", "i", dset_id);
/* Check args */
if(NULL == (dataset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid dataset identifier")
/* Get the dataset creation property list */
if((ret_value = H5D_get_create_plist(dataset)) < 0)
if(H5VL_dataset_get(vol_obj->data, vol_obj->driver->cls, H5VL_DATASET_GET_DCPL,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, &ret_value) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, H5I_INVALID_HID, "unable to get dataset creation properties")
done:
@@ -512,18 +543,19 @@ done:
hid_t
H5Dget_access_plist(hid_t dset_id)
{
H5D_t *dset; /* Dataset structure */
H5VL_object_t *vol_obj; /* Dataset structure */
hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
H5TRACE1("i", "i", dset_id);
/* Check args */
if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid dataset identifier")
/* Get the dataset access property list */
if((ret_value = H5D_get_access_plist(dset)) < 0)
if(H5VL_dataset_get(vol_obj->data, vol_obj->driver->cls, H5VL_DATASET_GET_DAPL,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, &ret_value) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, H5I_INVALID_HID, "unable to get dataset access properties")
done:
@@ -549,18 +581,19 @@ done:
hsize_t
H5Dget_storage_size(hid_t dset_id)
{
H5D_t *dset; /* Dataset for this operation */
H5VL_object_t *vol_obj; /* Dataset for this operation */
hsize_t ret_value = 0; /* Return value */
FUNC_ENTER_API(0)
H5TRACE1("h", "i", dset_id);
/* Check args */
if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "invalid dataset identifier")
/* Get the storage size */
if(H5D__get_storage_size(dset, &ret_value) < 0)
if(H5VL_dataset_get(vol_obj->data, vol_obj->driver->cls, H5VL_DATASET_GET_STORAGE_SIZE,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, &ret_value) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, 0, "unable to get storage size")
done:
@@ -582,18 +615,20 @@ done:
haddr_t
H5Dget_offset(hid_t dset_id)
{
H5D_t *dset; /* Dataset for this operation */
H5VL_object_t *vol_obj; /* Dataset for this operation */
haddr_t ret_value = HADDR_UNDEF; /* Return value */
FUNC_ENTER_API(HADDR_UNDEF)
H5TRACE1("a", "i", dset_id);
/* Check args */
if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, HADDR_UNDEF, "invalid dataset identifier")
/* Get the offset */
ret_value = H5D__get_offset(dset);
if(H5VL_dataset_get(vol_obj->data, vol_obj->driver->cls, H5VL_DATASET_GET_OFFSET,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, &ret_value) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, HADDR_UNDEF, "unable to get offset")
done:
FUNC_LEAVE_API(ret_value)
@@ -775,8 +810,7 @@ H5Dvlen_get_buf_size(hid_t dataset_id, hid_t type_id, hid_t space_id,
hsize_t *size)
{
H5D_vlen_bufsize_t vlen_bufsize = {0, 0, 0, 0, 0, 0};
H5D_t *dset; /* Dataset for this operation */
H5S_t *fspace = NULL; /* Dataset's dataspace */
H5VL_object_t *vol_obj; /* Dataset for this operation */
H5S_t *mspace = NULL; /* Memory dataspace */
char bogus; /* bogus value to pass to H5Diterate() */
H5S_t *space; /* Dataspace for iteration */
@@ -791,7 +825,7 @@ H5Dvlen_get_buf_size(hid_t dataset_id, hid_t type_id, hid_t space_id,
if(H5I_DATASET != H5I_get_type(dataset_id) ||
H5I_DATATYPE != H5I_get_type(type_id) || size == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid argument")
if(NULL == (dset = (H5D_t *)H5I_object(dataset_id)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(dataset_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid dataset identifier")
if(NULL == (type = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an valid base datatype")
@@ -801,21 +835,20 @@ H5Dvlen_get_buf_size(hid_t dataset_id, hid_t type_id, hid_t space_id,
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "dataspace does not have extent set")
/* Save the dataset */
vlen_bufsize.dset = dset;
vlen_bufsize.dset_vol_obj = vol_obj;
vlen_bufsize.fspace_id = H5I_INVALID_HID;
vlen_bufsize.mspace_id = H5I_INVALID_HID;
/* Get a copy of the dataset's dataspace */
if(NULL == (fspace = H5S_copy(dset->shared->space, FALSE, TRUE)))
if(H5VL_dataset_get(vol_obj->data, vol_obj->driver->cls, H5VL_DATASET_GET_SPACE,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, &vlen_bufsize.fspace_id) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "can't copy dataspace")
if((vlen_bufsize.fspace_id = H5I_register(H5I_DATASPACE, fspace, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register file dataspace")
/* Create a scalar for the memory dataspace */
if(NULL == (mspace = H5S_create(H5S_SCALAR)))
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCREATE, FAIL, "can't create dataspace")
if((vlen_bufsize.mspace_id = H5I_register(H5I_DATASPACE, mspace, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register memory dataspace")
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register dataspace atom")
/* Grab the temporary buffers required */
if(NULL == (vlen_bufsize.fl_tbuf = H5FL_BLK_MALLOC(vlen_fl_buf, (size_t)1)))
@@ -842,17 +875,14 @@ H5Dvlen_get_buf_size(hid_t dataset_id, hid_t type_id, hid_t space_id,
*size = vlen_bufsize.size;
done:
if(ret_value < 0) {
if(fspace && H5S_close(fspace) < 0)
HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release file dataspace")
if(ret_value < 0)
if(mspace && H5S_close(mspace) < 0)
HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release memory dataspace")
}
HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release dataspace")
if(vlen_bufsize.fspace_id && H5I_dec_app_ref(vlen_bufsize.fspace_id) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDEC, FAIL, "problem freeing file dataspace id")
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDEC, FAIL, "problem freeing id")
if(vlen_bufsize.mspace_id && H5I_dec_app_ref(vlen_bufsize.mspace_id) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDEC, FAIL, "problem freeing memory dataspace id")
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDEC, FAIL, "problem freeing id")
if(vlen_bufsize.fl_tbuf != NULL)
vlen_bufsize.fl_tbuf = H5FL_BLK_FREE(vlen_fl_buf, vlen_bufsize.fl_tbuf);
if(vlen_bufsize.vl_tbuf != NULL)
@@ -875,14 +905,14 @@ done:
herr_t
H5Dset_extent(hid_t dset_id, const hsize_t size[])
{
H5D_t *dset; /* Dataset for this operation */
H5VL_object_t *vol_obj; /* Dataset for this operation */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE2("e", "i*h", dset_id, size);
/* Check args */
if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dset_id parameter is not a valid dataset identifier")
if(!size)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "size array cannot be NULL")
@@ -892,7 +922,8 @@ H5Dset_extent(hid_t dset_id, const hsize_t size[])
HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "can't set collective metadata read info")
/* Set the extent */
if(H5D__set_extent(dset, size) < 0)
if ((ret_value = H5VL_dataset_specific(vol_obj->data, vol_obj->driver->cls, H5VL_DATASET_SET_EXTENT,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, size)) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "unable to set dataset extent")
done:
@@ -912,22 +943,26 @@ done:
herr_t
H5Dflush(hid_t dset_id)
{
H5D_t *dset; /* Dataset for this operation */
H5VL_object_t *vol_obj; /* Dataset for this operation */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE1("e", "i", dset_id);
/* Check args */
if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dset_id parameter is not a valid dataset identifier")
/* Set up collective metadata if appropriate */
if(H5CX_set_loc(dset_id) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "can't set collective metadata read info")
/* Flush dataset information cached in memory */
if(H5D__flush(dset, dset_id) < 0)
/* Flush dataset information cached in memory
* XXX: Note that we need to pass the ID to the VOL since the H5F_flush_cb_t
* callback needs it and that's in the public API.
*/
if((ret_value = H5VL_dataset_specific(vol_obj->data, vol_obj->driver->cls, H5VL_DATASET_FLUSH,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, dset_id)) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTFLUSH, FAIL, "unable to flush dataset")
done:
@@ -947,14 +982,14 @@ done:
herr_t
H5Drefresh(hid_t dset_id)
{
H5D_t *dset; /* Dataset for this operation */
H5VL_object_t *vol_obj; /* Dataset for this operation */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE1("e", "i", dset_id);
/* Check args */
if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dset_id parameter is not a valid dataset identifier")
/* Set up collective metadata if appropriate */
@@ -962,7 +997,8 @@ H5Drefresh(hid_t dset_id)
HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "can't set collective metadata read info")
/* Refresh the dataset object */
if((H5D__refresh(dset_id, dset)) < 0)
if((ret_value = H5VL_dataset_specific(vol_obj->data, vol_obj->driver->cls, H5VL_DATASET_REFRESH,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, dset_id)) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTLOAD, FAIL, "unable to refresh dataset")
done:
@@ -990,47 +1026,24 @@ done:
herr_t
H5Dformat_convert(hid_t dset_id)
{
H5D_t *dset; /* Dataset for this operation */
H5VL_object_t *vol_obj; /* Dataset for this operation */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE1("e", "i", dset_id);
/* Check args */
if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dset_id parameter is not a valid dataset identifier")
/* Set up collective metadata if appropriate */
if(H5CX_set_loc(dset_id) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "can't set collective metadata read info")
switch(dset->shared->layout.type) {
case H5D_CHUNKED:
/* Convert the chunk indexing type to version 1 B-tree if not */
if(dset->shared->layout.u.chunk.idx_type != H5D_CHUNK_IDX_BTREE)
if((H5D__format_convert(dset)) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTLOAD, FAIL, "unable to downgrade chunk indexing type for dataset")
break;
case H5D_CONTIGUOUS:
case H5D_COMPACT:
/* Downgrade the layout version to 3 if greater than 3 */
if(dset->shared->layout.version > H5O_LAYOUT_VERSION_DEFAULT)
if((H5D__format_convert(dset)) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTLOAD, FAIL, "unable to downgrade layout version for dataset")
break;
case H5D_VIRTUAL:
/* Nothing to do even though layout is version 4 */
break;
case H5D_LAYOUT_ERROR:
case H5D_NLAYOUTS:
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid dataset layout type")
default:
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "unknown dataset layout type")
} /* end switch */
/* Convert the dataset */
if(H5VL_dataset_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT,
H5_REQUEST_NULL, H5VL_DATASET_FORMAT_CONVERT) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_INTERNAL, FAIL, "can't convert dataset format")
done:
FUNC_LEAVE_API(ret_value)
@@ -1052,25 +1065,22 @@ done:
herr_t
H5Dget_chunk_index_type(hid_t dset_id, H5D_chunk_index_t *idx_type)
{
H5D_t *dset; /* Dataset for this operation */
H5VL_object_t *vol_obj; /* Dataset for this operation */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE2("e", "i*Dk", dset_id, idx_type);
/* Check args */
if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dset_id parameter is not a valid dataset identifier")
if(NULL == idx_type)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "idx_type parameter cannot be NULL")
/* Should be a chunked dataset */
if(dset->shared->layout.type != H5D_CHUNKED)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dataset is not chunked")
/* Get the chunk indexing type */
if(idx_type)
*idx_type = dset->shared->layout.u.chunk.idx_type;
if(H5VL_dataset_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT,
H5_REQUEST_NULL, H5VL_DATASET_GET_CHUNK_INDEX_TYPE, idx_type) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get chunk index type")
done:
FUNC_LEAVE_API(ret_value)
@@ -1095,25 +1105,23 @@ done:
herr_t
H5Dget_chunk_storage_size(hid_t dset_id, const hsize_t *offset, hsize_t *chunk_nbytes)
{
H5D_t *dset; /* Dataset for this operation */
H5VL_object_t *vol_obj; /* Dataset for this operation */
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 == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dset_id parameter is not a valid dataset identifier")
if(NULL == offset)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "offset parameter cannot be NULL")
if(NULL == chunk_nbytes)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "chunk_nbytes parameter cannot be NULL")
if(H5D_CHUNKED != dset->shared->layout.type)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a chunked dataset")
/* Get the dataset creation property list */
if(H5D__get_chunk_storage_size(dset, offset, chunk_nbytes) < 0)
if(H5VL_dataset_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT,
H5_REQUEST_NULL, H5VL_DATASET_GET_CHUNK_STORAGE_SIZE, offset, chunk_nbytes) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get storage size of chunk")
done:
+2 -1
View File
@@ -26,6 +26,7 @@
#include "H5Dpkg.h" /* Datasets */
#include "H5Eprivate.h" /* Error handling */
#include "H5Iprivate.h" /* IDs */
#include "H5VLprivate.h" /* Virtual Object Layer */
/****************/
@@ -79,7 +80,7 @@ H5Ddebug(hid_t dset_id)
H5TRACE1("e", "i", dset_id);
/* Check args */
if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
if(NULL == (dset = (H5D_t *)H5VL_object_verify(dset_id, H5I_DATASET)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
/* Print B-tree information */
+88 -34
View File
@@ -40,6 +40,7 @@
#include "H5Dpkg.h" /* Datasets */
#include "H5Eprivate.h" /* Error handling */
#include "H5Iprivate.h" /* IDs */
#include "H5VLprivate.h" /* VOL plugins */
/****************/
@@ -112,9 +113,11 @@ hid_t
H5Dcreate1(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id,
hid_t dcpl_id)
{
H5G_loc_t loc; /* Object location to insert dataset into */
H5D_t *dset = NULL; /* New dataset's info */
const H5S_t *space; /* Dataspace for dataset */
void *dset = NULL; /* dset token from VOL plugin */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
H5P_genplist_t *plist; /* Property list pointer */
hid_t lcpl_id = H5P_LINK_CREATE_DEFAULT;
hid_t dapl_id = H5P_DEFAULT; /* DAPL used by library */
hid_t ret_value = H5I_INVALID_HID; /* Return value */
@@ -126,12 +129,7 @@ H5Dcreate1(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id,
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "name parameter cannot be NULL")
if(!*name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "name parameter cannot be an empty string")
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a location ID")
if(H5I_DATATYPE != H5I_get_type(type_id))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a datatype ID")
if(NULL == (space = (const H5S_t *)H5I_object_verify(space_id,H5I_DATASPACE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a dataspace ID")
if(H5P_DEFAULT == dcpl_id)
dcpl_id = H5P_DATASET_CREATE_DEFAULT;
else
@@ -142,17 +140,38 @@ H5Dcreate1(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id,
if(H5CX_set_apl(&dapl_id, H5P_CLS_DACC, loc_id, TRUE) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, H5I_INVALID_HID, "can't set access property list info")
/* Build and open the new dataset */
if(NULL == (dset = H5D__create_named(&loc, name, type_id, space, H5P_LINK_CREATE_DEFAULT, dcpl_id, dapl_id)))
/* Get the plist structure */
if(NULL == (plist = (H5P_genplist_t *)H5I_object(dcpl_id)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, H5I_INVALID_HID, "can't find object for ID")
/* set creation properties */
if(H5P_set(plist, H5VL_PROP_DSET_TYPE_ID, &type_id) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5I_INVALID_HID, "can't set property value for datatype id")
if(H5P_set(plist, H5VL_PROP_DSET_SPACE_ID, &space_id) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5I_INVALID_HID, "can't set property value for space id")
if(H5P_set(plist, H5VL_PROP_DSET_LCPL_ID, &lcpl_id) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5I_INVALID_HID, "can't set property value for lcpl id")
/* Set location parameters */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(loc_id);
/* get the location object */
if(NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid location identifier")
/* Create the dataset through the VOL */
if(NULL == (dset = H5VL_dataset_create(vol_obj->data, loc_params, vol_obj->driver->cls, name, dcpl_id,
H5P_DATASET_ACCESS_DEFAULT, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, H5I_INVALID_HID, "unable to create dataset")
/* Get an atom for the dataset */
if((ret_value = H5I_register(H5I_DATASET, dset, TRUE)) < 0)
if((ret_value = H5VL_register_id(H5I_DATASET, dset, vol_obj->driver, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register dataset")
done:
if (H5I_INVALID_HID == ret_value)
if(dset && H5D_close(dset) < 0)
if(dset && H5VL_dataset_close(dset, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, H5I_INVALID_HID, "unable to release dataset")
FUNC_LEAVE_API(ret_value)
@@ -179,8 +198,9 @@ done:
hid_t
H5Dopen1(hid_t loc_id, const char *name)
{
H5D_t *dset = NULL;
H5G_loc_t loc; /* Object location of group */
void *dset = NULL; /* dset token from VOL plugin */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
@@ -191,20 +211,27 @@ H5Dopen1(hid_t loc_id, const char *name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "name parameter cannot be NULL")
if (!*name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "name parameter cannot be an empty string")
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a location")
/* Set location parameters */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(loc_id);
/* get the location object */
if(NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid location identifier")
/* Open the dataset */
if(NULL == (dset = H5D__open_name(&loc, name, H5P_DATASET_ACCESS_DEFAULT)))
if(NULL == (dset = H5VL_dataset_open(vol_obj->data, loc_params, vol_obj->driver->cls, name,
H5P_DATASET_ACCESS_DEFAULT, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, H5I_INVALID_HID, "unable to open dataset")
/* Get an atom for the dataset */
if((ret_value = H5I_register(H5I_DATASET, dset, TRUE)) < 0)
if((ret_value = H5VL_register_id(H5I_DATASET, dset, vol_obj->driver, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "can't register dataset atom")
done:
if(H5I_INVALID_HID == ret_value)
if(dset && H5D_close(dset) < 0)
if(dset && H5VL_dataset_close(dset, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, H5I_INVALID_HID, "unable to release dataset")
FUNC_LEAVE_API(ret_value)
@@ -230,37 +257,64 @@ done:
herr_t
H5Dextend(hid_t dset_id, const hsize_t size[])
{
H5D_t *dset; /* Pointer to dataset to modify */
hsize_t dset_dims[H5S_MAX_RANK]; /* Current dataset dimensions */
unsigned u; /* Local index variable */
herr_t ret_value = SUCCEED; /* Return value */
H5VL_object_t *vol_obj = NULL; /* Dataset structure */
hid_t sid = H5I_INVALID_HID; /* Dataspace ID */
H5S_t *ds = NULL; /* Dataspace struct */
int ndims; /* Dataset/space rank */
hsize_t dset_dims[H5S_MAX_RANK]; /* Current dataset dimensions */
int i; /* Local index variable */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE2("e", "i*h", dset_id, size);
/* Check args */
if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid dataset identifier")
if(!size)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no size specified")
/* Make certain that the dataset dimensions don't decrease */
/* (Shrinking dimensions is possible with H5Dset_extent, but not H5Dextend) */
if(H5S_get_simple_extent_dims(dset->shared->space, dset_dims, NULL) < 0)
/* Get the dataspace pointer for the dataset */
if(H5VL_dataset_get(vol_obj->data, vol_obj->driver->cls, H5VL_DATASET_GET_SPACE,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, &sid) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to get dataspace")
if(H5I_INVALID_HID == sid)
HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "received an invalid dataspace from the dataset")
if(NULL == (ds = (H5S_t *)H5I_object_verify(sid, H5I_DATASPACE)))
HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "couldn't get dataspace structure from ID")
/* Get the dataset's current extent */
if(H5S_get_simple_extent_dims(ds, dset_dims, NULL) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get dataset dimensions")
for(u = 0; u < dset->shared->ndims; u++)
if(size[u] > dset_dims[u])
dset_dims[u] = size[u];
/* Get the dataset dimensions */
ndims = H5S_GET_EXTENT_NDIMS(ds);
/* Make certain that the dataset dimensions don't decrease in any dimension.
*
* (Shrinking dimensions is possible with H5Dset_extent, but not H5Dextend)
*
* XXX (VOL_MERGE): I feel like we should fail here instead of just silently
* not doing what we're supposed to do.
*/
for(i = 0; i < ndims; i++)
if(size[i] > dset_dims[i])
dset_dims[i] = size[i];
/* Set up collective metadata if appropriate */
if(H5CX_set_loc(dset_id) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "can't set collective metadata read info")
/* Increase size */
if(H5D__set_extent(dset, dset_dims) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to extend dataset")
if ((ret_value = H5VL_dataset_specific(vol_obj->data, vol_obj->driver->cls, H5VL_DATASET_SET_EXTENT,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, dset_dims)) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "unable to extend dataset")
done:
/* Close the dataspace */
if(sid != H5I_INVALID_HID && H5I_dec_app_ref(sid) < 0)
HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "can't close dataspace")
FUNC_LEAVE_API(ret_value)
} /* end H5Dextend() */
#endif /* H5_NO_DEPRECATED_SYMBOLS */
+42 -19
View File
@@ -30,6 +30,8 @@
#include "H5Iprivate.h" /* IDs */
#include "H5Lprivate.h" /* Links */
#include "H5MMprivate.h" /* Memory management */
#include "H5VLprivate.h" /* Virtual Object Layer */
#include "H5VLnative.h" /* Native VOL driver */
/****************/
@@ -57,7 +59,7 @@ static herr_t H5D__open_oid(H5D_t *dataset, hid_t dapl_id);
static herr_t H5D__init_storage(const H5D_io_info_t *io_info, hbool_t full_overwrite,
hsize_t old_dim[]);
static herr_t H5D__append_flush_setup(H5D_t *dset, hid_t dapl_id);
static herr_t H5D__close_cb(H5D_t *dset);
static herr_t H5D__close_cb(H5VL_object_t *dset_vol_obj);
/*********************/
@@ -289,23 +291,29 @@ H5D_term_package(void)
*-------------------------------------------------------------------------
*/
static herr_t
H5D__close_cb(H5D_t *dset)
H5D__close_cb(H5VL_object_t *dset_vol_obj)
{
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_STATIC
/* Sanity check */
HDassert(dset);
HDassert(dset->oloc.file);
HDassert(dset->shared);
HDassert(dset->shared->fo_count > 0);
HDassert(dset_vol_obj);
/* Close the dataset */
if(H5D_close(dset) < 0)
if(H5VL_dataset_close(dset_vol_obj->data, dset_vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to close dataset");
done:
/* XXX: (MSC) Weird thing for datasets and filters:
* Always decrement the ref count on the VOL for datasets, since
* the ID is removed even if the close fails.
*/
/* Free the VOL object */
if(H5VL_free_object(dset_vol_obj) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTDEC, FAIL, "unable to free VOL object");
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5D__close_cb() */
@@ -943,7 +951,8 @@ H5D_t *
H5D__create(H5F_t *file, hid_t type_id, const H5S_t *space, hid_t dcpl_id,
hid_t dapl_id)
{
const H5T_t *type; /* Datatype for dataset */
const H5T_t *type = NULL; /* Datatype for dataset (VOL pointer) */
H5T_t *dt = NULL; /* Datatype for dataset (non-VOL pointer) */
H5D_t *new_dset = NULL;
H5P_genplist_t *dc_plist = NULL; /* New Property list */
hbool_t has_vl_type = FALSE; /* Flag to indicate a VL-type for dataset */
@@ -964,8 +973,10 @@ H5D__create(H5F_t *file, hid_t type_id, const H5S_t *space, hid_t dcpl_id,
HDassert(H5I_GENPROP_LST == H5I_get_type(dcpl_id));
/* Get the dataset's datatype */
if(NULL == (type = (const H5T_t *)H5I_object(type_id)))
if(NULL == (dt = (const H5T_t *)H5I_object(type_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a datatype")
/* If this is a named datatype, get the pointer via the VOL driver */
type = (const H5T_t *)H5T_get_actual_type(dt);
/* Check if the datatype is "sensible" for use in a dataset */
if(H5T_is_sensible(type) != TRUE)
@@ -1812,11 +1823,13 @@ H5D_mult_refresh_close(hid_t dset_id)
FUNC_ENTER_NOAPI(FAIL)
if(NULL == (dataset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
if(NULL == (dataset = (H5D_t *)H5VL_object_verify(dset_id, H5I_DATASET)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
/* check args */
HDassert(dataset && dataset->oloc.file && dataset->shared);
HDassert(dataset);
HDassert(dataset->oloc.file);
HDassert(dataset->shared);
HDassert(dataset->shared->fo_count > 0);
if(dataset->shared->fo_count > 1) {
@@ -2422,8 +2435,8 @@ H5D__vlen_get_buf_size(void H5_ATTR_UNUSED *elem, hid_t type_id,
unsigned H5_ATTR_UNUSED ndim, const hsize_t *point, void *op_data)
{
H5D_vlen_bufsize_t *vlen_bufsize = (H5D_vlen_bufsize_t *)op_data;
H5VL_object_t *vol_obj = vlen_bufsize->dset_vol_obj;
H5T_t *dt; /* Datatype for operation */
H5S_t *mspace; /* Memory dataspace for operation */
H5S_t *fspace; /* File dataspace for operation */
herr_t ret_value = SUCCEED; /* Return value */
@@ -2440,10 +2453,6 @@ H5D__vlen_get_buf_size(void H5_ATTR_UNUSED *elem, hid_t type_id,
if(NULL == (vlen_bufsize->fl_tbuf = H5FL_BLK_REALLOC(vlen_fl_buf, vlen_bufsize->fl_tbuf, H5T_get_size(dt))))
HGOTO_ERROR(H5E_DATASET, H5E_NOSPACE, FAIL, "can't resize tbuf")
/* Get the memory dataspace from the ID */
if(NULL == (mspace = (H5S_t *)H5I_object_verify(vlen_bufsize->mspace_id, H5I_DATASPACE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
/* Select point to read in */
if(NULL == (fspace = (H5S_t *)H5I_object_verify(vlen_bufsize->fspace_id, H5I_DATASPACE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
@@ -2451,7 +2460,10 @@ H5D__vlen_get_buf_size(void H5_ATTR_UNUSED *elem, hid_t type_id,
HGOTO_ERROR(H5E_DATASET, H5E_CANTCREATE, FAIL, "can't select point")
/* Read in the point (with the custom VL memory allocator) */
if(H5D__read(vlen_bufsize->dset, type_id, mspace, fspace, vlen_bufsize->fl_tbuf) < 0)
if(H5VL_dataset_read(vol_obj->data, vol_obj->driver->cls,
type_id, vlen_bufsize->mspace_id,
vlen_bufsize->fspace_id, H5P_DATASET_XFER_DEFAULT,
vlen_bufsize->fl_tbuf, H5_REQUEST_NULL) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "can't read point")
done:
@@ -3384,8 +3396,19 @@ H5D__get_type(const H5D_t *dset)
if(H5T_lock(dt, FALSE) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to lock transient datatype")
if((ret_value = H5I_register(H5I_DATATYPE, dt, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register datatype")
/* Create an atom */
if(H5T_is_named(dt)) {
/* If this is a committed datatype, we need to recreate the
* two-level IDs, where the VOL object is a copy of the
* returned datatype.
*/
if((ret_value = H5VL_native_register(H5I_DATATYPE, dt, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register datatype")
}
else {
if((ret_value = H5I_register(H5I_DATATYPE, dt, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register datatype")
}
done:
if(ret_value < 0)
+31 -57
View File
@@ -163,26 +163,22 @@ herr_t
H5Dread(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id,
hid_t file_space_id, hid_t dxpl_id, void *buf/*out*/)
{
H5D_t *dset = NULL;
const H5S_t *mem_space = NULL;
const H5S_t *file_space = NULL;
H5VL_object_t *vol_obj = NULL;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE6("e", "iiiiix", dset_id, mem_type_id, mem_space_id, file_space_id,
dxpl_id, buf);
/* Get dataset pointer */
if (NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dset_id is not a dataset ID")
if (NULL == dset->oloc.file)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dataset is not associated with a file")
/* Check arguments */
if (mem_space_id < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid memory dataspace ID")
if (file_space_id < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file dataspace ID")
/* Get validated dataspace pointers */
if (H5S_get_validated_dataspace(mem_space_id, &mem_space) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "could not get a validated dataspace from mem_space_id")
if (H5S_get_validated_dataspace(file_space_id, &file_space) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "could not get a validated dataspace from file_space_id")
/* Get dataset pointer */
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dset_id is not a dataset ID")
/* Get the default dataset transfer property list if the user didn't provide one */
if (H5P_DEFAULT == dxpl_id)
@@ -195,7 +191,8 @@ H5Dread(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id,
H5CX_set_dxpl(dxpl_id);
/* Read the data */
if (H5D__read(dset, mem_type_id, mem_space, file_space, buf/*out*/) < 0)
if ((ret_value = H5VL_dataset_read(vol_obj->data, vol_obj->driver->cls, mem_type_id, mem_space_id,
file_space_id, dxpl_id, buf, H5_REQUEST_NULL)) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "can't read data")
done:
@@ -219,20 +216,15 @@ herr_t
H5Dread_chunk(hid_t dset_id, hid_t dxpl_id, const hsize_t *offset, uint32_t *filters,
void *buf)
{
H5D_t *dset = NULL;
hsize_t offset_copy[H5O_LAYOUT_NDIMS]; /* Internal copy of chunk offset */
H5VL_object_t *vol_obj = NULL;
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 == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dset_id is not a dataset ID")
if (NULL == dset->oloc.file)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dataset is not associated with a file")
if (H5D_CHUNKED != dset->shared->layout.type)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a chunked dataset")
if (!buf)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "buf cannot be NULL")
if (!offset)
@@ -250,14 +242,9 @@ H5Dread_chunk(hid_t dset_id, hid_t dxpl_id, const hsize_t *offset, uint32_t *fil
/* Set DXPL for operation */
H5CX_set_dxpl(dxpl_id);
/* Copy the user's offset array so we can be sure it's terminated properly.
* (we don't want to mess with the user's buffer).
*/
if (H5D__get_offset_copy(dset, offset, offset_copy) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "failure to copy offset array")
/* Read the raw chunk */
if (H5D__chunk_direct_read(dset, offset_copy, filters, buf) < 0)
if (H5VL_dataset_optional(vol_obj->data, vol_obj->driver->cls, dxpl_id,
H5_REQUEST_NULL, H5VL_DATASET_CHUNK_READ, offset, filters, buf) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "can't read unprocessed chunk data")
done:
@@ -298,28 +285,24 @@ done:
*/
herr_t
H5Dwrite(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id,
hid_t file_space_id, hid_t dxpl_id, const void *buf)
hid_t file_space_id, hid_t dxpl_id, const void *buf)
{
H5D_t *dset = NULL;
const H5S_t *mem_space = NULL;
const H5S_t *file_space = NULL;
H5VL_object_t *vol_obj = NULL;
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);
/* Get dataset pointer */
if (NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dset_id is not a dataset ID")
if (NULL == dset->oloc.file)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dataset is not associated with a file")
/* Check arguments */
if (mem_space_id < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid memory dataspace ID")
if (file_space_id < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file dataspace ID")
/* Get validated dataspace pointers */
if (H5S_get_validated_dataspace(mem_space_id, &mem_space) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "could not get a validated dataspace from mem_space_id")
if (H5S_get_validated_dataspace(file_space_id, &file_space) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "could not get a validated dataspace from file_space_id")
/* Get dataset pointer */
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dset_id is not a dataset ID")
/* Get the default dataset transfer property list if the user didn't provide one */
if (H5P_DEFAULT == dxpl_id)
@@ -332,7 +315,8 @@ H5Dwrite(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id,
H5CX_set_dxpl(dxpl_id);
/* Write the data */
if (H5D__write(dset, mem_type_id, mem_space, file_space, buf) < 0)
if ((ret_value = H5VL_dataset_write(vol_obj->data, vol_obj->driver->cls, mem_type_id, mem_space_id,
file_space_id, dxpl_id, buf, H5_REQUEST_NULL)) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "can't write data")
done:
@@ -356,8 +340,7 @@ herr_t
H5Dwrite_chunk(hid_t dset_id, hid_t dxpl_id, uint32_t filters, const hsize_t *offset,
size_t data_size, const void *buf)
{
H5D_t *dset = NULL;
hsize_t offset_copy[H5O_LAYOUT_NDIMS]; /* Internal copy of chunk offset */
H5VL_object_t *vol_obj = NULL;
uint32_t data_size_32; /* Chunk data size (limited to 32-bits currently) */
herr_t ret_value = SUCCEED; /* Return value */
@@ -365,12 +348,8 @@ H5Dwrite_chunk(hid_t dset_id, hid_t dxpl_id, uint32_t filters, const hsize_t *of
H5TRACE6("e", "iiIu*hz*x", dset_id, dxpl_id, filters, offset, data_size, buf);
/* Check arguments */
if (NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(dset_id, H5I_DATASET)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid dataset ID")
if (NULL == dset->oloc.file)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dataset is not associated with a file")
if (H5D_CHUNKED != dset->shared->layout.type)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a chunked dataset")
if (!buf)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "buf cannot be NULL")
if (!offset)
@@ -393,14 +372,9 @@ H5Dwrite_chunk(hid_t dset_id, hid_t dxpl_id, uint32_t filters, const hsize_t *of
/* Set DXPL for operation */
H5CX_set_dxpl(dxpl_id);
/* Copy the user's offset array so we can be sure it's terminated properly.
* (we don't want to mess with the user's buffer).
*/
if (H5D__get_offset_copy(dset, offset, offset_copy) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "failure to copy offset array")
/* Write chunk */
if (H5D__chunk_direct_write(dset, filters, offset_copy, data_size_32, buf) < 0)
if (H5VL_dataset_optional(vol_obj->data, vol_obj->driver->cls, dxpl_id,
H5_REQUEST_NULL, H5VL_DATASET_CHUNK_WRITE, filters, offset, data_size_32, buf) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "can't write unprocessed chunk data")
done:
+16 -15
View File
@@ -29,6 +29,7 @@
#include "H5FLprivate.h" /* Free lists */
#include "H5Iprivate.h" /* IDs */
#include "H5Opkg.h" /* Object headers */
#include "H5VLprivate.h" /* Virtual Object Layer */
/****************/
@@ -47,7 +48,7 @@
static void *H5O__dset_get_copy_file_udata(void);
static void H5O__dset_free_copy_file_udata(void *);
static htri_t H5O__dset_isa(const H5O_t *loc);
static hid_t H5O__dset_open(const H5G_loc_t *obj_loc, hbool_t app_ref);
static void *H5O__dset_open(const H5G_loc_t *obj_loc, H5I_type_t *opened_type);
static void *H5O__dset_create(H5F_t *f, void *_crt_info, H5G_loc_t *obj_loc);
static H5O_loc_t *H5O__dset_get_oloc(hid_t obj_id);
static herr_t H5O__dset_bh_info(const H5O_loc_t *loc, H5O_t *oh,
@@ -217,17 +218,19 @@ done:
*
*-------------------------------------------------------------------------
*/
static hid_t
H5O__dset_open(const H5G_loc_t *obj_loc, hbool_t app_ref)
static void *
H5O__dset_open(const H5G_loc_t *obj_loc, H5I_type_t *opened_type)
{
H5D_t *dset = NULL; /* Dataset opened */
hid_t dapl_id; /* dapl to use to open this dataset */
hid_t ret_value = H5I_INVALID_HID; /* Return value */
H5D_t *dset = NULL; /* Dataset opened */
hid_t dapl_id; /* dapl to use to open this dataset */
void *ret_value = NULL; /* Return value */
FUNC_ENTER_STATIC
HDassert(obj_loc);
*opened_type = H5I_DATASET;
/* Get the LAPL (which is a superclass of DAPLs) from the API context, but
* if it's the default link access property list or a custom link access
* property list but not a dataset access property list, use the default
@@ -242,9 +245,9 @@ H5O__dset_open(const H5G_loc_t *obj_loc, hbool_t app_ref)
/* Check class of LAPL from API context */
if((is_lapl = H5P_isa_class(dapl_id, H5P_LINK_ACCESS)) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, H5I_INVALID_HID, "unable to get LAPL status")
HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, NULL, "unable to get LAPL status")
if((is_dapl = H5P_isa_class(dapl_id, H5P_DATASET_ACCESS)) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, H5I_INVALID_HID, "unable to get DAPL status")
HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, NULL, "unable to get DAPL status")
/* Switch to default DAPL if not an actual DAPL in the API context */
if(!is_dapl && is_lapl)
@@ -253,16 +256,14 @@ H5O__dset_open(const H5G_loc_t *obj_loc, hbool_t app_ref)
/* Open the dataset */
if(NULL == (dset = H5D_open(obj_loc, dapl_id)))
HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, H5I_INVALID_HID, "unable to open dataset")
HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, NULL, "unable to open dataset")
/* Register an ID for the dataset */
if((ret_value = H5I_register(H5I_DATASET, dset, app_ref)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register dataset")
ret_value = (void *)dset;
done:
if(H5I_INVALID_HID == ret_value)
if(NULL == ret_value)
if(dset && H5D_close(dset) < 0)
HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, H5I_INVALID_HID, "unable to release dataset")
HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, NULL, "unable to release dataset")
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5O__dset_open() */
@@ -339,7 +340,7 @@ H5O__dset_get_oloc(hid_t obj_id)
FUNC_ENTER_STATIC
/* Get the dataset */
if(NULL == (dset = (H5D_t *)H5I_object(obj_id)))
if(NULL == (dset = (H5D_t *)H5VL_object(obj_id)))
HGOTO_ERROR(H5E_OHDR, H5E_BADATOM, NULL, "couldn't get object from ID")
/* Get the dataset's object header location */
+10 -1
View File
@@ -110,6 +110,15 @@ typedef struct H5D_type_info_t {
hbool_t bkg_buf_allocated; /* Whether the background buffer was allocated */
} H5D_type_info_t;
/* types for dataset optional VOL operations */
typedef enum H5VL_dataset_optional_t {
H5VL_DATASET_FORMAT_CONVERT, /* H5Dformat_convert (internal) */
H5VL_DATASET_GET_CHUNK_INDEX_TYPE, /* H5Dget_chunk_index_type */
H5VL_DATASET_GET_CHUNK_STORAGE_SIZE, /* H5Dget_chunk_storage_size */
H5VL_DATASET_CHUNK_READ, /* H5Dchunk_read */
H5VL_DATASET_CHUNK_WRITE, /* H5Dchunk_write */
} H5VL_dataset_optional_t;
/* Forward declaration of structs used below */
struct H5D_io_info_t;
struct H5D_chunk_map_t;
@@ -510,7 +519,7 @@ typedef struct H5D_fill_buf_info_t {
/* Internal data structure for computing variable-length dataset's total size */
typedef struct {
H5D_t *dset; /* Dataset for operation */
H5VL_object_t *dset_vol_obj; /* VOL object for the dataset */
hid_t fspace_id; /* File dataspace ID of the dataset we are working on */
hid_t mspace_id; /* Memory dataspace ID of the dataset we are working on */
void *fl_tbuf; /* Ptr to the temporary buffer we are using for fixed-length data */
+7 -6
View File
@@ -32,6 +32,7 @@
#include "H5Dpkg.h" /* Datasets */
#include "H5Eprivate.h" /* Error handling */
#include "H5Iprivate.h" /* IDs */
#include "H5VLprivate.h" /* Virtual Object Layer */
/****************/
@@ -88,7 +89,7 @@ H5D__layout_version_test(hid_t did, unsigned *version)
FUNC_ENTER_PACKAGE
/* Check args */
if(NULL == (dset = (H5D_t *)H5I_object_verify(did, H5I_DATASET)))
if(NULL == (dset = (H5D_t *)H5VL_object_verify(did, H5I_DATASET)))
HGOTO_ERROR(H5E_DATASET, H5E_BADTYPE, FAIL, "not a dataset")
if(version)
@@ -127,7 +128,7 @@ H5D__layout_contig_size_test(hid_t did, hsize_t *size)
FUNC_ENTER_PACKAGE
/* Check args */
if(NULL == (dset = (H5D_t *)H5I_object_verify(did, H5I_DATASET)))
if(NULL == (dset = (H5D_t *)H5VL_object_verify(did, H5I_DATASET)))
HGOTO_ERROR(H5E_DATASET, H5E_BADTYPE, FAIL, "not a dataset")
if(size) {
@@ -168,7 +169,7 @@ H5D__layout_compact_dirty_test(hid_t did, hbool_t *dirty)
FUNC_ENTER_PACKAGE
/* Check args */
if(NULL == (dset = (H5D_t *)H5I_object_verify(did, H5I_DATASET)))
if(NULL == (dset = (H5D_t *)H5VL_object_verify(did, H5I_DATASET)))
HGOTO_ERROR(H5E_DATASET, H5E_BADTYPE, FAIL, "not a dataset")
if(dirty) {
@@ -211,7 +212,7 @@ H5D__layout_type_test(hid_t did, H5D_layout_t *layout_type)
HDassert(layout_type);
/* Check args */
if(NULL == (dset = (H5D_t *)H5I_object_verify(did, H5I_DATASET)))
if(NULL == (dset = (H5D_t *)H5VL_object_verify(did, H5I_DATASET)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
if(layout_type)
@@ -250,7 +251,7 @@ H5D__layout_idx_type_test(hid_t did, H5D_chunk_index_t *idx_type)
FUNC_ENTER_PACKAGE
/* Check args */
if(NULL == (dset = (H5D_t *)H5I_object_verify(did, H5I_DATASET)))
if(NULL == (dset = (H5D_t *)H5VL_object_verify(did, H5I_DATASET)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
if(dset->shared->layout.type != H5D_CHUNKED)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dataset is not chunked")
@@ -291,7 +292,7 @@ H5D__current_cache_size_test(hid_t did, size_t *nbytes_used, int *nused)
FUNC_ENTER_PACKAGE
/* Check args */
if(NULL == (dset = (H5D_t *)H5I_object_verify(did, H5I_DATASET)))
if(NULL == (dset = (H5D_t *)H5VL_object_verify(did, H5I_DATASET)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
if(nbytes_used) {
+18 -6
View File
@@ -58,7 +58,8 @@
#include "H5Oprivate.h" /* Object headers */
#include "H5Pprivate.h" /* Property Lists */
#include "H5Sprivate.h" /* Dataspaces */
#include "H5VLnative.h" /* Native VOL driver */
#include "H5VLprivate.h" /* Virtual Object Layer */
/****************/
/* Local Macros */
@@ -2961,27 +2962,38 @@ done:
static herr_t
H5D__virtual_refresh_source_dset(H5D_t **dset)
{
hid_t temp_id; /* Temporary dataset identifier */
herr_t ret_value = SUCCEED; /* Return value */
hid_t temp_id = H5I_INVALID_HID; /* Temporary dataset identifier */
hid_t native_vol_id = H5I_INVALID_HID; /* ID for the native VOL driver */
H5VL_object_t *vol_obj = NULL; /* VOL object stored with the ID */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_STATIC
/* Sanity check */
HDassert(dset && *dset);
/* Get the native VOL driver's ID */
if((native_vol_id = H5VL_native_get_driver_id()) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get native VOL driver ID")
/* Get a temporary identifier for this source dataset */
if((temp_id = H5I_register(H5I_DATASET, *dset, FALSE)) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTREGISTER, FAIL, "can't register source dataset ID")
if((temp_id = H5VL_object_register(*dset, H5I_DATASET, native_vol_id, FALSE)) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTREGISTER, FAIL, "can't register (temporary) source dataset ID")
/* Refresh source dataset */
if(H5D__refresh(temp_id, *dset) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTFLUSH, FAIL, "unable to refresh source dataset")
/* Discard the identifier & replace the dataset */
if(NULL == (*dset = (H5D_t *)H5I_remove(temp_id)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_remove(temp_id)))
HGOTO_ERROR(H5E_DATASET, H5E_CANTREMOVE, FAIL, "can't unregister source dataset ID")
*dset = (H5D_t *)(vol_obj->data);
vol_obj->data = NULL;
done:
if(vol_obj && H5VL_free_object(vol_obj) < 0)
HDONE_ERROR(H5E_DATASET, H5E_CANTDEC, FAIL, "unable to free VOL object")
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5D__virtual_refresh_source_dsets() */
+53
View File
@@ -0,0 +1,53 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright by The HDF Group. *
* All rights reserved. *
* *
* This file is part of HDF5. The full HDF5 copyright notice, including *
* terms governing use, modification, and redistribution, is contained in *
* the COPYING file, which can be found at the root of the source code *
* distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases. *
* If you do not have access to either file, you may request a copy from *
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#ifndef _H5ESpublic_H
#define _H5ESpublic_H
/* Public headers needed by this file */
#include "H5public.h" /* Generic Functions */
/*****************/
/* Public Macros */
/*****************/
/*******************/
/* Public Typedefs */
/*******************/
/* Asynchronous operation status */
typedef enum H5ES_status_t {
H5ES_STATUS_IN_PROGRESS, /* Operation has not yet completed */
H5ES_STATUS_SUCCEED, /* Operation has completed, successfully */
H5ES_STATUS_FAIL, /* Operation has completed, but failed */
H5ES_STATUS_CANCEL /* Operation has not completed and has been cancelled */
} H5ES_status_t;
/********************/
/* Public Variables */
/********************/
/*********************/
/* Public Prototypes */
/*********************/
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
#endif /* _H5ESpublic_H */
+266 -365
View File
@@ -29,12 +29,14 @@
#include "H5Eprivate.h" /* Error handling */
#include "H5Fpkg.h" /* File access */
#include "H5FDprivate.h" /* File drivers */
#include "H5FLprivate.h" /* Free lists */
#include "H5Gprivate.h" /* Groups */
#include "H5Iprivate.h" /* IDs */
#include "H5MFprivate.h" /* File memory management */
#include "H5MMprivate.h" /* Memory management */
#include "H5Pprivate.h" /* Property lists */
#include "H5Tprivate.h" /* Datatypes */
#include "H5VLprivate.h" /* Virtual Object Layer */
/****************/
@@ -55,7 +57,13 @@
/* Local Prototypes */
/********************/
static herr_t H5F__close_cb(H5F_t *f);
static herr_t H5F__close_cb(H5VL_object_t *file_vol_obj);
/* Callback for getting object counts in a file */
static int H5F__get_all_count_cb(void H5_ATTR_UNUSED *obj_ptr, hid_t H5_ATTR_UNUSED obj_id, void *key);
/* Callback for getting IDs for open objects in a file */
static int H5F__get_all_ids_cb(void H5_ATTR_UNUSED *obj_ptr, hid_t obj_id, void *key);
/*********************/
@@ -75,6 +83,11 @@ hbool_t H5_PKG_INIT_VAR = FALSE;
/* Local Variables */
/*******************/
/* Declare a free list to manage the H5VL_t struct */
H5FL_EXTERN(H5VL_t);
/* Declare a free list to manage the H5VL_object_t struct */
H5FL_EXTERN(H5VL_object_t);
/* File ID class */
static const H5I_class_t H5I_FILE_CLS[1] = {{
@@ -176,42 +189,22 @@ H5F_term_package(void)
*-------------------------------------------------------------------------
*/
static herr_t
H5F__close_cb(H5F_t *f)
H5F__close_cb(H5VL_object_t *file_vol_obj)
{
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_STATIC
/* Sanity check */
HDassert(f);
HDassert(f->file_id > 0); /* This routine should only be called when a file ID's ref count drops to zero */
HDassert(file_vol_obj);
/* Perform checks for "semi" file close degree here, since closing the
* file is not allowed if there are objects still open.
*/
if(f->shared->fc_degree == H5F_CLOSE_SEMI) {
unsigned nopen_files = 0; /* Number of open files in file/mount hierarchy */
unsigned nopen_objs = 0; /* Number of open objects in file/mount hierarchy */
/* Close the file */
if(H5VL_file_close(file_vol_obj->data, file_vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "unable to close file");
/* Get the number of open objects and open files on this file/mount hierarchy */
if(H5F__mount_count_ids(f, &nopen_files, &nopen_objs) < 0)
HGOTO_ERROR(H5E_SYM, H5E_MOUNT, FAIL, "problem checking mount hierarchy")
/* If there are no other file IDs open on this file/mount hier., but
* there are still open objects, issue an error and bail out now,
* without decrementing the file ID's reference count and triggering
* a "real" attempt at closing the file.
*/
if(nopen_files == 1 && nopen_objs > 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close file, there are objects still open")
} /* end if */
/* Reset the file ID for this file */
f->file_id = -1;
/* Attempt to close the file/mount hierarchy */
if(H5F_try_close(f, NULL) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "unable to close file")
/* Free the VOL object */
if(H5VL_free_object(file_vol_obj) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTDEC, FAIL, "unable to free VOL object");
done:
FUNC_LEAVE_NOAPI(ret_value)
@@ -235,21 +228,19 @@ done:
hid_t
H5Fget_create_plist(hid_t file_id)
{
H5F_t *file; /* File info */
H5P_genplist_t *plist; /* Property list */
H5VL_object_t *vol_obj; /* File info */
hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
H5TRACE1("i", "i", file_id);
/* check args */
if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(file_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid file identifier")
if(NULL == (plist = (H5P_genplist_t *)H5I_object(file->shared->fcpl_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a property list")
/* Retrieve the file creation property list */
if((ret_value = H5P_copy_plist(plist, TRUE)) < 0)
if(H5VL_file_get(vol_obj->data, vol_obj->driver->cls, H5VL_FILE_GET_FCPL,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, &ret_value) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, H5I_INVALID_HID, "unable to retrieve file creation properties")
done:
@@ -278,18 +269,19 @@ done:
hid_t
H5Fget_access_plist(hid_t file_id)
{
H5F_t *file; /* File info */
H5VL_object_t *vol_obj; /* File info */
hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
H5TRACE1("i", "i", file_id);
/* Check args */
if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(file_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid file identifier")
/* Retrieve the file's access property list */
if((ret_value = H5F_get_access_plist(file, TRUE)) < 0)
if(H5VL_file_get(vol_obj->data, vol_obj->driver->cls, H5VL_FILE_GET_FAPL,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, &ret_value) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5I_INVALID_HID, "can't get file access property list")
done:
@@ -351,19 +343,16 @@ H5Fget_obj_count(hid_t file_id, unsigned types)
* count the IDs in the file.
*/
if(file_id != (hid_t)H5F_OBJ_ALL) {
H5F_t *f = NULL;
size_t obj_count = 0;
H5VL_object_t *vol_obj;
/* Get the file object */
if(NULL == (f = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, (-1), "not a file id")
/* Get the count */
if(H5F_get_obj_count(f, types, TRUE, &obj_count) < 0)
if(H5VL_file_get(vol_obj->data, vol_obj->driver->cls, H5VL_FILE_GET_OBJ_COUNT,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, types, &ret_value) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTGET, (-1), "unable to get object count in file(s)")
/* Set the return value */
ret_value = (ssize_t)obj_count;
}
/* If we passed in the 'special' ID, get the count for everything open in the
* library, iterating over all open files and getting the object count for each.
@@ -466,19 +455,16 @@ H5Fget_obj_ids(hid_t file_id, unsigned types, size_t max_objs, hid_t *oid_list)
* get the IDs from the file.
*/
if(file_id != (hid_t)H5F_OBJ_ALL) {
H5F_t *file = NULL;
size_t obj_id_count = 0;
H5VL_object_t *vol_obj;
/* get the file object */
if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, (-1), "invalid file identifier")
/* Get the IDs */
if(H5F_get_obj_ids(file, types, max_objs, oid_list, TRUE, &obj_id_count) < 0)
if(H5VL_file_get(vol_obj->data, vol_obj->driver->cls, H5VL_FILE_GET_OBJ_IDS,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, types, max_objs, oid_list, &ret_value) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTGET, (-1), "unable to get object ids in file(s)")
/* Set the return value */
ret_value = (ssize_t)obj_id_count;
}
/* If we passed in the 'special' ID, get the count for everything open in the
* library, iterating over all open files and getting the object count for each.
@@ -491,6 +477,8 @@ H5Fget_obj_ids(hid_t file_id, unsigned types, size_t max_objs, hid_t *oid_list)
else {
H5F_trav_obj_ids_t udata;
/* XXX (VOL MERGE): Unclear why this is commented out */
//udata.types = types | H5F_OBJ_LOCAL;
udata.max_objs = max_objs;
udata.oid_list = oid_list;
udata.obj_count = &ret_value;
@@ -535,7 +523,7 @@ done:
herr_t
H5Fget_vfd_handle(hid_t file_id, hid_t fapl_id, void **file_handle)
{
H5F_t *file; /* File info */
H5VL_object_t *vol_obj; /* File info */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -546,11 +534,12 @@ H5Fget_vfd_handle(hid_t file_id, hid_t fapl_id, void **file_handle)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file handle pointer")
/* Get the file object */
if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(file_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid file identifier")
/* Retrieve the VFD handle for the file */
if(H5F_get_vfd_handle(file, fapl_id, file_handle) < 0)
if(H5VL_file_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT,
H5_REQUEST_NULL, H5VL_FILE_GET_VFD_HANDLE, file_handle, fapl_id) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to get VFD handle")
done:
@@ -559,38 +548,41 @@ done:
/*-------------------------------------------------------------------------
* Function: H5Fis_hdf5
* Function: H5Fis_accessible
*
* Purpose: Check the file signature to detect an HDF5 file.
*
* Bugs: This function is not robust: it only uses the default file
* driver when attempting to open the file when in fact it
* should use all known file drivers.
* Purpose: Check if the file can be opened with the given fapl.
*
* Return: TRUE/FALSE/FAIL
*
*-------------------------------------------------------------------------
*/
htri_t
H5Fis_hdf5(const char *name)
H5Fis_accessible(const char *name, hid_t fapl_id)
{
htri_t ret_value; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE1("t", "*s", name);
H5TRACE2("t", "*si", name, fapl_id);
/* Check args */
if(!name || !*name)
HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "no file name specified")
/* call the private is_HDF5 function */
/* (Should not trigger raw data I/O - QAK, 2018/01/03) */
if((ret_value = H5F__is_hdf5(name)) < 0)
HGOTO_ERROR(H5E_FILE, H5E_NOTHDF5, FAIL, "unable open file")
/* Check the file access property list */
if(H5P_DEFAULT == fapl_id)
fapl_id = H5P_FILE_ACCESS_DEFAULT;
else
if(TRUE != H5P_isa_class(fapl_id, H5P_FILE_ACCESS))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not file access property list")
/* Check if file is accessible */
if(H5VL_file_specific(NULL, NULL, H5VL_FILE_IS_ACCESSIBLE, H5P_DATASET_XFER_DEFAULT,
H5_REQUEST_NULL, fapl_id, name, &ret_value) < 0)
HGOTO_ERROR(H5E_FILE, H5E_NOTHDF5, FAIL, "unable to determine if file is accessible as HDF5")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Fis_hdf5() */
} /* end H5Fis_accessible() */
/*-------------------------------------------------------------------------
@@ -621,7 +613,12 @@ done:
hid_t
H5Fcreate(const char *filename, unsigned flags, hid_t fcpl_id, hid_t fapl_id)
{
H5F_t *new_file = NULL; /* file struct for new file */
void *new_file = NULL; /* file struct for new file */
H5P_genplist_t *plist; /* Property list pointer */
H5VL_class_t *cls = NULL; /* VOL Class structure for callback info */
H5VL_t *driver = NULL; /* VOL driver struct */
H5VL_driver_prop_t driver_prop; /* Property for vol driver ID & info */
hid_t ret_value; /* return value */
FUNC_ENTER_API(H5I_INVALID_HID)
@@ -652,6 +649,14 @@ H5Fcreate(const char *filename, unsigned flags, hid_t fcpl_id, hid_t fapl_id)
if(H5CX_set_apl(&fapl_id, H5P_CLS_FACC, H5I_INVALID_HID, TRUE) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTSET, H5I_INVALID_HID, "can't set access property list info")
/* get the VOL info from the fapl */
if(NULL == (plist = (H5P_genplist_t *)H5I_object(fapl_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a file access property list")
if(H5P_peek(plist, H5F_ACS_VOL_DRV_NAME, &driver_prop) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5I_INVALID_HID, "can't get vol driver info")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_prop.driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a VOL driver ID")
/* Adjust bit flags by turning on the creation bit and making sure that
* the EXCL or TRUNC bit is set. All newly-created files are opened for
* reading and writing.
@@ -660,21 +665,24 @@ H5Fcreate(const char *filename, unsigned flags, hid_t fcpl_id, hid_t fapl_id)
flags |= H5F_ACC_EXCL; /*default*/
flags |= H5F_ACC_RDWR | H5F_ACC_CREAT;
/* Create a new file or truncate an existing file. */
if(NULL == (new_file = H5F_open(filename, flags, fcpl_id, fapl_id)))
/* Create a new file or truncate an existing file through the VOL */
if(NULL == (new_file = H5VL_file_create(cls, filename, flags, fcpl_id, fapl_id,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, H5I_INVALID_HID, "unable to create file")
/* Get an atom for the file */
if((ret_value = H5I_register(H5I_FILE, new_file, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to atomize file")
/* Setup VOL driver struct */
if(NULL == (driver = H5FL_CALLOC(H5VL_t)))
HGOTO_ERROR(H5E_FILE, H5E_NOSPACE, H5I_INVALID_HID, "can't allocate VL info struct")
driver->cls = cls;
driver->id = driver_prop.driver_id;
if(H5I_inc_ref(driver->id, FALSE) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTINC, H5I_INVALID_HID, "unable to increment ref count on VOL driver")
/* Keep this ID in file object structure */
new_file->file_id = ret_value;
/* Get an atom for the file */
if((ret_value = H5VL_register_id(H5I_FILE, new_file, driver, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to atomize file handle")
done:
if(ret_value < 0 && new_file && H5F_try_close(new_file, NULL) < 0)
HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, H5I_INVALID_HID, "problems closing file")
FUNC_LEAVE_API(ret_value)
} /* end H5Fcreate() */
@@ -701,8 +709,12 @@ done:
hid_t
H5Fopen(const char *filename, unsigned flags, hid_t fapl_id)
{
H5F_t *new_file = NULL; /* file struct for new file */
hid_t ret_value; /* return value */
void *new_file = NULL; /* file struct for new file */
H5P_genplist_t *plist; /* Property list pointer */
H5VL_driver_prop_t driver_prop; /* Property for vol driver ID & info */
H5VL_class_t *cls = NULL; /* VOL class structure for callback info */
H5VL_t *driver = NULL; /* VOL driver struct */
hid_t ret_value; /* return value */
FUNC_ENTER_API(H5I_INVALID_HID)
H5TRACE3("i", "*sIui", filename, flags, fapl_id);
@@ -714,6 +726,7 @@ H5Fopen(const char *filename, unsigned flags, hid_t fapl_id)
if((flags & ~H5F_ACC_PUBLIC_FLAGS) ||
(flags & H5F_ACC_TRUNC) || (flags & H5F_ACC_EXCL))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "invalid file open flags")
/* XXX (VOL MERGE): Might want to move SWMR flag checks to H5F_open() */
/* Asking for SWMR write access on a read-only file is invalid */
if((flags & H5F_ACC_SWMR_WRITE) && 0 == (flags & H5F_ACC_RDWR))
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, H5I_INVALID_HID, "SWMR write access on a file open for read-only access is not allowed")
@@ -725,21 +738,31 @@ H5Fopen(const char *filename, unsigned flags, hid_t fapl_id)
if(H5CX_set_apl(&fapl_id, H5P_CLS_FACC, H5I_INVALID_HID, TRUE) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTSET, H5I_INVALID_HID, "can't set access property list info")
/* Open the file */
if(NULL == (new_file = H5F_open(filename, flags, H5P_FILE_CREATE_DEFAULT, fapl_id)))
/* Get the VOL info from the fapl */
if(NULL == (plist = (H5P_genplist_t *)H5I_object(fapl_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a file access property list")
if(H5P_peek(plist, H5F_ACS_VOL_DRV_NAME, &driver_prop) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5I_INVALID_HID, "can't get VOL driver info")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_prop.driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid VOL driver ID")
/* Open the file through the VOL layer */
if(NULL == (new_file = H5VL_file_open(cls, filename, flags, fapl_id, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, H5I_INVALID_HID, "unable to open file")
/* Get an atom for the file */
if((ret_value = H5I_register(H5I_FILE, new_file, TRUE)) < 0)
/* Setup VOL driver struct */
if(NULL == (driver = H5FL_CALLOC(H5VL_t)))
HGOTO_ERROR(H5E_FILE, H5E_NOSPACE, H5I_INVALID_HID, "can't allocate VL info struct")
driver->cls = cls;
driver->id = driver_prop.driver_id;
if(H5I_inc_ref(driver->id, FALSE) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTINC, H5I_INVALID_HID, "unable to increment ref count on VOL driver")
/* Get an ID for the file */
if((ret_value = H5VL_register_id(H5I_FILE, new_file, driver, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to atomize file handle")
/* Keep this ID in file object structure */
new_file->file_id = ret_value;
done:
if(ret_value < 0 && new_file && H5F_try_close(new_file, NULL) < 0)
HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, H5I_INVALID_HID, "problems closing file")
FUNC_LEAVE_API(ret_value)
} /* end H5Fopen() */
@@ -758,108 +781,28 @@ done:
herr_t
H5Fflush(hid_t object_id, H5F_scope_t scope)
{
H5F_t *f = NULL; /* File to flush */
H5O_loc_t *oloc = NULL; /* Object location for ID */
H5VL_object_t *vol_obj = NULL; /* Object info */
H5I_type_t obj_type; /* Type of object */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE2("e", "iFs", object_id, scope);
switch(H5I_get_type(object_id)) {
case H5I_FILE:
if(NULL == (f = (H5F_t *)H5I_object(object_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid file identifier")
break;
/* Get the type of object we're flushing + sanity check */
obj_type = H5I_get_type(object_id);
if(H5I_FILE != obj_type && H5I_GROUP != obj_type && H5I_DATATYPE != obj_type &&
H5I_DATASET != obj_type && H5I_ATTR != obj_type) {
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file or file object")
}
case H5I_GROUP:
{
H5G_t *grp;
/* get the file object */
if(NULL == (vol_obj = H5VL_get_object(object_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid object identifier")
if(NULL == (grp = (H5G_t *)H5I_object(object_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid group identifier")
oloc = H5G_oloc(grp);
}
break;
case H5I_DATATYPE:
{
H5T_t *type;
if(NULL == (type = (H5T_t *)H5I_object(object_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid type identifier")
oloc = H5T_oloc(type);
}
break;
case H5I_DATASET:
{
H5D_t *dset;
if(NULL == (dset = (H5D_t *)H5I_object(object_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid dataset identifier")
oloc = H5D_oloc(dset);
}
break;
case H5I_ATTR:
{
H5A_t *attr;
if(NULL == (attr = (H5A_t *)H5I_object(object_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid attribute identifier")
oloc = H5A_oloc(attr);
}
break;
case H5I_UNINIT:
case H5I_BADID:
case H5I_DATASPACE:
case H5I_REFERENCE:
case H5I_VFL:
case H5I_GENPROP_CLS:
case H5I_GENPROP_LST:
case H5I_ERROR_CLASS:
case H5I_ERROR_MSG:
case H5I_ERROR_STACK:
case H5I_NTYPES:
default:
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file or file object")
} /* end switch */
if(!f) {
if(!oloc)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "object is not assocated with a file")
f = oloc->file;
} /* end if */
if(!f)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "object is not associated with a file")
/* Flush the file */
/*
* Nothing to do if the file is read only. This determination is
* made at the shared open(2) flags level, implying that opening a
* file twice, once for read-only and once for read-write, and then
* calling H5Fflush() with the read-only handle, still causes data
* to be flushed.
*/
if(H5F_ACC_RDWR & H5F_INTENT(f)) {
hid_t fapl_id = H5P_DEFAULT; /* FAPL to use */
/* Verify access property list and set up collective metadata if appropriate */
if(H5CX_set_apl(&fapl_id, H5P_CLS_FACC, object_id, TRUE) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "can't set access property list info")
/* Flush other files, depending on scope */
if(H5F_SCOPE_GLOBAL == scope) {
/* Call the flush routine for mounted file hierarchies */
if(H5F_flush_mounts(f) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush mounted file hierarchy")
} /* end if */
else
/* Call the flush routine, for this file */
if(H5F__flush(f) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush file's cached information")
} /* end if */
/* Flush the object */
if(H5VL_file_specific(vol_obj->data, vol_obj->driver->cls, H5VL_FILE_FLUSH,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, obj_type, scope) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush file")
done:
FUNC_LEAVE_API(ret_value)
@@ -892,9 +835,11 @@ H5Fclose(hid_t file_id)
if(H5I_FILE != H5I_get_type(file_id))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file ID")
/* Close the file */
if(H5F__close(file_id) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "closing file ID failed")
/* Decrement reference count on atom. When it reaches zero the file will
* be closed.
*/
if(H5I_dec_app_ref(file_id) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTCLOSEFILE, FAIL, "decrementing file ID failed")
done:
FUNC_LEAVE_API(ret_value)
@@ -919,33 +864,32 @@ done:
hid_t
H5Freopen(hid_t file_id)
{
H5F_t *old_file = NULL;
H5F_t *new_file = NULL;
H5VL_object_t *vol_obj = NULL;
void *file; /* File token from VOL driver */
hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
H5TRACE1("i", "i", file_id);
/* Get the file object */
if(NULL == (old_file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a file")
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid file identifier")
/* Reopen the file */
if(NULL == (new_file = H5F__reopen(old_file)))
if(H5VL_file_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT,
H5_REQUEST_NULL, H5VL_FILE_REOPEN, &file) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, H5I_INVALID_HID, "unable to reopen file via the VOL driver")
/* Make sure that worked */
if(NULL == file)
HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, H5I_INVALID_HID, "unable to reopen file")
/* Get an atom for the file */
if((ret_value = H5I_register(H5I_FILE, new_file, TRUE)) < 0)
if((ret_value = H5VL_register_id(H5I_FILE, file, vol_obj->driver, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to atomize file handle")
/* Keep this ID in file object structure */
new_file->file_id = ret_value;
done:
if(H5I_INVALID_HID == ret_value)
if(new_file && H5F__dest(new_file, FALSE) < 0)
HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, H5I_INVALID_HID, "can't close file")
/* XXX (VOL MERGE): If registration fails, file will not be closed */
FUNC_LEAVE_API(ret_value)
} /* end H5Freopen() */
@@ -970,31 +914,17 @@ H5Fget_intent(hid_t file_id, unsigned *intent_flags)
/* If no intent flags were passed in, exit quietly */
if(intent_flags) {
H5F_t *file; /* Pointer to file structure */
H5VL_object_t *vol_obj; /* File info */
/* Get the internal file structure */
if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(file_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid file identifier")
/* HDF5 uses some flags internally that users don't know about.
* Simplify things for them so that they only get either H5F_ACC_RDWR
* or H5F_ACC_RDONLY.
*/
if(H5F_INTENT(file) & H5F_ACC_RDWR) {
*intent_flags = H5F_ACC_RDWR;
/* Check for SWMR write access on the file */
if(H5F_INTENT(file) & H5F_ACC_SWMR_WRITE)
*intent_flags |= H5F_ACC_SWMR_WRITE;
} /* end if */
else {
*intent_flags = H5F_ACC_RDONLY;
/* Check for SWMR read access on the file */
if(H5F_INTENT(file) & H5F_ACC_SWMR_READ)
*intent_flags |= H5F_ACC_SWMR_READ;
} /* end else */
} /* end if */
/* Get the flags */
if((ret_value = H5VL_file_get(vol_obj->data, vol_obj->driver->cls, H5VL_FILE_GET_INTENT,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, intent_flags)) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to get file's intent flags")
}
done:
FUNC_LEAVE_API(ret_value)
@@ -1015,23 +945,21 @@ done:
hssize_t
H5Fget_freespace(hid_t file_id)
{
H5F_t *file; /* File object for file ID */
hsize_t tot_space; /* Amount of free space in the file */
H5VL_object_t *vol_obj = NULL;
hssize_t ret_value; /* Return value */
FUNC_ENTER_API((-1))
H5TRACE1("Hs", "i", file_id);
/* Get the file object */
if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(file_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, (-1), "invalid file identifier")
/* Get the amount of free space in the file */
if(H5MF_get_freespace(file, &tot_space, NULL) < 0)
if(H5VL_file_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT,
H5_REQUEST_NULL, H5VL_FILE_GET_FREE_SPACE, &ret_value) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTGET, (-1), "unable to get file free space")
ret_value = (hssize_t)tot_space;
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Fget_freespace() */
@@ -1051,9 +979,7 @@ done:
herr_t
H5Fget_filesize(hid_t file_id, hsize_t *size)
{
H5F_t *file; /* File object for file ID */
haddr_t max_eof_eoa; /* Maximum of the EOA & EOF */
haddr_t base_addr; /* Base address for the file */
H5VL_object_t *vol_obj; /* File info */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -1062,18 +988,13 @@ H5Fget_filesize(hid_t file_id, hsize_t *size)
/* Check args */
if(!size)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "size parameter cannot be NULL")
if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
/* Get the actual file size */
if(H5F__get_max_eof_eoa(file, &max_eof_eoa) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "file can't get max eof/eoa ")
base_addr = H5FD_get_base_addr(file->shared->lf);
/* Convert relative base address for file to absolute address */
if(size)
*size = (hsize_t)(max_eof_eoa + base_addr);
/* Get the file size */
if(H5VL_file_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT,
H5_REQUEST_NULL, H5VL_FILE_GET_SIZE, size) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to get file size")
done:
FUNC_LEAVE_API(ret_value)
@@ -1122,19 +1043,19 @@ done:
ssize_t
H5Fget_file_image(hid_t file_id, void *buf_ptr, size_t buf_len)
{
H5F_t *file; /* File object for file ID */
H5VL_object_t *vol_obj; /* File object for file ID */
ssize_t ret_value; /* Return value */
FUNC_ENTER_API((-1))
H5TRACE3("Zs", "i*xz", file_id, buf_ptr, buf_len);
/* Check args */
if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, (-1), "not a file ID")
/* Get the file image */
/* (Should not trigger raw data I/O - QAK, 2018/01/03) */
if((ret_value = H5F__get_file_image(file, buf_ptr, buf_len)) < 0)
if(H5VL_file_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL,
H5VL_FILE_GET_FILE_IMAGE, buf_ptr, &ret_value, buf_len) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTGET, (-1), "unable to get file image")
done:
@@ -1159,20 +1080,23 @@ done:
herr_t
H5Fget_mdc_config(hid_t file_id, H5AC_cache_config_t *config_ptr)
{
H5F_t *file; /* File object for file ID */
H5VL_object_t *vol_obj = NULL;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE2("e", "i*x", file_id, config_ptr);
/* Check args */
if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
if((NULL == config_ptr) || (config_ptr->version != H5AC__CURR_CACHE_CONFIG_VERSION))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Bad config_ptr")
/* Get the file object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(file_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid file identifier")
/* Get the metadata cache configuration */
if(H5AC_get_cache_auto_resize_config(file->shared->cache, config_ptr) < 0)
if(H5VL_file_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT,
H5_REQUEST_NULL, H5VL_FILE_GET_MDC_CONF, config_ptr) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to get metadata cache configuration")
done:
@@ -1194,18 +1118,19 @@ done:
herr_t
H5Fset_mdc_config(hid_t file_id, H5AC_cache_config_t *config_ptr)
{
H5F_t *file; /* File object for file ID */
H5VL_object_t *vol_obj = NULL;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE2("e", "i*x", file_id, config_ptr);
/* Get the file object */
if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(file_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid file identifier")
/* Set the metadata cache configuration */
if(H5AC_set_cache_auto_resize_config(file->shared->cache, config_ptr) < 0)
if(H5VL_file_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT,
H5_REQUEST_NULL, H5VL_FILE_SET_MDC_CONFIG, config_ptr) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "unable to set metadata cache configuration")
done:
@@ -1228,21 +1153,21 @@ done:
herr_t
H5Fget_mdc_hit_rate(hid_t file_id, double *hit_rate_ptr)
{
H5F_t *file; /* File object for file ID */
H5VL_object_t *vol_obj;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE2("e", "i*d", file_id, hit_rate_ptr);
/* Check args */
if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
if(NULL == hit_rate_ptr)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "NULL hit rate pointer")
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
/* Get the current hit rate */
if(H5AC_get_cache_hit_rate(file->shared->cache, hit_rate_ptr) < 0)
if(H5VL_file_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT,
H5_REQUEST_NULL, H5VL_FILE_GET_MDC_HR, hit_rate_ptr) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to get MDC hit rate")
done:
@@ -1267,8 +1192,7 @@ herr_t
H5Fget_mdc_size(hid_t file_id, size_t *max_size_ptr, size_t *min_clean_size_ptr,
size_t *cur_size_ptr, int *cur_num_entries_ptr)
{
H5F_t *file; /* File object for file ID */
uint32_t cur_num_entries;
H5VL_object_t *vol_obj;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -1276,17 +1200,15 @@ H5Fget_mdc_size(hid_t file_id, size_t *max_size_ptr, size_t *min_clean_size_ptr,
cur_size_ptr, cur_num_entries_ptr);
/* Check args */
if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
/* Get the size data */
if(H5AC_get_cache_size(file->shared->cache, max_size_ptr,
min_clean_size_ptr, cur_size_ptr, &cur_num_entries) < 0)
if(H5VL_file_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT,
H5_REQUEST_NULL, H5VL_FILE_GET_MDC_SIZE,
max_size_ptr, min_clean_size_ptr, cur_size_ptr, cur_num_entries_ptr) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to get MDC size")
if(cur_num_entries_ptr != NULL)
*cur_num_entries_ptr = (int)cur_num_entries;
done:
FUNC_LEAVE_API(ret_value)
} /* H5Fget_mdc_size() */
@@ -1311,18 +1233,19 @@ done:
herr_t
H5Freset_mdc_hit_rate_stats(hid_t file_id)
{
H5F_t *file; /* File object for file ID */
H5VL_object_t *vol_obj = NULL;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE1("e", "i", file_id);
/* Get the file object */
if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(file_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid file identifier")
/* Reset the hit rate statistic */
if(H5AC_reset_cache_hit_rate_stats(file->shared->cache) < 0)
if(H5VL_file_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT,
H5_REQUEST_NULL, H5VL_FILE_RESET_MDC_HIT_RATE) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "can't reset cache hit rate")
done:
@@ -1354,40 +1277,26 @@ done:
ssize_t
H5Fget_name(hid_t obj_id, char *name/*out*/, size_t size)
{
H5F_t *f; /* Top file in mount hierarchy */
size_t len;
H5VL_object_t *vol_obj = NULL;
H5I_type_t type;
ssize_t ret_value = -1;
FUNC_ENTER_API((-1))
H5TRACE3("Zs", "ixz", obj_id, name, size);
/* For file IDs, get the file object directly */
/* (This prevents the H5G_loc() call from returning the file pointer for
* the top file in a mount hierarchy)
*/
if(H5I_get_type(obj_id) == H5I_FILE ) {
if(NULL == (f = (H5F_t *)H5I_object(obj_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, (-1), "not a file")
} /* end if */
else {
H5G_loc_t loc; /* Object location */
/* Check the type */
type = H5I_get_type(obj_id);
if(H5I_FILE != type && H5I_GROUP != type && H5I_DATATYPE != type && H5I_DATASET != type && H5I_ATTR != type)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, (-1), "not a file or file object")
/* Get symbol table entry */
if(H5G_loc(obj_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, (-1), "not a valid object ID")
f = loc.oloc->file;
} /* end else */
/* Get the file object */
if(NULL == (vol_obj = H5VL_get_object(obj_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, (-1), "invalid file identifier")
len = HDstrlen(H5F_OPEN_NAME(f));
if(name) {
HDstrncpy(name, H5F_OPEN_NAME(f), MIN(len + 1,size));
if(len >= size)
name[size-1]='\0';
} /* end if */
/* Set return value */
ret_value = (ssize_t)len;
/* Get the filename via the VOL */
if(H5VL_file_get(vol_obj->data, vol_obj->driver->cls, H5VL_FILE_GET_NAME,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, type, size, name, &ret_value) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTGET, (-1), "unable to get file name")
done:
FUNC_LEAVE_API(ret_value)
@@ -1410,7 +1319,7 @@ done:
herr_t
H5Fget_info2(hid_t obj_id, H5F_info2_t *finfo)
{
H5F_t *f; /* Top file in mount hierarchy */
H5VL_object_t *vol_obj = NULL;
H5I_type_t type;
herr_t ret_value = SUCCEED; /* Return value */
@@ -1427,25 +1336,12 @@ H5Fget_info2(hid_t obj_id, H5F_info2_t *finfo)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file or file object")
/* Get the file object */
if(type == H5I_FILE ) {
/* For file IDs, get the file object directly */
/* (This prevents the H5G_loc() call from returning the file pointer for
* the top file in a mount hierarchy)
*/
if(NULL == (f = (H5F_t *)H5I_object(obj_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid file identifier")
} /* end if */
else {
H5G_loc_t loc; /* Object location */
/* Get symbol table entry */
if(H5G_loc(obj_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object identifier")
f = loc.oloc->file;
} /* end else */
if(NULL == (vol_obj = H5VL_get_object(obj_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid object identifier")
/* Get the file information */
if(H5F__get_info(f, finfo) < 0)
if(H5VL_file_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL,
H5VL_FILE_GET_INFO, type, finfo) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to retrieve file info")
done:
@@ -1466,7 +1362,7 @@ done:
herr_t
H5Fget_metadata_read_retry_info(hid_t file_id, H5F_retry_info_t *info)
{
H5F_t *file; /* File object for file ID */
H5VL_object_t *vol_obj = NULL; /* File object for file ID */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -1477,11 +1373,12 @@ H5Fget_metadata_read_retry_info(hid_t file_id, H5F_retry_info_t *info)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no info struct")
/* Get the file pointer */
if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
/* Get the retry info */
if(H5F_get_metadata_read_retry_info(file, info) < 0)
if(H5VL_file_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT,
H5_REQUEST_NULL, H5VL_FILE_GET_METADATA_READ_RETRY_INFO, info) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "can't get metadata read retry info")
done:
@@ -1507,20 +1404,21 @@ ssize_t
H5Fget_free_sections(hid_t file_id, H5F_mem_t type, size_t nsects,
H5F_sect_info_t *sect_info/*out*/)
{
H5F_t *file;
H5VL_object_t *vol_obj = NULL;
ssize_t ret_value = -1; /* Return value */
FUNC_ENTER_API((-1))
H5TRACE4("Zs", "iFmzx", file_id, type, nsects, sect_info);
/* Check args */
if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, (-1), "invalid file identifier")
if(sect_info && nsects == 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, (-1), "nsects must be > 0")
/* Get the free-space section information in the file */
if((ret_value = H5MF_get_free_sections(file, type, nsects, sect_info)) < 0)
if(H5VL_file_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL,
H5VL_FILE_GET_FREE_SECTIONS, sect_info, &ret_value, type, nsects) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTGET, (-1), "unable to get file free sections")
done:
@@ -1542,21 +1440,20 @@ done:
herr_t
H5Fclear_elink_file_cache(hid_t file_id)
{
H5F_t *file; /* File */
H5VL_object_t *vol_obj; /* File */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE1("e", "i", file_id);
/* Check args */
if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
/* See if there's an EFC */
if(file->shared->efc)
/* Release the EFC */
if(H5F__efc_release(file->shared->efc) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "can't release external file cache")
/* Release the EFC */
if(H5VL_file_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT,
H5_REQUEST_NULL, H5VL_FILE_CLEAR_ELINK_CACHE) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "can't release external file cache")
done:
FUNC_LEAVE_API(ret_value)
@@ -1600,14 +1497,14 @@ done:
herr_t
H5Fstart_swmr_write(hid_t file_id)
{
H5F_t *file = NULL; /* File info */
H5VL_object_t *vol_obj = NULL; /* File info */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE1("e", "i", file_id);
/* Check args */
if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "hid_t identifier is not a file ID")
/* Set up collective metadata if appropriate */
@@ -1615,7 +1512,8 @@ H5Fstart_swmr_write(hid_t file_id)
HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "can't set collective metadata read info")
/* start SWMR writing */
if(H5F__start_swmr_write(file) < 0)
if(H5VL_file_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT,
H5_REQUEST_NULL, H5VL_FILE_START_SWMR_WRITE) < 0)
HGOTO_ERROR(H5E_FILE, H5E_SYSTEM, FAIL, "unable to start SWMR writing")
done:
@@ -1636,18 +1534,19 @@ done:
herr_t
H5Fstart_mdc_logging(hid_t file_id)
{
H5F_t *file; /* File info */
herr_t ret_value = SUCCEED; /* Return value */
H5VL_object_t *vol_obj; /* File info */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE1("e", "i", file_id);
/* Sanity check */
if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "hid_t identifier is not a file ID")
/* Call mdc logging function */
if(H5C_start_logging(file->shared->cache) < 0)
if(H5VL_file_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT,
H5_REQUEST_NULL, H5VL_FILE_START_MDC_LOGGING) < 0)
HGOTO_ERROR(H5E_FILE, H5E_LOGFAIL, FAIL, "unable to start mdc logging")
done:
@@ -1669,18 +1568,19 @@ done:
herr_t
H5Fstop_mdc_logging(hid_t file_id)
{
H5F_t *file; /* File info */
herr_t ret_value = SUCCEED; /* Return value */
H5VL_object_t *vol_obj; /* File info */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE1("e", "i", file_id);
/* Sanity check */
if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "hid_t identifier is not a file ID")
/* Call mdc logging function */
if(H5C_stop_logging(file->shared->cache) < 0)
if(H5VL_file_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT,
H5_REQUEST_NULL, H5VL_FILE_STOP_MDC_LOGGING) < 0)
HGOTO_ERROR(H5E_FILE, H5E_LOGFAIL, FAIL, "unable to stop mdc logging")
done:
@@ -1703,18 +1603,19 @@ herr_t
H5Fget_mdc_logging_status(hid_t file_id, hbool_t *is_enabled,
hbool_t *is_currently_logging)
{
H5F_t *file; /* File info */
herr_t ret_value = SUCCEED; /* Return value */
H5VL_object_t *vol_obj; /* File info */
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 == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "hid_t identifier is not a file ID")
/* Call mdc logging function */
if(H5C_get_logging_status(file->shared->cache, is_enabled, is_currently_logging) < 0)
if(H5VL_file_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT,
H5_REQUEST_NULL, H5VL_FILE_GET_MDC_LOGGING_STATUS, is_enabled, is_currently_logging) < 0)
HGOTO_ERROR(H5E_FILE, H5E_LOGFAIL, FAIL, "unable to get logging status")
done:
@@ -1734,9 +1635,12 @@ done:
*
*-------------------------------------------------------------------------
*/
/* XXX (VOL MERGE): This could go in the native VOL driver under 'optional'
*/
herr_t
H5Fset_libver_bounds(hid_t file_id, H5F_libver_t low, H5F_libver_t high)
{
H5VL_object_t *vol_obj; /* File as VOL object */
H5F_t *f; /* File */
herr_t ret_value = SUCCEED; /* Return value */
@@ -1744,8 +1648,9 @@ H5Fset_libver_bounds(hid_t file_id, H5F_libver_t low, H5F_libver_t high)
H5TRACE3("e", "iFvFv", file_id, low, high);
/* Check args */
if(NULL == (f = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "not a file ID")
f = (H5F_t *)(vol_obj->data);
/* Set up collective metadata if appropriate */
if(H5CX_set_loc(file_id) < 0)
@@ -1774,26 +1679,23 @@ done:
herr_t
H5Fformat_convert(hid_t file_id)
{
H5F_t *f = NULL; /* File */
H5VL_object_t *vol_obj = NULL; /* File */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE1("e", "i", file_id);
/* Check args */
if(H5I_FILE != H5I_get_type(file_id))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "file_id parameter is not a valid file identifier")
/* Get file object */
if(NULL == (f = (H5F_t *)H5I_object(file_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid file identifier")
/* Set up collective metadata if appropriate */
if(H5CX_set_loc(file_id) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "can't set collective metadata read info")
/* Convert the format */
if(H5F__format_convert(f) < 0)
if(H5VL_file_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT,
H5_REQUEST_NULL, H5VL_FILE_FORMAT_CONVERT) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTCONVERT, FAIL, "can't convert file format")
done:
@@ -1813,20 +1715,19 @@ done:
herr_t
H5Freset_page_buffering_stats(hid_t file_id)
{
H5F_t *file; /* File to reset stats on */
H5VL_object_t *vol_obj; /* File to reset stats on */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE1("e", "i", file_id);
/* Check args */
if(NULL == (file = (H5F_t *)H5I_object(file_id)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid file identifier")
if(NULL == file->shared->page_buf)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "page buffering not enabled on file")
/* Reset the statistics */
if(H5PB_reset_stats(file->shared->page_buf) < 0)
if(H5VL_file_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT,
H5_REQUEST_NULL, H5VL_FILE_RESET_PAGE_BUFFERING_STATS) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "can't reset stats for page buffering")
done:
@@ -1847,23 +1748,23 @@ herr_t
H5Fget_page_buffering_stats(hid_t file_id, unsigned accesses[2], unsigned hits[2],
unsigned misses[2], unsigned evictions[2], unsigned bypasses[2])
{
H5F_t *file; /* File object */
herr_t ret_value = SUCCEED; /* Return value */
H5VL_object_t *vol_obj; /* File object */
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 == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
if(NULL == file->shared->page_buf)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "page buffering not enabled on file")
if(NULL == accesses || NULL == hits || NULL == misses || NULL == evictions || NULL == bypasses)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "NULL input parameters for stats")
/* Get the statistics */
if(H5PB_get_stats(file->shared->page_buf, accesses, hits, misses, evictions, bypasses) < 0)
if(H5VL_file_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT,
H5_REQUEST_NULL, H5VL_FILE_GET_PAGE_BUFFERING_STATS,
accesses, hits, misses, evictions, bypasses) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't retrieve stats for page buffering")
done:
@@ -1894,7 +1795,7 @@ H5Fget_mdc_image_info(hid_t file_id, haddr_t *image_addr, hsize_t *image_len)
H5TRACE3("e", "i*a*h", file_id, image_addr, image_len);
/* Check args */
if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
if(NULL == (file = (H5F_t *)H5VL_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
if(NULL == image_addr || NULL == image_len)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "NULL image addr or image len")
@@ -1929,7 +1830,7 @@ H5Fget_eoa(hid_t file_id, haddr_t *eoa)
H5TRACE2("e", "i*a", file_id, eoa);
/* Check args */
if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
if(NULL == (file = (H5F_t *)H5VL_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "hid_t identifier is not a file ID")
/* This public routine will work only for drivers with this feature enabled.*/
@@ -1968,7 +1869,7 @@ H5Fincrement_filesize(hid_t file_id, hsize_t increment)
H5TRACE2("e", "ih", file_id, increment);
/* Check args */
if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
if(NULL == (file = (H5F_t *)H5VL_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "hid_t identifier is not a file ID")
/* This public routine will work only for drivers with this feature enabled.*/
+45 -6
View File
@@ -113,7 +113,7 @@ H5Fget_info1(hid_t obj_id, H5F_info1_t *finfo)
* the top file in a mount hierarchy)
*/
if(H5I_get_type(obj_id) == H5I_FILE ) {
if(NULL == (f = (H5F_t *)H5I_object(obj_id)))
if(NULL == (f = (H5F_t *)H5VL_object(obj_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
}
else {
@@ -139,6 +139,41 @@ done:
FUNC_LEAVE_API(ret_value)
} /* end H5Fget_info1() */
/*-------------------------------------------------------------------------
* Function: H5Fis_hdf5
*
* Purpose: Check the file signature to detect an HDF5 file.
*
* Bugs: This function is not robust: it only uses the default file
* driver when attempting to open the file when in fact it
* should use all known file drivers.
*
* Return: TRUE/FALSE/FAIL
*
*-------------------------------------------------------------------------
*/
htri_t
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)
HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, (-1), "no file name specified")
/* call the private is_HDF5 function */
if((ret_value = H5F__is_hdf5(name, H5P_FILE_ACCESS_DEFAULT)) < 0)
HGOTO_ERROR(H5E_FILE, H5E_NOTHDF5, (-1), "unable open file")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Fis_hdf5() */
/*-------------------------------------------------------------------------
* Function: H5Fset_latest_format
@@ -174,20 +209,24 @@ done:
*
*-------------------------------------------------------------------------
*/
/* XXX (VOL MERGE): This could go in the native VOL driver under 'optional'.
*/
herr_t
H5Fset_latest_format(hid_t file_id, hbool_t latest_format)
{
H5F_t *f; /* File */
H5F_libver_t low = H5F_LIBVER_LATEST; /* Low bound */
H5F_libver_t high = H5F_LIBVER_LATEST; /* High bound */
herr_t ret_value = SUCCEED; /* Return value */
H5VL_object_t *vol_obj; /* File as VOL object */
H5F_t *f; /* File */
H5F_libver_t low = H5F_LIBVER_LATEST; /* Low bound */
H5F_libver_t high = H5F_LIBVER_LATEST; /* High bound */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE2("e", "ib", file_id, latest_format);
/* Check args */
if(NULL == (f = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "not a file ID")
f = (H5F_t *)(vol_obj->data);
/* 'low' and 'high' are both initialized to LATEST.
* If latest format is not expected, set 'low' to EARLIEST
+70 -52
View File
@@ -37,6 +37,9 @@
#include "H5Pprivate.h" /* Property lists */
#include "H5SMprivate.h" /* Shared Object Header Messages */
#include "H5Tprivate.h" /* Datatypes */
#include "H5VLprivate.h" /* VOL drivers */
#include "H5VLnative.h" /* Native VOL driver */
/****************/
@@ -438,6 +441,7 @@ H5F__get_objects_cb(void *obj_ptr, hid_t obj_id, void *key)
case H5I_DATASPACE:
case H5I_REFERENCE:
case H5I_VFL:
case H5I_VOL:
case H5I_GENPROP_CLS:
case H5I_GENPROP_LST:
case H5I_ERROR_CLASS:
@@ -782,15 +786,11 @@ done:
*
* Purpose: Check the file signature to detect an HDF5 file.
*
* Bugs: This function is not robust: it only uses the default file
* driver when attempting to open the file when in fact it
* should use all known file drivers.
*
* Return: TRUE/FALSE/FAIL
*-------------------------------------------------------------------------
*/
htri_t
H5F__is_hdf5(const char *name)
H5F__is_hdf5(const char *name, hid_t fapl_id)
{
H5FD_t *file = NULL; /* Low-level file struct */
haddr_t sig_addr; /* Addess of hdf5 file signature */
@@ -799,7 +799,10 @@ H5F__is_hdf5(const char *name)
FUNC_ENTER_PACKAGE
/* Open the file */
if(NULL == (file = H5FD_open(name, H5F_ACC_RDONLY, H5P_FILE_ACCESS_DEFAULT, HADDR_UNDEF)))
/* NOTE: This now uses the fapl_id that was passed in, so H5Fis_accessible()
* should work with arbitrary VFDs, unlike H5Fis_hdf5().
*/
if(NULL == (file = H5FD_open(name, H5F_ACC_RDONLY, fapl_id, HADDR_UNDEF)))
HGOTO_ERROR(H5E_IO, H5E_CANTINIT, FAIL, "unable to open file")
/* The file is an hdf5 file if the hdf5 file signature can be found */
@@ -843,7 +846,7 @@ H5F__new(H5F_file_t *shared, unsigned flags, hid_t fcpl_id, hid_t fapl_id, H5FD_
if(NULL == (f = H5FL_CALLOC(H5F_t)))
HGOTO_ERROR(H5E_FILE, H5E_NOSPACE, NULL, "can't allocate top file structure")
f->file_id = H5I_INVALID_HID;
f->id_exists = FALSE;
if(shared) {
HDassert(lf == NULL);
@@ -1468,26 +1471,12 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id)
tent_flags = flags;
if(NULL == (lf = H5FD_open(name, tent_flags, fapl_id, HADDR_UNDEF))) {
if(tent_flags == flags) {
#ifndef H5_USING_MEMCHECKER
time_t mytime = HDtime(NULL);
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to open file: time = %s, name = '%s', tent_flags = %x", HDctime(&mytime), name, tent_flags)
#else /* H5_USING_MEMCHECKER */
if(tent_flags == flags)
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to open file: name = '%s', tent_flags = %x", name, tent_flags)
#endif /* H5_USING_MEMCHECKER */
} /* end if */
H5E_clear_stack(NULL);
tent_flags = flags;
if(NULL == (lf = H5FD_open(name, tent_flags, fapl_id, HADDR_UNDEF))) {
#ifndef H5_USING_MEMCHECKER
time_t mytime = HDtime(NULL);
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to open file: time = %s, name = '%s', tent_flags = %x", HDctime(&mytime), name, tent_flags)
#else /* H5_USING_MEMCHECKER */
if(NULL == (lf = H5FD_open(name, tent_flags, fapl_id, HADDR_UNDEF)))
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to open file: name = '%s', tent_flags = %x", name, tent_flags)
#endif /* H5_USING_MEMCHECKER */
} /* end if */
} /* end if */
/* Is the file already open? */
@@ -1893,41 +1882,60 @@ H5F__flush(H5F_t *f)
/*-------------------------------------------------------------------------
* Function: H5F__close
*
* Purpose: Internal routine to close a file.
* Purpose: Closes a file or causes the close operation to be pended.
* This function is called two ways: from the API it gets called
* by H5Fclose->H5I_dec_ref->H5F__close when H5I_dec_ref()
* decrements the file ID reference count to zero. The file ID
* is removed from the H5I_FILE group by H5I_dec_ref() just
* before H5F__close() is called. If there are open object
* headers then the close is pended by moving the file to the
* H5I_FILE_CLOSING ID group (the f->closing contains the ID
* assigned to file).
*
* This function is also called directly from H5O_close() when
* the last object header is closed for the file and the file
* has a pending close.
*
* Return: SUCCEED/FAIL
*
*-------------------------------------------------------------------------
*/
herr_t
H5F__close(hid_t file_id)
H5F__close(H5F_t *f)
{
H5F_t *f; /* File pointer */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_PACKAGE
/* Flush file if this is the last reference to this id and we have write
* intent, unless it will be flushed by the "shared" file being closed.
* This is only necessary to replicate previous behaviour, and could be
* disabled by an option/property to improve performance.
/* Sanity check */
HDassert(f);
/* Perform checks for "semi" file close degree here, since closing the
* file is not allowed if there are objects still open.
*/
if(NULL == (f = (H5F_t *)H5I_object(file_id)))
HGOTO_ERROR(H5E_FILE, H5E_BADTYPE, FAIL, "invalid file identifier")
if((f->shared->nrefs > 1) && (H5F_INTENT(f) & H5F_ACC_RDWR)) {
int nref; /* Number of references to file ID */
if(f->shared->fc_degree == H5F_CLOSE_SEMI) {
unsigned nopen_files = 0; /* Number of open files in file/mount hierarchy */
unsigned nopen_objs = 0; /* Number of open objects in file/mount hierarchy */
if((nref = H5I_get_ref(file_id, FALSE)) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't get ID ref count")
if(nref == 1)
if(H5F__flush(f) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush cache")
} /* end if */
/* Get the number of open objects and open files on this file/mount hierarchy */
if(H5F__mount_count_ids(f, &nopen_files, &nopen_objs) < 0)
HGOTO_ERROR(H5E_SYM, H5E_MOUNT, FAIL, "problem checking mount hierarchy")
/* Decrement reference count on file ID */
/* (When it reaches zero the file will be closed) */
if(H5I_dec_app_ref(file_id) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTDEC, FAIL, "decrementing file ID failed")
/* If there are no other file IDs open on this file/mount hier., but
* there are still open objects, issue an error and bail out now,
* without decrementing the file ID's reference count and triggering
* a "real" attempt at closing the file.
*/
if(nopen_files == 1 && nopen_objs > 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close file, there are objects still open")
}
/* Reset the file ID for this file */
f->id_exists = FALSE;
/* Attempt to close the file/mount hierarchy */
if(H5F_try_close(f, NULL) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close file")
done:
FUNC_LEAVE_NOAPI(ret_value)
@@ -2167,19 +2175,18 @@ H5F_get_id(H5F_t *file, hbool_t app_ref)
HDassert(file);
if(file->file_id == -1) {
/* Get an atom for the file */
if((file->file_id = H5I_register(H5I_FILE, file, app_ref)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to atomize file")
if(H5I_find_id(file, H5I_FILE, &ret_value) < 0 || H5I_INVALID_HID == ret_value) {
/* resurrect the ID - Register an ID with the native driver */
if((ret_value = H5VL_native_register(H5I_FILE, file, app_ref)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register group")
file->id_exists = TRUE;
}
else {
/* Increment reference count on existing ID */
if(H5I_inc_ref(file->file_id, app_ref) < 0)
if(H5I_inc_ref(ret_value, app_ref) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTSET, H5I_INVALID_HID, "incrementing file ID failed")
}
ret_value = file->file_id;
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5F_get_id() */
@@ -3228,6 +3235,7 @@ H5F__start_swmr_write(H5F_t *f)
H5G_name_t *obj_paths = NULL; /* Group hierarchy path */
size_t u; /* Local index variable */
hbool_t setup = FALSE; /* Boolean flag to indicate whether SWMR setting is enabled */
H5VL_t *vol_driver = NULL; /* VOL driver for the file */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_PACKAGE
@@ -3291,6 +3299,16 @@ H5F__start_swmr_write(H5F_t *f)
if(H5F_get_obj_ids(f, H5F_OBJ_GROUP|H5F_OBJ_DATASET, grp_dset_count, obj_ids, FALSE, &grp_dset_count) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "H5F_get_obj_ids failed")
/* Save the VOL driver for the refresh step */
if(grp_dset_count > 0) {
H5VL_object_t *vol_obj = NULL;
if(NULL == (vol_obj = H5VL_get_object(obj_ids[0])))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid object identifier")
vol_driver = vol_obj->driver;
}
/* Refresh opened objects (groups, datasets) in the file */
for(u = 0; u < grp_dset_count; u++) {
H5O_loc_t *oloc; /* object location */
@@ -3353,7 +3371,7 @@ H5F__start_swmr_write(H5F_t *f)
/* Refresh (reopen) the objects (groups & datasets) in the file */
for(u = 0; u < grp_dset_count; u++) {
if(H5O_refresh_metadata_reopen(obj_ids[u], &obj_glocs[u], TRUE) < 0)
if(H5O_refresh_metadata_reopen(obj_ids[u], &obj_glocs[u], vol_driver, TRUE) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CLOSEERROR, FAIL, "can't refresh-close object")
}
+16 -9
View File
@@ -24,6 +24,7 @@
#include "H5Iprivate.h" /* IDs */
#include "H5MMprivate.h" /* Memory management */
#include "H5Pprivate.h" /* Property lists */
#include "H5VLprivate.h" /* Virtual Object Layer */
/* PRIVATE PROTOTYPES */
static void H5F__mount_count_ids_recurse(H5F_t *f, unsigned *nopen_files, unsigned *nopen_objs);
@@ -438,8 +439,8 @@ H5F_is_mount(const H5F_t *file)
herr_t
H5Fmount(hid_t loc_id, const char *name, hid_t child_id, hid_t plist_id)
{
H5G_loc_t loc; /* Parent location */
H5F_t *child = NULL; /* Child object */
H5VL_object_t *loc_vol_obj = NULL; /* Parent object */
H5VL_object_t *child_vol_obj = NULL; /* Child object */
H5I_type_t loc_type; /* ID type of location */
H5I_type_t child_type; /* ID type of child */
herr_t ret_value = SUCCEED; /* Return value */
@@ -469,15 +470,20 @@ H5Fmount(hid_t loc_id, const char *name, hid_t child_id, hid_t plist_id)
HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "can't set collective metadata read info")
/* Get the location object */
if(H5G_loc(loc_id, &loc) < 0)
if(NULL == (loc_vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "could not get location object")
/* Get the child object */
if(NULL == (child = (H5F_t *)H5I_object_verify(child_id, H5I_FILE)))
if(NULL == (child_vol_obj = (H5VL_object_t *)H5I_object(child_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "could not get child object")
/* Check if both objects are associated with the same VOL plugin */
if(loc_vol_obj->driver->cls->value != child_vol_obj->driver->cls->value)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "Can't mount file onto object from different VOL driver")
/* Perform the mount operation */
if(H5F__mount(&loc, name, child, plist_id) < 0)
if(H5VL_file_specific(loc_vol_obj->data, loc_vol_obj->driver->cls, H5VL_FILE_MOUNT, H5P_DATASET_XFER_DEFAULT,
H5_REQUEST_NULL, loc_type, name, child_vol_obj->data, plist_id) < 0)
HGOTO_ERROR(H5E_FILE, H5E_MOUNT, FAIL, "unable to mount file")
done:
@@ -504,7 +510,7 @@ done:
herr_t
H5Funmount(hid_t loc_id, const char *name)
{
H5G_loc_t loc; /* Parent location */
H5VL_object_t *vol_obj = NULL; /* Parent object */
H5I_type_t loc_type; /* ID type of location */
herr_t ret_value = SUCCEED; /* Return value */
@@ -525,11 +531,12 @@ H5Funmount(hid_t loc_id, const char *name)
HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "can't set collective metadata read info")
/* Get the location object */
if(H5G_loc(loc_id, &loc) < 0)
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "could not get location object")
/* Perform the unmount operation */
if(H5F__unmount(&loc, name) < 0)
if(H5VL_file_specific(vol_obj->data, vol_obj->driver->cls, H5VL_FILE_UNMOUNT,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, loc_type, name) < 0)
HGOTO_ERROR(H5E_FILE, H5E_MOUNT, FAIL, "unable to unmount file")
done:
@@ -563,7 +570,7 @@ H5F__mount_count_ids_recurse(H5F_t *f, unsigned *nopen_files, unsigned *nopen_ob
HDassert(nopen_objs);
/* If this file is still open, increment number of file IDs open */
if(f->file_id > 0)
if(H5F_ID_EXISTS(f))
*nopen_files += 1;
/* Increment number of open objects in file
+2 -2
View File
@@ -231,7 +231,7 @@ H5Fset_mpi_atomicity(hid_t file_id, hbool_t flag)
H5TRACE2("e", "ib", file_id, flag);
/* Check args */
if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
if(NULL == (file = (H5F_t *)H5VL_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
/* Check VFD */
@@ -271,7 +271,7 @@ H5Fget_mpi_atomicity(hid_t file_id, hbool_t *flag)
H5TRACE2("e", "i*b", file_id, flag);
/* Check args */
if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
if(NULL == (file = (H5F_t *)H5VL_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
/* Check VFD */
+33 -3
View File
@@ -31,6 +31,7 @@
/* Other public headers needed by this file */
#include "H5Bpublic.h" /* B-tree header (for H5B_NUM_BTREE_ID) */
#include "H5VLpublic.h" /* Virtual Object Layer */
/* Other private headers needed by this file */
#include "H5private.h" /* Generic Functions */
@@ -367,7 +368,7 @@ struct H5F_t {
H5F_file_t *shared; /* The shared file info */
unsigned nopen_objs; /* Number of open object headers */
H5FO_t *obj_count; /* # of time each object is opened through top file structure */
hid_t file_id; /* ID of this file */
hbool_t id_exists; /* Whether an ID for this struct exists */
hbool_t closing; /* File is in the process of being closed */
struct H5F_t *parent; /* Parent file that this file is mounted to */
unsigned nmounts; /* Number of children mounted to this file */
@@ -377,6 +378,34 @@ struct H5F_t {
#endif /* H5_HAVE_PARALLEL */
};
/* types for file optional VOL operations */
typedef enum H5VL_file_optional_t {
H5VL_FILE_CLEAR_ELINK_CACHE, /* Clear external link cache */
H5VL_FILE_GET_FILE_IMAGE, /* file image */
H5VL_FILE_GET_FREE_SECTIONS, /* file free selections */
H5VL_FILE_GET_FREE_SPACE, /* file freespace */
H5VL_FILE_GET_INFO, /* file info */
H5VL_FILE_GET_MDC_CONF, /* file metadata cache configuration */
H5VL_FILE_GET_MDC_HR, /* file metadata cache hit rate */
H5VL_FILE_GET_MDC_SIZE, /* file metadata cache size */
H5VL_FILE_GET_SIZE, /* file size */
H5VL_FILE_GET_VFD_HANDLE, /* file VFD handle */
H5VL_FILE_REOPEN, /* reopen the file */
H5VL_FILE_RESET_MDC_HIT_RATE, /* get metadata cache hit rate */
H5VL_FILE_SET_MDC_CONFIG, /* set metadata cache configuration */
H5VL_FILE_GET_METADATA_READ_RETRY_INFO,
H5VL_FILE_START_SWMR_WRITE,
H5VL_FILE_START_MDC_LOGGING,
H5VL_FILE_STOP_MDC_LOGGING,
H5VL_FILE_GET_MDC_LOGGING_STATUS,
H5VL_FILE_SET_LATEST_FORMAT,
H5VL_FILE_FORMAT_CONVERT,
H5VL_FILE_RESET_PAGE_BUFFERING_STATS,
H5VL_FILE_GET_PAGE_BUFFERING_STATS,
H5VL_FILE_GET_MDC_IMAGE_INFO
} H5VL_file_optional_t;
/* User data for traversal routine to get ID counts */
typedef struct {
ssize_t *obj_count; /* number of objects counted so far */
@@ -384,6 +413,7 @@ typedef struct {
} H5F_trav_obj_cnt_t;
/* User data for traversal routine to get ID lists */
/* XXX (VOL MERGE): Should the type of obj_count and max_objs be identical? */
typedef struct {
size_t max_objs;
hid_t *oid_list;
@@ -411,12 +441,12 @@ H5_DLL H5F_t *H5F__reopen(H5F_t *f);
H5_DLL H5F_t *H5F__new(H5F_file_t *shared, unsigned flags, hid_t fcpl_id, hid_t fapl_id, H5FD_t *lf);
H5_DLL herr_t H5F__dest(H5F_t *f, hbool_t flush);
H5_DLL herr_t H5F__flush(H5F_t *f);
H5_DLL htri_t H5F__is_hdf5(const char *name);
H5_DLL htri_t H5F__is_hdf5(const char *name, hid_t fapl_id);
H5_DLL ssize_t H5F__get_file_image(H5F_t *f, void *buf_ptr, size_t buf_len);
H5_DLL herr_t H5F__get_info(H5F_t *f, H5F_info2_t *finfo);
H5_DLL herr_t H5F__format_convert(H5F_t *f);
H5_DLL herr_t H5F__start_swmr_write(H5F_t *f);
H5_DLL herr_t H5F__close(hid_t file_id);
H5_DLL herr_t H5F__close(H5F_t *f);
H5_DLL herr_t H5F__set_libver_bounds(H5F_t *f, H5F_libver_t low, H5F_libver_t high);
/* File mount related routines */
+4 -3
View File
@@ -286,7 +286,7 @@ typedef struct H5F_t H5F_t;
#define H5F_NOPEN_OBJS(F) ((F)->nopen_objs)
#define H5F_INCR_NOPEN_OBJS(F) ((F)->nopen_objs++)
#define H5F_DECR_NOPEN_OBJS(F) ((F)->nopen_objs--)
#define H5F_FILE_ID(F) ((F)->file_id)
#define H5F_ID_EXISTS(F) ((F)->id_exists)
#define H5F_PARENT(F) ((F)->parent)
#define H5F_NMOUNTS(F) ((F)->nmounts)
#define H5F_GET_READ_ATTEMPTS(F) ((F)->shared->read_attempts)
@@ -343,7 +343,7 @@ typedef struct H5F_t H5F_t;
#define H5F_NOPEN_OBJS(F) (H5F_get_nopen_objs(F))
#define H5F_INCR_NOPEN_OBJS(F) (H5F_incr_nopen_objs(F))
#define H5F_DECR_NOPEN_OBJS(F) (H5F_decr_nopen_objs(F))
#define H5F_FILE_ID(F) (H5F_get_file_id(F))
#define H5F_ID_EXISTS(F) (H5F_file_id_exists(F))
#define H5F_PARENT(F) (H5F_get_parent(F))
#define H5F_NMOUNTS(F) (H5F_get_nmounts(F))
#define H5F_GET_READ_ATTEMPTS(F) (H5F_get_read_attempts(F))
@@ -479,6 +479,7 @@ typedef struct H5F_t H5F_t;
#define H5F_ACS_SDATA_BLOCK_SIZE_NAME "sdata_block_size" /* Minimum "small data" allocation block size (when aggregating "small" raw data allocations) */
#define H5F_ACS_GARBG_COLCT_REF_NAME "gc_ref" /* Garbage-collect references */
#define H5F_ACS_FILE_DRV_NAME "vfd_info" /* File driver ID & info */
#define H5F_ACS_VOL_DRV_NAME "vol_driver_info" /* VOL driver ID & info */
#define H5F_ACS_CLOSE_DEGREE_NAME "close_degree" /* File close degree */
#define H5F_ACS_FAMILY_OFFSET_NAME "family_offset" /* Offset position in file for family file driver */
#define H5F_ACS_FAMILY_NEWSIZE_NAME "family_newsize" /* New member size of family driver. (private property only used by h5repart) */
@@ -728,7 +729,7 @@ H5_DLL hbool_t H5F_same_shared(const H5F_t *f1, const H5F_t *f2);
H5_DLL unsigned H5F_get_nopen_objs(const H5F_t *f);
H5_DLL unsigned H5F_incr_nopen_objs(H5F_t *f);
H5_DLL unsigned H5F_decr_nopen_objs(H5F_t *f);
H5_DLL hid_t H5F_get_file_id(const H5F_t *f);
H5_DLL hbool_t H5F_file_id_exists(const H5F_t *f);
H5_DLL H5F_t *H5F_get_parent(const H5F_t *f);
H5_DLL unsigned H5F_get_nmounts(const H5F_t *f);
H5_DLL unsigned H5F_get_read_attempts(const H5F_t *f);
+2 -1
View File
@@ -223,7 +223,7 @@ extern "C" {
#endif
/* Functions in H5F.c */
H5_DLL htri_t H5Fis_hdf5(const char *filename);
H5_DLL htri_t H5Fis_accessible(const char *container_name, hid_t fapl_id);
H5_DLL hid_t H5Fcreate(const char *filename, unsigned flags,
hid_t create_plist, hid_t access_plist);
H5_DLL hid_t H5Fopen(const char *filename, unsigned flags,
@@ -303,6 +303,7 @@ typedef struct H5F_info1_t {
/* Function prototypes */
H5_DLL herr_t H5Fget_info1(hid_t obj_id, H5F_info1_t *finfo);
H5_DLL herr_t H5Fset_latest_format(hid_t file_id, hbool_t latest_format);
H5_DLL htri_t H5Fis_hdf5(const char *filename);
#endif /* H5_NO_DEPRECATED_SYMBOLS */
+7 -7
View File
@@ -277,23 +277,23 @@ H5F_get_nopen_objs(const H5F_t *f)
/*-------------------------------------------------------------------------
* Function: H5F_get_file_id
* Function: H5F_file_id_exists
*
* Purpose: Retrieve the file's 'file_id' value
* Purpose: Determines if a file ID exists for this file struct
*
* Return: 'file_id' on success/abort on failure (shouldn't fail)
* Return: TRUE/FALSE
*-------------------------------------------------------------------------
*/
hid_t
H5F_get_file_id(const H5F_t *f)
hbool_t
H5F_file_id_exists(const H5F_t *f)
{
/* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
FUNC_ENTER_NOAPI_NOINIT_NOERR
HDassert(f);
FUNC_LEAVE_NOAPI(f->file_id)
} /* end H5F_get_file_id() */
FUNC_LEAVE_NOAPI(f->id_exists)
} /* end H5F_file_id_exists() */
/*-------------------------------------------------------------------------
+5 -4
View File
@@ -44,6 +44,7 @@
#include "H5Gpkg.h" /* Groups */
#include "H5Iprivate.h" /* IDs */
#include "H5SMpkg.h" /* Shared object header messages */
#include "H5VLprivate.h" /* Virtual Object Layer */
/****************/
@@ -103,7 +104,7 @@ H5F__get_sohm_mesg_count_test(hid_t file_id, unsigned type_id, size_t *mesg_coun
FUNC_ENTER_PACKAGE
/* Check arguments */
if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
if(NULL == (file = (H5F_t *)H5VL_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
/* Push API context */
@@ -148,7 +149,7 @@ H5F__check_cached_stab_test(hid_t file_id)
FUNC_ENTER_PACKAGE
/* Check arguments */
if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
if(NULL == (file = (H5F_t *)H5VL_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
/* Push API context */
@@ -189,7 +190,7 @@ H5F__get_maxaddr_test(hid_t file_id, haddr_t *maxaddr)
FUNC_ENTER_PACKAGE
/* Check arguments */
if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
if(NULL == (file = (H5F_t *)H5VL_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
/* Retrieve maxaddr for file */
@@ -222,7 +223,7 @@ H5F__get_sbe_addr_test(hid_t file_id, haddr_t *sbe_addr)
FUNC_ENTER_PACKAGE
/* Check arguments */
if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
if(NULL == (file = (H5F_t *)H5VL_object_verify(file_id, H5I_FILE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
/* Retrieve maxaddr for file */
+146 -72
View File
@@ -87,6 +87,7 @@
#include "H5Gpkg.h" /* Groups */
#include "H5Iprivate.h" /* IDs */
#include "H5Pprivate.h" /* Property lists */
#include "H5VLprivate.h" /* Virtual Object Layer */
/****************/
@@ -108,6 +109,9 @@
/* Local Prototypes */
/********************/
/* Group close callback */
static herr_t H5G__close_cb(H5VL_object_t *grp_vol_obj);
/*********************/
/* Package Variables */
@@ -131,7 +135,7 @@ static const H5I_class_t H5I_GROUP_CLS[1] = {{
H5I_GROUP, /* ID class value */
0, /* Class flags */
0, /* # of reserved IDs for class */
(H5I_free_t)H5G_close /* Callback routine for closing objects of this class */
(H5I_free_t)H5G__close_cb /* Callback routine for closing objects of this class */
}};
/* Flag indicating "top" of interface has been initialized */
@@ -253,6 +257,38 @@ H5G_term_package(void)
FUNC_LEAVE_NOAPI(n)
} /* end H5G_term_package() */
/*-------------------------------------------------------------------------
* Function: H5G__close_cb
*
* Purpose: Called when the ref count reaches zero on the group's ID
*
* Return: SUCCEED/FAIL
*
*-------------------------------------------------------------------------
*/
static herr_t
H5G__close_cb(H5VL_object_t *grp_vol_obj)
{
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_STATIC
/* Sanity check */
HDassert(grp_vol_obj);
/* Close the group */
if(H5VL_group_close(grp_vol_obj->data, grp_vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "unable to close group")
/* Free the VOL object */
if(H5VL_free_object(grp_vol_obj) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTDEC, FAIL, "unable to free VOL object")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5G__close_cb() */
/*-------------------------------------------------------------------------
* Function: H5Gcreate2
@@ -281,16 +317,16 @@ hid_t
H5Gcreate2(hid_t loc_id, const char *name, hid_t lcpl_id, hid_t gcpl_id,
hid_t gapl_id)
{
H5G_t *grp = NULL; /* Structure for new group */
H5G_loc_t loc; /* Location to create group */
void *grp = NULL; /* Structure for new group */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
H5P_genplist_t *plist; /* Property list pointer */
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);
/* Check arguments */
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a location")
if(!name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "name parameter cannot be NULL")
if(!*name)
@@ -314,17 +350,32 @@ H5Gcreate2(hid_t loc_id, const char *name, hid_t lcpl_id, hid_t gcpl_id,
if(H5CX_set_apl(&gapl_id, H5P_CLS_GACC, loc_id, TRUE) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTSET, H5I_INVALID_HID, "can't set access property list info")
/* Get the gcpl structure and set the link properties on it */
if (NULL == (plist = (H5P_genplist_t *)H5I_object(gcpl_id)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, H5I_INVALID_HID, "can't find object for ID")
if (H5P_set(plist, H5VL_PROP_GRP_LCPL_ID, &lcpl_id) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, H5I_INVALID_HID, "can't set property value for lcpl id")
/* get the location object */
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid location identifier")
/* Set the location parameters */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(loc_id);
/* Create the group */
if(NULL == (grp = H5G__create_named(&loc, name, lcpl_id, gcpl_id)))
if(NULL == (grp = H5VL_group_create(vol_obj->data, loc_params, vol_obj->driver->cls, name,
gcpl_id, gapl_id, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, H5I_INVALID_HID, "unable to create group")
/* Get an atom for the group */
if((ret_value = H5I_register(H5I_GROUP, grp, TRUE)) < 0)
if((ret_value = H5VL_register_id(H5I_GROUP, grp, vol_obj->driver, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to atomize group handle")
done:
if(H5I_INVALID_HID == ret_value)
if(grp && H5G_close(grp) < 0)
if(grp && H5VL_group_close(grp, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, H5I_INVALID_HID, "unable to release group")
FUNC_LEAVE_API(ret_value)
@@ -366,18 +417,14 @@ done:
hid_t
H5Gcreate_anon(hid_t loc_id, hid_t gcpl_id, hid_t gapl_id)
{
H5G_t *grp = NULL; /* Structure for new group */
H5G_loc_t loc;
H5G_obj_create_t gcrt_info; /* Information for group creation */
void *grp = NULL; /* Structure for new group */
H5VL_object_t *vol_obj = NULL; /* Object token for loc_id */
H5VL_loc_params_t loc_params;
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 arguments */
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a location")
/* Check group creation property list */
if(H5P_DEFAULT == gcpl_id)
gcpl_id = H5P_GROUP_CREATE_DEFAULT;
@@ -389,36 +436,27 @@ H5Gcreate_anon(hid_t loc_id, hid_t gcpl_id, hid_t gapl_id)
if(H5CX_set_apl(&gapl_id, H5P_CLS_GACC, loc_id, TRUE) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTSET, H5I_INVALID_HID, "can't set access property list info")
/* Set up group creation info */
gcrt_info.gcpl_id = gcpl_id;
gcrt_info.cache_type = H5G_NOTHING_CACHED;
HDmemset(&gcrt_info.cache, 0, sizeof(gcrt_info.cache));
/* Set location struct fields */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(loc_id);
/* get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid location identifier")
/* Create the group */
if(NULL == (grp = H5G__create(loc.oloc->file, &gcrt_info)))
HGOTO_ERROR(H5E_SYM, H5E_CANTCREATE, H5I_INVALID_HID, "unable to create group")
if(NULL == (grp = H5VL_group_create(vol_obj->data, loc_params, vol_obj->driver->cls, NULL,
gcpl_id, gapl_id, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, H5I_INVALID_HID, "unable to create group")
/* Get an atom for the group */
if((ret_value = H5I_register(H5I_GROUP, grp, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register group")
if((ret_value = H5VL_register_id(H5I_GROUP, grp, vol_obj->driver, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to atomize group handle")
done:
/* Release the group's object header, if it was created */
if(grp) {
H5O_loc_t *oloc; /* Object location for group */
/* Get the new group's object location */
if(NULL == (oloc = H5G_oloc(grp)))
HDONE_ERROR(H5E_SYM, H5E_CANTGET, H5I_INVALID_HID, "unable to get object location of group")
/* Decrement refcount on group's object header in memory */
if(H5O_dec_rc_by_loc(oloc) < 0)
HDONE_ERROR(H5E_SYM, H5E_CANTDEC, H5I_INVALID_HID, "unable to decrement refcount on newly created object")
} /* end if */
/* Cleanup on failure */
if(H5I_INVALID_HID == ret_value)
if(grp && H5G_close(grp) < 0)
if(grp && H5VL_group_close(grp, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, H5I_INVALID_HID, "unable to release group")
FUNC_LEAVE_API(ret_value)
@@ -443,16 +481,15 @@ done:
hid_t
H5Gopen2(hid_t loc_id, const char *name, hid_t gapl_id)
{
H5G_t *grp = NULL; /* Group opened */
H5G_loc_t loc; /* Location of parent for group */
void *grp = NULL; /* Group opened */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
H5TRACE3("i", "i*si", loc_id, name, gapl_id);
/* Check args */
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a location")
if(!name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "name parameter cannot be NULL")
if(!*name)
@@ -462,17 +499,24 @@ H5Gopen2(hid_t loc_id, const char *name, hid_t gapl_id)
if(H5CX_set_apl(&gapl_id, H5P_CLS_GACC, loc_id, FALSE) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTSET, H5I_INVALID_HID, "can't set access property list info")
/* Get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid location identifier")
/* Open the group */
if(NULL == (grp = H5G__open_name(&loc, name)))
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(loc_id);
if(NULL == (grp = H5VL_group_open(vol_obj->data, loc_params, vol_obj->driver->cls,
name, gapl_id, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, H5I_INVALID_HID, "unable to open group")
/* Register an ID for the group */
if((ret_value = H5I_register(H5I_GROUP, grp, TRUE)) < 0)
if((ret_value = H5VL_register_id(H5I_GROUP, grp, vol_obj->driver, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register group")
done:
if(H5I_INVALID_HID == ret_value)
if(grp && H5G_close(grp) < 0)
if(grp && H5VL_group_close(grp, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, H5I_INVALID_HID, "unable to release group")
FUNC_LEAVE_API(ret_value)
@@ -495,18 +539,19 @@ done:
hid_t
H5Gget_create_plist(hid_t group_id)
{
H5G_t *group = NULL;
hid_t ret_value = H5I_INVALID_HID; /* Return value */
H5VL_object_t *vol_obj = NULL;
hid_t ret_value = H5I_INVALID_HID;
FUNC_ENTER_API(H5I_INVALID_HID)
H5TRACE1("i", "i", group_id);
/* Check args */
if(NULL == (group = (H5G_t *)H5I_object_verify(group_id, H5I_GROUP)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(group_id, H5I_GROUP)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a group ID")
/* Get the group creation property list for the group */
if((ret_value = H5G_get_create_plist(group)) < 0)
if(H5VL_group_get(vol_obj->data, vol_obj->driver->cls, H5VL_GROUP_GET_GCPL,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, &ret_value) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTGET, H5I_INVALID_HID, "can't get group's creation property list")
done:
@@ -526,8 +571,9 @@ done:
herr_t
H5Gget_info(hid_t loc_id, H5G_info_t *group_info)
{
H5I_type_t id_type; /* Type of ID */
H5G_loc_t loc; /* Location of group */
H5VL_object_t *vol_obj;
H5I_type_t id_type; /* Type of ID */
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -541,11 +587,14 @@ H5Gget_info(hid_t loc_id, H5G_info_t *group_info)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "group_info parameter cannot be NULL")
/* Get group location */
if(H5G_loc(loc_id, &loc) < 0)
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Retrieve the group's information */
if(H5G__obj_info(loc.oloc, group_info) < 0)
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = id_type;
if((ret_value = H5VL_group_get(vol_obj->data, vol_obj->driver->cls, H5VL_GROUP_GET_INFO,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, loc_params, group_info)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to get group info")
done:
@@ -567,15 +616,14 @@ herr_t
H5Gget_info_by_name(hid_t loc_id, const char *name, H5G_info_t *group_info,
hid_t lapl_id)
{
H5G_loc_t loc; /* Location of group */
herr_t ret_value = SUCCEED; /* Return value */
H5VL_object_t *vol_obj;
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE4("e", "i*s*xi", loc_id, name, group_info, lapl_id);
/* Check args */
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "name parameter cannot be NULL")
if(!*name)
@@ -587,8 +635,19 @@ H5Gget_info_by_name(hid_t loc_id, const char *name, H5G_info_t *group_info,
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, loc_id, FALSE) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTSET, FAIL, "can't set access property list info")
/* Get the location object */
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Set up location parameters */
loc_params.type = H5VL_OBJECT_BY_NAME;
loc_params.loc_data.loc_by_name.name = name;
loc_params.loc_data.loc_by_name.lapl_id = lapl_id;
loc_params.obj_type = H5I_get_type(loc_id);
/* Retrieve the group's information */
if(H5G__get_info_by_name(&loc, name, group_info/*out*/) < 0)
if((ret_value = H5VL_group_get(vol_obj->data, vol_obj->driver->cls, H5VL_GROUP_GET_INFO,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, loc_params, group_info)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve group info")
done:
@@ -610,7 +669,8 @@ herr_t
H5Gget_info_by_idx(hid_t loc_id, const char *group_name, H5_index_t idx_type,
H5_iter_order_t order, hsize_t n, H5G_info_t *group_info, hid_t lapl_id)
{
H5G_loc_t loc; /* Location of group */
H5VL_object_t *vol_obj;
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -618,8 +678,6 @@ H5Gget_info_by_idx(hid_t loc_id, const char *group_name, H5_index_t idx_type,
lapl_id);
/* Check args */
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!group_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "group_name parameter cannot be NULL")
if(!*group_name)
@@ -635,8 +693,22 @@ H5Gget_info_by_idx(hid_t loc_id, const char *group_name, H5_index_t idx_type,
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, loc_id, FALSE) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTSET, FAIL, "can't set access property list info")
/* get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Set location parameters */
loc_params.type = H5VL_OBJECT_BY_IDX;
loc_params.loc_data.loc_by_idx.name = group_name;
loc_params.loc_data.loc_by_idx.idx_type = idx_type;
loc_params.loc_data.loc_by_idx.order = order;
loc_params.loc_data.loc_by_idx.n = n;
loc_params.loc_data.loc_by_idx.lapl_id = lapl_id;
loc_params.obj_type = H5I_get_type(loc_id);
/* Retrieve the group's information */
if(H5G__get_info_by_idx(&loc, group_name, idx_type, order, n, group_info/*out*/) < 0)
if((ret_value = H5VL_group_get(vol_obj->data, vol_obj->driver->cls, H5VL_GROUP_GET_INFO,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, loc_params, group_info)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve group info")
done:
@@ -663,7 +735,7 @@ H5Gclose(hid_t group_id)
H5TRACE1("e", "i", group_id);
/* Check args */
if(NULL == H5I_object_verify(group_id,H5I_GROUP))
if(NULL == H5I_object_verify(group_id, H5I_GROUP))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group")
/* Decrement the counter on the group atom. It will be freed if the count
@@ -692,22 +764,23 @@ done:
herr_t
H5Gflush(hid_t group_id)
{
H5G_t *grp; /* Group for this operation */
herr_t ret_value = SUCCEED; /* Return value */
H5VL_object_t *vol_obj; /* Group for this operation */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE1("e", "i", group_id);
/* Check args */
if(NULL == (grp = (H5G_t *)H5I_object_verify(group_id, H5I_GROUP)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(group_id, H5I_GROUP)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group ID")
/* Set up collective metadata if appropriate */
if(H5CX_set_loc(group_id) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTSET, FAIL, "can't set collective metadata read info")
/* Flush metadata to file */
if(H5O_flush_common(&grp->oloc, group_id) < 0)
/* Flush group's metadata to file */
if((ret_value = H5VL_group_specific(vol_obj->data, vol_obj->driver->cls, H5VL_GROUP_FLUSH,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, group_id)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTFLUSH, FAIL, "unable to flush group")
done:
@@ -730,14 +803,14 @@ done:
herr_t
H5Grefresh(hid_t group_id)
{
H5G_t *grp; /* Group for this operation */
herr_t ret_value = SUCCEED; /* Return value */
H5VL_object_t *vol_obj; /* Group for this operation */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE1("e", "i", group_id);
/* Check args */
if(NULL == (grp = (H5G_t *)H5I_object_verify(group_id, H5I_GROUP)))
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(group_id, H5I_GROUP)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group ID")
/* Set up collective metadata if appropriate */
@@ -745,7 +818,8 @@ H5Grefresh(hid_t group_id)
HGOTO_ERROR(H5E_SYM, H5E_CANTSET, FAIL, "can't set collective metadata read info")
/* Refresh group's metadata */
if((H5O_refresh_metadata(group_id, grp->oloc)) < 0)
if((ret_value = H5VL_group_specific(vol_obj->data, vol_obj->driver->cls, H5VL_GROUP_REFRESH,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, group_id)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, FAIL, "unable to refresh group")
done:
+228 -149
View File
@@ -43,6 +43,7 @@
#include "H5Iprivate.h" /* IDs */
#include "H5Lprivate.h" /* Links */
#include "H5Pprivate.h" /* Property lists */
#include "H5VLprivate.h" /* VOL plugins */
/****************/
@@ -72,10 +73,6 @@ typedef struct {
/* Local Prototypes */
/********************/
static herr_t H5G__link(hid_t cur_loc_id, const char *cur_name, H5G_link_t type,
hid_t new_loc_id, const char *new_name, hid_t lcpl_id);
static herr_t H5G__move(hid_t src_loc_id, const char *src_name,
hid_t dst_loc_id, const char *dst_name, hid_t lcpl_id);
static herr_t H5G__get_objinfo_cb(H5G_loc_t *grp_loc/*in*/, const char *name,
const H5O_link_t *lnk, H5G_loc_t *obj_loc, void *_udata/*in,out*/,
H5G_own_loc_t *own_loc/*out*/);
@@ -174,17 +171,18 @@ H5G_map_obj_type(H5O_type_t obj_type)
hid_t
H5Gcreate1(hid_t loc_id, const char *name, size_t size_hint)
{
H5G_loc_t loc; /* Location to create group */
H5G_t *grp = NULL; /* New group created */
void *grp = NULL; /* New group created */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
H5P_genplist_t *plist; /* Property list pointer */
hid_t tmp_gcpl = H5I_INVALID_HID; /* Temporary group creation property list */
hid_t lcpl_id = H5P_LINK_CREATE_DEFAULT;
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(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a location")
if(!name || !*name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "no name given")
@@ -221,12 +219,28 @@ H5Gcreate1(hid_t loc_id, const char *name, size_t size_hint)
if(H5CX_set_loc(loc_id) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTSET, H5I_INVALID_HID, "can't set collective metadata read info")
/* Get the plist structure */
if(NULL == (plist = (H5P_genplist_t *)H5I_object(tmp_gcpl)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, H5I_INVALID_HID, "can't find object for ID")
/* get creation properties */
if(H5P_set(plist, H5VL_PROP_GRP_LCPL_ID, &lcpl_id) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5I_INVALID_HID, "can't get property value for lcpl id")
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(loc_id);
/* get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid location identifier")
/* Create the group */
if(NULL == (grp = H5G__create_named(&loc, name, H5P_LINK_CREATE_DEFAULT, tmp_gcpl)))
if(NULL == (grp = H5VL_group_create(vol_obj->data, loc_params, vol_obj->driver->cls, name, tmp_gcpl,
H5P_GROUP_ACCESS_DEFAULT, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, H5I_INVALID_HID, "unable to create group")
/* Get an atom for the group */
if((ret_value = H5I_register(H5I_GROUP, grp, TRUE)) < 0)
if((ret_value = H5VL_register_id(H5I_GROUP, grp, vol_obj->driver, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register group")
done:
@@ -235,7 +249,7 @@ done:
HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, H5I_INVALID_HID, "unable to release property list")
if(H5I_INVALID_HID == ret_value)
if(grp && H5G_close(grp) < 0)
if(grp && H5VL_group_close(grp, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, H5I_INVALID_HID, "unable to release group")
FUNC_LEAVE_API(ret_value)
@@ -262,30 +276,38 @@ done:
hid_t
H5Gopen1(hid_t loc_id, const char *name)
{
H5G_t *grp = NULL; /* Group opened */
H5G_loc_t loc; /* Location of parent for group */
void *grp = NULL; /* Group opened */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
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(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a location")
if(!name || !*name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "no name")
/* Set location parameters */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(loc_id);
/* get the location object */
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid location identifier")
/* Open the group */
if(NULL == (grp = H5G__open_name(&loc, name)))
if(NULL == (grp = H5VL_group_open(vol_obj->data, loc_params, vol_obj->driver->cls, name, H5P_DEFAULT,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, H5I_INVALID_HID, "unable to open group")
/* Get an atom for the group */
if((ret_value = H5I_register(H5I_GROUP, grp, TRUE)) < 0)
if((ret_value = H5VL_register_id(H5I_GROUP, grp, vol_obj->driver, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register group")
done:
if(H5I_INVALID_HID == ret_value)
if(grp && H5G_close(grp) < 0)
if(grp && H5VL_group_close(grp, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, H5I_INVALID_HID, "unable to release group")
FUNC_LEAVE_API(ret_value)
@@ -303,6 +325,8 @@ done:
herr_t
H5Glink(hid_t cur_loc_id, H5G_link_t type, const char *cur_name, const char *new_name)
{
hid_t lcpl_id = H5P_LINK_CREATE_DEFAULT;
H5P_genplist_t *plist; /* Property list pointer */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -318,9 +342,64 @@ H5Glink(hid_t cur_loc_id, H5G_link_t type, const char *cur_name, const char *new
if(H5CX_set_loc(cur_loc_id) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTSET, FAIL, "can't set collective metadata read info")
/* Get the plist structure */
if(NULL == (plist = (H5P_genplist_t *)H5I_object(lcpl_id)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
/* Create link */
if(H5G__link(cur_loc_id, cur_name, type, H5L_SAME_LOC, new_name, H5P_LINK_CREATE_DEFAULT) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "couldn't create link")
if(type == H5L_TYPE_HARD) {
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params1;
H5VL_loc_params_t loc_params2;
loc_params1.type = H5VL_OBJECT_BY_NAME;
loc_params1.obj_type = H5I_get_type(cur_loc_id);
loc_params1.loc_data.loc_by_name.name = cur_name;
loc_params1.loc_data.loc_by_name.lapl_id = H5P_DEFAULT;
loc_params2.type = H5VL_OBJECT_BY_NAME;
loc_params2.loc_data.loc_by_name.name = new_name;
loc_params2.loc_data.loc_by_name.lapl_id = H5P_DEFAULT;
/* get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(cur_loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* set creation properties */
if(H5P_set(plist, H5VL_PROP_LINK_TARGET, &vol_obj->data) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't set property value for target")
if(H5P_set(plist, H5VL_PROP_LINK_TARGET_LOC_PARAMS, &loc_params1) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't set property value for target loc params")
/* Create the link through the VOL */
if((ret_value = H5VL_link_create(H5VL_LINK_CREATE_HARD, NULL, loc_params2, vol_obj->driver->cls,
lcpl_id, H5P_DEFAULT, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to create link")
}
else if(type == H5L_TYPE_SOFT) {
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
loc_params.type = H5VL_OBJECT_BY_NAME;
loc_params.loc_data.loc_by_name.name = new_name;
loc_params.loc_data.loc_by_name.lapl_id = H5P_DEFAULT;
loc_params.obj_type = H5I_get_type(cur_loc_id);
/* get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(cur_loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* set creation properties */
if(H5P_set(plist, H5VL_PROP_LINK_TARGET_NAME, &cur_name) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get property value for target name")
/* Create the link through the VOL */
if((ret_value = H5VL_link_create(H5VL_LINK_CREATE_SOFT, vol_obj->data, loc_params, vol_obj->driver->cls,
lcpl_id, H5P_DEFAULT, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to create link")
}
else
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Not a valid link type")
done:
FUNC_LEAVE_API(ret_value)
@@ -339,6 +418,8 @@ herr_t
H5Glink2(hid_t cur_loc_id, const char *cur_name, H5G_link_t type,
hid_t new_loc_id, const char *new_name)
{
hid_t lcpl_id = H5P_LINK_CREATE_DEFAULT;
H5P_genplist_t *plist; /* Property list pointer */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -354,84 +435,77 @@ H5Glink2(hid_t cur_loc_id, const char *cur_name, H5G_link_t type,
if(H5CX_set_loc(cur_loc_id) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTSET, FAIL, "can't set collective metadata read info")
/* Create link */
if(H5G__link(cur_loc_id, cur_name, type, new_loc_id, new_name, H5P_LINK_CREATE_DEFAULT) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "couldn't create link")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Glink2() */
/*-------------------------------------------------------------------------
* Function: H5G__link
*
* Purpose: Internal routine to create a new link.
*
* Return: Non-negative on success/Negative on failure
*
* Programmer: Quincey Koziol
* Monday, December 18, 2017
*
*-------------------------------------------------------------------------
*/
static herr_t
H5G__link(hid_t cur_loc_id, const char *cur_name, H5G_link_t type,
hid_t new_loc_id, const char *new_name, hid_t lcpl_id)
{
H5G_loc_t new_loc; /* Information about new link's group */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_STATIC
/* Get the plist structure */
if(NULL == (plist = (H5P_genplist_t *)H5I_object(lcpl_id)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
/* Create the appropriate kind of link */
if(type == H5L_TYPE_HARD) {
H5G_loc_t cur_loc, *cur_loc_p; /* Information about current link's group */
H5G_loc_t *new_loc_p; /* Information about new link's group */
H5VL_object_t *vol_obj1 = NULL; /* object token of loc_id */
H5VL_object_t *vol_obj2 = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params1;
H5VL_loc_params_t loc_params2;
/* Finish checking arguments */
if(cur_loc_id == H5L_SAME_LOC && new_loc_id == H5L_SAME_LOC)
HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "source and destination should not be both H5L_SAME_LOC")
if(cur_loc_id != H5L_SAME_LOC && H5G_loc(cur_loc_id, &cur_loc) < 0)
HGOTO_ERROR(H5E_SYM, H5E_BADTYPE, FAIL, "not a location")
if(new_loc_id != H5L_SAME_LOC && H5G_loc(new_loc_id, &new_loc) < 0)
HGOTO_ERROR(H5E_SYM, H5E_BADTYPE, FAIL, "not a location")
loc_params1.type = H5VL_OBJECT_BY_NAME;
loc_params1.obj_type = H5I_get_type(cur_loc_id);
loc_params1.loc_data.loc_by_name.name = cur_name;
loc_params1.loc_data.loc_by_name.lapl_id = H5P_DEFAULT;
/* Set up current & new location pointers */
cur_loc_p = &cur_loc;
new_loc_p = &new_loc;
if(cur_loc_id == H5L_SAME_LOC)
cur_loc_p = new_loc_p;
else if(new_loc_id == H5L_SAME_LOC)
new_loc_p = cur_loc_p;
else if(cur_loc_p->oloc->file != new_loc_p->oloc->file)
HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "source and destination should be in the same file.")
loc_params2.type = H5VL_OBJECT_BY_NAME;
loc_params2.obj_type = H5I_get_type(new_loc_id);
loc_params2.loc_data.loc_by_name.name = new_name;
loc_params2.loc_data.loc_by_name.lapl_id = H5P_DEFAULT;
/* Create the link */
if(H5L_create_hard(cur_loc_p, cur_name, new_loc_p, new_name, lcpl_id) < 0)
/* get the location object */
if(NULL == (vol_obj1 = (H5VL_object_t *)H5I_object(cur_loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
if(NULL == (vol_obj2 = (H5VL_object_t *)H5I_object(new_loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* set creation properties */
if(H5P_set(plist, H5VL_PROP_LINK_TARGET, &vol_obj1->data) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't set property value for target id")
if(H5P_set(plist, H5VL_PROP_LINK_TARGET_LOC_PARAMS, &loc_params1) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't set property value for target name")
/* Create the link through the VOL */
if((ret_value = H5VL_link_create(H5VL_LINK_CREATE_HARD, vol_obj2->data, loc_params2, vol_obj2->driver->cls,
lcpl_id, H5P_DEFAULT, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to create link")
}
else if(type == H5L_TYPE_SOFT) {
/* Soft links only need one location, the new_loc_id, but it's possible
* that new_loc_id is H5L_SAME_LOC
*/
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
/* Soft links only need one location, the new_loc_id, but it's possible that
* new_loc_id is H5L_SAME_LOC */
if(new_loc_id == H5L_SAME_LOC)
new_loc_id = cur_loc_id;
/* Finish checking arguments */
if(H5G_loc(new_loc_id, &new_loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
loc_params.type = H5VL_OBJECT_BY_NAME;
loc_params.loc_data.loc_by_name.name = new_name;
loc_params.loc_data.loc_by_name.lapl_id = H5P_DEFAULT;
loc_params.obj_type = H5I_get_type(new_loc_id);
/* Create the link */
if(H5L_create_soft(cur_name, &new_loc, new_name, lcpl_id) < 0)
/* get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(new_loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* set creation properties */
if(H5P_set(plist, H5VL_PROP_LINK_TARGET_NAME, &cur_name) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get property value for target name")
/* Create the link through the VOL */
if((ret_value = H5VL_link_create(H5VL_LINK_CREATE_SOFT, vol_obj->data, loc_params, vol_obj->driver->cls,
lcpl_id, H5P_DEFAULT, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to create link")
}
else
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a valid link type")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5G__link() */
FUNC_LEAVE_API(ret_value)
} /* end H5Glink2() */
/*-------------------------------------------------------------------------
@@ -444,7 +518,10 @@ done:
herr_t
H5Gmove(hid_t src_loc_id, const char *src_name, const char *dst_name)
{
herr_t ret_value = SUCCEED; /* Return value */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params1;
H5VL_loc_params_t loc_params2;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE3("e", "i*s*s", src_loc_id, src_name, dst_name);
@@ -453,8 +530,22 @@ H5Gmove(hid_t src_loc_id, const char *src_name, const char *dst_name)
if(H5CX_set_loc(src_loc_id) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTSET, FAIL, "can't set collective metadata read info")
loc_params1.type = H5VL_OBJECT_BY_NAME;
loc_params1.obj_type = H5I_get_type(src_loc_id);
loc_params1.loc_data.loc_by_name.name = src_name;
loc_params1.loc_data.loc_by_name.lapl_id = H5P_DEFAULT;
loc_params2.type = H5VL_OBJECT_BY_NAME;
loc_params2.loc_data.loc_by_name.name = dst_name;
loc_params2.loc_data.loc_by_name.lapl_id = H5P_DEFAULT;
/* get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(src_loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Move the link */
if(H5G__move(src_loc_id, src_name, H5L_SAME_LOC, dst_name, H5P_LINK_CREATE_DEFAULT) < 0)
if((ret_value = H5VL_link_move(vol_obj->data, loc_params1, NULL, loc_params2, vol_obj->driver->cls,
H5P_DEFAULT, H5P_DEFAULT, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTMOVE, FAIL, "couldn't move link")
done:
@@ -473,81 +564,51 @@ herr_t
H5Gmove2(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id,
const char *dst_name)
{
H5VL_object_t *vol_obj1 = NULL; /* object token of src_id */
H5VL_loc_params_t loc_params1;
H5VL_object_t *vol_obj2 = NULL; /* object token of dst_id */
H5VL_loc_params_t loc_params2;
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);
/* Check arguments */
if(src_loc_id == H5L_SAME_LOC && dst_loc_id == H5L_SAME_LOC)
HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "source and destination should not both be H5L_SAME_LOC")
/* Set up collective metadata if appropriate */
if(H5CX_set_loc(dst_loc_id) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTSET, FAIL, "can't set collective metadata read info")
/* Set location parameter for source object */
loc_params1.type = H5VL_OBJECT_BY_NAME;
loc_params1.loc_data.loc_by_name.name = src_name;
loc_params1.loc_data.loc_by_name.lapl_id = H5P_DEFAULT;
loc_params1.obj_type = H5I_get_type(src_loc_id);
/* Set location parameter for destination object */
loc_params2.type = H5VL_OBJECT_BY_NAME;
loc_params2.loc_data.loc_by_name.name = dst_name;
loc_params2.loc_data.loc_by_name.lapl_id = H5P_DEFAULT;
loc_params2.obj_type = H5I_get_type(dst_loc_id);
if(H5L_SAME_LOC != src_loc_id) {
/* get the location object */
if(NULL == (vol_obj1 = (H5VL_object_t *)H5I_object(src_loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
}
if(H5L_SAME_LOC != dst_loc_id) {
/* get the location object */
if(NULL == (vol_obj2 = (H5VL_object_t *)H5I_object(dst_loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
}
/* Move the link */
if(H5G__move(src_loc_id, src_name, dst_loc_id, dst_name, H5P_LINK_CREATE_DEFAULT) < 0)
if((ret_value = H5VL_link_move(vol_obj1->data, loc_params1, vol_obj2->data, loc_params2,
vol_obj1->driver->cls, H5P_DEFAULT, H5P_DEFAULT,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTMOVE, FAIL, "unable to move link")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Gmove2() */
/*-------------------------------------------------------------------------
* Function: H5G__move
*
* Purpose: Renames an object within an HDF5 file and moves it to a new
* group. The original name SRC is unlinked from the group graph
* and then inserted with the new name DST (which can specify a
* new path for the object) as an atomic operation. The names
* are interpreted relative to SRC_LOC_ID and
* DST_LOC_ID, which are either file IDs or group ID.
*
* Return: Non-negative on success/Negative on failure
*
* Programmer: Quincey Koziol
* Monday, November 6, 2006
*
*-------------------------------------------------------------------------
*/
static herr_t
H5G__move(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id,
const char *dst_name, hid_t lcpl_id)
{
H5G_loc_t src_loc, *src_loc_p; /* Group info for source location */
H5G_loc_t dst_loc, *dst_loc_p; /* Group info for destination location */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_STATIC
/* Check arguments */
if(src_loc_id != H5L_SAME_LOC && H5G_loc(src_loc_id, &src_loc) < 0)
HGOTO_ERROR(H5E_SYM, H5E_BADTYPE, FAIL, "not a location")
if(dst_loc_id != H5L_SAME_LOC && H5G_loc(dst_loc_id, &dst_loc) < 0)
HGOTO_ERROR(H5E_SYM, H5E_BADTYPE, FAIL, "not a location")
if(!src_name || !*src_name)
HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "no current name specified")
if(!dst_name || !*dst_name)
HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "no destination name specified")
/* Set up src & dst location pointers */
src_loc_p = &src_loc;
dst_loc_p = &dst_loc;
if(src_loc_id == H5L_SAME_LOC)
src_loc_p = dst_loc_p;
else if(dst_loc_id == H5L_SAME_LOC)
dst_loc_p = src_loc_p;
/* Move the link */
if(H5L_move(src_loc_p, src_name, dst_loc_p, dst_name, FALSE, lcpl_id) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTMOVE, FAIL, "unable to move link")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5G__move() */
/*-------------------------------------------------------------------------
* Function: H5Gunlink
@@ -559,15 +620,14 @@ done:
herr_t
H5Gunlink(hid_t loc_id, const char *name)
{
H5G_loc_t loc; /* Group's location */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE2("e", "i*s", loc_id, name);
/* Check arguments */
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!name || !*name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
@@ -575,8 +635,18 @@ H5Gunlink(hid_t loc_id, const char *name)
if(H5CX_set_loc(loc_id) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTSET, FAIL, "can't set collective metadata read info")
loc_params.type = H5VL_OBJECT_BY_NAME;
loc_params.obj_type = H5I_get_type(loc_id);
loc_params.loc_data.loc_by_name.name = name;
loc_params.loc_data.loc_by_name.lapl_id = H5P_LINK_ACCESS_DEFAULT;
/* Get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Delete the link */
if(H5L_delete(&loc, name) < 0)
if(H5VL_link_specific(vol_obj->data, loc_params, vol_obj->driver->cls, H5VL_LINK_DELETE,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "couldn't delete link")
done:
@@ -595,15 +665,14 @@ done:
herr_t
H5Gget_linkval(hid_t loc_id, const char *name, size_t size, char *buf/*out*/)
{
H5G_loc_t loc; /* Group's location */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE4("e", "i*szx", loc_id, name, size, buf);
/* Check arguments */
if(H5G_loc(loc_id, &loc))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!name || !*name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified")
@@ -611,9 +680,19 @@ H5Gget_linkval(hid_t loc_id, const char *name, size_t size, char *buf/*out*/)
if(H5CX_set_loc(loc_id) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTSET, FAIL, "can't set collective metadata read info")
loc_params.type = H5VL_OBJECT_BY_NAME;
loc_params.obj_type = H5I_get_type(loc_id);
loc_params.loc_data.loc_by_name.name = name;
loc_params.loc_data.loc_by_name.lapl_id = H5P_LINK_ACCESS_DEFAULT;
/* Get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Get the link value */
if(H5L_get_val(&loc, name, buf, size) < 0)
HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "couldn't get link info")
if((ret_value = H5VL_link_get(vol_obj->data, loc_params, vol_obj->driver->cls, H5VL_LINK_GET_VAL,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, buf, size)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to get link value")
done:
FUNC_LEAVE_API(ret_value)
+3 -2
View File
@@ -39,6 +39,7 @@
#include "H5Iprivate.h" /* IDs */
#include "H5Lprivate.h" /* Links */
#include "H5MMprivate.h" /* Memory management */
#include "H5VLnative.h" /* Virtual Object Layer (native) */
/****************/
@@ -807,7 +808,7 @@ H5G_iterate(H5G_loc_t *loc, const char *group_name,
*/
if(NULL == (grp = H5G__open_name(loc, group_name)))
HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open group")
if((gid = H5I_register(H5I_GROUP, grp, TRUE)) < 0)
if((gid = H5VL_native_register(H5I_GROUP, grp, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register group")
/* Set up user data for callback */
@@ -1069,7 +1070,7 @@ H5G_visit(H5G_loc_t *loc, const char *group_name, H5_index_t idx_type,
HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open group")
/* Register an ID for the starting group */
if((gid = H5I_register(H5I_GROUP, grp, TRUE)) < 0)
if((gid = H5VL_native_register(H5I_GROUP, grp, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register group")
/* Get the location of the starting group */
+44 -20
View File
@@ -137,29 +137,25 @@ static herr_t H5G__loc_get_comment_cb(H5G_loc_t *grp_loc, const char *name,
/*-------------------------------------------------------------------------
* Function: H5G_loc
* Function: H5G_loc_real
*
* Purpose: Given an object ID return a location for the object.
* Purpose: Utility routine to get object location
*
* Returns: SUCCEED/FAIL
*
*-------------------------------------------------------------------------
*/
herr_t
H5G_loc(hid_t loc_id, H5G_loc_t *loc)
H5G_loc_real(void *obj, H5I_type_t type, H5G_loc_t *loc)
{
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
switch(H5I_get_type(loc_id)) {
switch(type) {
case H5I_FILE:
{
H5F_t *f = NULL;
/* Get the file struct */
if(NULL == (f = (H5F_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file ID")
H5F_t *f = (H5F_t *)obj;
/* Construct a group location for root group of the file */
if(H5G_root_loc(f, loc) < 0)
@@ -169,10 +165,8 @@ H5G_loc(hid_t loc_id, H5G_loc_t *loc)
case H5I_GROUP:
{
H5G_t *group = NULL;
H5G_t *group = (H5G_t *)obj;
if(NULL == (group = (H5G_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid group ID")
if(NULL == (loc->oloc = H5G_oloc(group)))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get object location of group")
if(NULL == (loc->path = H5G_nameof(group)))
@@ -184,8 +178,9 @@ H5G_loc(hid_t loc_id, H5G_loc_t *loc)
{
H5T_t *dt = NULL;
if(NULL == (dt = (H5T_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid type ID")
/* Get the actual datatype object if the VOL object is set */
dt = H5T_get_actual_type((H5T_t *)obj);
if(NULL == (loc->oloc = H5T_oloc(dt)))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get object location of datatype")
if(NULL == (loc->path = H5T_nameof(dt)))
@@ -195,10 +190,8 @@ H5G_loc(hid_t loc_id, H5G_loc_t *loc)
case H5I_DATASET:
{
H5D_t *dset = NULL;
H5D_t *dset = (H5D_t *)obj;
if(NULL == (dset = (H5D_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid data ID")
if(NULL == (loc->oloc = H5D_oloc(dset)))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get object location of dataset")
if(NULL == (loc->path = H5D_nameof(dset)))
@@ -208,10 +201,8 @@ H5G_loc(hid_t loc_id, H5G_loc_t *loc)
case H5I_ATTR:
{
H5A_t *attr = NULL;
H5A_t *attr = (H5A_t *)obj;
if(NULL == (attr = (H5A_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid attribute ID")
if(NULL == (loc->oloc = H5A_oloc(attr)))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get object location of attribute")
if(NULL == (loc->path = H5A_nameof(attr)))
@@ -237,6 +228,9 @@ H5G_loc(hid_t loc_id, H5G_loc_t *loc)
case H5I_VFL:
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get group location of a virtual file driver (VFD)")
case H5I_VOL:
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get group location of a virtual object layer (VOL) driver")
case H5I_UNINIT:
case H5I_BADID:
case H5I_NTYPES:
@@ -244,6 +238,36 @@ H5G_loc(hid_t loc_id, H5G_loc_t *loc)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid location ID")
} /* end switch */
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5G_loc_real() */
/*-------------------------------------------------------------------------
* Function: H5G_loc
*
* Purpose: Given an object ID return a location for the object.
*
* Return: SUCCEED/FAIL
*
*-------------------------------------------------------------------------
*/
herr_t
H5G_loc(hid_t loc_id, H5G_loc_t *loc)
{
void *obj = NULL; /* VOL object */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
/* Get the object from the VOL */
if(NULL == (obj = H5VL_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Fill in the struct */
if(H5G_loc_real(obj, H5I_get_type(loc_id), loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "unable to fill in location struct")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5G_loc() */
+1
View File
@@ -835,6 +835,7 @@ H5G_name_replace_cb(void *obj_ptr, hid_t obj_id, void *key)
case H5I_ATTR:
case H5I_REFERENCE:
case H5I_VFL:
case H5I_VOL:
case H5I_GENPROP_CLS:
case H5I_GENPROP_LST:
case H5I_ERROR_CLASS:
+15 -14
View File
@@ -27,6 +27,7 @@
#include "H5Gpkg.h" /* Groups */
#include "H5Iprivate.h" /* IDs */
#include "H5Opkg.h" /* Object headers */
#include "H5VLprivate.h" /* Virtual Object Layer */
/****************/
@@ -46,7 +47,7 @@
static void *H5O__group_get_copy_file_udata(void);
static void H5O__group_free_copy_file_udata(void *udata);
static htri_t H5O__group_isa(const H5O_t *loc);
static hid_t H5O__group_open(const H5G_loc_t *obj_loc, hbool_t app_ref);
static void *H5O__group_open(const H5G_loc_t *obj_loc, H5I_type_t *opened_type);
static void *H5O__group_create(H5F_t *f, void *_crt_info, H5G_loc_t *obj_loc);
static H5O_loc_t *H5O__group_get_oloc(hid_t obj_id);
static herr_t H5O__group_bh_info(const H5O_loc_t *loc, H5O_t *oh,
@@ -197,36 +198,36 @@ done:
*
* Purpose: Open a group at a particular location
*
* Return: Success: Open object identifier
* Failure: Negative
* Return: Success: Pointer to group data
* Failure: NULL
*
* Programmer: Quincey Koziol
* Monday, November 6, 2006
*
*-------------------------------------------------------------------------
*/
static hid_t
H5O__group_open(const H5G_loc_t *obj_loc, hbool_t app_ref)
static void *
H5O__group_open(const H5G_loc_t *obj_loc, H5I_type_t *opened_type)
{
H5G_t *grp = NULL; /* Group opened */
hid_t ret_value = H5I_INVALID_HID; /* Return value */
H5G_t *grp = NULL; /* Group opened */
void *ret_value = NULL; /* Return value */
FUNC_ENTER_STATIC
HDassert(obj_loc);
*opened_type = H5I_GROUP;
/* Open the group */
if(NULL == (grp = H5G_open(obj_loc)))
HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open group")
HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, NULL, "unable to open group")
/* Register an ID for the group */
if((ret_value = H5I_register(H5I_GROUP, grp, app_ref)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register group")
ret_value = (void *)grp;
done:
if(ret_value < 0)
if(NULL == ret_value)
if(grp && H5G_close(grp) < 0)
HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "unable to release group")
HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, NULL, "unable to release group")
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5O__group_open() */
@@ -303,7 +304,7 @@ H5O__group_get_oloc(hid_t obj_id)
FUNC_ENTER_STATIC
/* Get the group */
if(NULL == (grp = (H5G_t *)H5I_object(obj_id)))
if(NULL == (grp = (H5G_t *)H5VL_object(obj_id)))
HGOTO_ERROR(H5E_OHDR, H5E_BADATOM, NULL, "couldn't get object from ID")
/* Get the group's object header location */
+1
View File
@@ -268,6 +268,7 @@ H5_DLL H5RS_str_t *H5G_build_fullpath_refstr_str(H5RS_str_t *path_r, const char
/*
* These functions operate on group "locations"
*/
H5_DLL herr_t H5G_loc_real(void *obj, H5I_type_t type, H5G_loc_t *loc);
H5_DLL herr_t H5G_loc(hid_t loc_id, H5G_loc_t *loc);
H5_DLL herr_t H5G_loc_copy(H5G_loc_t *dst, const H5G_loc_t *src, H5_copy_depth_t depth);
H5_DLL herr_t H5G_loc_find(const H5G_loc_t *loc, const char *name,
+11 -8
View File
@@ -35,6 +35,8 @@
#include "H5Gpkg.h" /* Groups */
#include "H5HLprivate.h" /* Local Heaps */
#include "H5Iprivate.h" /* IDs */
#include "H5VLprivate.h" /* Virtual Object Layer */
/****************/
/* Local Macros */
@@ -102,7 +104,7 @@ H5G__is_empty_test(hid_t gid)
FUNC_ENTER_PACKAGE
/* Get group structure */
if(NULL == (grp = (H5G_t *)H5I_object_verify(gid, H5I_GROUP)))
if(NULL == (grp = (H5G_t *)H5VL_object_verify(gid, H5I_GROUP)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group")
/* Set API context */
@@ -222,7 +224,7 @@ H5G__has_links_test(hid_t gid, unsigned *nmsgs)
FUNC_ENTER_PACKAGE
/* Get group structure */
if(NULL == (grp = (H5G_t *)H5I_object_verify(gid, H5I_GROUP)))
if(NULL == (grp = (H5G_t *)H5VL_object_verify(gid, H5I_GROUP)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group")
/* Set API context */
@@ -289,7 +291,7 @@ H5G__has_stab_test(hid_t gid)
FUNC_ENTER_PACKAGE
/* Get group structure */
if(NULL == (grp = (H5G_t *)H5I_object_verify(gid, H5I_GROUP)))
if(NULL == (grp = (H5G_t *)H5VL_object_verify(gid, H5I_GROUP)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group")
/* Set API context */
@@ -348,7 +350,7 @@ H5G__is_new_dense_test(hid_t gid)
FUNC_ENTER_PACKAGE
/* Get group structure */
if(NULL == (grp = (H5G_t *)H5I_object_verify(gid, H5I_GROUP)))
if(NULL == (grp = (H5G_t *)H5VL_object_verify(gid, H5I_GROUP)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group")
/* Set API context */
@@ -427,7 +429,7 @@ H5G__new_dense_info_test(hid_t gid, hsize_t *name_count, hsize_t *corder_count)
FUNC_ENTER_PACKAGE
/* Get group structure */
if(NULL == (grp = (H5G_t *)H5I_object_verify(gid, H5I_GROUP)))
if(NULL == (grp = (H5G_t *)H5VL_object_verify(gid, H5I_GROUP)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group")
/* Set API context */
@@ -515,7 +517,7 @@ H5G__lheap_size_test(hid_t gid, size_t *lheap_size)
FUNC_ENTER_PACKAGE
/* Get group structure */
if(NULL == (grp = (H5G_t *)H5I_object_verify(gid, H5I_GROUP)))
if(NULL == (grp = (H5G_t *)H5VL_object_verify(gid, H5I_GROUP)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group")
/* Set API context */
@@ -576,7 +578,7 @@ H5G__user_path_test(hid_t obj_id, char *user_path, size_t *user_path_len, unsign
HDassert(obj_hidden);
/* Get pointer to object for ID */
if(NULL == (obj_ptr = H5I_object(obj_id)))
if(NULL == (obj_ptr = H5VL_object(obj_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get object for ID")
/* Set API context */
@@ -609,6 +611,7 @@ H5G__user_path_test(hid_t obj_id, char *user_path, size_t *user_path_len, unsign
case H5I_ATTR:
case H5I_REFERENCE:
case H5I_VFL:
case H5I_VOL:
case H5I_GENPROP_CLS:
case H5I_GENPROP_LST:
case H5I_ERROR_CLASS:
@@ -829,7 +832,7 @@ H5G__verify_cached_stabs_test(hid_t gid)
HDassert(gid >= 0);
/* Check args */
if(NULL == (grp = (H5G_t *)H5I_object_verify(gid, H5I_GROUP)))
if(NULL == (grp = (H5G_t *)H5VL_object_verify(gid, H5I_GROUP)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group")
/* Set up metadata tagging */
+2 -1
View File
@@ -43,6 +43,7 @@
#include "H5MMprivate.h" /* Memory management */
#include "H5Ppublic.h" /* Property Lists */
#include "H5WBprivate.h" /* Wrapped Buffers */
#include "H5VLnative.h" /* Virtual Object Layer (native) */
/****************/
@@ -197,7 +198,7 @@ H5G__traverse_ud(const H5G_loc_t *grp_loc/*in,out*/, const H5O_link_t *lnk,
/* Create a group ID to pass to the user-defined callback */
if(NULL == (grp = H5G_open(&grp_loc_copy)))
HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open group")
if((cur_grp = H5I_register(H5I_GROUP, grp, FALSE)) < 0)
if((cur_grp = H5VL_native_register(H5I_GROUP, grp, FALSE)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_CANTREGISTER, FAIL, "unable to register group")
/* User-defined callback function */
+284 -23
View File
@@ -41,6 +41,7 @@
#include "H5Oprivate.h" /* Object headers */
#include "H5SLprivate.h" /* Skip Lists */
#include "H5Tpkg.h" /* Datatypes */
#include "H5VLprivate.h" /* Virtual Object Layer */
/* Local Macros */
@@ -74,11 +75,24 @@ typedef struct {
void *ret_obj; /* Object to return */
} H5I_search_ud_t;
typedef struct {
H5I_iterate_func_t op; /* Application's callback routine */
void *op_data; /* Application's user data */
} H5I_iterate_pub_ud_t;
/* User data for iterator callback for retrieving an ID corresponding to an object pointer */
typedef struct {
const void *object; /* object pointer to search for */
H5I_type_t obj_type; /* type of object we are searching for */
hid_t ret_id; /* ID returned */
} H5I_get_id_ud_t;
/* User data for iterator callback for ID iteration */
typedef struct {
H5I_search_func_t user_func; /* 'User' function to invoke */
void *user_udata; /* User data to pass to 'user' function */
hbool_t app_ref; /* Whether this is an appl. ref. call */
H5I_type_t obj_type; /* Type of object we are iterating over */
} H5I_iterate_ud_t;
/* User data for H5I__clear_type_cb */
@@ -113,6 +127,8 @@ H5FL_DEFINE_STATIC(H5I_id_type_t);
/* Declare a free list to manage the H5I_class_t struct */
H5FL_DEFINE_STATIC(H5I_class_t);
H5FL_EXTERN(H5VL_object_t);
/*--------------------- Local function prototypes ---------------------------*/
static htri_t H5I__clear_type_cb(void *_id, void *key, void *udata);
static int H5I__destroy_type(H5I_type_t type);
@@ -122,7 +138,9 @@ static int H5I__inc_type_ref(H5I_type_t type);
static int H5I__get_type_ref(H5I_type_t type);
static int H5I__search_cb(void *obj, hid_t id, void *_udata);
static H5I_id_info_t *H5I__find_id(hid_t id);
static int H5I__iterate_pub_cb(void *obj, hid_t id, void *udata);
static hid_t H5I__get_file_id(hid_t obj_id, H5I_type_t id_type);
static int H5I__find_id_cb(void *_item, void *_key, void *_udata);
static int H5I__id_dump_cb(void *_item, void *_key, void *_udata);
@@ -543,7 +561,7 @@ H5I__clear_type_cb(void *_id, void H5_ATTR_UNUSED *key, void *_udata)
if(udata->force) {
#ifdef H5I_DEBUG
if(H5DEBUG(I)) {
fprintf(H5DEBUG(I), "H5I: free type=%d obj=0x%08lx "
HDfprintf(H5DEBUG(I), "H5I: free type=%d obj=0x%08lx "
"failure ignored\n",
(int)udata->type_ptr->cls->type_id,
(unsigned long)(id->obj_ptr));
@@ -760,8 +778,9 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
H5I_register_with_id(H5I_type_t type, const void *object, hbool_t app_ref, hid_t id)
H5I_register_with_id(H5I_type_t type, void *object, H5VL_t *vol_driver, hbool_t app_ref, hid_t id)
{
H5VL_object_t *new_vol_obj = NULL; /* pointer to new VOL object */
H5I_id_type_t *type_ptr; /* ptr to the type */
H5I_id_info_t *id_ptr; /* ptr to the new ID information */
herr_t ret_value = SUCCEED; /* return value */
@@ -770,6 +789,7 @@ H5I_register_with_id(H5I_type_t type, const void *object, hbool_t app_ref, hid_t
/* Check arguments */
HDassert(object);
HDassert(vol_driver);
/* Make sure ID is not already in use */
if(NULL != (id_ptr = H5I__find_id(id)))
@@ -793,11 +813,29 @@ H5I_register_with_id(H5I_type_t type, const void *object, hbool_t app_ref, hid_t
if(NULL == (id_ptr = H5FL_MALLOC(H5I_id_info_t)))
HGOTO_ERROR(H5E_ATOM, H5E_NOSPACE, FAIL, "memory allocation failed")
/* Set up the new VOL object */
if(NULL == (new_vol_obj = H5FL_CALLOC(H5VL_object_t)))
HGOTO_ERROR(H5E_ATOM, H5E_CANTALLOC, FAIL, "can't allocate memory for VOL object");
new_vol_obj->driver = vol_driver;
new_vol_obj->data = object;
/* Bump the reference count on the VOL driver */
vol_driver->nrefs++;
/* Create the struct & insert requested ID */
id_ptr->id = id;
id_ptr->count = 1; /* initial reference count*/
id_ptr->app_count = !!app_ref;
id_ptr->obj_ptr = object;
if(H5I_DATATYPE == type) {
void *dt = NULL;
if(NULL == (dt = (void *)H5T_construct_datatype(new_vol_obj)))
HGOTO_ERROR(H5E_ATOM, H5E_CANTINIT, FAIL, "can't construct datatype object");
id_ptr->obj_ptr = dt;
}
else
id_ptr->obj_ptr = new_vol_obj;
/* Insert into the type */
if(H5SL_insert(type_ptr->ids, id_ptr, &id_ptr->id) < 0)
@@ -1840,6 +1878,91 @@ done:
FUNC_LEAVE_API(ret_value)
} /* end H5Isearch() */
/*-------------------------------------------------------------------------
* Function: H5I__iterate_pub_cb
*
* Purpose: Callback routine for H5Iiterate, when it calls
* H5I_iterate. Calls "user" callback search function, and
* then sets return value, based on the result of that
* callback.
*
* Return: Success: H5_ITER_CONT (0) or H5_ITER_STOP (1)
* Failure: H5_ITER_ERROR (-1)
*
* Programmer: Neil Fortner
* Friday, October 11, 2013
*
*-------------------------------------------------------------------------
*/
static int
H5I__iterate_pub_cb(void H5_ATTR_UNUSED *obj, hid_t id, void *_udata)
{
H5I_iterate_pub_ud_t *udata = (H5I_iterate_pub_ud_t *)_udata; /* User data for callback */
herr_t cb_ret_val; /* User callback return value */
int ret_value = H5_ITER_ERROR; /* Callback return value */
FUNC_ENTER_STATIC_NOERR
/* Invoke the callback */
cb_ret_val = (*udata->op)(id, udata->op_data);
/* Set the return value based on the callback's return value */
if(cb_ret_val > 0)
ret_value = H5_ITER_STOP; /* terminate iteration early */
else if(cb_ret_val < 0)
ret_value = H5_ITER_ERROR; /* indicate failure (which terminates iteration) */
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5I__iterate_pub_cb() */
/*-------------------------------------------------------------------------
* Function: H5Iiterate
*
* Purpose: Call the callback funciton op for each member of the id
* type type. op takes as parameters the id and a
* passthrough of op_data, and returns an herr_t. A positive
* return from op will cause the iteration to stop and
* H5Iiterate will return the value returned by op. A
* negative return from op will cause the iteration to stop
* and H5Iiterate will return failure. A zero return from op
* will allow iteration to continue, as long as there are
* other ids remaining in type.
*
* Limitation: Currently there is no way to start searching from where a
* previous search left off.
*
* Return: The last value returned by op
*
* Programmer: Neil Fortner
* Friday, October 11, 2013
*
*-------------------------------------------------------------------------
*/
herr_t
H5Iiterate(H5I_type_t type, H5I_iterate_func_t op, void *op_data)
{
H5I_iterate_pub_ud_t int_udata; /* Internal user data */
herr_t ret_value; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE3("e", "Itx*x", type, op, op_data);
/* Set up udata struct */
int_udata.op = op;
int_udata.op_data = op_data;
/* Note that H5I_iterate returns an error code. We ignore it
* here, as we can't do anything with it without revising the API.
*/
if ((ret_value = H5I_iterate(type, H5I__iterate_pub_cb, &int_udata, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_BADITER, FAIL, "can't iterate over ids")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Iiterate() */
/*-------------------------------------------------------------------------
* Function: H5I__iterate_cb
@@ -1866,10 +1989,26 @@ H5I__iterate_cb(void *_item, void H5_ATTR_UNUSED *_key, void *_udata)
* its reference count is positive.
*/
if((!udata->app_ref) || (item->app_count > 0)) {
H5I_type_t type = udata->obj_type;
const void *obj_ptr = NULL;
herr_t cb_ret_val;
/* The stored object pointer might be an H5VL_object_t, in which
* case we'll need to get the wrapped object struct (H5F_t *, etc.).
*/
if(H5I_FILE == type || H5I_GROUP == type || H5I_DATASET == type || H5I_ATTR == type) {
const H5VL_object_t *vol_obj = (const H5VL_object_t *)item->obj_ptr;
obj_ptr = vol_obj->data;
}
else if(H5I_DATATYPE == type) {
const H5T_t *dt = (const H5T_t *)item->obj_ptr;
obj_ptr = (void *)H5T_get_actual_type(dt);
}
else
obj_ptr = item->obj_ptr;
/* Invoke callback function */
cb_ret_val = (*udata->user_func)((void *)item->obj_ptr, item->id, udata->user_udata); /* (Casting away const OK) */
cb_ret_val = (*udata->user_func)((void *)obj_ptr, item->id, udata->user_udata); /* (Casting away const OK) */
/* Set the return value based on the callback's return value */
if(cb_ret_val > 0)
@@ -1929,6 +2068,7 @@ H5I_iterate(H5I_type_t type, H5I_search_func_t func, void *udata, hbool_t app_re
iter_udata.user_func = func;
iter_udata.user_udata = udata;
iter_udata.app_ref = app_ref;
iter_udata.obj_type = type;
/* Iterate over IDs */
if ((iter_status = H5SL_iterate(type_ptr->ids, H5I__iterate_cb, &iter_udata)) < 0)
@@ -1987,6 +2127,9 @@ done:
*
* Failure: -1
*
* NOTE: Not safe for arbitrary VOL drivers as it relies on
* private H5G calls.
*
* Comments: Public function
* If 'name' is non-NULL then write up to 'size' bytes into that
* buffer and always return the length of the entry name.
@@ -2072,35 +2215,137 @@ done:
static hid_t
H5I__get_file_id(hid_t obj_id, H5I_type_t type)
{
H5VL_object_t *vol_obj = NULL;
void *file = NULL;
hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_STATIC
/* Process based on object type */
if (type == H5I_FILE) {
/* Increment reference count on file ID */
if(H5I_inc_ref(obj_id, TRUE) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTSET, H5I_INVALID_HID, "incrementing file ID failed")
/* Get the object pointer */
if (NULL == (vol_obj = H5VL_get_object(obj_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid identifier")
/* Set return value */
ret_value = obj_id;
/* Get the file through the VOL */
if (H5VL_file_get(vol_obj->data, vol_obj->driver->cls, H5VL_OBJECT_GET_FILE, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, type, &file) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, H5I_INVALID_HID, "unable to get file")
if (NULL == file)
HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, H5I_INVALID_HID, "unable to get the file through the VOL")
/* Check if the file's ID already exists */
if (H5I_find_id(file, H5I_FILE, &ret_value) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTGET, H5I_INVALID_HID, "getting file ID failed")
/* If the ID does not exist, register it with the VOL driver */
if (H5I_INVALID_HID == ret_value) {
if ((ret_value = H5VL_register_id(H5I_FILE, file, vol_obj->driver, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to atomize file handle")
}
else {
H5G_loc_t loc; /* Location of object */
/* Get the object location information */
if(H5G_loc(obj_id, &loc) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTGET, H5I_INVALID_HID, "can't get object location")
/* Get the file ID for the object */
if((ret_value = H5F_get_id(loc.oloc->file, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTGET, H5I_INVALID_HID, "can't get file ID")
/* Increment ref count on existing ID */
if (H5I_inc_ref(ret_value, TRUE) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTSET, H5I_INVALID_HID, "incrementing file ID failed")
}
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5I__get_file_id() */
/*-------------------------------------------------------------------------
* Function: H5I__find_id_cb
*
* Purpose: Callback for searching for an ID with a specific pointer
*
* Return: Success: H5_ITER_CONT (0) or H5_ITER_STOP (1)
* Failure: H5_ITER_ERROR (-1)
*
*-------------------------------------------------------------------------
*/
static int
H5I__find_id_cb(void *_item, void H5_ATTR_UNUSED *_key, void *_udata)
{
H5I_id_info_t *item = (H5I_id_info_t *)_item; /* Pointer to the ID node */
H5I_get_id_ud_t *udata = (H5I_get_id_ud_t *)_udata; /* Pointer to user data */
H5I_type_t type = udata->obj_type;
const void *obj_ptr = NULL;
int ret_value = H5_ITER_CONT; /* Return value */
FUNC_ENTER_STATIC_NOERR
/* Sanity check */
HDassert(item);
HDassert(udata);
/* Get a pointer to the VOL driver's data */
if (H5I_FILE == type || H5I_GROUP == type || H5I_DATASET == type || H5I_ATTR == type) {
const H5VL_object_t *vol_obj = (const H5VL_object_t *)item->obj_ptr;
obj_ptr = vol_obj->data;
}
else if (H5I_DATATYPE == type) {
const H5T_t *dt = (const H5T_t *)item->obj_ptr;
obj_ptr = (void *)H5T_get_actual_type(dt);
}
else
obj_ptr = item->obj_ptr;
/* Check for a match */
if (obj_ptr == udata->object) {
udata->ret_id = item->id;
ret_value = H5_ITER_STOP;
}
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5I__find_id_cb() */
/*-------------------------------------------------------------------------
* Function: H5I_find_id
*
* Purpose: Return the ID of an object by searching through the ID list
* for the type.
*
* Return: SUCCEED/FAIL
* (id will be set to H5I_INVALID_HID on errors or not found)
*
*-------------------------------------------------------------------------
*/
herr_t
H5I_find_id(const void *object, H5I_type_t type, hid_t *id)
{
H5I_id_type_t *type_ptr; /* Pointer to the type */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
HDassert(id);
*id = H5I_INVALID_HID;
type_ptr = H5I_id_type_list_g[type];
if (!type_ptr || type_ptr->init_count <= 0)
HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "invalid type")
/* Only iterate through ID list if it is initialized and there are IDs in type */
if (type_ptr->init_count > 0 && type_ptr->id_count > 0) {
H5I_get_id_ud_t udata; /* User data */
herr_t iter_status; /* Iteration status */
/* Set up iterator user data */
udata.object = object;
udata.obj_type = type;
udata.ret_id = H5I_INVALID_HID;
/* Iterate over IDs for the ID type */
if ((iter_status = H5SL_iterate(type_ptr->ids, H5I__find_id_cb, &udata)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_BADITER, FAIL, "iteration failed")
*id = udata.ret_id;
}
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5I_find_id() */
/*-------------------------------------------------------------------------
* Function: H5I__id_dump_cb
@@ -2117,6 +2362,7 @@ H5I__id_dump_cb(void *_item, void H5_ATTR_UNUSED *_key, void *_udata)
H5I_id_info_t *item = (H5I_id_info_t *)_item; /* Pointer to the ID node */
H5I_type_t type = *(H5I_type_t *)_udata; /* User data */
H5G_name_t *path = NULL; /* Path to file object */
const void *obj_ptr = NULL; /* Pointer to VOL driver object */
FUNC_ENTER_STATIC_NOERR
@@ -2128,17 +2374,31 @@ H5I__id_dump_cb(void *_item, void H5_ATTR_UNUSED *_key, void *_udata)
switch (type) {
case H5I_GROUP:
{
path = H5G_nameof((H5G_t*)item->obj_ptr);
const H5VL_object_t *vol_obj = (const H5VL_object_t *)item->obj_ptr;
obj_ptr = vol_obj->data;
if(H5_VOL_NATIVE == vol_obj->driver->cls->value)
path = H5G_nameof((H5G_t *)obj_ptr);
break;
}
case H5I_DATASET:
{
path = H5D_nameof((H5D_t*)item->obj_ptr);
const H5VL_object_t *vol_obj = (const H5VL_object_t *)item->obj_ptr;
obj_ptr = vol_obj->data;
if(H5_VOL_NATIVE == vol_obj->driver->cls->value)
path = H5D_nameof((H5D_t *)obj_ptr);
break;
}
case H5I_DATATYPE:
{
path = H5T_nameof((H5T_t*)item->obj_ptr);
const H5T_t *dt = (const H5T_t *)item->obj_ptr;
obj_ptr = (void *)H5T_get_actual_type(dt);
path = H5T_nameof((H5T_t *)obj_ptr);
break;
}
case H5I_UNINIT:
@@ -2148,6 +2408,7 @@ H5I__id_dump_cb(void *_item, void H5_ATTR_UNUSED *_key, void *_udata)
case H5I_ATTR:
case H5I_REFERENCE:
case H5I_VFL:
case H5I_VOL:
case H5I_GENPROP_CLS:
case H5I_GENPROP_LST:
case H5I_ERROR_CLASS:
+3 -1
View File
@@ -25,6 +25,7 @@
/* Private headers needed by this file */
#include "H5private.h"
#include "H5VLprivate.h"
/**************************/
/* Library Private Macros */
@@ -67,7 +68,7 @@ H5_DLL herr_t H5I_register_type(const H5I_class_t *cls);
H5_DLL int64_t H5I_nmembers(H5I_type_t type);
H5_DLL herr_t H5I_clear_type(H5I_type_t type, hbool_t force, hbool_t app_ref);
H5_DLL hid_t H5I_register(H5I_type_t type, const void *object, hbool_t app_ref);
H5_DLL herr_t H5I_register_with_id(H5I_type_t type, const void *object, hbool_t app_ref, hid_t id);
H5_DLL herr_t H5I_register_with_id(H5I_type_t type, void *object, H5VL_t *vol_driver, hbool_t app_ref, hid_t id);
H5_DLL void *H5I_subst(hid_t id, const void *new_object);
H5_DLL void *H5I_object(hid_t id);
H5_DLL void *H5I_object_verify(hid_t id, H5I_type_t id_type);
@@ -80,6 +81,7 @@ H5_DLL int H5I_dec_ref(hid_t id);
H5_DLL int H5I_dec_app_ref(hid_t id);
H5_DLL int H5I_dec_app_ref_always_close(hid_t id);
H5_DLL int H5I_dec_type_ref(H5I_type_t type);
H5_DLL herr_t H5I_find_id(const void *object, H5I_type_t type, hid_t *id /*out*/);
/* Debugging functions */
H5_DLL herr_t H5I_dump_ids_for_type(H5I_type_t type);
+5
View File
@@ -44,6 +44,7 @@ typedef enum H5I_type_t {
H5I_ATTR, /* type ID for Attribute objects */
H5I_REFERENCE, /* *DEPRECATED* type ID for Reference objects */
H5I_VFL, /* type ID for virtual file layer */
H5I_VOL, /* type ID for virtual object layer */
H5I_GENPROP_CLS, /* type ID for generic property list classes */
H5I_GENPROP_LST, /* type ID for generic property lists */
H5I_ERROR_CLASS, /* type ID for error classes */
@@ -71,6 +72,9 @@ typedef herr_t (*H5I_free_t)(void *);
/* Type of the function to compare objects & keys */
typedef int (*H5I_search_func_t)(void *obj, hid_t id, void *key);
/* Type of the H5Iiterate callback function */
typedef herr_t (*H5I_iterate_func_t)(hid_t id, void *udata);
#ifdef __cplusplus
extern "C" {
#endif
@@ -93,6 +97,7 @@ H5_DLL int H5Iinc_type_ref(H5I_type_t type);
H5_DLL int H5Idec_type_ref(H5I_type_t type);
H5_DLL int H5Iget_type_ref(H5I_type_t type);
H5_DLL void *H5Isearch(H5I_type_t type, H5I_search_func_t func, void *key);
H5_DLL herr_t H5Iiterate(H5I_type_t type, H5I_iterate_func_t op, void *op_data);
H5_DLL herr_t H5Inmembers(H5I_type_t type, hsize_t *num_members);
H5_DLL htri_t H5Itype_exists(H5I_type_t type);
H5_DLL htri_t H5Iis_valid(hid_t id);
+370 -104
View File
@@ -33,6 +33,9 @@
#include "H5MMprivate.h" /* Memory management */
#include "H5Oprivate.h" /* File objects */
#include "H5Pprivate.h" /* Property lists */
#include "H5VLprivate.h" /* Virtual Object Layer */
#include "H5VLnative.h" /* Virtual Object Layer (native) */
/****************/
/* Local Macros */
@@ -272,8 +275,10 @@ herr_t
H5Lmove(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id,
const char *dst_name, hid_t lcpl_id, hid_t lapl_id)
{
H5G_loc_t src_loc, *src_loc_p;
H5G_loc_t dst_loc, *dst_loc_p;
H5VL_object_t *vol_obj1 = NULL; /* Object token of src_id */
H5VL_loc_params_t loc_params1;
H5VL_object_t *vol_obj2 = NULL; /* Object token of dst_id */
H5VL_loc_params_t loc_params2;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -283,10 +288,6 @@ H5Lmove(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id,
/* Check arguments */
if(src_loc_id == H5L_SAME_LOC && dst_loc_id == H5L_SAME_LOC)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "source and destination should not both be H5L_SAME_LOC")
if(src_loc_id != H5L_SAME_LOC && H5G_loc(src_loc_id, &src_loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(dst_loc_id != H5L_SAME_LOC && H5G_loc(dst_loc_id, &dst_loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!src_name || !*src_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no current name specified")
if(!dst_name || !*dst_name)
@@ -294,21 +295,49 @@ H5Lmove(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id,
if(lcpl_id != H5P_DEFAULT && (TRUE != H5P_isa_class(lcpl_id, H5P_LINK_CREATE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a link creation property list")
/* Check the link create property list */
if(H5P_DEFAULT == lcpl_id)
lcpl_id = H5P_LINK_CREATE_DEFAULT;
/* Verify access property list and set up collective metadata if appropriate */
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC,
((src_loc_id != H5L_SAME_LOC) ? src_loc_id : dst_loc_id), TRUE) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTSET, FAIL, "can't set access property list info")
/* Set up src & dst location pointers */
src_loc_p = &src_loc;
dst_loc_p = &dst_loc;
if(src_loc_id == H5L_SAME_LOC)
src_loc_p = dst_loc_p;
else if(dst_loc_id == H5L_SAME_LOC)
dst_loc_p = src_loc_p;
/* Set location paramter for source object */
loc_params1.type = H5VL_OBJECT_BY_NAME;
loc_params1.loc_data.loc_by_name.name = src_name;
loc_params1.loc_data.loc_by_name.lapl_id = lapl_id;
loc_params1.obj_type = H5I_get_type(src_loc_id);
/* Set location paramter for destination object */
loc_params2.type = H5VL_OBJECT_BY_NAME;
loc_params2.loc_data.loc_by_name.name = dst_name;
loc_params2.loc_data.loc_by_name.lapl_id = lapl_id;
loc_params2.obj_type = H5I_get_type(dst_loc_id);
if (H5L_SAME_LOC != src_loc_id) {
/* Get the location object */
if (NULL == (vol_obj1 = (H5VL_object_t *)H5I_object(src_loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
}
if (H5L_SAME_LOC != dst_loc_id) {
/* Get the location object */
if (NULL == (vol_obj2 = (H5VL_object_t *)H5I_object(dst_loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
}
/* Make sure that the VOL drivers are the same */
if (vol_obj1 && vol_obj2) {
if (vol_obj1->driver->cls->value != vol_obj2->driver->cls->value)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "Objects are accessed through different VOL plugins and can't be linked")
}
/* Move the link */
if(H5L_move(src_loc_p, src_name, dst_loc_p, dst_name, FALSE, lcpl_id) < 0)
if (H5VL_link_move((vol_obj1 ? vol_obj1->data : NULL), loc_params1,
(vol_obj2 ? vol_obj2->data : NULL), loc_params2,
(vol_obj1 ? vol_obj1->driver->cls : vol_obj2->driver->cls),
lcpl_id, lapl_id, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTMOVE, FAIL, "unable to move link")
done:
@@ -334,8 +363,10 @@ herr_t
H5Lcopy(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id,
const char *dst_name, hid_t lcpl_id, hid_t lapl_id)
{
H5G_loc_t src_loc, *src_loc_p;
H5G_loc_t dst_loc, *dst_loc_p;
H5VL_object_t *vol_obj1 = NULL; /* Object token of src_id */
H5VL_loc_params_t loc_params1;
H5VL_object_t *vol_obj2 = NULL; /* Object token of dst_id */
H5VL_loc_params_t loc_params2;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -345,10 +376,6 @@ H5Lcopy(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id,
/* Check arguments */
if(src_loc_id == H5L_SAME_LOC && dst_loc_id == H5L_SAME_LOC)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "source and destination should not both be H5L_SAME_LOC")
if(src_loc_id != H5L_SAME_LOC && H5G_loc(src_loc_id, &src_loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(dst_loc_id != H5L_SAME_LOC && H5G_loc(dst_loc_id, &dst_loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!src_name || !*src_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no current name specified")
if(!dst_name || !*dst_name)
@@ -361,16 +388,45 @@ H5Lcopy(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id,
((src_loc_id != H5L_SAME_LOC) ? src_loc_id : dst_loc_id), TRUE) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTSET, FAIL, "can't set access property list info")
/* Set up src & dst location pointers */
src_loc_p = &src_loc;
dst_loc_p = &dst_loc;
if(src_loc_id == H5L_SAME_LOC)
src_loc_p = dst_loc_p;
else if(dst_loc_id == H5L_SAME_LOC)
dst_loc_p = src_loc_p;
/* Check the link create property list */
if(H5P_DEFAULT == lcpl_id)
lcpl_id = H5P_LINK_CREATE_DEFAULT;
/* Set location paramter for source object */
loc_params1.type = H5VL_OBJECT_BY_NAME;
loc_params1.loc_data.loc_by_name.name = src_name;
loc_params1.loc_data.loc_by_name.lapl_id = lapl_id;
loc_params1.obj_type = H5I_get_type(src_loc_id);
/* Set location paramter for destination object */
loc_params2.type = H5VL_OBJECT_BY_NAME;
loc_params2.loc_data.loc_by_name.name = dst_name;
loc_params2.loc_data.loc_by_name.lapl_id = lapl_id;
loc_params2.obj_type = H5I_get_type(dst_loc_id);
if(H5L_SAME_LOC != src_loc_id) {
/* Get the location object */
if(NULL == (vol_obj1 = (H5VL_object_t *)H5I_object(src_loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
}
if(H5L_SAME_LOC != dst_loc_id) {
/* Get the location object */
if(NULL == (vol_obj2 = (H5VL_object_t *)H5I_object(dst_loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
}
/* Make sure that the VOL plugins are the same */
if(vol_obj1 && vol_obj2) {
if(vol_obj1->driver->cls->value != vol_obj2->driver->cls->value)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "Objects are accessed through different VOL plugins and can't be linked")
}
/* Copy the link */
if(H5L_move(src_loc_p, src_name, dst_loc_p, dst_name, TRUE, lcpl_id) < 0)
if(H5VL_link_copy((vol_obj1 ? vol_obj1->data : NULL), loc_params1,
(vol_obj2 ? vol_obj2->data : NULL), loc_params2,
(vol_obj1 ? vol_obj1->driver->cls : vol_obj2->driver->cls),
lcpl_id, lapl_id, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTMOVE, FAIL, "unable to copy link")
done:
@@ -397,18 +453,20 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
H5Lcreate_soft(const char *link_target, hid_t link_loc_id,
const char *link_name, hid_t lcpl_id, hid_t lapl_id)
H5Lcreate_soft(const char *link_target, hid_t link_loc_id, const char *link_name,
hid_t lcpl_id, hid_t lapl_id)
{
H5G_loc_t link_loc; /* Group location for new link */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
H5P_genplist_t *plist = NULL; /* Property list pointer */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE5("e", "*si*sii", link_target, link_loc_id, link_name, lcpl_id, lapl_id);
/* Check arguments */
if(H5G_loc(link_loc_id, &link_loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(link_loc_id == H5L_SAME_LOC)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "link location id should not be H5L_SAME_LOC")
if(!link_target)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "link_target parameter cannot be NULL")
if(!*link_target)
@@ -420,12 +478,35 @@ H5Lcreate_soft(const char *link_target, hid_t link_loc_id,
if(lcpl_id != H5P_DEFAULT && (TRUE != H5P_isa_class(lcpl_id, H5P_LINK_CREATE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a link creation property list")
/* Check the group access property list */
if(H5P_DEFAULT == lcpl_id)
lcpl_id = H5P_LINK_CREATE_DEFAULT;
/* Set location fields */
loc_params.type = H5VL_OBJECT_BY_NAME;
loc_params.loc_data.loc_by_name.name = link_name;
loc_params.loc_data.loc_by_name.lapl_id = lapl_id;
loc_params.obj_type = H5I_get_type(link_loc_id);
/* get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5VL_get_object(link_loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Get the plist structure */
if(NULL == (plist = (H5P_genplist_t *)H5I_object(lcpl_id)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
/* set creation properties */
if(H5P_set(plist, H5VL_PROP_LINK_TARGET_NAME, &link_target) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get property value for target name")
/* Verify access property list and set up collective metadata if appropriate */
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, link_loc_id, TRUE) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTSET, FAIL, "can't set access property list info")
/* Create the link */
if(H5L_create_soft(link_target, &link_loc, link_name, lcpl_id) < 0)
if(H5VL_link_create(H5VL_LINK_CREATE_SOFT, vol_obj->data, loc_params, vol_obj->driver->cls,
lcpl_id, lapl_id, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTCREATE, FAIL, "unable to create soft link")
done:
@@ -453,8 +534,11 @@ herr_t
H5Lcreate_hard(hid_t cur_loc_id, const char *cur_name,
hid_t new_loc_id, const char *new_name, hid_t lcpl_id, hid_t lapl_id)
{
H5G_loc_t cur_loc, *cur_loc_p;
H5G_loc_t new_loc, *new_loc_p;
H5VL_object_t *vol_obj1 = NULL; /* object token of cur_loc_id */
H5VL_object_t *vol_obj2 = NULL; /* object token of new_loc_id */
H5VL_loc_params_t loc_params1;
H5VL_loc_params_t loc_params2;
H5P_genplist_t *plist; /* Property list pointer */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -464,10 +548,6 @@ H5Lcreate_hard(hid_t cur_loc_id, const char *cur_name,
/* Check arguments */
if(cur_loc_id == H5L_SAME_LOC && new_loc_id == H5L_SAME_LOC)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "source and destination should not be both H5L_SAME_LOC")
if(cur_loc_id != H5L_SAME_LOC && H5G_loc(cur_loc_id, &cur_loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(new_loc_id != H5L_SAME_LOC && H5G_loc(new_loc_id, &new_loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!cur_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cur_name parameter cannot be NULL")
if(!*cur_name)
@@ -479,22 +559,56 @@ H5Lcreate_hard(hid_t cur_loc_id, const char *cur_name,
if(lcpl_id != H5P_DEFAULT && (TRUE != H5P_isa_class(lcpl_id, H5P_LINK_CREATE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a link creation property list")
/* Check the link create property list */
if(H5P_DEFAULT == lcpl_id)
lcpl_id = H5P_LINK_CREATE_DEFAULT;
/* Verify access property list and set up collective metadata if appropriate */
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, cur_loc_id, TRUE) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTSET, FAIL, "can't set access property list info")
/* Set up current & new location pointers */
cur_loc_p = &cur_loc;
new_loc_p = &new_loc;
if(cur_loc_id == H5L_SAME_LOC)
cur_loc_p = new_loc_p;
else if(new_loc_id == H5L_SAME_LOC)
new_loc_p = cur_loc_p;
else if(cur_loc_p->oloc->file != new_loc_p->oloc->file)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "source and destination should be in the same file.")
/* Set up current & new location structs */
loc_params1.type = H5VL_OBJECT_BY_NAME;
loc_params1.obj_type = H5I_get_type(cur_loc_id);
loc_params1.loc_data.loc_by_name.name = cur_name;
loc_params1.loc_data.loc_by_name.lapl_id = lapl_id;
loc_params2.type = H5VL_OBJECT_BY_NAME;
loc_params2.obj_type = H5I_get_type(new_loc_id);
loc_params2.loc_data.loc_by_name.name = new_name;
loc_params2.loc_data.loc_by_name.lapl_id = lapl_id;
if(H5L_SAME_LOC != cur_loc_id) {
/* Get the current location object */
if (NULL == (vol_obj1 = (H5VL_object_t *)H5VL_get_object(cur_loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
}
if(H5L_SAME_LOC != new_loc_id) {
/* Get the new location object */
if(NULL == (vol_obj2 = (H5VL_object_t *)H5VL_get_object(new_loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
}
/* Make sure that the VOL drivers are the same */
if(vol_obj1 && vol_obj2) {
if(vol_obj1->driver->cls->value != vol_obj2->driver->cls->value)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "Objects are accessed through different VOL drivers and can't be linked")
}
/* Get the link creation plist structure */
if(NULL == (plist = (H5P_genplist_t *)H5I_object(lcpl_id)))
HGOTO_ERROR(H5E_LINK, H5E_BADATOM, FAIL, "can't find object for ID")
/* Set creation properties */
if(H5P_set(plist, H5VL_PROP_LINK_TARGET, (vol_obj1 ? &(vol_obj1->data) : NULL)) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "can't set property value for target id")
if(H5P_set(plist, H5VL_PROP_LINK_TARGET_LOC_PARAMS, &loc_params1) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "can't set property value for target name")
/* Create the link */
if(H5L_create_hard(cur_loc_p, cur_name, new_loc_p, new_name, lcpl_id) < 0)
if(H5VL_link_create(H5VL_LINK_CREATE_HARD, (vol_obj2 ? (vol_obj2->data) : NULL), loc_params2,
(vol_obj1 != NULL ? vol_obj1->driver->cls : vol_obj2->driver->cls),
lcpl_id, lapl_id, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTCREATE, FAIL, "unable to create hard link")
done:
@@ -530,7 +644,9 @@ herr_t
H5Lcreate_ud(hid_t link_loc_id, const char *link_name, H5L_type_t link_type,
const void *udata, size_t udata_size, hid_t lcpl_id, hid_t lapl_id)
{
H5G_loc_t link_loc;
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
H5P_genplist_t *plist; /* Property list pointer */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -538,19 +654,43 @@ H5Lcreate_ud(hid_t link_loc_id, const char *link_name, H5L_type_t link_type,
udata_size, lcpl_id, lapl_id);
/* Check arguments */
if(H5G_loc(link_loc_id, &link_loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!link_name || !*link_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no link name specified")
if(link_type < H5L_TYPE_UD_MIN || link_type > H5L_TYPE_MAX)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid link class")
/* Check the group access property list */
if(H5P_DEFAULT == lcpl_id)
lcpl_id = H5P_LINK_CREATE_DEFAULT;
/* Verify access property list and set up collective metadata if appropriate */
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, link_loc_id, TRUE) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTSET, FAIL, "can't set access property list info")
loc_params.type = H5VL_OBJECT_BY_NAME;
loc_params.loc_data.loc_by_name.name = link_name;
loc_params.loc_data.loc_by_name.lapl_id = lapl_id;
loc_params.obj_type = H5I_get_type(link_loc_id);
/* get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(link_loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Get the plist structure */
if(NULL == (plist = (H5P_genplist_t *)H5I_object(lcpl_id)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
/* set creation properties */
if(H5P_set(plist, H5VL_PROP_LINK_TYPE, &link_type) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get property value from plist")
if(H5P_set(plist, H5VL_PROP_LINK_UDATA, &udata) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get property value from plist")
if(H5P_set(plist, H5VL_PROP_LINK_UDATA_SIZE, &udata_size) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get property value from plist")
/* Create external link */
if(H5L__create_ud(&link_loc, link_name, udata, udata_size, link_type, lcpl_id) < 0)
if(H5VL_link_create(H5VL_LINK_CREATE_UD, vol_obj->data, loc_params, vol_obj->driver->cls,
lcpl_id, lapl_id, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create link")
done:
@@ -578,15 +718,14 @@ done:
herr_t
H5Ldelete(hid_t loc_id, const char *name, hid_t lapl_id)
{
H5G_loc_t loc; /* Group's location */
H5VL_object_t *vol_obj = NULL; /* Object token of loc_id */
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE3("e", "i*si", loc_id, name, lapl_id);
/* Check arguments */
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!name || !*name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
@@ -594,8 +733,19 @@ H5Ldelete(hid_t loc_id, const char *name, hid_t lapl_id)
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, loc_id, TRUE) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTSET, FAIL, "can't set access property list info")
/* Fill in the location struct fields */
loc_params.type = H5VL_OBJECT_BY_NAME;
loc_params.obj_type = H5I_get_type(loc_id);
loc_params.loc_data.loc_by_name.name = name;
loc_params.loc_data.loc_by_name.lapl_id = lapl_id;
/* get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Unlink */
if(H5L_delete(&loc, name) < 0)
if(H5VL_link_specific(vol_obj->data, loc_params, vol_obj->driver->cls, H5VL_LINK_DELETE,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTDELETE, FAIL, "unable to delete link")
done:
@@ -626,15 +776,14 @@ herr_t
H5Ldelete_by_idx(hid_t loc_id, const char *group_name, H5_index_t idx_type,
H5_iter_order_t order, hsize_t n, hid_t lapl_id)
{
H5G_loc_t loc; /* Group's location */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE6("e", "i*sIiIohi", loc_id, group_name, idx_type, order, n, lapl_id);
/* Check arguments */
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!group_name || !*group_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified")
if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
@@ -646,8 +795,21 @@ H5Ldelete_by_idx(hid_t loc_id, const char *group_name, H5_index_t idx_type,
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, loc_id, TRUE) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTSET, FAIL, "can't set access property list info")
loc_params.type = H5VL_OBJECT_BY_IDX;
loc_params.loc_data.loc_by_idx.name = group_name;
loc_params.loc_data.loc_by_idx.idx_type = idx_type;
loc_params.loc_data.loc_by_idx.order = order;
loc_params.loc_data.loc_by_idx.n = n;
loc_params.loc_data.loc_by_idx.lapl_id = lapl_id;
loc_params.obj_type = H5I_get_type(loc_id);
/* Get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Delete the link */
if(H5L_delete_by_idx(&loc, group_name, idx_type, order, n) < 0)
if(H5VL_link_specific(vol_obj->data, loc_params, vol_obj->driver->cls, H5VL_LINK_DELETE,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTDELETE, FAIL, "unable to delete link")
done:
@@ -678,15 +840,14 @@ herr_t
H5Lget_val(hid_t loc_id, const char *name, void *buf/*out*/, size_t size,
hid_t lapl_id)
{
H5G_loc_t loc; /* Group location for location to query */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE5("e", "i*sxzi", loc_id, name, buf, size, lapl_id);
/* Check arguments */
if(H5G_loc(loc_id, &loc))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!name || !*name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified")
@@ -694,8 +855,18 @@ H5Lget_val(hid_t loc_id, const char *name, void *buf/*out*/, size_t size,
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, loc_id, FALSE) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTSET, FAIL, "can't set access property list info")
loc_params.type = H5VL_OBJECT_BY_NAME;
loc_params.obj_type = H5I_get_type(loc_id);
loc_params.loc_data.loc_by_name.name = name;
loc_params.loc_data.loc_by_name.lapl_id = lapl_id;
/* Get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Get the link value */
if(H5L_get_val(&loc, name, buf, size) < 0)
if(H5VL_link_get(vol_obj->data, loc_params, vol_obj->driver->cls, H5VL_LINK_GET_VAL,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, buf, size) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "unable to get link value for '%s'", name)
done:
@@ -726,7 +897,8 @@ H5Lget_val_by_idx(hid_t loc_id, const char *group_name, H5_index_t idx_type,
H5_iter_order_t order, hsize_t n, void *buf/*out*/, size_t size,
hid_t lapl_id)
{
H5G_loc_t loc; /* Group location for location to query */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -734,8 +906,6 @@ H5Lget_val_by_idx(hid_t loc_id, const char *group_name, H5_index_t idx_type,
lapl_id);
/* Check arguments */
if(H5G_loc(loc_id, &loc))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!group_name || !*group_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified")
if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
@@ -747,8 +917,21 @@ H5Lget_val_by_idx(hid_t loc_id, const char *group_name, H5_index_t idx_type,
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, loc_id, FALSE) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTSET, FAIL, "can't set access property list info")
loc_params.type = H5VL_OBJECT_BY_IDX;
loc_params.loc_data.loc_by_idx.name = group_name;
loc_params.loc_data.loc_by_idx.idx_type = idx_type;
loc_params.loc_data.loc_by_idx.order = order;
loc_params.loc_data.loc_by_idx.n = n;
loc_params.loc_data.loc_by_idx.lapl_id = lapl_id;
loc_params.obj_type = H5I_get_type(loc_id);
/* get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Get the link value */
if(H5L_get_val_by_idx(&loc, group_name, idx_type, order, n, buf, size) < 0)
if(H5VL_link_get(vol_obj->data, loc_params, vol_obj->driver->cls, H5VL_LINK_GET_VAL,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, buf, size) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "unable to get link value")
done:
@@ -771,15 +954,14 @@ done:
htri_t
H5Lexists(hid_t loc_id, const char *name, hid_t lapl_id)
{
H5G_loc_t loc;
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
htri_t ret_value = FAIL; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE3("t", "i*si", loc_id, name, lapl_id);
/* Check arguments */
if(H5G_loc(loc_id, &loc))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "name parameter cannot be NULL")
if(!*name)
@@ -789,8 +971,19 @@ H5Lexists(hid_t loc_id, const char *name, hid_t lapl_id)
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, loc_id, FALSE) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTSET, FAIL, "can't set access property list info")
/* Set location struct fields */
loc_params.type = H5VL_OBJECT_BY_NAME;
loc_params.obj_type = H5I_get_type(loc_id);
loc_params.loc_data.loc_by_name.name = name;
loc_params.loc_data.loc_by_name.lapl_id = lapl_id;
/* Get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Check for the existence of the link */
if((ret_value = H5L_exists(&loc, name)) < 0)
if(H5VL_link_specific(vol_obj->data, loc_params, vol_obj->driver->cls, H5VL_LINK_EXISTS,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, &ret_value) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "unable to get link info")
done:
@@ -816,15 +1009,14 @@ herr_t
H5Lget_info(hid_t loc_id, const char *name, H5L_info_t *linfo /*out*/,
hid_t lapl_id)
{
H5G_loc_t loc;
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE4("e", "i*sxi", loc_id, name, linfo, lapl_id);
/* Check arguments */
if(H5G_loc(loc_id, &loc))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!name || !*name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified")
@@ -832,8 +1024,18 @@ H5Lget_info(hid_t loc_id, const char *name, H5L_info_t *linfo /*out*/,
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, loc_id, TRUE) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTSET, FAIL, "can't set access property list info")
loc_params.type = H5VL_OBJECT_BY_NAME;
loc_params.obj_type = H5I_get_type(loc_id);
loc_params.loc_data.loc_by_name.name = name;
loc_params.loc_data.loc_by_name.lapl_id = lapl_id;
/* get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Get the link information */
if(H5L_get_info(&loc, name, linfo) < 0)
if(H5VL_link_get(vol_obj->data, loc_params, vol_obj->driver->cls, H5VL_LINK_GET_INFO,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, linfo) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "unable to get link info")
done:
@@ -860,7 +1062,8 @@ H5Lget_info_by_idx(hid_t loc_id, const char *group_name,
H5_index_t idx_type, H5_iter_order_t order, hsize_t n,
H5L_info_t *linfo /*out*/, hid_t lapl_id)
{
H5G_loc_t loc; /* Group location for group to query */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -868,8 +1071,6 @@ H5Lget_info_by_idx(hid_t loc_id, const char *group_name,
lapl_id);
/* Check arguments */
if(H5G_loc(loc_id, &loc))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!group_name || !*group_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified")
if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
@@ -881,8 +1082,21 @@ H5Lget_info_by_idx(hid_t loc_id, const char *group_name,
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, loc_id, FALSE) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTSET, FAIL, "can't set access property list info")
loc_params.type = H5VL_OBJECT_BY_IDX;
loc_params.loc_data.loc_by_idx.name = group_name;
loc_params.loc_data.loc_by_idx.idx_type = idx_type;
loc_params.loc_data.loc_by_idx.order = order;
loc_params.loc_data.loc_by_idx.n = n;
loc_params.loc_data.loc_by_idx.lapl_id = lapl_id;
loc_params.obj_type = H5I_get_type(loc_id);
/* get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Get the link information */
if(H5L_get_info_by_idx(&loc, group_name, idx_type, order, n, linfo) < 0)
if(H5VL_link_get(vol_obj->data, loc_params, vol_obj->driver->cls, H5VL_LINK_GET_INFO,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, linfo) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "unable to get link info")
done:
@@ -1044,7 +1258,8 @@ H5Lget_name_by_idx(hid_t loc_id, const char *group_name,
H5_index_t idx_type, H5_iter_order_t order, hsize_t n,
char *name /*out*/, size_t size, hid_t lapl_id)
{
H5G_loc_t loc; /* Location of group */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
ssize_t ret_value = -1; /* Return value */
FUNC_ENTER_API((-1))
@@ -1052,8 +1267,6 @@ H5Lget_name_by_idx(hid_t loc_id, const char *group_name,
lapl_id);
/* Check arguments */
if(H5G_loc(loc_id, &loc))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, (-1), "not a location")
if(!group_name || !*group_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, (-1), "no name specified")
if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
@@ -1065,8 +1278,22 @@ H5Lget_name_by_idx(hid_t loc_id, const char *group_name,
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, loc_id, TRUE) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTSET, (-1), "can't set access property list info")
/* Fill in location struct fields */
loc_params.type = H5VL_OBJECT_BY_IDX;
loc_params.loc_data.loc_by_idx.name = group_name;
loc_params.loc_data.loc_by_idx.idx_type = idx_type;
loc_params.loc_data.loc_by_idx.order = order;
loc_params.loc_data.loc_by_idx.n = n;
loc_params.loc_data.loc_by_idx.lapl_id = lapl_id;
loc_params.obj_type = H5I_get_type(loc_id);
/* Get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, (-1), "invalid location identifier")
/* Get the link information */
if((ret_value = H5L_get_name_by_idx(&loc, group_name, idx_type, order, n, name, size)) < 0)
if(H5VL_link_get(vol_obj->data, loc_params, vol_obj->driver->cls, H5VL_LINK_GET_NAME,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, name, size, &ret_value) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTGET, (-1), "unable to get link name")
done:
@@ -1096,7 +1323,8 @@ herr_t
H5Literate(hid_t group_id, H5_index_t idx_type, H5_iter_order_t order,
hsize_t *idx_p, H5L_iterate_t op, void *op_data)
{
H5G_loc_t loc;
H5VL_object_t *vol_obj = NULL; /* Object token of loc_id */
H5VL_loc_params_t loc_params;
H5I_type_t id_type; /* Type of ID */
herr_t ret_value; /* Return value */
@@ -1104,8 +1332,6 @@ H5Literate(hid_t group_id, H5_index_t idx_type, H5_iter_order_t order,
H5TRACE6("e", "iIiIo*hx*x", group_id, idx_type, order, idx_p, op, op_data);
/* Check arguments */
if(H5G_loc(group_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
id_type = H5I_get_type(group_id);
if (!(H5I_GROUP == id_type || H5I_FILE == id_type))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid argument")
@@ -1116,8 +1342,18 @@ H5Literate(hid_t group_id, H5_index_t idx_type, H5_iter_order_t order,
if (!op)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no operator specified")
/* Get the location object */
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object(group_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Set location struct fields */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(group_id);
/* Iterate over the links */
if((ret_value = H5L_iterate(&loc, ".", idx_type, order, idx_p, op, op_data)) < 0)
if((ret_value = H5VL_link_specific(vol_obj->data, loc_params, vol_obj->driver->cls, H5VL_LINK_ITER,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL,
FALSE, idx_type, order, idx_p, op, op_data)) < 0)
HGOTO_ERROR(H5E_LINK, H5E_BADITER, FAIL, "link iteration failed")
done:
@@ -1152,7 +1388,8 @@ H5Literate_by_name(hid_t loc_id, const char *group_name,
H5_index_t idx_type, H5_iter_order_t order, hsize_t *idx_p,
H5L_iterate_t op, void *op_data, hid_t lapl_id)
{
H5G_loc_t loc;
H5VL_object_t *vol_obj = NULL; /* Object token of loc_id */
H5VL_loc_params_t loc_params;
herr_t ret_value; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -1160,8 +1397,6 @@ H5Literate_by_name(hid_t loc_id, const char *group_name,
op_data, lapl_id);
/* Check arguments */
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!group_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "group_name parameter cannot be NULL")
if(!*group_name)
@@ -1177,8 +1412,19 @@ H5Literate_by_name(hid_t loc_id, const char *group_name,
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, loc_id, FALSE) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTSET, FAIL, "can't set access property list info")
/* Get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Set location struct fields */
loc_params.type = H5VL_OBJECT_BY_NAME;
loc_params.obj_type = H5I_get_type(loc_id);
loc_params.loc_data.loc_by_name.name = group_name;
loc_params.loc_data.loc_by_name.lapl_id = lapl_id;
/* Iterate over the links */
if((ret_value = H5L_iterate(&loc, group_name, idx_type, order, idx_p, op, op_data)) < 0)
if((ret_value = H5VL_link_specific(vol_obj->data, loc_params, vol_obj->driver->cls, H5VL_LINK_ITER,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, FALSE, idx_type, order, idx_p, op, op_data)) < 0)
HGOTO_ERROR(H5E_LINK, H5E_BADITER, FAIL, "link iteration failed")
done:
@@ -1218,7 +1464,8 @@ herr_t
H5Lvisit(hid_t group_id, H5_index_t idx_type, H5_iter_order_t order,
H5L_iterate_t op, void *op_data)
{
H5G_loc_t loc;
H5VL_object_t *vol_obj = NULL; /* Object token of loc_id */
H5VL_loc_params_t loc_params;
H5I_type_t id_type; /* Type of ID */
herr_t ret_value; /* Return value */
@@ -1226,8 +1473,6 @@ H5Lvisit(hid_t group_id, H5_index_t idx_type, H5_iter_order_t order,
H5TRACE5("e", "iIiIox*x", group_id, idx_type, order, op, op_data);
/* Check args */
if(H5G_loc(group_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
id_type = H5I_get_type(group_id);
if(!(H5I_GROUP == id_type || H5I_FILE == id_type))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid argument")
@@ -1238,8 +1483,18 @@ H5Lvisit(hid_t group_id, H5_index_t idx_type, H5_iter_order_t order,
if(!op)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no callback operator specified")
/* Set location struct fields */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(group_id);
/* Get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(group_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Iterate over the links */
if((ret_value = H5G_visit(&loc, ".", idx_type, order, op, op_data)) < 0)
if((ret_value = H5VL_link_specific(vol_obj->data, loc_params, vol_obj->driver->cls, H5VL_LINK_ITER,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL,
TRUE, idx_type, order, NULL, op, op_data)) < 0)
HGOTO_ERROR(H5E_LINK, H5E_BADITER, FAIL, "link visitation failed")
done:
@@ -1279,7 +1534,8 @@ herr_t
H5Lvisit_by_name(hid_t loc_id, const char *group_name, H5_index_t idx_type,
H5_iter_order_t order, H5L_iterate_t op, void *op_data, hid_t lapl_id)
{
H5G_loc_t loc;
H5VL_object_t *vol_obj = NULL; /* Object token of loc_id */
H5VL_loc_params_t loc_params;
herr_t ret_value; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -1287,8 +1543,6 @@ H5Lvisit_by_name(hid_t loc_id, const char *group_name, H5_index_t idx_type,
lapl_id);
/* Check args */
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!group_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "group_name parameter cannot be NULL")
if(!*group_name)
@@ -1304,8 +1558,20 @@ H5Lvisit_by_name(hid_t loc_id, const char *group_name, H5_index_t idx_type,
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, loc_id, FALSE) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTSET, FAIL, "can't set access property list info")
/* get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Set location struct fields */
loc_params.type = H5VL_OBJECT_BY_NAME;
loc_params.obj_type = H5I_get_type(loc_id);
loc_params.loc_data.loc_by_name.name = group_name;
loc_params.loc_data.loc_by_name.lapl_id = lapl_id;
/* Visit the links */
if((ret_value = H5G_visit(&loc, group_name, idx_type, order, op, op_data)) < 0)
if((ret_value = H5VL_link_specific(vol_obj->data, loc_params, vol_obj->driver->cls, H5VL_LINK_ITER,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL,
TRUE, idx_type, order, NULL, op, op_data)) < 0)
HGOTO_ERROR(H5E_LINK, H5E_BADITER, FAIL, "link visitation failed")
done:
@@ -1683,7 +1949,7 @@ H5L__link_cb(H5G_loc_t *grp_loc/*in*/, const char *name, const H5O_link_t H5_ATT
/* Set up location for user-defined callback */
if(NULL == (grp = H5G_open(&temp_loc)))
HGOTO_ERROR(H5E_LINK, H5E_CANTOPENOBJ, FAIL, "unable to open group")
if((grp_id = H5I_register(H5I_GROUP, grp, TRUE)) < 0)
if((grp_id = H5VL_native_register(H5I_GROUP, grp, TRUE)) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTREGISTER, FAIL, "unable to register ID for group")
/* Make callback */
@@ -2468,7 +2734,7 @@ H5L__move_dest_cb(H5G_loc_t *grp_loc/*in*/, const char *name,
/* Set up location for user-defined callback */
if(NULL == (grp = H5G_open(&temp_loc)))
HGOTO_ERROR(H5E_LINK, H5E_CANTOPENOBJ, FAIL, "unable to open group")
if((grp_id = H5I_register(H5I_GROUP, grp, TRUE)) < 0)
if((grp_id = H5VL_native_register(H5I_GROUP, grp, TRUE)) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTREGISTER, FAIL, "unable to register group ID")
if(udata->copy) {
+45 -9
View File
@@ -33,6 +33,8 @@
#include "H5MMprivate.h" /* Memory management */
#include "H5Opublic.h" /* File objects */
#include "H5Pprivate.h" /* Property lists */
#include "H5VLprivate.h" /* Virtual Object Layer */
#include "H5VLnative.h" /* Native VOL Driver */
/****************/
@@ -125,7 +127,9 @@ H5L__extern_traverse(const char H5_ATTR_UNUSED *link_name, hid_t cur_group,
unsigned intent; /* File access permissions */
H5L_elink_cb_t cb_info; /* Callback info struct */
hid_t fapl_id = -1; /* File access property list for external link's file */
hid_t ext_obj = -1; /* ID for external link's object */
void *ext_obj = NULL; /* External link's object */
hid_t ext_obj_id = H5I_INVALID_HID; /* ID for external link's object */
H5I_type_t opened_type; /* ID type of external link's object */
char *parent_group_name = NULL;/* Temporary pointer to group name */
char local_group_name[H5L_EXT_TRAVERSE_BUF_SIZE]; /* Local buffer to hold group name */
H5P_genplist_t *fa_plist; /* File access property list pointer */
@@ -235,13 +239,18 @@ H5L__extern_traverse(const char H5_ATTR_UNUSED *link_name, hid_t cur_group,
HGOTO_ERROR(H5E_LINK, H5E_BADVALUE, H5I_INVALID_HID, "unable to create location for file")
/* Open the object referenced in the external file */
if((ext_obj = H5O_open_name(&root_loc, obj_name, FALSE)) < 0)
if(NULL == (ext_obj = H5O_open_name(&root_loc, obj_name, &opened_type)))
HGOTO_ERROR(H5E_LINK, H5E_CANTOPENOBJ, H5I_INVALID_HID, "unable to open object")
/* Get an ID for the external link's object */
if((ext_obj_id = H5VL_native_register(opened_type, ext_obj, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register external link object")
/* Set return value */
ret_value = ext_obj;
ret_value = ext_obj_id;
done:
/* XXX (VOL MERGE): Probably also want to consider closing ext_obj here on failures */
/* Release resources */
if(fapl_id > 0 && H5I_dec_ref(fapl_id) < 0)
HDONE_ERROR(H5E_ATOM, H5E_CANTRELEASE, H5I_INVALID_HID, "unable to close atom for file access property list")
@@ -251,7 +260,7 @@ done:
parent_group_name = (char *)H5MM_xfree(parent_group_name);
if(ret_value < 0) {
/* Close object if it's open and something failed */
if(ext_obj >= 0 && H5I_dec_ref(ext_obj) < 0)
if(ext_obj_id >= 0 && H5I_dec_ref(ext_obj_id) < 0)
HDONE_ERROR(H5E_ATOM, H5E_CANTRELEASE, H5I_INVALID_HID, "unable to close atom for external object")
} /* end if */
@@ -333,13 +342,16 @@ herr_t
H5Lcreate_external(const char *file_name, const char *obj_name,
hid_t link_loc_id, const char *link_name, hid_t lcpl_id, hid_t lapl_id)
{
H5G_loc_t link_loc; /* Group location to create link */
char *norm_obj_name = NULL; /* Pointer to normalized current name */
H5VL_object_t *vol_obj = NULL; /* Object token of loc_id */
H5VL_loc_params_t loc_params;
char *norm_obj_name = NULL; /* Pointer to normalized current name */
void *ext_link_buf = NULL; /* Buffer to contain external link */
size_t buf_size; /* Size of buffer to hold external link */
size_t file_name_len; /* Length of file name string */
size_t norm_obj_name_len; /* Length of normalized object name string */
uint8_t *p; /* Pointer into external link buffer */
H5P_genplist_t *plist; /* Property list pointer */
H5L_type_t link_type = H5L_TYPE_EXTERNAL;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -351,11 +363,13 @@ H5Lcreate_external(const char *file_name, const char *obj_name,
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no file name specified")
if(!obj_name || !*obj_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no object name specified")
if(H5G_loc(link_loc_id, &link_loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!link_name || !*link_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no link name specified")
/* Check the group access property list */
if(H5P_DEFAULT == lcpl_id)
lcpl_id = H5P_LINK_CREATE_DEFAULT;
/* Get normalized copy of the link target */
if(NULL == (norm_obj_name = H5G_normalize(obj_name)))
HGOTO_ERROR(H5E_LINK, H5E_BADVALUE, FAIL, "can't normalize object name")
@@ -378,8 +392,30 @@ H5Lcreate_external(const char *file_name, const char *obj_name,
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, link_loc_id, TRUE) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTSET, FAIL, "can't set access property list info")
loc_params.type = H5VL_OBJECT_BY_NAME;
loc_params.loc_data.loc_by_name.name = link_name;
loc_params.loc_data.loc_by_name.lapl_id = lapl_id;
loc_params.obj_type = H5I_get_type(link_loc_id);
/* get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(link_loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid object identifier")
/* Get the plist structure */
if(NULL == (plist = (H5P_genplist_t *)H5I_object(lcpl_id)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
/* Set creation properties */
if(H5P_set(plist, H5VL_PROP_LINK_TYPE, &link_type) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get property value from plist")
if(H5P_set(plist, H5VL_PROP_LINK_UDATA, &ext_link_buf) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get property value from plist")
if(H5P_set(plist, H5VL_PROP_LINK_UDATA_SIZE, &buf_size) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get property value from plist")
/* Create an external link */
if(H5L__create_ud(&link_loc, link_name, ext_link_buf, buf_size, H5L_TYPE_EXTERNAL, lcpl_id) < 0)
if((ret_value = H5VL_link_create(H5VL_LINK_CREATE_UD, vol_obj->data, loc_params, vol_obj->driver->cls,
lcpl_id, lapl_id, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)) < 0)
HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create external link")
done:
+260 -76
View File
@@ -100,15 +100,16 @@
hid_t
H5Oopen(hid_t loc_id, const char *name, hid_t lapl_id)
{
H5G_loc_t loc; /* Location of group */
H5VL_object_t *vol_obj = NULL; /* Object token of loc_id */
H5I_type_t opened_type;
void *opened_obj = NULL;
H5VL_loc_params_t loc_params;
hid_t ret_value = H5I_INVALID_HID;
FUNC_ENTER_API(H5I_INVALID_HID)
H5TRACE3("i", "i*si", loc_id, name, lapl_id);
/* Check args */
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a location")
if(!name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "name parameter cannot be NULL")
if(!*name)
@@ -118,10 +119,24 @@ H5Oopen(hid_t loc_id, const char *name, hid_t lapl_id)
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, loc_id, FALSE) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, H5I_INVALID_HID, "can't set access property list info")
/* Get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid location identifier")
/* Set location struct fields */
loc_params.type = H5VL_OBJECT_BY_NAME;
loc_params.loc_data.loc_by_name.name = name;
loc_params.loc_data.loc_by_name.lapl_id = lapl_id;
loc_params.obj_type = H5I_get_type(loc_id);
/* Open the object */
if((ret_value = H5O_open_name(&loc, name, TRUE)) < 0)
if(NULL == (opened_obj = H5VL_object_open(vol_obj->data, loc_params, vol_obj->driver->cls,
&opened_type, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, H5I_INVALID_HID, "unable to open object")
/* Get an atom for the object */
if((ret_value = H5VL_register_id(opened_type, opened_obj, vol_obj->driver, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to atomize object handle")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Oopen() */
@@ -154,15 +169,16 @@ hid_t
H5Oopen_by_idx(hid_t loc_id, const char *group_name, H5_index_t idx_type,
H5_iter_order_t order, hsize_t n, hid_t lapl_id)
{
H5G_loc_t loc; /* Location of group */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5I_type_t opened_type;
void *opened_obj = NULL;
H5VL_loc_params_t loc_params;
hid_t ret_value = H5I_INVALID_HID;
FUNC_ENTER_API(H5I_INVALID_HID)
H5TRACE6("i", "i*sIiIohi", loc_id, group_name, idx_type, order, n, lapl_id);
/* Check args */
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a location")
if(!group_name || !*group_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "no name specified")
if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
@@ -174,10 +190,26 @@ H5Oopen_by_idx(hid_t loc_id, const char *group_name, H5_index_t idx_type,
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, loc_id, FALSE) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, H5I_INVALID_HID, "can't set access property list info")
loc_params.type = H5VL_OBJECT_BY_IDX;
loc_params.loc_data.loc_by_idx.name = group_name;
loc_params.loc_data.loc_by_idx.idx_type = idx_type;
loc_params.loc_data.loc_by_idx.order = order;
loc_params.loc_data.loc_by_idx.n = n;
loc_params.loc_data.loc_by_idx.lapl_id = lapl_id;
loc_params.obj_type = H5I_get_type(loc_id);
/* get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid location identifier")
/* Open the object */
if((ret_value = H5O_open_by_idx(&loc, group_name, idx_type, order, n)) < 0)
if(NULL == (opened_obj = H5VL_object_open(vol_obj->data, loc_params, vol_obj->driver->cls,
&opened_type, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, H5I_INVALID_HID, "unable to open object")
if((ret_value = H5VL_register_id(opened_type, opened_obj, vol_obj->driver, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to atomize object handle")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Oopen_by_idx() */
@@ -221,22 +253,32 @@ done:
hid_t
H5Oopen_by_addr(hid_t loc_id, haddr_t addr)
{
H5G_loc_t loc; /* Location within file */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5I_type_t opened_type;
void *opened_obj = NULL;
H5VL_loc_params_t loc_params;
hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
H5TRACE2("i", "ia", loc_id, addr);
/* Check args */
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a location")
if(!H5F_addr_defined(addr))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "no address supplied")
loc_params.type = H5VL_OBJECT_BY_ADDR;
loc_params.loc_data.loc_by_addr.addr = addr;
loc_params.obj_type = H5I_get_type(loc_id);
/* Get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid location identifier")
/* Open the object */
if((ret_value = H5O_open_by_addr(&loc, addr)) < 0)
if(NULL == (opened_obj = H5VL_object_open(vol_obj->data, loc_params, vol_obj->driver->cls, &opened_type,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, H5I_INVALID_HID, "unable to open object")
/* Register the dataset ID */
if((ret_value = H5VL_register_id(opened_type, opened_obj, vol_obj->driver, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to atomize object handle")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Oopen_by_addr() */
@@ -267,20 +309,19 @@ herr_t
H5Olink(hid_t obj_id, hid_t new_loc_id, const char *new_name, hid_t lcpl_id,
hid_t lapl_id)
{
H5G_loc_t new_loc; /* Location of group to link from */
H5G_loc_t obj_loc; /* Location of object to link to */
herr_t ret_value = SUCCEED; /* Return value */
H5VL_object_t *vol_obj1 = NULL; /* object token of obj_id */
H5VL_object_t *vol_obj2 = NULL; /* object token of new_loc_id */
H5VL_loc_params_t loc_params1;
H5VL_loc_params_t loc_params2;
H5P_genplist_t *plist; /* Property list pointer */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE5("e", "ii*sii", obj_id, new_loc_id, new_name, lcpl_id, lapl_id);
/* Check arguments */
if(H5G_loc(obj_id, &obj_loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(new_loc_id == H5L_SAME_LOC)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "cannot use H5L_SAME_LOC when only one location is specified")
if(H5G_loc(new_loc_id, &new_loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!new_name || !*new_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified")
/* Avoid compiler warning on 32-bit machines */
@@ -291,12 +332,52 @@ H5Olink(hid_t obj_id, hid_t new_loc_id, const char *new_name, hid_t lcpl_id,
if(lcpl_id != H5P_DEFAULT && (TRUE != H5P_isa_class(lcpl_id, H5P_LINK_CREATE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a link creation property list")
/* Check the group access property list */
if(H5P_DEFAULT == lcpl_id)
lcpl_id = H5P_LINK_CREATE_DEFAULT;
/* Verify access property list and set up collective metadata if appropriate */
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, obj_id, TRUE) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "can't set access property list info")
/* Link to the object */
if(H5L_link(&new_loc, new_name, &obj_loc, lcpl_id) < 0)
loc_params1.type = H5VL_OBJECT_BY_SELF;
loc_params1.obj_type = H5I_get_type(obj_id);
loc_params2.type = H5VL_OBJECT_BY_NAME;
loc_params2.obj_type = H5I_get_type(new_loc_id);
loc_params2.loc_data.loc_by_name.name = new_name;
loc_params2.loc_data.loc_by_name.lapl_id = lapl_id;
if(H5L_SAME_LOC != obj_id) {
/* get the location object */
if(NULL == (vol_obj1 = H5VL_get_object(obj_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
}
if(H5L_SAME_LOC != new_loc_id) {
/* get the location object */
if(NULL == (vol_obj2 = H5VL_get_object(new_loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
}
/* Make sure that the VOL plugins are the same */
if(vol_obj1 && vol_obj2) {
if (vol_obj1->driver->cls->value != vol_obj2->driver->cls->value)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "Objects are accessed through different VOL plugins and can't be linked")
}
/* Get the plist structure */
if(NULL == (plist = (H5P_genplist_t *)H5I_object(lcpl_id)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
/* set creation properties */
if(H5P_set(plist, H5VL_PROP_LINK_TARGET, &vol_obj1->data) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't set property value for target id")
if(H5P_set(plist, H5VL_PROP_LINK_TARGET_LOC_PARAMS, &loc_params1) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't set property value for target id")
/* Create a link to the object */
if(H5VL_link_create(H5VL_LINK_CREATE_HARD, vol_obj2->data, loc_params2,
(vol_obj1 != NULL ? vol_obj1->driver->cls : vol_obj2->driver->cls),
lcpl_id, lapl_id, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTCREATE, FAIL, "unable to create link")
done:
@@ -327,22 +408,27 @@ done:
herr_t
H5Oincr_refcount(hid_t object_id)
{
H5O_loc_t *oloc; /* Object location */
herr_t ret_value = SUCCEED; /* Return value */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE1("e", "i", object_id);
/* Get the object's oloc so we can adjust its link count */
if((oloc = H5O_get_loc(object_id)) == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get object location from ID")
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(object_id);
/* Get the location object */
if(NULL == (vol_obj = H5VL_get_object(object_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Set up collective metadata if appropriate */
if(H5CX_set_loc(object_id) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "can't set access property list info")
/* Change the object's reference count */
if(H5O_link(oloc, 1) < 0)
if(H5VL_object_specific(vol_obj->data, loc_params, vol_obj->driver->cls, H5VL_OBJECT_CHANGE_REF_COUNT,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, 1) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_LINKCOUNT, FAIL, "modifying object link count failed")
done:
@@ -373,22 +459,27 @@ done:
herr_t
H5Odecr_refcount(hid_t object_id)
{
H5O_loc_t *oloc; /* Object location */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE1("e", "i", object_id);
/* Get the object's oloc so we can adjust its link count */
if((oloc = H5O_get_loc(object_id)) == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get object location from ID")
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(object_id);
/* Get the location object */
if(NULL == (vol_obj = H5VL_get_object(object_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Set up collective metadata if appropriate */
if(H5CX_set_loc(object_id) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "can't set access property list info")
/* Change the object's reference count */
if(H5O_link(oloc, -1) < 0)
if(H5VL_object_specific(vol_obj->data, loc_params, vol_obj->driver->cls, H5VL_OBJECT_CHANGE_REF_COUNT,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, -1) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_LINKCOUNT, FAIL, "modifying object link count failed")
done:
@@ -412,15 +503,14 @@ done:
htri_t
H5Oexists_by_name(hid_t loc_id, const char *name, hid_t lapl_id)
{
H5G_loc_t loc; /* Location info */
H5VL_object_t *vol_obj = NULL; /* Object token of loc_id */
H5VL_loc_params_t loc_params;
htri_t ret_value = FAIL; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE3("t", "i*si", loc_id, name, lapl_id);
/* Check args */
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "name parameter cannot be NULL")
if(!*name)
@@ -430,8 +520,19 @@ H5Oexists_by_name(hid_t loc_id, const char *name, hid_t lapl_id)
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, loc_id, FALSE) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "can't set access property list info")
/* Get the location object */
if(NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Set the location struct fields */
loc_params.type = H5VL_OBJECT_BY_NAME;
loc_params.loc_data.loc_by_name.name = name;
loc_params.loc_data.loc_by_name.lapl_id = lapl_id;
loc_params.obj_type = H5I_get_type(loc_id);
/* Check if the object exists */
if((ret_value = H5G_loc_exists(&loc, name)) < 0)
if(H5VL_object_specific(vol_obj->data, loc_params, vol_obj->driver->cls, H5VL_OBJECT_EXISTS,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, &ret_value) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to determine if '%s' exists", name)
done:
@@ -456,22 +557,30 @@ done:
herr_t
H5Oget_info2(hid_t loc_id, H5O_info_t *oinfo, unsigned fields)
{
H5G_loc_t loc; /* Location of group */
H5VL_object_t *vol_obj = NULL; /* Object token of loc_id */
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE3("e", "i*xIu", loc_id, oinfo, fields);
/* Check args */
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!oinfo)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "oinfo parameter cannot be NULL")
if(fields & ~H5O_INFO_ALL)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid fields")
/* Set location struct fields */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(loc_id);
/* Get the location object */
if(NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Retrieve the object's information */
if(H5G_loc_info(&loc, ".", oinfo, fields) < 0)
if(H5VL_object_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT,
H5_REQUEST_NULL, H5VL_OBJECT_GET_INFO, loc_params, oinfo, fields) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't get info for object")
done:
@@ -497,15 +606,14 @@ herr_t
H5Oget_info_by_name2(hid_t loc_id, const char *name, H5O_info_t *oinfo,
unsigned fields, hid_t lapl_id)
{
H5G_loc_t loc; /* Location of group */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE5("e", "i*s*xIui", loc_id, name, oinfo, fields, lapl_id);
/* Check args */
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "name parameter cannot be NULL")
if(!*name)
@@ -519,8 +627,19 @@ H5Oget_info_by_name2(hid_t loc_id, const char *name, H5O_info_t *oinfo,
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, loc_id, FALSE) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "can't set access property list info")
/* Fill out location struct */
loc_params.type = H5VL_OBJECT_BY_NAME;
loc_params.loc_data.loc_by_name.name = name;
loc_params.loc_data.loc_by_name.lapl_id = lapl_id;
loc_params.obj_type = H5I_get_type(loc_id);
/* Get the location object */
if(NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Retrieve the object's information */
if(H5G_loc_info(&loc, name, oinfo/*out*/, fields) < 0)
if(H5VL_object_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL,
H5VL_OBJECT_GET_INFO, loc_params, oinfo, fields) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't get info for object: '%s'", name)
done:
@@ -548,7 +667,8 @@ herr_t
H5Oget_info_by_idx2(hid_t loc_id, const char *group_name, H5_index_t idx_type,
H5_iter_order_t order, hsize_t n, H5O_info_t *oinfo, unsigned fields, hid_t lapl_id)
{
H5G_loc_t loc; /* Location of group */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -556,8 +676,6 @@ H5Oget_info_by_idx2(hid_t loc_id, const char *group_name, H5_index_t idx_type,
fields, lapl_id);
/* Check args */
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!group_name || !*group_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified")
if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
@@ -573,8 +691,21 @@ H5Oget_info_by_idx2(hid_t loc_id, const char *group_name, H5_index_t idx_type,
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, loc_id, FALSE) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "can't set access property list info")
loc_params.type = H5VL_OBJECT_BY_IDX;
loc_params.loc_data.loc_by_idx.name = group_name;
loc_params.loc_data.loc_by_idx.idx_type = idx_type;
loc_params.loc_data.loc_by_idx.order = order;
loc_params.loc_data.loc_by_idx.n = n;
loc_params.loc_data.loc_by_idx.lapl_id = lapl_id;
loc_params.obj_type = H5I_get_type(loc_id);
/* Get the location object */
if(NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Retrieve the object's information */
if(H5O__get_info_by_idx(&loc, group_name, idx_type, order, n, oinfo, fields) < 0)
if(H5VL_object_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL,
H5VL_OBJECT_GET_INFO, loc_params, oinfo, fields) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't get info for object")
done:
@@ -602,22 +733,28 @@ done:
herr_t
H5Oset_comment(hid_t obj_id, const char *comment)
{
H5G_loc_t loc; /* Location of group */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE2("e", "i*s", obj_id, comment);
/* Check args */
if(H5G_loc(obj_id, &loc) < 0)
/* Get the location object */
if(NULL == (vol_obj = H5VL_get_object(obj_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Set up collective metadata if appropriate */
if(H5CX_set_loc(obj_id) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "can't set collective metadata read info")
/* Fill in location struct fields */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(obj_id);
/* (Re)set the object's comment */
if(H5G_loc_set_comment(&loc, ".", comment) < 0)
if(H5VL_object_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT,
H5_REQUEST_NULL, H5VL_OBJECT_SET_COMMENT, loc_params, comment) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "can't set comment for object")
done:
@@ -646,15 +783,14 @@ herr_t
H5Oset_comment_by_name(hid_t loc_id, const char *name, const char *comment,
hid_t lapl_id)
{
H5G_loc_t loc; /* Location of group */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE4("e", "i*s*si", loc_id, name, comment, lapl_id);
/* Check args */
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!name || !*name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
@@ -662,8 +798,19 @@ H5Oset_comment_by_name(hid_t loc_id, const char *name, const char *comment,
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, loc_id, TRUE) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "can't set access property list info")
/* Fill in location struct fields */
loc_params.type = H5VL_OBJECT_BY_NAME;
loc_params.loc_data.loc_by_name.name = name;
loc_params.loc_data.loc_by_name.lapl_id = lapl_id;
loc_params.obj_type = H5I_get_type(loc_id);
/* Get the location object */
if(NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* (Re)set the object's comment */
if(H5G_loc_set_comment(&loc, name, comment) < 0)
if(H5VL_object_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL,
H5VL_OBJECT_SET_COMMENT, loc_params, comment) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "can't set comment for object: '%s'", name)
done:
@@ -690,18 +837,24 @@ done:
ssize_t
H5Oget_comment(hid_t obj_id, char *comment, size_t bufsize)
{
H5G_loc_t loc; /* Location of group */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
ssize_t ret_value = -1; /* Return value */
FUNC_ENTER_API((-1))
H5TRACE3("Zs", "i*sz", obj_id, comment, bufsize);
/* Check args */
if(H5G_loc(obj_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, (-1), "not a location")
/* Get the object */
if (NULL == (vol_obj = H5VL_get_object(obj_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, (-1), "invalid location identifier")
/* Set fields in the location struct */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(obj_id);
/* Retrieve the object's comment */
if((ret_value = H5G_loc_get_comment(&loc, ".", comment/*out*/, bufsize)) < 0)
if (H5VL_object_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL,
H5VL_OBJECT_GET_COMMENT, loc_params, comment, bufsize, &ret_value) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, (-1), "can't get comment for object")
done:
@@ -729,15 +882,14 @@ ssize_t
H5Oget_comment_by_name(hid_t loc_id, const char *name, char *comment, size_t bufsize,
hid_t lapl_id)
{
H5G_loc_t loc; /* Location of group */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
ssize_t ret_value = -1; /* Return value */
FUNC_ENTER_API((-1))
H5TRACE5("Zs", "i*s*szi", loc_id, name, comment, bufsize, lapl_id);
/* Check args */
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, (-1), "not a location")
if(!name || !*name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, (-1), "no name")
@@ -745,8 +897,19 @@ H5Oget_comment_by_name(hid_t loc_id, const char *name, char *comment, size_t buf
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, loc_id, FALSE) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, (-1), "can't set access property list info")
/* Fill in location struct fields */
loc_params.type = H5VL_OBJECT_BY_NAME;
loc_params.loc_data.loc_by_name.name = name;
loc_params.loc_data.loc_by_name.lapl_id = lapl_id;
loc_params.obj_type = H5I_get_type(loc_id);
/* Get the location object */
if(NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, (-1), "invalid location identifier")
/* Retrieve the object's comment */
if((ret_value = H5G_loc_get_comment(&loc, name, comment/*out*/, bufsize)) < 0)
if(H5VL_object_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL,
H5VL_OBJECT_GET_COMMENT, loc_params, comment, bufsize, &ret_value) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, (-1), "can't get comment for object: '%s'", name)
done:
@@ -793,15 +956,14 @@ herr_t
H5Ovisit2(hid_t obj_id, H5_index_t idx_type, H5_iter_order_t order,
H5O_iterate_t op, void *op_data, unsigned fields)
{
H5G_loc_t loc;
H5VL_object_t *vol_obj = NULL; /* Object token of loc_id */
H5VL_loc_params_t loc_params;
herr_t ret_value; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE6("e", "iIiIox*xIu", obj_id, idx_type, order, op, op_data, fields);
/* Check args */
if(H5G_loc(obj_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index type specified")
if(order <= H5_ITER_UNKNOWN || order >= H5_ITER_N)
@@ -811,8 +973,18 @@ H5Ovisit2(hid_t obj_id, H5_index_t idx_type, H5_iter_order_t order,
if(fields & ~H5O_INFO_ALL)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid fields")
/* Get the location object */
if(NULL == (vol_obj = H5VL_get_object(obj_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Set location parameters */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(obj_id);
/* Visit the objects */
if((ret_value = H5O__visit(&loc, ".", idx_type, order, op, op_data, fields)) < 0)
if((ret_value = H5VL_object_specific(vol_obj->data, loc_params, vol_obj->driver->cls,
H5VL_OBJECT_VISIT, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL,
idx_type, order, op, op_data, fields)) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_BADITER, FAIL, "object iteration failed")
done:
@@ -859,7 +1031,8 @@ herr_t
H5Ovisit_by_name2(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
H5_iter_order_t order, H5O_iterate_t op, void *op_data, unsigned fields, hid_t lapl_id)
{
H5G_loc_t loc;
H5VL_object_t *vol_obj = NULL; /* Object token of loc_id */
H5VL_loc_params_t loc_params;
herr_t ret_value; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -867,8 +1040,6 @@ H5Ovisit_by_name2(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
fields, lapl_id);
/* Check args */
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!obj_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "obj_name parameter cannot be NULL")
if(!*obj_name)
@@ -886,8 +1057,20 @@ H5Ovisit_by_name2(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, loc_id, FALSE) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "can't set access property list info")
/* Get the location object */
if(NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Set location parameters */
loc_params.type = H5VL_OBJECT_BY_NAME;
loc_params.loc_data.loc_by_name.name = obj_name;
loc_params.loc_data.loc_by_name.lapl_id = lapl_id;
loc_params.obj_type = H5I_get_type(loc_id);
/* Visit the objects */
if((ret_value = H5O__visit(&loc, obj_name, idx_type, order, op, op_data, fields)) < 0)
if((ret_value = H5VL_object_specific(vol_obj->data, loc_params, vol_obj->driver->cls,
H5VL_OBJECT_VISIT, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL,
idx_type, order, op, op_data, fields)) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_BADITER, FAIL, "object iteration failed")
done:
@@ -938,6 +1121,7 @@ H5Oclose(hid_t object_id)
case H5I_ATTR:
case H5I_REFERENCE:
case H5I_VFL:
case H5I_VOL:
case H5I_GENPROP_CLS:
case H5I_GENPROP_LST:
case H5I_ERROR_CLASS:
+1 -1
View File
@@ -713,7 +713,7 @@ H5O__attr_find_opened_attr(const H5O_loc_t *loc, H5A_t **attr, const char* name_
unsigned long attr_fnum; /* Attributes file serial number */
/* Get pointer to attribute */
if(NULL == (*attr = (H5A_t *)H5I_object_verify(attr_id_list[u], H5I_ATTR)))
if(NULL == (*attr = (H5A_t *)H5VL_object_verify(attr_id_list[u], H5I_ATTR)))
HGOTO_ERROR(H5E_ATTR, H5E_BADTYPE, FAIL, "not an attribute")
/* Get file serial number for attribute */
+22 -9
View File
@@ -43,6 +43,7 @@
#include "H5MMprivate.h" /* Memory management */
#include "H5Opkg.h" /* Object headers */
#include "H5Pprivate.h" /* Property lists */
#include "H5VLprivate.h" /* Virtual Object Layer */
/****************/
@@ -197,10 +198,12 @@ H5FL_DEFINE(haddr_t);
*/
herr_t
H5Ocopy(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id,
const char *dst_name, hid_t ocpypl_id, hid_t lcpl_id)
const char *dst_name, hid_t ocpypl_id, hid_t lcpl_id)
{
H5G_loc_t loc; /* Source group group location */
H5G_loc_t dst_loc; /* Destination group location */
H5VL_object_t *vol_obj1 = NULL; /* object token of src_id */
H5VL_loc_params_t loc_params1;
H5VL_object_t *vol_obj2 = NULL; /* object token of dst_id */
H5VL_loc_params_t loc_params2;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -208,10 +211,6 @@ H5Ocopy(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id,
ocpypl_id, lcpl_id);
/* Check arguments */
if(H5G_loc(src_loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(H5G_loc(dst_loc_id, &dst_loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!src_name || !*src_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no source name specified")
if(!dst_name || !*dst_name)
@@ -235,8 +234,22 @@ H5Ocopy(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id,
if(H5CX_set_loc(src_loc_id) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "can't set collective metadata read info")
/* get the object */
if(NULL == (vol_obj1 = (H5VL_object_t *)H5I_object(src_loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
loc_params1.type = H5VL_OBJECT_BY_SELF;
loc_params1.obj_type = H5I_get_type(src_loc_id);
/* get the object */
if(NULL == (vol_obj2 = (H5VL_object_t *)H5I_object(dst_loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
loc_params2.type = H5VL_OBJECT_BY_SELF;
loc_params2.obj_type = H5I_get_type(dst_loc_id);
/* Copy the object */
if(H5O_copy(&loc, src_name, &dst_loc, dst_name, ocpypl_id, lcpl_id) < 0)
if((ret_value = H5VL_object_copy(vol_obj1->data, loc_params1, vol_obj1->driver->cls, src_name,
vol_obj2->data, loc_params2, vol_obj2->driver->cls, dst_name,
ocpypl_id, lcpl_id, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to copy object")
done:
@@ -1784,7 +1797,7 @@ H5O__copy_search_comm_dt(H5F_t *file_src, H5O_t *oh_src,
HDassert(oh_src);
HDassert(oloc_dst);
HDassert(oloc_dst->file);
HDassert(H5F_FILE_ID(oloc_dst->file) >= 0);
HDassert(H5F_ID_EXISTS(oloc_dst->file));
HDassert(cpy_info);
/* Allocate key */
+71 -26
View File
@@ -34,6 +34,7 @@
#include "H5private.h" /* Generic Functions */
#include "H5CXprivate.h" /* API Contexts */
#include "H5Eprivate.h" /* Error handling */
#include "H5Iprivate.h" /* IDs */
#include "H5Opkg.h" /* Object headers */
@@ -88,20 +89,28 @@
herr_t
H5Oget_info1(hid_t loc_id, H5O_info_t *oinfo)
{
H5G_loc_t loc; /* Location of group */
H5VL_object_t *vol_obj = NULL; /* Object token of loc_id */
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE2("e", "i*x", loc_id, oinfo);
/* Check args */
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!oinfo)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "oinfo parameter cannot be NULL")
/* Set location struct fields */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(loc_id);
/* Get the location object */
if(NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Retrieve the object's information */
if(H5G_loc_info(&loc, ".", oinfo/*out*/, H5O_INFO_ALL) < 0)
if(H5VL_object_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT,
H5_REQUEST_NULL, H5VL_OBJECT_GET_INFO, loc_params, oinfo, H5O_INFO_ALL) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't get info for object")
done:
@@ -122,15 +131,14 @@ done:
herr_t
H5Oget_info_by_name1(hid_t loc_id, const char *name, H5O_info_t *oinfo, hid_t lapl_id)
{
H5G_loc_t loc; /* Location of group */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE4("e", "i*s*xi", loc_id, name, oinfo, lapl_id);
/* Check args */
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "name parameter cannot be NULL")
if(!*name)
@@ -142,8 +150,19 @@ H5Oget_info_by_name1(hid_t loc_id, const char *name, H5O_info_t *oinfo, hid_t la
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, loc_id, FALSE) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "can't set access property list info")
/* Fill out location struct */
loc_params.type = H5VL_OBJECT_BY_NAME;
loc_params.loc_data.loc_by_name.name = name;
loc_params.loc_data.loc_by_name.lapl_id = lapl_id;
loc_params.obj_type = H5I_get_type(loc_id);
/* Get the location object */
if(NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Retrieve the object's information */
if(H5G_loc_info(&loc, name, oinfo/*out*/, H5O_INFO_ALL) < 0)
if(H5VL_object_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL,
H5VL_OBJECT_GET_INFO, loc_params, oinfo, H5O_INFO_ALL) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't get info for object: '%s'", name)
done:
@@ -169,9 +188,8 @@ herr_t
H5Oget_info_by_idx1(hid_t loc_id, const char *group_name, H5_index_t idx_type,
H5_iter_order_t order, hsize_t n, H5O_info_t *oinfo, hid_t lapl_id)
{
H5G_loc_t loc; /* Location of group */
H5G_loc_t obj_loc; /* Location used to open group */
hbool_t loc_found = FALSE; /* Entry at 'name' found */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -179,8 +197,6 @@ H5Oget_info_by_idx1(hid_t loc_id, const char *group_name, H5_index_t idx_type,
lapl_id);
/* Check args */
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!group_name || !*group_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified")
if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
@@ -194,15 +210,24 @@ H5Oget_info_by_idx1(hid_t loc_id, const char *group_name, H5_index_t idx_type,
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, loc_id, FALSE) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "can't set access property list info")
loc_params.type = H5VL_OBJECT_BY_IDX;
loc_params.loc_data.loc_by_idx.name = group_name;
loc_params.loc_data.loc_by_idx.idx_type = idx_type;
loc_params.loc_data.loc_by_idx.order = order;
loc_params.loc_data.loc_by_idx.n = n;
loc_params.loc_data.loc_by_idx.lapl_id = lapl_id;
loc_params.obj_type = H5I_get_type(loc_id);
/* Get the location object */
if(NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Retrieve the object's information */
if(H5O__get_info_by_idx(&loc, group_name, idx_type, order, n, oinfo, H5O_INFO_ALL) < 0)
if(H5VL_object_optional(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL,
H5VL_OBJECT_GET_INFO, loc_params, oinfo, H5O_INFO_ALL) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't get info for object")
done:
/* Release the object location */
if(loc_found && H5G_loc_free(&obj_loc) < 0)
HDONE_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "can't free location")
FUNC_LEAVE_API(ret_value)
} /* end H5Oget_info_by_idx1() */
@@ -243,15 +268,14 @@ herr_t
H5Ovisit1(hid_t obj_id, H5_index_t idx_type, H5_iter_order_t order,
H5O_iterate_t op, void *op_data)
{
H5G_loc_t loc;
H5VL_object_t *vol_obj = NULL; /* Object token of loc_id */
H5VL_loc_params_t loc_params;
herr_t ret_value; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE5("e", "iIiIox*x", obj_id, idx_type, order, op, op_data);
/* Check args */
if(H5G_loc(obj_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(idx_type <= H5_INDEX_UNKNOWN || idx_type >= H5_INDEX_N)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index type specified")
if(order <= H5_ITER_UNKNOWN || order >= H5_ITER_N)
@@ -259,8 +283,18 @@ H5Ovisit1(hid_t obj_id, H5_index_t idx_type, H5_iter_order_t order,
if(!op)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no callback operator specified")
/* Get the location object */
if(NULL == (vol_obj = H5VL_get_object(obj_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Set location parameters */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(obj_id);
/* Visit the objects */
if((ret_value = H5O__visit(&loc, ".", idx_type, order, op, op_data, H5O_INFO_ALL)) < 0)
if((ret_value = H5VL_object_specific(vol_obj->data, loc_params, vol_obj->driver->cls,
H5VL_OBJECT_VISIT, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL,
idx_type, order, op, op_data, H5O_INFO_ALL)) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_BADITER, FAIL, "object visitation failed")
done:
@@ -304,7 +338,8 @@ herr_t
H5Ovisit_by_name1(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
H5_iter_order_t order, H5O_iterate_t op, void *op_data, hid_t lapl_id)
{
H5G_loc_t loc;
H5VL_object_t *vol_obj = NULL; /* Object token of loc_id */
H5VL_loc_params_t loc_params;
herr_t ret_value; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -312,8 +347,6 @@ H5Ovisit_by_name1(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
lapl_id);
/* Check args */
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!obj_name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "obj_name parameter cannot be NULL")
if(!*obj_name)
@@ -329,8 +362,20 @@ H5Ovisit_by_name1(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
if(H5CX_set_apl(&lapl_id, H5P_CLS_LACC, loc_id, FALSE) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "can't set access property list info")
/* Get the location object */
if(NULL == (vol_obj = H5VL_get_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid location identifier")
/* Set location parameters */
loc_params.type = H5VL_OBJECT_BY_NAME;
loc_params.loc_data.loc_by_name.name = obj_name;
loc_params.loc_data.loc_by_name.lapl_id = lapl_id;
loc_params.obj_type = H5I_get_type(loc_id);
/* Visit the objects */
if((ret_value = H5O__visit(&loc, obj_name, idx_type, order, op, op_data, H5O_INFO_ALL)) < 0)
if((ret_value = H5VL_object_specific(vol_obj->data, loc_params, vol_obj->driver->cls,
H5VL_OBJECT_VISIT, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL,
idx_type, order, op, op_data, H5O_INFO_ALL)) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_BADITER, FAIL, "object visitation failed")
done:
+1 -1
View File
@@ -344,7 +344,7 @@ H5O_fill_old_decode(H5F_t *f, H5O_t *open_oh,
if((exists = H5O_msg_exists_oh(open_oh, H5O_DTYPE_ID)) < 0)
HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, NULL, "unable to read object header")
if(exists) {
if((dt = H5O_msg_read_oh(f, open_oh, H5O_DTYPE_ID, NULL)) < 0)
if(NULL == (dt = (H5T_t *)H5O_msg_read_oh(f, open_oh, H5O_DTYPE_ID, NULL)))
HGOTO_ERROR(H5E_SYM, H5E_CANTGET, NULL, "can't read DTYPE message")
/* Verify size */
if(fill->size != H5T_GET_SIZE(dt))
+54 -13
View File
@@ -27,6 +27,7 @@
/****************/
#include "H5Omodule.h" /* This source code file is part of the H5O module */
#define H5T_FRIEND /* Suppress error about including H5Tpkg */
/***********/
/* Headers */
@@ -40,6 +41,7 @@
#include "H5Gprivate.h" /* Groups */
#include "H5Iprivate.h" /* IDs */
#include "H5Opkg.h" /* Objects */
#include "H5Tpkg.h" /* Datatypes */
/********************/
/* Local Prototypes */
@@ -70,22 +72,28 @@ static herr_t H5O__refresh_metadata_close(hid_t oid, H5O_loc_t oloc,
herr_t
H5Oflush(hid_t obj_id)
{
H5O_loc_t *oloc; /* Object location */
H5VL_object_t *vol_obj = NULL; /* Object token */
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE1("e", "i", obj_id);
/* Check args */
if(NULL == (oloc = H5O_get_loc(obj_id)))
if(NULL == (vol_obj = H5VL_get_object(obj_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid object identifier")
/* Set up collective metadata if appropriate */
if(H5CX_set_loc(obj_id) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTSET, FAIL, "can't set access property list info")
/* Set location parameters */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(obj_id);
/* Flush the object */
if(H5O_flush(oloc, obj_id) < 0)
if((ret_value = H5VL_object_specific(vol_obj->data, loc_params, vol_obj->driver->cls,
H5VL_OBJECT_FLUSH, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, obj_id)) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTFLUSH, FAIL, "unable to flush object")
done:
@@ -116,7 +124,7 @@ H5O_flush(H5O_loc_t *oloc, hid_t obj_id)
FUNC_ENTER_NOAPI(FAIL)
/* Get the object pointer */
if(NULL == (obj_ptr = H5I_object(obj_id)))
if(NULL == (obj_ptr = H5VL_object(obj_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid object identifier")
/* Get the object class */
@@ -229,22 +237,28 @@ done:
herr_t
H5Orefresh(hid_t oid)
{
H5O_loc_t *oloc; /* object location */
herr_t ret_value = SUCCEED; /* return value */
H5VL_object_t *vol_obj = NULL; /* Object token */
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE1("e", "i", oid);
/* Check args */
if(NULL == (oloc = H5O_get_loc(oid)))
if(NULL == (vol_obj = H5VL_get_object(oid)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid object identifier")
/* Set up collective metadata if appropriate */
if(H5CX_set_loc(oid) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "can't set access property list info")
/* Set location parameters */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(oid);
/* Refresh the object */
if(H5O_refresh_metadata(oid, *oloc) < 0)
if((ret_value = H5VL_object_specific(vol_obj->data, loc_params, vol_obj->driver->cls,
H5VL_OBJECT_REFRESH, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, oid)) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "unable to refresh object")
done:
@@ -275,6 +289,7 @@ done:
herr_t
H5O_refresh_metadata(hid_t oid, H5O_loc_t oloc)
{
H5VL_object_t *vol_obj = NULL; /* VOL object associated with the ID */
hbool_t objs_incr = FALSE; /* Whether the object count in the file was incremented */
herr_t ret_value = SUCCEED; /* Return value */
@@ -285,6 +300,7 @@ H5O_refresh_metadata(hid_t oid, H5O_loc_t oloc)
H5G_loc_t obj_loc;
H5O_loc_t obj_oloc;
H5G_name_t obj_path;
H5O_shared_t cached_H5O_shared;
/* Create empty object location */
obj_loc.oloc = &obj_oloc;
@@ -297,13 +313,36 @@ H5O_refresh_metadata(hid_t oid, H5O_loc_t oloc)
H5F_incr_nopen_objs(oloc.file);
objs_incr = TRUE;
/* Save important datatype state */
if(H5I_get_type(oid) == H5I_DATATYPE)
if(H5T_save_refresh_state(oid, &cached_H5O_shared) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTOPENOBJ, FAIL, "unable to save datatype state")
/* Get the VOL object from the ID */
if(NULL == (vol_obj = H5VL_get_object(oid)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid object identifier")
/* Bump the number of references on the VOL driver.
* If you don't do this, VDS refreshes can accidentally close the driver.
*/
vol_obj->driver->nrefs++;
/* Close object & evict its metadata */
if((H5O__refresh_metadata_close(oid, oloc, &obj_loc)) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "unable to refresh object")
/* Re-open the object, re-fetching its metadata */
if((H5O_refresh_metadata_reopen(oid, &obj_loc, FALSE)) < 0)
if((H5O_refresh_metadata_reopen(oid, &obj_loc, vol_obj->driver, FALSE)) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "unable to refresh object")
/* Restore the number of references on the VOL driver */
vol_obj->driver->nrefs--;
/* Restore important datatype state */
if(H5I_get_type(oid) == H5I_DATATYPE)
if(H5T_restore_refresh_state(oid, &cached_H5O_shared) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTOPENOBJ, FAIL, "unable to restore datatype state")
} /* end if */
done:
@@ -350,7 +389,7 @@ H5O__refresh_metadata_close(hid_t oid, H5O_loc_t oloc, H5G_loc_t *obj_loc)
H5G_loc_copy(obj_loc, &tmp_loc, H5_COPY_DEEP);
} /* end if */
/* Get object's type */
/* Handle close for multiple dataset opens */
if(H5I_get_type(oid) == H5I_DATASET)
if(H5D_mult_refresh_close(oid) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "unable to prepare refresh for dataset")
@@ -400,7 +439,7 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
H5O_refresh_metadata_reopen(hid_t oid, H5G_loc_t *obj_loc, hbool_t start_swmr)
H5O_refresh_metadata_reopen(hid_t oid, H5G_loc_t *obj_loc, H5VL_t *vol_driver, hbool_t start_swmr)
{
void *object = NULL; /* Object for this operation */
H5I_type_t type; /* Type of object for the ID */
@@ -410,6 +449,7 @@ H5O_refresh_metadata_reopen(hid_t oid, H5G_loc_t *obj_loc, hbool_t start_swmr)
/* Sanity check */
HDassert(obj_loc);
HDassert(vol_driver);
/* Get object's type */
type = H5I_get_type(oid);
@@ -443,6 +483,7 @@ H5O_refresh_metadata_reopen(hid_t oid, H5G_loc_t *obj_loc, hbool_t start_swmr)
case H5I_ATTR:
case H5I_REFERENCE:
case H5I_VFL:
case H5I_VOL:
case H5I_GENPROP_CLS:
case H5I_GENPROP_LST:
case H5I_ERROR_CLASS:
@@ -455,7 +496,7 @@ H5O_refresh_metadata_reopen(hid_t oid, H5G_loc_t *obj_loc, hbool_t start_swmr)
} /* end switch */
/* Re-register ID for the object */
if((H5I_register_with_id(type, object, TRUE, oid)) < 0)
if((H5I_register_with_id(type, object, vol_driver, TRUE, oid)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to re-register object ID after refresh")
done:
+61 -46
View File
@@ -42,6 +42,8 @@
#include "H5MMprivate.h" /* Memory management */
#endif /* H5O_ENABLE_BOGUS */
#include "H5Opkg.h" /* Object headers */
#include "H5VLprivate.h" /* Virtual Object Layer */
#include "H5VLnative.h" /* Virtual Object Layer (native) */
/****************/
@@ -515,26 +517,26 @@ done:
/*-------------------------------------------------------------------------
* Function: H5O_open_name
*
* Purpose: Opens an object within an HDF5 file.
* Purpose: Opens an object by name
*
* Return: Success: Open object identifier
* Failure: H5I_INVALID_HID
* Return: Success: Pointer to object data
* Failure: NULL
*
* Programmer: Quincey Koziol
* March 5 2007
*
*-------------------------------------------------------------------------
*/
hid_t
H5O_open_name(const H5G_loc_t *loc, const char *name, hbool_t app_ref)
void *
H5O_open_name(const H5G_loc_t *loc, const char *name, H5I_type_t *opened_type)
{
H5G_loc_t obj_loc; /* Location used to open group */
H5G_name_t obj_path; /* Opened object group hier. path */
H5O_loc_t obj_oloc; /* Opened object object location */
hbool_t loc_found = FALSE; /* Entry at 'name' found */
hid_t ret_value = H5I_INVALID_HID;
void *ret_value = NULL; /* Return value */
FUNC_ENTER_NOAPI(H5I_INVALID_HID)
FUNC_ENTER_NOAPI(NULL)
/* Check args */
HDassert(loc);
@@ -547,17 +549,17 @@ H5O_open_name(const H5G_loc_t *loc, const char *name, hbool_t app_ref)
/* Find the object's location */
if(H5G_loc_find(loc, name, &obj_loc/*out*/) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, H5I_INVALID_HID, "object not found")
HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, NULL, "object not found")
loc_found = TRUE;
/* Open the object */
if((ret_value = H5O_open_by_loc(&obj_loc, app_ref)) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, H5I_INVALID_HID, "unable to open object")
if(NULL == (ret_value = H5O_open_by_loc(&obj_loc, opened_type)))
HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, NULL, "unable to open object")
done:
if(ret_value < 0 && loc_found)
if(H5G_loc_free(&obj_loc) < 0)
HDONE_ERROR(H5E_OHDR, H5E_CANTRELEASE, H5I_INVALID_HID, "can't free location")
if(NULL == ret_value)
if(loc_found && H5G_loc_free(&obj_loc) < 0)
HDONE_ERROR(H5E_OHDR, H5E_CANTRELEASE, NULL, "can't free location")
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5O_open_name() */
@@ -568,25 +570,25 @@ done:
*
* Purpose: Internal routine to open an object by index within group
*
* Return: Success: Open object identifier
* Failure: H5I_INVALID_HID
* Return: Success: Pointer to object data
* Failure: NULL
*
* Programmer: Quincey Koziol
* December 28, 2017
*
*-------------------------------------------------------------------------
*/
hid_t
void *
H5O_open_by_idx(const H5G_loc_t *loc, const char *name, H5_index_t idx_type,
H5_iter_order_t order, hsize_t n)
H5_iter_order_t order, hsize_t n, H5I_type_t *opened_type)
{
H5G_loc_t obj_loc; /* Location used to open group */
H5G_name_t obj_path; /* Opened object group hier. path */
H5O_loc_t obj_oloc; /* Opened object object location */
hbool_t loc_found = FALSE; /* Entry at 'name' found */
hid_t ret_value = H5I_INVALID_HID; /* Return value */
void *ret_value = NULL; /* Return value */
FUNC_ENTER_NOAPI(H5I_INVALID_HID)
FUNC_ENTER_NOAPI(NULL)
/* Check arguments */
HDassert(loc);
@@ -598,18 +600,18 @@ H5O_open_by_idx(const H5G_loc_t *loc, const char *name, H5_index_t idx_type,
/* Find the object's location, according to the order in the index */
if(H5G_loc_find_by_idx(loc, name, idx_type, order, n, &obj_loc/*out*/) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, H5I_INVALID_HID, "group not found")
HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, NULL, "group not found")
loc_found = TRUE;
/* Open the object */
if((ret_value = H5O_open_by_loc(&obj_loc, TRUE)) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, H5I_INVALID_HID, "unable to open object")
if(NULL == (ret_value = H5O_open_by_loc(&obj_loc, opened_type)))
HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, NULL, "unable to open object")
done:
/* Release the object location if we failed after copying it */
if(ret_value < 0 && loc_found)
if(H5G_loc_free(&obj_loc) < 0)
HDONE_ERROR(H5E_OHDR, H5E_CANTRELEASE, H5I_INVALID_HID, "can't free location")
if(NULL == ret_value)
if(loc_found && H5G_loc_free(&obj_loc) < 0)
HDONE_ERROR(H5E_OHDR, H5E_CANTRELEASE, NULL, "can't free location")
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5O_open_by_idx() */
@@ -620,23 +622,23 @@ done:
*
* Purpose: Internal routine to open an object by its address
*
* Return: Success: Open object identifier
* Failure: H5I_INVALID_HID
* Return: Success: Pointer to object data
* Failure: NULL
*
* Programmer: Quincey Koziol
* December 28, 2017
*
*-------------------------------------------------------------------------
*/
hid_t
H5O_open_by_addr(const H5G_loc_t *loc, haddr_t addr)
void *
H5O_open_by_addr(const H5G_loc_t *loc, haddr_t addr, H5I_type_t *opened_type)
{
H5G_loc_t obj_loc; /* Location used to open group */
H5G_name_t obj_path; /* Opened object group hier. path */
H5O_loc_t obj_oloc; /* Opened object object location */
hid_t ret_value = H5I_INVALID_HID; /* Return value */
void *ret_value = NULL; /* Return value */
FUNC_ENTER_NOAPI(H5I_INVALID_HID)
FUNC_ENTER_NOAPI(NULL)
/* Check arguments */
HDassert(loc);
@@ -650,8 +652,8 @@ H5O_open_by_addr(const H5G_loc_t *loc, haddr_t addr)
H5G_name_reset(obj_loc.path); /* objects opened through this routine don't have a path name */
/* Open the object */
if((ret_value = H5O_open_by_loc(&obj_loc, TRUE)) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, H5I_INVALID_HID, "unable to open object")
if(NULL == (ret_value = H5O_open_by_loc(&obj_loc, opened_type)))
HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, NULL, "unable to open object")
done:
FUNC_LEAVE_NOAPI(ret_value)
@@ -661,34 +663,34 @@ done:
/*-------------------------------------------------------------------------
* Function: H5O_open_by_loc
*
* Purpose: Opens an object and returns an ID given its group loction.
* Purpose: Opens an object
*
* Return: Success: Open object identifier
* Failure: H5I_INVALID_HID
* Return: Success: Pointer to object data
* Failure: NULL
*
* Programmer: James Laird
* July 25 2006
*
*-------------------------------------------------------------------------
*/
hid_t
H5O_open_by_loc(const H5G_loc_t *obj_loc, hbool_t app_ref)
void *
H5O_open_by_loc(const H5G_loc_t *obj_loc, H5I_type_t *opened_type)
{
const H5O_obj_class_t *obj_class; /* Class of object for location */
hid_t ret_value = H5I_INVALID_HID; /* Return value */
void *ret_value = NULL; /* Return value */
FUNC_ENTER_NOAPI(H5I_INVALID_HID)
FUNC_ENTER_NOAPI(NULL)
HDassert(obj_loc);
/* Get the object class for this location */
if(NULL == (obj_class = H5O__obj_class(obj_loc->oloc)))
HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, H5I_INVALID_HID, "unable to determine object class")
HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, NULL, "unable to determine object class")
/* Call the object class's 'open' routine */
HDassert(obj_class->open);
if((ret_value = obj_class->open(obj_loc, app_ref)) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, H5I_INVALID_HID, "unable to open object")
if(NULL == (ret_value = obj_class->open(obj_loc, opened_type)))
HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, NULL, "unable to open object")
done:
FUNC_LEAVE_NOAPI(ret_value)
@@ -733,7 +735,7 @@ H5O_close(H5O_loc_t *loc, hbool_t *file_closed /*out*/)
#ifdef H5O_DEBUG
if(H5DEBUG(O)) {
if(H5F_FILE_ID(loc->file)< 0 && 1 == H5F_NREFS(loc->file))
if(FALSE == H5F_ID_EXISTS(loc->file) && 1 == H5F_NREFS(loc->file))
HDfprintf(H5DEBUG(O), "< %a auto %lu remaining\n", loc->addr, (unsigned long)H5F_NOPEN_OBJS(loc->file));
else
HDfprintf(H5DEBUG(O), "< %a\n", loc->addr);
@@ -1766,6 +1768,7 @@ H5O_get_loc(hid_t object_id)
case H5I_ATTR:
case H5I_REFERENCE:
case H5I_VFL:
case H5I_VOL:
case H5I_GENPROP_CLS:
case H5I_GENPROP_LST:
case H5I_ERROR_CLASS:
@@ -2622,6 +2625,8 @@ H5O__visit(H5G_loc_t *loc, const char *obj_name, H5_index_t idx_type,
H5O_loc_t obj_oloc; /* Opened object object location */
hbool_t loc_found = FALSE; /* Entry at 'name' found */
H5O_info_t oinfo; /* Object info struct */
void *obj = NULL; /* Object */
H5I_type_t opened_type; /* ID type of object */
hid_t obj_id = H5I_INVALID_HID; /* ID of object */
herr_t ret_value = FAIL; /* Return value */
@@ -2649,9 +2654,13 @@ H5O__visit(H5G_loc_t *loc, const char *obj_name, H5_index_t idx_type,
/* Open the object */
/* (Takes ownership of the obj_loc information) */
if((obj_id = H5O_open_by_loc(&obj_loc, TRUE)) < 0)
if(NULL == (obj = H5O_open_by_loc(&obj_loc, &opened_type)))
HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, FAIL, "unable to open object")
/* Get an ID for the visited object */
if((obj_id = H5VL_native_register(opened_type, obj, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register visited object")
/* Make callback for starting object */
if((ret_value = op(obj_id, ".", &oinfo, op_data)) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_BADITER, FAIL, "can't visit objects")
@@ -2663,6 +2672,7 @@ H5O__visit(H5G_loc_t *loc, const char *obj_name, H5_index_t idx_type,
/* Check for object being a group */
if(oinfo.type == H5O_TYPE_GROUP) {
H5G_loc_t start_loc; /* Location of starting group */
H5G_loc_t vis_loc; /* Location of visited group */
/* Get the location of the starting group */
if(H5G_loc(obj_id, &start_loc) < 0)
@@ -2697,12 +2707,17 @@ H5O__visit(H5G_loc_t *loc, const char *obj_name, H5_index_t idx_type,
HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "can't insert object node into visited list")
}
/* Get the location of the visited group */
if(H5G_loc(obj_id, &vis_loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
/* Call internal group visitation routine */
if((ret_value = H5G_visit(&start_loc, ".", idx_type, order, H5O__visit_cb, &udata)) < 0)
if((ret_value = H5G_visit(&vis_loc, ".", idx_type, order, H5O__visit_cb, &udata)) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_BADITER, FAIL, "object visitation failed")
} /* end if */
done:
/* XXX (VOL MERGE): Probably also want to consider closing obj here on failures */
if(obj_id != H5I_INVALID_HID) {
if(H5I_dec_app_ref(obj_id) < 0)
HDONE_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "unable to close object")
+7 -1
View File
@@ -339,7 +339,7 @@ typedef struct H5O_obj_class_t {
void *(*get_copy_file_udata)(void); /*retrieve user data for 'copy file' operation */
void (*free_copy_file_udata)(void *); /*free user data for 'copy file' operation */
htri_t (*isa)(const H5O_t *); /*if a header matches an object class */
hid_t (*open)(const H5G_loc_t *, hbool_t ); /*open an object of this class */
void *(*open)(const H5G_loc_t *, H5I_type_t *); /*open an object of this class */
void *(*create)(H5F_t *, void *, H5G_loc_t *); /*create an object of this class */
H5O_loc_t *(*get_oloc)(hid_t ); /*get the object header location for an object */
herr_t (*bh_info)(const H5O_loc_t *loc, H5O_t *oh, H5_ih_info_t *bh_info); /*get the index & heap info for an object */
@@ -414,6 +414,12 @@ typedef struct H5O_chk_cache_ud_t {
H5O_common_cache_ud_t common; /* Common object header cache callback info */
} H5O_chk_cache_ud_t;
/* types for object optional VOL operations */
typedef enum H5VL_object_optional_t {
H5VL_OBJECT_GET_COMMENT, /* get object comment */
H5VL_OBJECT_GET_INFO, /* get object info */
H5VL_OBJECT_SET_COMMENT /* set object comment */
} H5VL_object_optional_t;
/* Header message ID to class mapping */
H5_DLLVAR const H5O_msg_class_t *const H5O_msg_class_g[H5O_MSG_TYPES];
+7 -6
View File
@@ -43,6 +43,7 @@ typedef struct H5O_fill_t H5O_fill_t;
#include "H5HGprivate.h" /* Global Heaps */
#include "H5SLprivate.h" /* Skip lists */
#include "H5Tprivate.h" /* Datatype functions */
#include "H5VLprivate.h"
#include "H5Zprivate.h" /* I/O pipeline filters */
/* Forward references of package typedefs */
@@ -866,10 +867,10 @@ H5_DLL herr_t H5O_init(void);
H5_DLL herr_t H5O_create(H5F_t *f, size_t size_hint, size_t initial_rc,
hid_t ocpl_id, H5O_loc_t *loc/*out*/);
H5_DLL herr_t H5O_open(H5O_loc_t *loc);
H5_DLL hid_t H5O_open_by_idx(const H5G_loc_t *loc, const char *name,
H5_index_t idx_type, H5_iter_order_t order, hsize_t n);
H5_DLL hid_t H5O_open_by_addr(const H5G_loc_t *loc, haddr_t addr);
H5_DLL hid_t H5O_open_by_loc(const H5G_loc_t *obj_loc, hbool_t app_ref);
H5_DLL void *H5O_open_by_idx(const H5G_loc_t *loc, const char *name,
H5_index_t idx_type, H5_iter_order_t order, hsize_t n, H5I_type_t *opened_type/*out*/);
H5_DLL void *H5O_open_by_addr(const H5G_loc_t *loc, haddr_t addr, H5I_type_t *opened_type/*out*/);
H5_DLL void *H5O_open_by_loc(const H5G_loc_t *obj_loc, H5I_type_t *opened_type/*out*/);
H5_DLL herr_t H5O_close(H5O_loc_t *loc, hbool_t *file_closed/*out*/);
H5_DLL int H5O_link(const H5O_loc_t *loc, int adjust);
H5_DLL H5O_t *H5O_protect(const H5O_loc_t *loc, unsigned prot_flags, hbool_t pin_all_chunks);
@@ -887,7 +888,7 @@ H5_DLL herr_t H5O_get_hdr_info(const H5O_loc_t *oloc, H5O_hdr_info_t *hdr);
H5_DLL herr_t H5O_get_info(const H5O_loc_t *oloc, H5O_info_t *oinfo, unsigned fields);
H5_DLL herr_t H5O_obj_type(const H5O_loc_t *loc, H5O_type_t *obj_type);
H5_DLL herr_t H5O_get_create_plist(const H5O_loc_t *loc, struct H5P_genplist_t *oc_plist);
H5_DLL hid_t H5O_open_name(const H5G_loc_t *loc, const char *name, hbool_t app_ref);
H5_DLL void *H5O_open_name(const H5G_loc_t *loc, const char *name, H5I_type_t *opened_type/*out*/);
H5_DLL herr_t H5O_get_nlinks(const H5O_loc_t *loc, hsize_t *nlinks);
H5_DLL void *H5O_obj_create(H5F_t *f, H5O_type_t obj_type, void *crt_info, H5G_loc_t *obj_loc);
H5_DLL haddr_t H5O_get_oh_addr(const H5O_t *oh);
@@ -945,7 +946,7 @@ H5_DLL herr_t H5O_msg_get_flags(const H5O_loc_t *loc, unsigned type_id, uint8_t
H5_DLL herr_t H5O_flush(H5O_loc_t *oloc, hid_t obj_id);
H5_DLL herr_t H5O_flush_common(H5O_loc_t *oloc, hid_t obj_id);
H5_DLL herr_t H5O_refresh_metadata(hid_t oid, H5O_loc_t oloc);
H5_DLL herr_t H5O_refresh_metadata_reopen(hid_t oid, H5G_loc_t *obj_loc, hbool_t start_swmr);
H5_DLL herr_t H5O_refresh_metadata_reopen(hid_t oid, H5G_loc_t *obj_loc, H5VL_t *vol_driver, hbool_t start_swmr);
/* Object copying routines */
H5_DLL herr_t H5O_copy_header_map(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out */,
+21
View File
@@ -30,6 +30,7 @@
#include "H5Eprivate.h" /* Error handling */
#include "H5MMprivate.h" /* Memory management */
#include "H5PLpkg.h" /* Plugin */
#include "H5VLprivate.h" /* Virtual Object Layer */
#include "H5Zprivate.h" /* Filter pipeline */
@@ -250,6 +251,10 @@ H5PL_load(H5PL_type_t type, H5PL_key_t key)
if ((H5PL_plugin_control_mask_g & H5PL_FILTER_PLUGIN) == 0)
HGOTO_ERROR(H5E_PLUGIN, H5E_CANTLOAD, NULL, "filter plugins disabled")
break;
case H5PL_TYPE_VOL:
if((H5PL_plugin_control_mask_g & H5PL_VOL_PLUGIN) == 0)
HGOTO_ERROR(H5E_PLUGIN, H5E_CANTLOAD, NULL, "Virtual Object Layer (VOL) driver plugins disabled")
break;
case H5PL_TYPE_ERROR:
case H5PL_TYPE_NONE:
default:
@@ -352,6 +357,22 @@ H5PL__open(const char *path, H5PL_type_t type, H5PL_key_t key, hbool_t *success,
break;
}
case H5PL_TYPE_VOL:
{
const H5VL_class_t *cls = NULL;
/* Get the plugin info */
if (NULL == (cls = (const H5VL_class_t *)(*get_plugin_info)()))
HGOTO_ERROR(H5E_PLUGIN, H5E_CANTGET, FAIL, "can't get VOL driver info from plugin")
/* If the plugin names match, we're done. Set the output parameters. */
if (cls->name && !HDstrcmp(cls->name, key.name)) {
*plugin_info = (const void *)cls;
*success = TRUE;
}
break;
}
case H5PL_TYPE_ERROR:
case H5PL_TYPE_NONE:
default:
+1
View File
@@ -36,6 +36,7 @@
/* The key that will be used to find the plugin */
typedef union H5PL_key_t {
int id; /* filters */
const char *name; /* VOL drivers */
} H5PL_key_t;
+3 -1
View File
@@ -32,11 +32,13 @@
typedef enum H5PL_type_t {
H5PL_TYPE_ERROR = -1, /* Error */
H5PL_TYPE_FILTER = 0, /* Filter */
H5PL_TYPE_NONE = 1 /* This must be last! */
H5PL_TYPE_VOL = 1, /* VOL driver */
H5PL_TYPE_NONE = 2 /* This must be last! */
} H5PL_type_t;
/* Common dynamic plugin type flags used by the set/get_loading_state functions */
#define H5PL_FILTER_PLUGIN 0x0001
#define H5PL_VOL_PLUGIN 0x0002
#define H5PL_ALL_PLUGIN 0xFFFF
#ifdef __cplusplus
+49 -1
View File
@@ -33,12 +33,17 @@
#include "H5private.h" /* Generic Functions */
#include "H5Eprivate.h" /* Error handling */
#include "H5Ppkg.h" /* Property lists */
#include "H5VLprivate.h" /* Virtual Object Layer */
/****************/
/* Local Macros */
/****************/
/* Definitions for locations parameters */
#define H5A_CRT_LOCATION_SIZE sizeof(H5VL_loc_params_t)
#define H5A_CRT_LOCATION_DEF H5I_BADID
/******************/
/* Local Typedefs */
@@ -54,6 +59,9 @@
/* Local Prototypes */
/********************/
/* Property class callbacks */
static herr_t H5P_acrt_reg_prop(H5P_genclass_t *pclass);
/*********************/
/* Package Variables */
@@ -68,7 +76,7 @@ const H5P_libclass_t H5P_CLS_ACRT[1] = {{
&H5P_CLS_ATTRIBUTE_CREATE_g, /* Pointer to class */
&H5P_CLS_ATTRIBUTE_CREATE_ID_g, /* Pointer to class ID */
&H5P_LST_ATTRIBUTE_CREATE_ID_g, /* Pointer to default property list ID */
NULL, /* Default property registration routine */
H5P_acrt_reg_prop, /* Default property registration routine */
NULL, /* Class creation callback */
NULL, /* Class creation callback info */
@@ -83,4 +91,44 @@ const H5P_libclass_t H5P_CLS_ACRT[1] = {{
/* Library Private Variables */
/*****************************/
/*-------------------------------------------------------------------------
* Function: H5P_acrt_reg_prop
*
* Purpose: Register the attribute creation property list class's properties
*
* Return: SUCCEED/FAIL
*
*-------------------------------------------------------------------------
*/
static herr_t
H5P_acrt_reg_prop(H5P_genclass_t *pclass)
{
hid_t type_id = H5I_INVALID_HID;
hid_t space_id = H5I_INVALID_HID;
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI_NOINIT
/* Register the type ID property*/
if(H5P__register_real(pclass, H5VL_PROP_ATTR_TYPE_ID, sizeof(hid_t), &type_id,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
/* Register the space ID property */
if(H5P__register_real(pclass, H5VL_PROP_ATTR_SPACE_ID, sizeof(hid_t), &space_id,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
/* Register the lcpl ID property */
HDmemset(&loc_params, 0, sizeof(H5VL_loc_params_t));
loc_params.obj_type = H5A_CRT_LOCATION_DEF;
if(H5P__register_real(pclass, H5VL_PROP_ATTR_LOC_PARAMS, H5A_CRT_LOCATION_SIZE, &loc_params,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5P_acrt_reg_prop() */
+18
View File
@@ -240,6 +240,9 @@ static hbool_t H5P_dcrt_def_layout_init_g = FALSE;
static herr_t
H5P__dcrt_reg_prop(H5P_genclass_t *pclass)
{
hid_t type_id = H5I_INVALID_HID;
hid_t space_id = H5I_INVALID_HID;
hid_t lcpl_id = H5P_LINK_CREATE_DEFAULT;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_STATIC
@@ -268,6 +271,21 @@ H5P__dcrt_reg_prop(H5P_genclass_t *pclass)
H5D_CRT_EXT_FILE_LIST_DEL, H5D_CRT_EXT_FILE_LIST_COPY, H5D_CRT_EXT_FILE_LIST_CMP, H5D_CRT_EXT_FILE_LIST_CLOSE) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
/* Register the type ID property*/
if(H5P__register_real(pclass, H5VL_PROP_DSET_TYPE_ID, sizeof(hid_t), &type_id,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, H5P_ignore_cmp, NULL) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
/* Register the space ID property */
if(H5P__register_real(pclass, H5VL_PROP_DSET_SPACE_ID, sizeof(hid_t), &space_id,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, H5P_ignore_cmp, NULL) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
/* Register the lcpl ID property */
if(H5P__register_real(pclass, H5VL_PROP_DSET_LCPL_ID, sizeof(hid_t), &lcpl_id,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, H5P_ignore_cmp, NULL) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5P__dcrt_reg_prop() */
+523
View File
@@ -39,6 +39,7 @@
#include "H5Iprivate.h" /* IDs */
#include "H5MMprivate.h" /* Memory Management */
#include "H5Ppkg.h" /* Property lists */
#include "H5VLprivate.h" /* VOL drivers */
/* Includes needed to set as default file driver */
#include "H5FDsec2.h" /* Posix unbuffered I/O file driver */
@@ -47,6 +48,9 @@
#include "H5FDwindows.h" /* Win32 I/O */
#endif
/* Includes needed to set the default VOL driver */
#include "H5VLnative.h" /* Native HDF5 file VOL driver */
/****************/
/* Local Macros */
@@ -258,6 +262,16 @@
#define H5F_ACS_PAGE_BUFFER_MIN_RAW_PERC_DEF 0
#define H5F_ACS_PAGE_BUFFER_MIN_RAW_PERC_ENC H5P__encode_unsigned
#define H5F_ACS_PAGE_BUFFER_MIN_RAW_PERC_DEC H5P__decode_unsigned
/* Definition for file VOL driver properties (ID, etc.) */
#define H5F_ACS_VOL_SIZE sizeof(H5VL_driver_prop_t)
#define H5F_ACS_VOL_DEF {H5_DEFAULT_VOL, NULL}
#define H5F_ACS_VOL_CRT H5P__facc_vol_create
#define H5F_ACS_VOL_SET H5P__facc_vol_set
#define H5F_ACS_VOL_GET H5P__facc_vol_get
#define H5F_ACS_VOL_DEL H5P__facc_vol_del
#define H5F_ACS_VOL_COPY H5P__facc_vol_copy
#define H5F_ACS_VOL_CMP H5P__facc_vol_cmp
#define H5F_ACS_VOL_CLOSE H5P__facc_vol_close
/******************/
@@ -320,6 +334,15 @@ static int H5P__facc_cache_image_config_cmp(const void *_config1, const void *_c
static herr_t H5P__facc_cache_image_config_enc(const void *value, void **_pp, size_t *size);
static herr_t H5P__facc_cache_image_config_dec(const void **_pp, void *_value);
/* VOL driver callbacks */
static herr_t H5P__facc_vol_create(const char *name, size_t size, void *value);
static herr_t H5P__facc_vol_set(hid_t prop_id, const char *name, size_t size, void *value);
static herr_t H5P__facc_vol_get(hid_t prop_id, const char *name, size_t size, void *value);
static herr_t H5P__facc_vol_del(hid_t prop_id, const char *name, size_t size, void *value);
static herr_t H5P__facc_vol_copy(const char *name, size_t size, void *value);
static int H5P__facc_vol_cmp(const void *value1, const void *value2, size_t size);
static herr_t H5P__facc_vol_close(const char *name, size_t size, void *value);
/*********************/
/* Package Variables */
@@ -414,6 +437,7 @@ static herr_t
H5P__facc_reg_prop(H5P_genclass_t *pclass)
{
const H5FD_driver_prop_t def_driver_prop = H5F_ACS_FILE_DRV_DEF; /* Default VFL driver ID & info (initialized from a variable) */
const H5VL_driver_prop_t def_vol_prop = H5F_ACS_VOL_DEF; /* Default VOL driver ID & info (initialized from a variable) */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_STATIC
@@ -644,6 +668,13 @@ H5P__facc_reg_prop(H5P_genclass_t *pclass)
NULL, NULL, NULL, NULL) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
/* Register the file VOL driver ID & info */
/* (Note: this property should not have an encode/decode callback -QAK) */
if(H5P__register_real(pclass, H5F_ACS_VOL_DRV_NAME, H5F_ACS_VOL_SIZE, &def_vol_prop,
H5F_ACS_VOL_CRT, H5F_ACS_VOL_SET, H5F_ACS_VOL_GET, NULL, NULL,
H5F_ACS_VOL_DEL, H5F_ACS_VOL_COPY, H5F_ACS_VOL_CMP, H5F_ACS_VOL_CLOSE) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5P__facc_reg_prop() */
@@ -4939,3 +4970,495 @@ done:
FUNC_LEAVE_API(ret_value)
} /* end H5Pget_page_buffer_size() */
/*-------------------------------------------------------------------------
* Function: H5P_set_vol
*
* Purpose: Set the VOL driver for a file access property list
* (PLIST_ID). The vol properties will
* be copied into the property list and the reference count on
* the vol will be incremented.
*
* Return: SUCCEED/FAIL
*
*-------------------------------------------------------------------------
*/
herr_t
H5P_set_vol(H5P_genplist_t *plist, hid_t vol_id, const void *vol_info)
{
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
if(NULL == H5I_object_verify(vol_id, H5I_VOL))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if(TRUE == H5P_isa_class(plist->plist_id, H5P_FILE_ACCESS)) {
H5VL_driver_prop_t vol_prop; /* Property for VOL ID & info */
/* Prepare the VOL driver property */
vol_prop.driver_id = vol_id;
vol_prop.driver_info = vol_info;
/* Set the driver ID & info property */
if(H5P_set(plist, H5F_ACS_VOL_DRV_NAME, &vol_prop) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set VOL driver ID & info")
}
else
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list");
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5P_set_vol() */
/*-------------------------------------------------------------------------
* Function: H5Pset_vol
*
* Purpose: Set the file VOL driver (VOL_ID) for a file access
* property list (PLIST_ID)
*
* Return: Success: Non-negative
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5Pset_vol(hid_t plist_id, hid_t new_vol_id, const void *new_vol_info)
{
H5P_genplist_t *plist; /* Property list pointer */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE3("e", "ii*x", plist_id, new_vol_id, new_vol_info);
/* Check arguments */
if(NULL == (plist = (H5P_genplist_t *)H5I_object_verify(plist_id, H5I_GENPROP_LST)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
if(NULL == H5I_object_verify(new_vol_id, H5I_VOL))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file vol ID")
/* Set the vol */
if(H5P_set_vol(plist, new_vol_id, new_vol_info) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set vol")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Pset_vol() */
/*-------------------------------------------------------------------------
* Function: H5P_get_vol_info
*
* Purpose: Returns a pointer directly to the file vol-specific
* information of a file access property list.
*
* Return: Success: Ptr to *uncopied* vol specific data
* structure if any.
*
* Failure: NULL. Null is also returned if the vol has
* not registered any vol-specific properties
* although no error is pushed on the stack in
* this case.
*
*-------------------------------------------------------------------------
*/
void *
H5P_get_vol_info(H5P_genplist_t *plist)
{
void *ret_value = NULL;
FUNC_ENTER_NOAPI(NULL)
/* Get the current vol info */
if(TRUE == H5P_isa_class(plist->plist_id, H5P_FILE_ACCESS)) {
H5VL_driver_prop_t driver_prop; /* Property for vol driver ID & info */
if(H5P_peek(plist, H5F_ACS_VOL_DRV_NAME, &driver_prop) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get vol driver info")
ret_value = (void *)driver_prop.driver_info;
} else
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5P_get_vol_info() */
/*-------------------------------------------------------------------------
* Function: H5Pget_vol_info
*
* Purpose: Returns a pointer directly to the file vol-specific
* information of a file access property list.
*
* XXX (VOL MERGE): This API call seems like a REALLY bad idea - DER
*
* Return: Success: Ptr to *uncopied* vol specific data
* structure if any.
*
* Failure: NULL. Null is also returned if the vol has
* not registered any vol-specific properties
* although no error is pushed on the stack in
* this case.
*
*-------------------------------------------------------------------------
*/
void *
H5Pget_vol_info(hid_t plist_id)
{
H5P_genplist_t *plist; /* Property list pointer */
void *ret_value; /* Return value */
FUNC_ENTER_API(NULL)
H5TRACE1("*x", "i", plist_id);
if(NULL == (plist = (H5P_genplist_t *)H5I_object_verify(plist_id, H5I_GENPROP_LST)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a property list")
if(NULL == (ret_value = H5P_get_vol_info(plist)))
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get vol info")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Pget_vol_info() */
/*-------------------------------------------------------------------------
* Function: H5P__vol_copy
*
* Purpose: Copy VOL driver ID & info.
*
* Note: This is an "in-place" copy, since this routine gets called
* after the top-level copy has been performed and this routine
* finishes the "deep" part of the copy.
*
* Return: Success: Non-negative
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
static herr_t
H5P__vol_copy(void *value)
{
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_STATIC
if(value) {
H5VL_driver_prop_t *info = (H5VL_driver_prop_t *)value; /* Driver ID & info struct */
/* Copy the driver ID & info, if there is one */
if(info->driver_id > 0) {
/* Increment the reference count on driver ID and copy driver info */
if(H5I_inc_ref(info->driver_id, FALSE) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTINC, FAIL, "unable to increment ref count on VOL driver ID")
/* Copy driver info, if it exists */
if(info->driver_info) {
H5VL_class_t *driver; /* Pointer to driver */
void *new_driver; /* Copy of driver info */
/* Retrieve the driver for the ID */
if(NULL == (driver = (H5VL_class_t *)H5I_object(info->driver_id)))
HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a VOL driver ID")
/* Allow the driver to copy or do it ourselves */
if(driver->fapl_copy) {
if(NULL == (new_driver = (driver->fapl_copy)(info->driver_info)))
HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "driver info copy failed")
}
else if(driver->fapl_size > 0) {
if(NULL == (new_driver = H5MM_malloc(driver->fapl_size)))
HGOTO_ERROR(H5E_PLIST, H5E_CANTALLOC, FAIL, "driver info allocation failed")
HDmemcpy(new_driver, info->driver_info, driver->fapl_size);
}
else
HGOTO_ERROR(H5E_PLIST, H5E_UNSUPPORTED, FAIL, "no way to copy driver info")
/* Set the driver info for the copy */
info->driver_info = new_driver;
}
}
}
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5P__vol_copy() */
/*-------------------------------------------------------------------------
* Function: H5P__vol_free
*
* Purpose: Free VOL driver ID & info.
*
* Return: Success: Non-negative
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
static herr_t
H5P__vol_free(void *value)
{
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_STATIC
if(value) {
H5VL_driver_prop_t *info = (H5VL_driver_prop_t *)value; /* Driver ID & info struct */
/* Free the driver info (if it exists) and decrement the ID */
if(info->driver_id > 0) {
if(info->driver_info) {
H5VL_class_t *driver; /* Pointer to driver */
/* Retrieve the driver for the ID */
if(NULL == (driver = (H5VL_class_t *)H5I_object(info->driver_id)))
HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a VOL driver ID")
/* Allow the driver to free info or do it ourselves */
if(driver->fapl_free) {
if((driver->fapl_free)((void *)info->driver_info) < 0) /* Casting away const OK -QAK */
HGOTO_ERROR(H5E_PLIST, H5E_CANTFREE, FAIL, "driver info free request failed")
}
else
H5MM_xfree((void *)info->driver_info); /* Casting away const OK -QAK */
}
/* Decrement reference count for driver ID */
if(H5I_dec_ref(info->driver_id) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTDEC, FAIL, "can't decrement reference count for driver ID")
}
}
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5P__vol_free() */
/*-------------------------------------------------------------------------
* Function: H5P__facc_vol_create
*
* Purpose: Create callback for the VOL driver ID & info property.
*
* Return: Success: Non-negative
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
static herr_t
H5P__facc_vol_create(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
{
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_STATIC
/* Make copy of the VOL driver */
if(H5P__vol_copy(value) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy VOL driver")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5P__facc_vol_create() */
/*-------------------------------------------------------------------------
* Function: H5P__facc_vol_set
*
* Purpose: Copies a VOL driver property when it's set for a property list
*
* Return: Success: Non-negative
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
static herr_t
H5P__facc_vol_set(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
size_t H5_ATTR_UNUSED size, void *value)
{
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_STATIC
/* Sanity check */
HDassert(value);
/* Make copy of VOL driver ID & info */
if(H5P__vol_copy(value) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy VOL driver")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5P__facc_vol_set() */
/*-------------------------------------------------------------------------
* Function: H5P__facc_vol_get
*
* Purpose: Copies a VOL driver property when it's retrieved from a property list
*
* Return: Success: Non-negative
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
static herr_t
H5P__facc_vol_get(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
size_t H5_ATTR_UNUSED size, void *value)
{
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_STATIC
/* Sanity check */
HDassert(value);
/* Make copy of VOL driver */
if(H5P__vol_copy(value) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy VOL driver")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5P__facc_vol_get() */
/*-------------------------------------------------------------------------
* Function: H5P__facc_vol_del
*
* Purpose: Frees memory used to store the VOL driver ID & info property
*
* Return: Success: Non-negative
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
static herr_t
H5P__facc_vol_del(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
{
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_STATIC
/* Free the VOL driver ID & info */
if(H5P__vol_free(value) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTRELEASE, FAIL, "can't release VOL driver")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5P__facc_vol_del() */
/*-------------------------------------------------------------------------
* Function: H5P__facc_vol_copy
*
* Purpose: Copy callback for the VOL driver ID & info property.
*
* Return: Success: Non-negative
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
static herr_t
H5P__facc_vol_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
{
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_STATIC
/* Make copy of VOL driver */
if(H5P__vol_copy(value) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy VOL driver")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5P__facc_vol_copy() */
/*-------------------------------------------------------------------------
* Function: H5P__facc_vol_cmp
*
* Purpose: Callback routine which is called whenever the VOL driver
* ID & info property in the file access property list
* is compared.
*
* Return: positive if VALUE1 is greater than VALUE2, negative if
* VALUE2 is greater than VALUE1 and zero if VALUE1 and
* VALUE2 are equal.
*
*-------------------------------------------------------------------------
*/
static int
H5P__facc_vol_cmp(const void *_info1, const void *_info2, size_t H5_ATTR_UNUSED size)
{
const H5VL_driver_prop_t *info1 = (const H5VL_driver_prop_t *)_info1; /* Create local aliases for values */
const H5VL_driver_prop_t *info2 = (const H5VL_driver_prop_t *)_info2;
H5VL_class_t *cls1, *cls2; /* Driver class for each property */
int cmp_value; /* Value from comparison */
herr_t ret_value = 0; /* Return value */
FUNC_ENTER_STATIC_NOERR
/* Sanity check */
HDassert(info1);
HDassert(info2);
HDassert(size == sizeof(H5VL_driver_prop_t));
/* Compare drivers */
if(NULL == (cls1 = (H5VL_class_t *)H5I_object(info1->driver_id)))
HGOTO_DONE(-1)
if(NULL == (cls2 = (H5VL_class_t *)H5I_object(info2->driver_id)))
HGOTO_DONE(1)
if(cls1->name == NULL && cls2->name != NULL)
HGOTO_DONE(-1);
if(cls1->name != NULL && cls2->name == NULL)
HGOTO_DONE(1);
if(0 != (cmp_value = HDstrcmp(cls1->name, cls2->name)))
HGOTO_DONE(cmp_value);
/* Compare driver info */
if(cls1->fapl_size < cls2->fapl_size)
HGOTO_DONE(-1)
if(cls1->fapl_size > cls2->fapl_size)
HGOTO_DONE(1)
HDassert(cls1->fapl_size == cls2->fapl_size);
if(info1->driver_info == NULL && info2->driver_info != NULL)
HGOTO_DONE(-1);
if(info1->driver_info != NULL && info2->driver_info == NULL)
HGOTO_DONE(1);
if(info1->driver_info) {
HDassert(cls1->fapl_size > 0);
if(0 != (cmp_value = HDmemcmp(info1->driver_info, info2->driver_info, cls1->fapl_size)))
HGOTO_DONE(cmp_value);
}
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5P__facc_vol_cmp() */
/*-------------------------------------------------------------------------
* Function: H5P__facc_vol_close
*
* Purpose: Close callback for the VOL driver ID & info property.
*
* Return: Success: Non-negative
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
static herr_t
H5P__facc_vol_close(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
{
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_STATIC
/* Free the VOL driver */
if(H5P__vol_free(value) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTRELEASE, FAIL, "can't release VOL driver")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5P__facc_vol_close() */
+6
View File
@@ -128,6 +128,7 @@ static const H5O_linfo_t H5G_def_linfo_g = H5G_CRT_LINK_INFO_DEF; /* Defaul
static herr_t
H5P__gcrt_reg_prop(H5P_genclass_t *pclass)
{
hid_t lcpl_id = H5P_LINK_CREATE_DEFAULT;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_STATIC
@@ -144,6 +145,11 @@ H5P__gcrt_reg_prop(H5P_genclass_t *pclass)
NULL, NULL, NULL, NULL) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
/* Register the lcpl ID property */
if(H5P__register_real(pclass, H5VL_PROP_GRP_LCPL_ID, sizeof(hid_t), &lcpl_id,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5P__gcrt_reg_prop() */
+19
View File
@@ -5452,3 +5452,22 @@ H5P_get_class(const H5P_genplist_t *plist)
FUNC_LEAVE_NOAPI(plist->pclass)
} /* end H5P_get_class() */
/*-------------------------------------------------------------------------
* Function: H5P_ignore_cmp
*
* Purpose: Callback routine to ignore comparing property values.
*
* Return: zero
*
*-------------------------------------------------------------------------
*/
int
H5P_ignore_cmp(const void H5_ATTR_UNUSED *val1, const void H5_ATTR_UNUSED *val2,
size_t H5_ATTR_UNUSED size)
{
FUNC_ENTER_NOAPI_NOINIT_NOERR
FUNC_LEAVE_NOAPI(0)
} /* end H5P_ignore_cmp() */
+55
View File
@@ -48,6 +48,31 @@
#define H5L_CRT_INTERMEDIATE_GROUP_ENC H5P__encode_unsigned
#define H5L_CRT_INTERMEDIATE_GROUP_DEC H5P__decode_unsigned
/* ======== VOL specific properties ========= */
/* Definitions for target object ID */
#define H5L_CRT_TARGET_SIZE sizeof(void *)
#define H5L_CRT_TARGET_DEF NULL
/* Definitions for Location params */
#define H5L_CRT_LOCATION_SIZE sizeof(H5VL_loc_params_t)
#define H5L_CRT_LOCATION_DEF {H5I_BADID, H5VL_OBJECT_BY_SELF, {HADDR_UNDEF}}
/* Definitions for target object NAME */
#define H5L_CRT_TARGET_NAME_SIZE sizeof(char *)
#define H5L_CRT_TARGET_NAME_DEF NULL
/* Definitions for link type */
#define H5L_CRT_LINK_TYPE_SIZE sizeof(link_type)
#define H5L_CRT_LINK_TYPE_DEF H5L_TYPE_ERROR
/* Definitions for UDATA */
#define H5L_CRT_UDATA_SIZE sizeof(void *)
#define H5L_CRT_UDATA_DEF NULL
/* Definitions for UDATA_SIZE */
#define H5L_CRT_UDATA_SIZE_SIZE sizeof(size_t)
#define H5L_CRT_UDATA_SIZE_DEF 0
/******************/
/* Local Typedefs */
/******************/
@@ -118,6 +143,12 @@ static const unsigned H5L_def_intmd_group_g = H5L_CRT_INTERMEDIATE_GROUP_DEF;
herr_t
H5P_lcrt_reg_prop(H5P_genclass_t *pclass)
{
void* target = H5L_CRT_TARGET_DEF;
H5VL_loc_params_t loc_params = H5L_CRT_LOCATION_DEF;
char *target_name = H5L_CRT_TARGET_NAME_DEF;
H5L_type_t link_type = H5L_CRT_LINK_TYPE_DEF;
void *udata = H5L_CRT_UDATA_DEF;
size_t udata_size = H5L_CRT_UDATA_SIZE_DEF;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
@@ -128,6 +159,30 @@ H5P_lcrt_reg_prop(H5P_genclass_t *pclass)
NULL, NULL, NULL, NULL) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
if(H5P__register_real(pclass, H5VL_PROP_LINK_TARGET, H5L_CRT_TARGET_SIZE, &target,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
if(H5P__register_real(pclass, H5VL_PROP_LINK_TARGET_LOC_PARAMS, H5L_CRT_LOCATION_SIZE, &loc_params,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
if(H5P__register_real(pclass, H5VL_PROP_LINK_TARGET_NAME, H5L_CRT_TARGET_NAME_SIZE, &target_name,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
if(H5P__register_real(pclass, H5VL_PROP_LINK_TYPE, H5L_CRT_LINK_TYPE_SIZE, &link_type,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
if(H5P__register_real(pclass, H5VL_PROP_LINK_UDATA, H5L_CRT_UDATA_SIZE, &udata,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
if(H5P__register_real(pclass, H5VL_PROP_LINK_UDATA_SIZE, H5L_CRT_UDATA_SIZE_SIZE, &udata_size,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5P_lcrt_reg_prop() */
+4
View File
@@ -177,6 +177,8 @@ H5_DLL hid_t H5P_peek_driver(H5P_genplist_t *plist);
H5_DLL const void *H5P_peek_driver_info(H5P_genplist_t *plist);
H5_DLL herr_t H5P_set_driver(H5P_genplist_t *plist, hid_t new_driver_id,
const void *new_driver_info);
H5_DLL herr_t H5P_set_vol(H5P_genplist_t *plist, hid_t vol_id, const void *vol_info);
H5_DLL void * H5P_get_vol_info(H5P_genplist_t *plist);
H5_DLL herr_t H5P_set_vlen_mem_manager(H5P_genplist_t *plist,
H5MM_allocate_t alloc_func, void *alloc_info, H5MM_free_t free_func,
void *free_info);
@@ -204,6 +206,8 @@ H5_DLL herr_t H5P_fill_value_defined(H5P_genplist_t *plist,
H5D_fill_value_t *status);
H5_DLL herr_t H5P_get_fill_value(H5P_genplist_t *plist, const struct H5T_t *type,
void *value);
H5_DLL int H5P_ignore_cmp(const void H5_ATTR_UNUSED *val1, const void H5_ATTR_UNUSED *val2,
size_t H5_ATTR_UNUSED size);
#endif /* _H5Pprivate_H */
+2
View File
@@ -313,6 +313,8 @@ H5_DLL herr_t H5Pset_driver(hid_t plist_id, hid_t driver_id,
const void *driver_info);
H5_DLL hid_t H5Pget_driver(hid_t plist_id);
H5_DLL const void *H5Pget_driver_info(hid_t plist_id);
H5_DLL herr_t H5Pset_vol(hid_t plist_id, hid_t new_vol_id, const void *new_vol_info);
H5_DLL void *H5Pget_vol_info(hid_t plist_id);
H5_DLL herr_t H5Pset_family_offset(hid_t fapl_id, hsize_t offset);
H5_DLL herr_t H5Pget_family_offset(hid_t fapl_id, hsize_t *offset);
H5_DLL herr_t H5Pset_multi_type(hid_t fapl_id, H5FD_mem_t type);
+74 -35
View File
@@ -91,8 +91,8 @@
herr_t
H5Rcreate(void *ref, hid_t loc_id, const char *name, H5R_type_t ref_type, hid_t space_id)
{
H5G_loc_t loc; /* File location */
H5S_t *space = NULL; /* Pointer to dataspace containing region */
H5VL_object_t *vol_obj = NULL; /* Object token of loc_id */
H5VL_loc_params_t loc_params;
herr_t ret_value; /* Return value */
FUNC_ENTER_API(FAIL)
@@ -101,8 +101,6 @@ H5Rcreate(void *ref, hid_t loc_id, const char *name, H5R_type_t ref_type, hid_t
/* Check args */
if (ref == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid reference pointer")
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!name || !*name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name given")
if(ref_type <= H5R_BADTYPE || ref_type >= H5R_MAXTYPE)
@@ -111,15 +109,27 @@ H5Rcreate(void *ref, hid_t loc_id, const char *name, H5R_type_t ref_type, hid_t
HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "reference type not supported")
if(space_id == (-1) && ref_type == H5R_DATASET_REGION)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "reference region dataspace id must be valid")
if(space_id != (-1) && (NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE))))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
/* Set up collective metadata if appropriate */
if(H5CX_set_loc(loc_id) < 0)
HGOTO_ERROR(H5E_REFERENCE, H5E_CANTSET, FAIL, "can't set access property list info")
/* Set location parameters */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(loc_id);
/* Get the file object */
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid file identifier")
/* Set up collective metadata if appropriate */
if(H5CX_set_loc(loc_id) < 0)
HGOTO_ERROR(H5E_REFERENCE, H5E_CANTSET, FAIL, "can't set access property list info")
/* Create reference */
if((ret_value = H5R__create(ref, &loc, name, ref_type, space)) < 0)
if((ret_value = H5VL_object_specific(vol_obj->data, loc_params, vol_obj->driver->cls, H5VL_REF_CREATE,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL,
ref, name, ref_type, space_id)) < 0)
HGOTO_ERROR(H5E_REFERENCE, H5E_CANTCREATE, FAIL, "unable to create reference")
done:
@@ -157,16 +167,16 @@ done:
hid_t
H5Rdereference2(hid_t obj_id, hid_t oapl_id, H5R_type_t ref_type, const void *_ref)
{
H5G_loc_t loc; /* Group location */
H5F_t *file = NULL; /* File object */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5I_type_t opened_type;
void *opened_obj = NULL;
H5VL_loc_params_t loc_params;
hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
H5TRACE4("i", "iiRt*x", obj_id, oapl_id, ref_type, _ref);
/* Check args */
if(H5G_loc(obj_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a location")
if(oapl_id < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a property list")
if(ref_type <= H5R_BADTYPE || ref_type >= H5R_MAXTYPE)
@@ -178,13 +188,25 @@ H5Rdereference2(hid_t obj_id, hid_t oapl_id, H5R_type_t ref_type, const void *_r
if(H5CX_set_apl(&oapl_id, H5P_CLS_DACC, obj_id, FALSE) < 0)
HGOTO_ERROR(H5E_REFERENCE, H5E_CANTSET, FAIL, "can't set access property list info")
/* Get the file pointer from the entry */
file = loc.oloc->file;
/* Get the VOL object */
if(NULL == (vol_obj = H5VL_get_object(obj_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid file identifier")
/* Set location parameters */
loc_params.type = H5VL_OBJECT_BY_REF;
loc_params.loc_data.loc_by_ref.ref_type = ref_type;
loc_params.loc_data.loc_by_ref._ref = _ref;
loc_params.loc_data.loc_by_ref.lapl_id = oapl_id;
loc_params.obj_type = H5I_get_type(obj_id);
/* Dereference */
if((ret_value = H5R__dereference(file, oapl_id, ref_type, _ref)) < 0)
if(NULL == (opened_obj = H5VL_object_open(vol_obj->data, loc_params, vol_obj->driver->cls,
&opened_type, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_REFERENCE, H5E_CANTOPENOBJ, H5I_INVALID_HID, "unable to dereference object")
if((ret_value = H5VL_register_id(opened_type, opened_obj, vol_obj->driver, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register object handle")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Rdereference2() */
@@ -216,28 +238,31 @@ done:
hid_t
H5Rget_region(hid_t id, H5R_type_t ref_type, const void *ref)
{
H5G_loc_t loc; /* Object's group location */
H5S_t *space = NULL; /* Dataspace object */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
H5TRACE3("i", "iRt*x", id, ref_type, ref);
/* Check args */
if(H5G_loc(id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a location")
if(ref_type != H5R_DATASET_REGION)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "invalid reference type")
if(ref == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "invalid reference pointer")
/* Get the dataspace with the correct region selected */
if(NULL == (space = H5R__get_region(loc.oloc->file, ref)))
HGOTO_ERROR(H5E_REFERENCE, H5E_CANTGET, H5I_INVALID_HID, "unable to retrieve dataspace")
/* Set location parameters */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(id);
/* Atomize */
if((ret_value = H5I_register(H5I_DATASPACE, space, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register dataspace atom")
/* get the file object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid file identifier")
/* Get the dataspace with the correct region selected */
if(H5VL_object_get(vol_obj->data, loc_params, vol_obj->driver->cls, H5VL_REF_GET_REGION,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, &ret_value, ref_type, ref) < 0)
HGOTO_ERROR(H5E_REFERENCE, H5E_CANTGET, H5I_INVALID_HID, "unable to retrieve dataspace")
done:
FUNC_LEAVE_API(ret_value)
@@ -271,22 +296,31 @@ herr_t
H5Rget_obj_type2(hid_t id, H5R_type_t ref_type, const void *ref,
H5O_type_t *obj_type)
{
H5G_loc_t loc; /* Object location */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE4("e", "iRt*x*Ot", id, ref_type, ref, obj_type);
/* Check args */
if(H5G_loc(id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(ref_type <= H5R_BADTYPE || ref_type >= H5R_MAXTYPE)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid reference type")
if(ref == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid reference pointer")
/* Set location parameters */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(id);
/* Get the file object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid file identifier")
/* Get the object type */
if(H5R__get_obj_type(loc.oloc->file, ref_type, ref, obj_type) < 0)
if(H5VL_object_get(vol_obj->data, loc_params, vol_obj->driver->cls,
H5VL_REF_GET_TYPE, H5P_DATASET_XFER_DEFAULT,
H5_REQUEST_NULL, obj_type, ref_type, ref) < 0)
HGOTO_ERROR(H5E_REFERENCE, H5E_CANTGET, FAIL, "unable to determine object type")
done:
@@ -331,26 +365,31 @@ ssize_t
H5Rget_name(hid_t id, H5R_type_t ref_type, const void *_ref, char *name,
size_t size)
{
H5G_loc_t loc; /* Group location */
H5F_t *file; /* File object */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
ssize_t ret_value = -1; /* Return value */
FUNC_ENTER_API((-1))
H5TRACE5("Zs", "iRt*x*sz", id, ref_type, _ref, name, size);
/* Check args */
if(H5G_loc(id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, (-1), "not a location")
if(ref_type <= H5R_BADTYPE || ref_type >= H5R_MAXTYPE)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, (-1), "invalid reference type")
if(_ref == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, (-1), "invalid reference pointer")
/* Get the file pointer from the entry */
file = loc.oloc->file;
/* Set location parameters */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(id);
/* Get the file object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, (-1), "invalid file identifier")
/* Get name */
if((ret_value = H5R__get_name(file, id, ref_type, _ref, name, size)) < 0)
if(H5VL_object_get(vol_obj->data, loc_params, vol_obj->driver->cls, H5VL_REF_GET_NAME,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL,
&ret_value, name, size, ref_type, _ref) < 0)
HGOTO_ERROR(H5E_REFERENCE, H5E_CANTGET, (-1), "unable to determine object path")
done:
+32 -11
View File
@@ -42,6 +42,7 @@
#include "H5CXprivate.h" /* API Contexts */
#include "H5Eprivate.h" /* Error handling */
#include "H5Gprivate.h" /* Groups */
#include "H5Iprivate.h" /* IDs */
#include "H5Oprivate.h" /* Object headers */
#include "H5Rpkg.h" /* References */
@@ -102,7 +103,8 @@
H5G_obj_t
H5Rget_obj_type1(hid_t id, H5R_type_t ref_type, const void *ref)
{
H5G_loc_t loc; /* Object location */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
H5O_type_t obj_type; /* Object type */
H5G_obj_t ret_value; /* Return value */
@@ -110,15 +112,22 @@ H5Rget_obj_type1(hid_t id, H5R_type_t ref_type, const void *ref)
H5TRACE3("Go", "iRt*x", id, ref_type, ref);
/* Check args */
if (H5G_loc(id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5G_UNKNOWN, "not a location")
if (ref_type <= H5R_BADTYPE || ref_type >= H5R_MAXTYPE)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5G_UNKNOWN, "invalid reference type")
if (ref == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5G_UNKNOWN, "invalid reference pointer")
/* Set location parameters */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(id);
/* Get the vol object */
if (NULL == (vol_obj = H5VL_get_object(id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5G_UNKNOWN, "invalid file identifier")
/* Get the object information */
if(H5R__get_obj_type(loc.oloc->file, ref_type, ref, &obj_type) < 0)
if (H5VL_object_get(vol_obj->data, loc_params, vol_obj->driver->cls, H5VL_REF_GET_TYPE,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, &obj_type, ref_type, ref) < 0)
HGOTO_ERROR(H5E_REFERENCE, H5E_CANTGET, H5G_UNKNOWN, "unable to determine object type")
/* Set return value */
@@ -148,28 +157,40 @@ done:
hid_t
H5Rdereference1(hid_t obj_id, H5R_type_t ref_type, const void *_ref)
{
H5G_loc_t loc; /* Group location */
H5F_t *file = NULL; /* File object */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5I_type_t opened_type;
void *opened_obj = NULL;
H5VL_loc_params_t loc_params;
hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
H5TRACE3("i", "iRt*x", obj_id, ref_type, _ref);
/* Check args */
if (H5G_loc(obj_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a location")
if (ref_type <= H5R_BADTYPE || ref_type >= H5R_MAXTYPE)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "invalid reference type")
if (_ref == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "invalid reference pointer")
/* Get the file pointer from the entry */
file = loc.oloc->file;
/* Get the VOL object */
if (NULL == (vol_obj = H5VL_get_object(obj_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid file identifier")
loc_params.type = H5VL_OBJECT_BY_REF;
loc_params.loc_data.loc_by_ref.ref_type = ref_type;
loc_params.loc_data.loc_by_ref._ref = _ref;
loc_params.loc_data.loc_by_ref.lapl_id = H5P_DATASET_ACCESS_DEFAULT;
loc_params.obj_type = H5I_get_type(obj_id);
/* Dereference */
if((ret_value = H5R__dereference(file, H5P_DATASET_ACCESS_DEFAULT, ref_type, _ref)) < 0)
if (NULL == (opened_obj = H5VL_object_open(vol_obj->data, loc_params, vol_obj->driver->cls, &opened_type,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_REFERENCE, H5E_CANTOPENOBJ, H5I_INVALID_HID, "unable to dereference object")
/* Get an atom for the object */
if ((ret_value = H5VL_register_id(opened_type, opened_obj, vol_obj->driver, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to atomize object handle")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Rdereference1() */
+1 -2
View File
@@ -692,8 +692,7 @@ done:
REVISION LOG
--------------------------------------------------------------------------*/
ssize_t
H5R__get_name(H5F_t *f, hid_t id, H5R_type_t ref_type, const void *_ref,
char *name, size_t size)
H5R__get_name(H5F_t *f, H5R_type_t ref_type, const void *_ref, char *name, size_t size)
{
hid_t file_id = H5I_INVALID_HID; /* ID for file that the reference is in */
H5O_loc_t oloc; /* Object location describing object for reference */
+1 -1
View File
@@ -54,7 +54,7 @@ H5_DLL herr_t H5R__create(void *ref, H5G_loc_t *loc, const char *name, H5R_type_
H5_DLL hid_t H5R__dereference(H5F_t *file, hid_t dapl_id, H5R_type_t ref_type, const void *_ref);
H5_DLL H5S_t *H5R__get_region(H5F_t *file, const void *_ref);
H5_DLL herr_t H5R__get_obj_type(H5F_t *file, H5R_type_t ref_type, const void *_ref, H5O_type_t *obj_type);
H5_DLL ssize_t H5R__get_name(H5F_t *file, hid_t id, H5R_type_t ref_type, const void *_ref, char *name, size_t size);
H5_DLL ssize_t H5R__get_name(H5F_t *file, H5R_type_t ref_type, const void *_ref, char *name, size_t size);
#endif /* _H5Rpkg_H */
+1
View File
@@ -131,6 +131,7 @@ H5_DLL H5S_class_t H5Sget_simple_extent_type(hid_t space_id);
H5_DLL herr_t H5Sset_extent_none(hid_t space_id);
H5_DLL herr_t H5Sextent_copy(hid_t dst_id,hid_t src_id);
H5_DLL htri_t H5Sextent_equal(hid_t sid1, hid_t sid2);
H5_DLL herr_t H5Sselect_copy(hid_t dst_id, hid_t src_id);
H5_DLL herr_t H5Sselect_all(hid_t spaceid);
H5_DLL herr_t H5Sselect_none(hid_t spaceid);
H5_DLL herr_t H5Soffset_simple(hid_t space_id, const hssize_t *offset);
+46
View File
@@ -86,6 +86,52 @@ H5S_select_offset(H5S_t *space, const hssize_t *offset)
FUNC_LEAVE_NOAPI(SUCCEED)
} /* H5S_select_offset() */
/*--------------------------------------------------------------------------
NAME
H5Sselect_copy
PURPOSE
Copy a selection from one dataspace to another
USAGE
herr_t H5Sselect_copy(dst, src)
hid_t dst; OUT: ID of the destination dataspace
hid_t src; IN: ID of the source dataspace
RETURNS
Non-negative on success/Negative on failure
DESCRIPTION
Copies all the selection information (including offset) from the source
dataspace to the destination dataspace.
GLOBAL VARIABLES
COMMENTS, BUGS, ASSUMPTIONS
EXAMPLES
REVISION LOG
--------------------------------------------------------------------------*/
herr_t
H5Sselect_copy(hid_t dst_id, hid_t src_id)
{
H5S_t *src;
H5S_t *dst;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE2("e", "ii", dst_id, src_id);
/* Check args */
if(NULL == (src = (H5S_t *)H5I_object_verify(src_id, H5I_DATASPACE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
if(NULL == (dst = (H5S_t *)H5I_object_verify(dst_id, H5I_DATASPACE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
/* Copy */
if(H5S_select_copy(dst, src, FALSE) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, FAIL, "can't copy selection")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Sselect_copy() */
/*--------------------------------------------------------------------------
NAME
+50 -5
View File
@@ -41,6 +41,7 @@
#include "H5MMprivate.h" /* Memory management */
#include "H5Pprivate.h" /* Property lists */
#include "H5Tpkg.h" /* Datatypes */
#include "H5VLprivate.h" /* Virtual Object Layer */
/****************/
@@ -1607,6 +1608,21 @@ H5T__close_cb(H5T_t *dt)
HDassert(dt);
HDassert(dt->shared);
/* If this datatype is VOL-managed (i.e.: has a VOL object),
* close it through the VOL driver.
*/
if(NULL != dt->vol_obj) {
/* Close the driver-managed datatype data */
if(H5VL_datatype_close(dt->vol_obj->data, dt->vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CLOSEERROR, FAIL, "unable to close datatype");
/* Free the VOL object */
if(H5VL_free_object(dt->vol_obj) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTDEC, FAIL, "unable to free VOL object");
dt->vol_obj = NULL;
}
/* Close the datatype */
if(H5T_close(dt) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CLOSEERROR, FAIL, "unable to close datatype");
@@ -1650,11 +1666,11 @@ H5Tcreate(H5T_class_t type, size_t size)
/* create the type */
if(NULL == (dt = H5T__create(type, size)))
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to create type")
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to create type")
/* Get an ID for the datatype */
if((ret_value = H5I_register(H5I_DATATYPE, dt, TRUE)) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register datatype ID")
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register datatype ID")
done:
FUNC_LEAVE_API(ret_value)
@@ -1701,7 +1717,7 @@ H5Tcopy(hid_t type_id)
H5D_t *dset; /* Dataset for datatype */
/* The argument is a dataset handle */
if(NULL == (dset = (H5D_t *)H5I_object(type_id)))
if(NULL == (dset = (H5D_t *)H5VL_object(type_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a dataset")
if(NULL == (dt = H5D_typeof(dset)))
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, H5I_INVALID_HID, "unable to get the dataset datatype")
@@ -1716,6 +1732,7 @@ H5Tcopy(hid_t type_id)
case H5I_ATTR:
case H5I_REFERENCE:
case H5I_VFL:
case H5I_VOL:
case H5I_GENPROP_CLS:
case H5I_GENPROP_LST:
case H5I_ERROR_CLASS:
@@ -3039,6 +3056,8 @@ H5T_decode(size_t buf_size, const unsigned char *buf)
if(H5T_set_loc(ret_value, NULL, H5T_LOC_MEMORY) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "invalid datatype location")
/* No VOL object */
ret_value->vol_obj = NULL;
done:
/* Release fake file structure */
if(f && H5F_fake_free(f) < 0)
@@ -3162,6 +3181,9 @@ H5T__create(H5T_class_t type, size_t size)
if(H5T_STRING != type || H5T_VARIABLE != size)
dt->shared->size = size;
/* No VOL object */
dt->vol_obj = NULL;
/* Set return value */
ret_value = dt;
@@ -3215,6 +3237,9 @@ H5T_copy(H5T_t *old_dt, H5T_copy_t method)
/* Copy shared information (entry information is copied last) */
*(new_dt->shared) = *(old_dt->shared);
/* No VOL object */
new_dt->vol_obj = NULL;
/* Check what sort of copy we are making */
switch (method) {
case H5T_COPY_TRANSIENT:
@@ -3543,6 +3568,9 @@ H5T__alloc(void)
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
dt->shared->version = H5O_DTYPE_VERSION_1;
/* No VOL object initially */
dt->vol_obj = NULL;
/* Assign return value */
ret_value = dt;
@@ -3643,7 +3671,8 @@ done:
*
* Purpose: Frees a datatype and all associated memory.
*
* Hote: Does _not_ deal with open named datatypes, etc.
* Note: Does _not_ deal with open named datatypes, etc. so this
* should never see a type managed by a VOL driver.
*
* Return: Non-negative on success/Negative on failure
*
@@ -5115,8 +5144,10 @@ H5T_is_named(const H5T_t *dt)
HDassert(dt);
if(dt->shared->state == H5T_STATE_OPEN || dt->shared->state == H5T_STATE_NAMED)
if(dt->vol_obj)
ret_value = TRUE;
else
ret_value = (H5T_STATE_OPEN == dt->shared->state || H5T_STATE_NAMED == dt->shared->state);
done:
FUNC_LEAVE_NOAPI(ret_value)
@@ -5158,6 +5189,20 @@ H5T_convert_committed_datatype(H5T_t *dt, H5F_t *f)
if(H5G_name_free(&dt->path) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTOPENOBJ, FAIL, "unable to reset path")
/* If the datatype is committed through the VOL, close it */
if (NULL != dt->vol_obj) {
H5VL_object_t *vol_obj = dt->vol_obj;
/* Close the datatype through the VOL*/
if ((ret_value = H5VL_datatype_close(vol_obj->data, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CLOSEERROR, FAIL, "unable to close datatype");
/* Free the datatype and set the VOL object pointer to NULL */
if (H5VL_free_object(vol_obj) < 0)
HGOTO_ERROR(H5E_ATTR, H5E_CANTDEC, FAIL, "unable to free VOL object");
dt->vol_obj = NULL;
}
dt->shared->state = H5T_STATE_TRANSIENT;
}
+278 -24
View File
@@ -30,12 +30,15 @@
#include "H5ACprivate.h" /* Metadata cache */
#include "H5CXprivate.h" /* API Contexts */
#include "H5Eprivate.h" /* Error handling */
#include "H5FLprivate.h" /* Free lists */
#include "H5FOprivate.h" /* File objects */
#include "H5Iprivate.h" /* IDs */
#include "H5Lprivate.h" /* Links */
#include "H5MMprivate.h" /* Memory Management */
#include "H5Oprivate.h" /* Object headers */
#include "H5Pprivate.h" /* Property lists */
#include "H5Tpkg.h" /* Datatypes */
#include "H5VLprivate.h" /* Virtual Object Layer */
/****************/
@@ -78,6 +81,12 @@ static H5T_t *H5T__open_oid(const H5G_loc_t *loc);
/* Local Variables */
/*******************/
/* Declare a free list to manage the H5VL_t struct */
H5FL_EXTERN(H5VL_t);
/* Declare a free list to manage the H5VL_object_t struct */
H5FL_EXTERN(H5VL_object_t);
/*-------------------------------------------------------------------------
@@ -94,22 +103,25 @@ herr_t
H5Tcommit2(hid_t loc_id, const char *name, hid_t type_id, hid_t lcpl_id,
hid_t tcpl_id, hid_t tapl_id)
{
H5G_loc_t loc; /* Location to create datatype */
H5T_t *type = NULL; /* Datatype for ID */
void *data = NULL; /* VOL-managed datatype data */
H5VL_object_t *new_obj = NULL; /* VOL object that holds the datatype object and the VOL info */
H5T_t *dt = NULL; /* High level datatype object that wraps the VOL object */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE6("e", "i*siiii", loc_id, name, type_id, lcpl_id, tcpl_id, tapl_id);
/* Check arguments */
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "name parameter cannot be NULL")
if(!*name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "name parameter cannot be an empty string")
if(NULL == (type = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
if(H5T_is_named(dt))
HGOTO_ERROR(H5E_ARGS, H5E_CANTSET, FAIL, "datatype is already committed")
/* Get correct property list */
if(H5P_DEFAULT == lcpl_id)
@@ -119,7 +131,7 @@ H5Tcommit2(hid_t loc_id, const char *name, hid_t type_id, hid_t lcpl_id,
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link creation property list")
/* Get correct property list */
if(H5P_DEFAULT == tcpl_id)
if (H5P_DEFAULT == tcpl_id)
tcpl_id = H5P_DATATYPE_CREATE_DEFAULT;
else
if(TRUE != H5P_isa_class(tcpl_id, H5P_DATATYPE_CREATE))
@@ -129,10 +141,30 @@ H5Tcommit2(hid_t loc_id, const char *name, hid_t type_id, hid_t lcpl_id,
if(H5CX_set_apl(&tapl_id, H5P_CLS_TACC, loc_id, TRUE) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTSET, FAIL, "can't set access property list info")
/* Fill in location struct fields */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(loc_id);
/* Get the object from the loc_id */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid object identifier")
/* Commit the type */
if(H5T__commit_named(&loc, name, type, lcpl_id, tcpl_id) < 0)
if(NULL == (data = H5VL_datatype_commit(vol_obj->data, loc_params, vol_obj->driver->cls,
name, type_id, lcpl_id, tcpl_id, tapl_id,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to commit datatype")
/* Set up VOL object */
if(NULL == (new_obj = H5FL_CALLOC(H5VL_object_t)))
HGOTO_ERROR(H5E_VOL, H5E_NOSPACE, FAIL, "can't allocate top object structure")
new_obj->driver = vol_obj->driver;
new_obj->driver->nrefs ++;
new_obj->data = data;
/* Set the committed type object to the VOL driver pointer in the H5T_t struct */
dt->vol_obj = new_obj;
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Tcommit2() */
@@ -237,16 +269,17 @@ done:
herr_t
H5Tcommit_anon(hid_t loc_id, hid_t type_id, hid_t tcpl_id, hid_t tapl_id)
{
H5G_loc_t loc; /* Group location for location */
void *dt = NULL; /* datatype object created by VOL plugin */
H5VL_object_t *new_obj = NULL; /* VOL object that holds the datatype object and the VOL info */
H5T_t *type = NULL; /* Datatype created */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE4("e", "iiii", loc_id, type_id, tcpl_id, tapl_id);
/* Check arguments */
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(NULL == (type = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
if(H5T_is_named(type))
@@ -263,10 +296,30 @@ H5Tcommit_anon(hid_t loc_id, hid_t type_id, hid_t tcpl_id, hid_t tapl_id)
if(H5CX_set_apl(&tapl_id, H5P_CLS_TACC, loc_id, TRUE) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTSET, FAIL, "can't set access property list info")
/* Fill in location struct fields */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(loc_id);
/* Get the file object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid file identifier")
/* Commit the datatype */
if(H5T__commit_anon(loc.oloc->file, type, tcpl_id) < 0)
if(NULL == (dt = H5VL_datatype_commit(vol_obj->data, loc_params, vol_obj->driver->cls,
NULL, type_id, H5P_DEFAULT, tcpl_id, tapl_id,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to commit datatype")
/* Setup VOL object */
if(NULL == (new_obj = H5FL_CALLOC(H5VL_object_t)))
HGOTO_ERROR(H5E_VOL, H5E_NOSPACE, FAIL, "can't allocate top object structure")
new_obj->driver = vol_obj->driver;
new_obj->driver->nrefs ++;
new_obj->data = dt;
/* Set the committed type object to the VOL pluging pointer in the H5T_t struct */
type->vol_obj = new_obj;
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Tcommit_anon() */
@@ -515,16 +568,15 @@ done:
hid_t
H5Topen2(hid_t loc_id, const char *name, hid_t tapl_id)
{
H5T_t *type = NULL; /* Datatype opened in file */
H5G_loc_t loc; /* Group location of object to open */
void *dt = NULL; /* datatype token created by VOL driver */
H5VL_object_t *vol_obj = NULL; /* object token of loc_id */
H5VL_loc_params_t loc_params;
hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
H5TRACE3("i", "i*si", loc_id, name, tapl_id);
/* Check args */
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a location")
if(!name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "name parameter cannot be NULL")
if(!*name)
@@ -534,19 +586,28 @@ H5Topen2(hid_t loc_id, const char *name, hid_t tapl_id)
if(H5CX_set_apl(&tapl_id, H5P_CLS_TACC, loc_id, FALSE) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTSET, FAIL, "can't set access property list info")
/* Fill in location struct fields */
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(loc_id);
/* get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid file identifier")
/* Open the datatype */
if(NULL == (type = H5T__open_name(&loc, name)))
if(NULL == (dt = H5VL_datatype_open(vol_obj->data, loc_params, vol_obj->driver->cls,
name, tapl_id, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTOPENOBJ, H5I_INVALID_HID, "unable to open named datatype")
/* Register the type and return the ID */
if((ret_value = H5I_register(H5I_DATATYPE, type, TRUE)) < 0)
if((ret_value = H5VL_register_id(H5I_DATATYPE, dt, vol_obj->driver, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register named datatype")
done:
/* Cleanup on error */
if(H5I_INVALID_HID == ret_value)
if(type != NULL)
(void)H5T_close(type);
if(dt && H5VL_datatype_close(dt, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HDONE_ERROR(H5E_DATATYPE, H5E_CLOSEERROR, H5I_INVALID_HID, "unable to release datatype")
FUNC_LEAVE_API(ret_value)
} /* end H5Topen2() */
@@ -600,7 +661,11 @@ H5Tget_create_plist(hid_t dtype_id)
}
/* If the datatype is committed, retrieve further information */
else {
if((ret_value = H5T__get_create_plist(type)) < 0)
H5VL_object_t *vol_obj = type->vol_obj;
/* Get the property list through the VOL */
if(H5VL_datatype_get(vol_obj->data, vol_obj->driver->cls, H5VL_DATATYPE_GET_TCPL,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, &ret_value) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, H5I_INVALID_HID, "can't get object creation info")
}
@@ -641,8 +706,10 @@ H5Tflush(hid_t type_id)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTSET, FAIL, "can't set access property list info")
/* Flush metadata for named datatype */
if(H5O_flush_common(&dt->oloc, type_id) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTFLUSH, FAIL, "unable to flush datatype")
if(dt->vol_obj)
if((ret_value = H5VL_datatype_specific(dt->vol_obj->data, dt->vol_obj->driver->cls, H5VL_DATATYPE_FLUSH,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, type_id)) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTFLUSH, FAIL, "unable to flush datatype")
done:
FUNC_LEAVE_API(ret_value)
@@ -681,8 +748,10 @@ H5Trefresh(hid_t type_id)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTSET, FAIL, "can't set access property list info")
/* Refresh the datatype's metadata */
if((H5O_refresh_metadata(type_id, dt->oloc)) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTLOAD, FAIL, "unable to refresh datatype")
if(dt->vol_obj)
if((ret_value = H5VL_datatype_specific(dt->vol_obj->data, dt->vol_obj->driver->cls, H5VL_DATATYPE_REFRESH,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, type_id)) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTLOAD, FAIL, "unable to refresh datatype")
done:
FUNC_LEAVE_API(ret_value)
@@ -865,6 +934,7 @@ H5T_open(const H5G_loc_t *loc)
else {
if(NULL == (dt = H5FL_MALLOC(H5T_t)))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate space for datatype")
dt->vol_obj = NULL;
#if defined(H5_USING_MEMCHECKER) || !defined(NDEBUG)
/* Clear object location */
@@ -1014,3 +1084,187 @@ H5T_update_shared(H5T_t *dt)
FUNC_LEAVE_NOAPI(SUCCEED)
} /* H5T_update_shared() */
/*-------------------------------------------------------------------------
* Function: H5T_construct_datatype
*
* Purpose: Create a Library datatype with a plugin specific datatype object
*
* Return: Success: A type structure
* Failure: NULL
*
*-------------------------------------------------------------------------
*/
H5T_t *
H5T_construct_datatype(H5VL_object_t *vol_obj)
{
ssize_t nalloc;
void *buf = NULL;
H5T_t *dt = NULL; /* datatype token from VOL plugin */
H5T_t *ret_value = NULL;
FUNC_ENTER_NOAPI(NULL)
/* get required buf size for encoding the datatype */
if(H5VL_datatype_get(vol_obj->data, vol_obj->driver->cls, H5VL_DATATYPE_GET_BINARY,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, &nalloc, NULL, 0) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to get datatype serialized size")
/* allocate buffer to store binary description of the datatype */
if(NULL == (buf = (void *)H5MM_calloc((size_t)nalloc)))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate space for datatype")
/* get binary description of the datatype */
if(H5VL_datatype_get(vol_obj->data, vol_obj->driver->cls, H5VL_DATATYPE_GET_BINARY,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, &nalloc, buf, (size_t)nalloc) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to get serialized datatype")
if(NULL == (dt = H5T_decode((size_t)nalloc, (const unsigned char *)buf)))
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "can't decode datatype")
dt->vol_obj = vol_obj;
ret_value = dt;
done:
if(buf)
buf = H5MM_xfree(buf);
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5T_construct_datatype() */
/*-------------------------------------------------------------------------
* Function: H5T_get_named_type
*
* Purpose: Returns the VOL object for the named datatype if it exists
*
* Return: Success: Pointer to the VOL object for the datatype
* Failure: NULL
*
*-------------------------------------------------------------------------
*/
H5VL_object_t *
H5T_get_named_type(const H5T_t *dt)
{
H5VL_object_t *ret_value = NULL; /* Return value */
FUNC_ENTER_NOAPI_NOINIT_NOERR
if(NULL != dt->vol_obj)
ret_value = dt->vol_obj;
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5T_get_named_type() */
/*-------------------------------------------------------------------------
* Function: H5T_get_actual_type
*
* Purpose: Returns underlying native datatype created by native driver
* if datatype is committed, otherwise return the datatype
* object associate with the ID.
*
* Return: Success: Pointer to the VOL-managed data for this datatype
* Failure: NULL
*
*-------------------------------------------------------------------------
*/
H5T_t *
H5T_get_actual_type(H5T_t *dt)
{
H5T_t *ret_value = NULL; /* Return value */
FUNC_ENTER_NOAPI_NOINIT_NOERR
/* Check if the datatype is committed */
if(NULL == dt->vol_obj)
ret_value = dt;
else
ret_value = (H5T_t *)dt->vol_obj->data;
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5T_get_actual_type() */
/*-------------------------------------------------------------------------
* Function: H5T_save_refresh_state
*
* Purpose: Save state for datatype reconstuction after a refresh.
*
* Return: SUCCEED/FAIL
*
*-------------------------------------------------------------------------
*/
herr_t
H5T_save_refresh_state(hid_t tid, H5O_shared_t *cached_H5O_shared)
{
H5T_t *dt = NULL; /* High level datatype object that wraps the VOL object */
H5T_t *vol_dt = NULL; /* H5T_t pointer stored in the datatype's vol_obj field */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
HDassert(cached_H5O_shared);
if(NULL == (dt = (H5T_t *)H5I_object_verify(tid, H5I_DATATYPE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "tid is not a datatype ID")
vol_dt = (H5T_t *)(dt->vol_obj->data);
if(NULL == vol_dt)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "tid is not not a named datatype ID")
/* Increase the count on the file object */
vol_dt->shared->fo_count += 1;
/* Increment object count for the object in the top file */
if(H5FO_top_incr(vol_dt->sh_loc.file, vol_dt->sh_loc.u.loc.oh_addr) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINC, FAIL, "can't increment object count")
/* Cache the H5O_shared_t data */
HDmemcpy(cached_H5O_shared, &(vol_dt->sh_loc), sizeof(H5O_shared_t));
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5T_save_refresh_state() */
/*-------------------------------------------------------------------------
* Function: H5T_restore_refresh_state
*
* Purpose: Restore state for datatype reconstuction after a refresh.
*
* Return: SUCCEED/FAIL
*
*-------------------------------------------------------------------------
*/
herr_t
H5T_restore_refresh_state(hid_t tid, H5O_shared_t *cached_H5O_shared)
{
H5T_t *dt = NULL; /* High level datatype object that wraps the VOL object */
H5T_t *vol_dt = NULL; /* H5T_t pointer stored in the datatype's vol_obj field */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
HDassert(cached_H5O_shared);
if(NULL == (dt = (H5T_t *)H5I_object_verify(tid, H5I_DATATYPE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "tid not a datatype ID")
vol_dt = (H5T_t *)(dt->vol_obj->data);
if(NULL == vol_dt)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "tid is not not a named datatype ID")
/* Restore the H5O_shared_t data */
HDmemcpy(&(vol_dt->sh_loc), cached_H5O_shared, sizeof(H5O_shared_t));
/* Decrement the ref. count for this object in the top file */
if(H5FO_top_decr(vol_dt->sh_loc.file, vol_dt->sh_loc.u.loc.oh_addr) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTDEC, FAIL, "can't decrement object count")
/* Decrease the count on the file object */
vol_dt->shared->fo_count -= 1;
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5T_restore_refresh_state() */
+3 -3
View File
@@ -7480,7 +7480,7 @@ H5T__conv_llong_double (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
*
*-------------------------------------------------------------------------
*/
#if H5T_CONV_INTERNAL_LLONG_LDOUBLE
#ifdef H5T_CONV_INTERNAL_LLONG_LDOUBLE
herr_t
H5T__conv_llong_ldouble (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
@@ -7548,7 +7548,7 @@ H5T__conv_ullong_double (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
*
*-------------------------------------------------------------------------
*/
#if H5T_CONV_INTERNAL_ULLONG_LDOUBLE
#ifdef H5T_CONV_INTERNAL_ULLONG_LDOUBLE
herr_t
H5T__conv_ullong_ldouble (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
@@ -8244,7 +8244,7 @@ H5_GCC_DIAG_ON(float-equal)
*
*-------------------------------------------------------------------------
*/
#if H5T_CONV_INTERNAL_LDOUBLE_LLONG
#ifdef H5T_CONV_INTERNAL_LDOUBLE_LLONG
herr_t
H5T__conv_ldouble_llong (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride,
+51 -13
View File
@@ -43,6 +43,7 @@
#include "H5Iprivate.h" /* IDs */
#include "H5Ppublic.h" /* Property Lists */
#include "H5Tpkg.h" /* Datatypes */
#include "H5VLprivate.h" /* VOL plugins */
/****************/
@@ -79,6 +80,12 @@
/* Local Variables */
/*******************/
/* Declare a free list to manage the H5VL_t struct */
H5FL_EXTERN(H5VL_t);
/* Declare a free list to manage the H5VL_object_t struct */
H5FL_EXTERN(H5VL_object_t);
#ifndef H5_NO_DEPRECATED_SYMBOLS
@@ -100,29 +107,52 @@
herr_t
H5Tcommit1(hid_t loc_id, const char *name, hid_t type_id)
{
H5G_loc_t loc; /* Location to create datatype */
H5T_t *type; /* Datatype for ID */
void *data = NULL; /* VOL-managed datatype data */
H5VL_object_t *new_obj = NULL; /* VOL object that holds the datatype object and the VOL info */
H5T_t *dt = NULL; /* High level datatype object that wraps the VOL object */
H5VL_object_t *vol_obj = NULL; /* Object token of loc_id */
H5VL_loc_params_t loc_params;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE3("e", "i*si", loc_id, name, type_id);
/* Check arguments */
if(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
if(!name || !*name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
if(NULL == (type = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
if(H5T_is_named(dt))
HGOTO_ERROR(H5E_ARGS, H5E_CANTSET, FAIL, "datatype is already committed")
/* Set up collective metadata if appropriate */
if(H5CX_set_loc(loc_id) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTSET, FAIL, "can't set access property list info")
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(loc_id);
/* get the object from the loc_id */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid object identifier")
/* Commit the datatype */
if(H5T__commit_named(&loc, name, type, H5P_LINK_CREATE_DEFAULT, H5P_DATATYPE_CREATE_DEFAULT) < 0)
if(NULL == (data = H5VL_datatype_commit(vol_obj->data, loc_params, vol_obj->driver->cls,
name, type_id, H5P_LINK_CREATE_DEFAULT,
H5P_DATATYPE_CREATE_DEFAULT, H5P_DATATYPE_ACCESS_DEFAULT,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to commit datatype")
/* Set up VOL object */
if(NULL == (new_obj = H5FL_CALLOC(H5VL_object_t)))
HGOTO_ERROR(H5E_VOL, H5E_NOSPACE, FAIL, "can't allocate top object structure")
new_obj->driver = vol_obj->driver;
new_obj->driver->nrefs ++;
new_obj->data = data;
/* Set the committed type object to the VOL pluging pointer in the H5T_t struct */
dt->vol_obj = new_obj;
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Tcommit1() */
@@ -147,31 +177,39 @@ done:
hid_t
H5Topen1(hid_t loc_id, const char *name)
{
H5T_t *type = NULL;
H5G_loc_t loc;
void *dt = NULL; /* Datatype token created by VOL plugin */
H5VL_object_t *vol_obj = NULL; /* Object token of loc_id */
H5VL_loc_params_t loc_params;
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(H5G_loc(loc_id, &loc) < 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a location")
if(!name || !*name)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "no name")
loc_params.type = H5VL_OBJECT_BY_SELF;
loc_params.obj_type = H5I_get_type(loc_id);
/* Get the location object */
if(NULL == (vol_obj = (H5VL_object_t *)H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid location identifier")
/* Open the datatype */
if(NULL == (type = H5T__open_name(&loc, name)))
if(NULL == (dt = H5VL_datatype_open(vol_obj->data, loc_params, vol_obj->driver->cls,
name, H5P_DATATYPE_ACCESS_DEFAULT,
H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL)))
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTOPENOBJ, H5I_INVALID_HID, "unable to open named datatype")
/* Register the type and return the ID */
if((ret_value = H5I_register(H5I_DATATYPE, type, TRUE)) < 0)
if((ret_value = H5VL_register_id(H5I_DATATYPE, dt, vol_obj->driver, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register named datatype")
done:
/* Cleanup on error */
if(H5I_INVALID_HID == ret_value)
if(type && H5T_close(type) < 0)
if(dt && H5VL_datatype_close(dt, vol_obj->driver->cls, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL) < 0)
HDONE_ERROR(H5E_DATATYPE, H5E_CLOSEERROR, H5I_INVALID_HID, "unable to close datatype")
FUNC_LEAVE_API(ret_value)
+16 -13
View File
@@ -44,7 +44,7 @@
/********************/
static htri_t H5O__dtype_isa(const H5O_t *loc);
static hid_t H5O__dtype_open(const H5G_loc_t *obj_loc, hbool_t app_ref);
static void *H5O__dtype_open(const H5G_loc_t *obj_loc, H5I_type_t *opened_type);
static void *H5O__dtype_create(H5F_t *f, void *_crt_info, H5G_loc_t *obj_loc);
static H5O_loc_t *H5O__dtype_get_oloc(hid_t obj_id);
@@ -125,28 +125,28 @@ done:
*
*-------------------------------------------------------------------------
*/
static hid_t
H5O__dtype_open(const H5G_loc_t *obj_loc, hbool_t app_ref)
static void *
H5O__dtype_open(const H5G_loc_t *obj_loc, H5I_type_t *opened_type)
{
H5T_t *type = NULL; /* Datatype opened */
hid_t ret_value = H5I_INVALID_HID; /* Return value */
H5T_t *type = NULL; /* Datatype opened */
void *ret_value = NULL; /* Return value */
FUNC_ENTER_STATIC
HDassert(obj_loc);
*opened_type = H5I_DATATYPE;
/* Open the datatype */
if(NULL == (type = H5T_open(obj_loc)))
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTOPENOBJ, FAIL, "unable to open datatype")
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTOPENOBJ, NULL, "unable to open datatype")
/* Register an ID for the datatype */
if((ret_value = H5I_register(H5I_DATATYPE, type, app_ref)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register datatype")
ret_value = (void *)type;
done:
if(ret_value < 0)
if(NULL == ret_value)
if(type && H5T_close(type) < 0)
HDONE_ERROR(H5E_DATATYPE, H5E_CLOSEERROR, FAIL, "unable to release datatype")
HDONE_ERROR(H5E_DATATYPE, H5E_CLOSEERROR, NULL, "unable to release datatype")
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5O__dtype_open() */
@@ -212,14 +212,17 @@ done:
static H5O_loc_t *
H5O__dtype_get_oloc(hid_t obj_id)
{
H5T_t *type; /* Datatype opened */
H5T_t *type = NULL; /* Datatype opened */
H5T_t *dt = NULL;
H5O_loc_t *ret_value = NULL; /* Return value */
FUNC_ENTER_STATIC
/* Get the datatype */
if(NULL == (type = (H5T_t *)H5I_object(obj_id)))
if(NULL == (dt = (H5T_t *)H5I_object(obj_id)))
HGOTO_ERROR(H5E_OHDR, H5E_BADATOM, NULL, "couldn't get object from ID")
/* If this is a named datatype, get the VOL driver pointer to the datatype */
type = (H5T_t *)H5T_get_actual_type(dt);
/* Get the datatype's object header location */
if(NULL == (ret_value = H5T_oloc(type)))
+2
View File
@@ -210,6 +210,8 @@ H5Tset_order(hid_t type_id, H5T_order_t order)
HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "not a datatype")
if(order < H5T_ORDER_LE || order > H5T_ORDER_NONE || order == H5T_ORDER_MIXED)
HGOTO_ERROR(H5E_DATATYPE, H5E_BADVALUE, FAIL, "illegal byte order")
if(NULL != dt->vol_obj)
HGOTO_ERROR(H5E_ARGS, H5E_CANTSET, FAIL, "datatype is already committed")
if(H5T_STATE_TRANSIENT != dt->shared->state)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "datatype is read-only")
+1
View File
@@ -320,6 +320,7 @@ struct H5T_t {
H5T_shared_t *shared; /* all other information */
H5O_loc_t oloc; /* Object location, if the type is a named type */
H5G_name_t path; /* group hier. path if the type is a named type */
H5VL_object_t *vol_obj; /* pointer to VOL object when working with committed datatypes */
};
/* The master list of soft conversion functions */
+2
View File
@@ -154,6 +154,8 @@ H5Tset_precision(hid_t type_id, size_t prec)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
if (H5T_STATE_TRANSIENT!=dt->shared->state)
HGOTO_ERROR(H5E_ARGS, H5E_CANTSET, FAIL, "datatype is read-only")
if (NULL != dt->vol_obj)
HGOTO_ERROR(H5E_ARGS, H5E_CANTSET, FAIL, "datatype is committed")
if (prec == 0)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "precision must be positive")
if (H5T_ENUM==dt->shared->type && dt->shared->u.enumer.nmembs>0)
+7 -1
View File
@@ -30,6 +30,7 @@ typedef struct H5T_t H5T_t;
#include "H5private.h" /* Generic Functions */
#include "H5Gprivate.h" /* Groups */
#include "H5Rprivate.h" /* References */
#include "H5VLprivate.h" /* VOL Drivers */
/* Macro for size of temporary buffers to contain a single element */
#define H5T_ELEM_BUF_SIZE 256
@@ -98,7 +99,7 @@ typedef struct H5T_subset_info_t {
} H5T_subset_info_t;
/* Forward declarations for prototype arguments */
struct H5O_t;
struct H5O_shared_t;
/* The native endianness of the platform */
H5_DLLVAR H5T_order_t H5T_native_order_g;
@@ -138,6 +139,11 @@ H5_DLL herr_t H5T_set_version(H5F_t *f, H5T_t *dt);
H5_DLL herr_t H5T_patch_file(H5T_t *dt, H5F_t *f);
H5_DLL herr_t H5T_patch_vlen_file(H5T_t *dt, H5F_t *f);
H5_DLL htri_t H5T_is_variable_str(const H5T_t *dt);
H5_DLL H5T_t *H5T_construct_datatype(H5VL_object_t *dt_obj);
H5_DLL H5VL_object_t *H5T_get_named_type(const H5T_t *dt);
H5_DLL H5T_t *H5T_get_actual_type(H5T_t *dt);
H5_DLL herr_t H5T_save_refresh_state(hid_t tid, struct H5O_shared_t *cached_H5O_shared);
H5_DLL herr_t H5T_restore_refresh_state(hid_t tid, struct H5O_shared_t *cached_H5O_shared);
/* Reference specific functions */
H5_DLL H5R_type_t H5T_get_ref_type(const H5T_t *dt);
+2296
View File
@@ -0,0 +1,2296 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright by The HDF Group. *
* All rights reserved. *
* *
* This file is part of HDF5. The full HDF5 copyright notice, including *
* terms governing use, modification, and redistribution, is contained in *
* the COPYING file, which can be found at the root of the source code *
* distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases. *
* If you do not have access to either file, you may request a copy from *
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* Purpose: The Virtual Object Layer as described in documentation.
* The pupose is to provide an abstraction on how to access the
* underlying HDF5 container, whether in a local file with
* a specific file format, or remotely on other machines, etc...
*/
/****************/
/* Module Setup */
/****************/
#include "H5VLmodule.h" /* This source code file is part of the H5VL module */
/***********/
/* Headers */
/***********/
#include "H5private.h" /* Generic Functions */
#include "H5Aprivate.h" /* Attributes */
#include "H5Eprivate.h" /* Error handling */
#include "H5Iprivate.h" /* IDs */
#include "H5MMprivate.h" /* Memory management */
#include "H5PLprivate.h" /* Plugins */
#include "H5VLpkg.h" /* Virtual Object Layer */
/****************/
/* Local Macros */
/****************/
/******************/
/* Local Typedefs */
/******************/
/* Information needed for iterating over the registered VOL driver hid_t IDs.
* The name of the new VOL driver that is being registered is stored in the
* name field and the found_id field is initialized to H5I_INVALID_HID (-1).
* If we find a VOL driver with the same name, we set the found_id field to
* the existing ID for return to the function.
*/
typedef struct {
const char *name; /* The name of the VOL driver to check */
hid_t found_id; /* The library ID if we found a match */
} H5VL_get_driver_ud_t;
/********************/
/* Local Prototypes */
/********************/
static int H5VL__get_driver_cb(void *obj, hid_t id, void *_op_data);
/*********************/
/* Package Variables */
/*********************/
/*****************************/
/* Library Private Variables */
/*****************************/
/*******************/
/* Local Variables */
/*******************/
/*-------------------------------------------------------------------------
* Function: H5VL__get_driver_cb
*
* Purpose: Callback routine to search through registered VOLs
*
* Return: Success: H5_ITER_STOP if the class and op_data name
* members match. H5_ITER_CONT otherwise.
*
* Failure: Can't fail
*
*-------------------------------------------------------------------------
*/
static int
H5VL__get_driver_cb(void *obj, hid_t id, void *_op_data)
{
H5VL_get_driver_ud_t *op_data = (H5VL_get_driver_ud_t *)_op_data; /* User data for callback */
H5VL_class_t *cls = (H5VL_class_t *)obj;
int ret_value = H5_ITER_CONT; /* Callback return value */
FUNC_ENTER_STATIC_NOERR
if (0 == HDstrcmp(cls->name, op_data->name)) {
op_data->found_id = id;
ret_value = H5_ITER_STOP;
}
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL__get_driver_cb() */
/*-------------------------------------------------------------------------
* Function: H5VLinitialize
*
* Purpose: Calls the driver-specific callback to initialize the driver.
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLinitialize(hid_t driver_id, hid_t vipl_id)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE2("e", "ii", driver_id, vipl_id);
/* Check args */
if (NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if (cls->initialize && cls->initialize(vipl_id) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTCLOSEOBJ, FAIL, "VOL driver did not initialize")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLinitialize() */
/*-------------------------------------------------------------------------
* Function: H5VLterminate
*
* Purpose: Calls the driver-specific callback to terminate the driver.
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLterminate(hid_t driver_id, hid_t vtpl_id)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE2("e", "ii", driver_id, vtpl_id);
/* Check args */
if (NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if (cls->terminate && cls->terminate(vtpl_id) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTCLOSEOBJ, FAIL, "VOL driver did not terminate cleanly")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLterminate() */
/*-------------------------------------------------------------------------
* Function: H5VLclose
*
* Purpose: Closes the specified VOL driver. The VOL ID will no longer
* be valid for accessing the VOL.
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLclose(hid_t vol_id)
{
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE1("e", "i", vol_id);
/* Check args */
if(NULL == H5I_object_verify(vol_id, H5I_VOL))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if(H5I_dec_app_ref(vol_id) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTRELEASE, FAIL, "unable to close VOL driver ID")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLclose() */
/*-------------------------------------------------------------------------
* Function: H5VLregister
*
* Purpose: Registers a new VOL driver as a member of the virtual object
* layer class.
*
* Return: Success: A VOL driver ID which is good until the
* library is closed or the driver is
* unregistered.
*
* Failure: A negative value (H5I_INVALID_HID).
*
*-------------------------------------------------------------------------
*/
hid_t
H5VLregister(const H5VL_class_t *cls)
{
H5VL_get_driver_ud_t op_data;
hid_t ret_value = H5I_INVALID_HID;
FUNC_ENTER_API(FAIL)
H5TRACE1("i", "*x", cls);
/* Check arguments */
if (!cls)
HGOTO_ERROR(H5E_ARGS, H5E_UNINITIALIZED, H5I_INVALID_HID, "VOL driver class pointer cannot be NULL")
if (!cls->name)
HGOTO_ERROR(H5E_VOL, H5E_CANTREGISTER, H5I_INVALID_HID, "VOL driver class name cannot be the NULL pointer");
/* XXX: Should probably come up with a max length so we can use strnlen()? */
if (0 == HDstrlen(cls->name))
HGOTO_ERROR(H5E_VOL, H5E_CANTREGISTER, H5I_INVALID_HID, "VOL driver class name cannot be the empty string");
op_data.found_id = H5I_INVALID_HID;
op_data.name = cls->name;
/* check if driver is already registered */
if (H5I_iterate(H5I_VOL, H5VL__get_driver_cb, &op_data, TRUE) < 0)
HGOTO_ERROR(H5E_VOL, H5E_BADITER, H5I_INVALID_HID, "can't iterate over VOL IDs")
/* XXX: Does this need to be an error? Users probably don't care as long
* as their VOL driver is available.
*/
if (op_data.found_id != H5I_INVALID_HID)
HGOTO_ERROR(H5E_VOL, H5E_CANTREGISTER, H5I_INVALID_HID, "VOL driver with the same name is already registered.")
/* Create the new class ID */
if ((ret_value = H5VL_register(cls, sizeof(H5VL_class_t), TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register VOL driver")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLregister() */
/*-------------------------------------------------------------------------
* Function: H5VLregister_by_name
*
* Purpose: Registers a new VOL driver as a member of the virtual object
* layer class.
*
* Return: Success: A VOL driver ID which is good until the
* library is closed or the driver is
* unregistered.
*
* Failure: A negative value.
*
*-------------------------------------------------------------------------
*/
hid_t
H5VLregister_by_name(const char *name)
{
H5VL_get_driver_ud_t op_data;
hid_t ret_value = H5I_INVALID_HID;
FUNC_ENTER_API(FAIL)
H5TRACE1("i", "*s", name);
/* Check arguments */
if (!name)
HGOTO_ERROR(H5E_ARGS, H5E_UNINITIALIZED, H5I_INVALID_HID, "null VOL driver name is disallowed")
if (0 == HDstrlen(name))
HGOTO_ERROR(H5E_ARGS, H5E_UNINITIALIZED, H5I_INVALID_HID, "zero-length VOL driver name is disallowed")
op_data.found_id = H5I_INVALID_HID;
op_data.name = name;
/* Check if driver is already registered */
if (H5I_iterate(H5I_VOL, H5VL__get_driver_cb, &op_data, TRUE) < 0)
HGOTO_ERROR(H5E_VOL, H5E_BADITER, H5I_INVALID_HID, "can't iterate over VOL ids")
if (op_data.found_id != H5I_INVALID_HID) {
/* If driver alread registered, increment ref count on ID and return ID */
if (H5I_inc_ref(op_data.found_id, TRUE) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTINC, H5I_INVALID_HID, "unable to increment ref count on VOL driver")
ret_value = op_data.found_id;
}
else {
H5PL_key_t key;
const H5VL_class_t *cls;
/* Try loading the driver */
key.name = name;
if (NULL == (cls = (const H5VL_class_t *)H5PL_load(H5PL_TYPE_VOL, key)))
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, H5I_INVALID_HID, "unable to load VOL driver")
/* Register the driver we loaded */
if ((ret_value = H5VL_register(cls, sizeof(H5VL_class_t), TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register VOL driver ID")
}
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLregister_by_name() */
/*-------------------------------------------------------------------------
* Function: H5VLunregister
*
* Purpose: Removes a vol driver ID from the library. This in no way affects
* file access property lists which have been defined to use
* this vol driver or files which are already opened under with
* this driver.
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLunregister(hid_t vol_id)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE1("e", "i", vol_id);
/* Check arguments */
if (NULL == (cls = (H5VL_class_t *)H5I_object_verify(vol_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a vol driver")
/* The H5VL_class_t struct will be freed by this function */
if (H5I_dec_app_ref(vol_id) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTDEC, FAIL, "unable to unregister vol driver")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLunregister() */
/*-------------------------------------------------------------------------
* Function: H5VLis_registered
*
* Purpose: Tests whether a VOL class has been registered or not
*
* Return: Positive if the VOL class has been registered
*
* Zero if it is unregistered
*
* Negative on error (if the class is not a valid class ID)
*
*-------------------------------------------------------------------------
*/
htri_t
H5VLis_registered(const char *name)
{
H5VL_get_driver_ud_t op_data;
htri_t ret_value = FALSE; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE1("t", "*s", name);
op_data.found_id = H5I_INVALID_HID;
op_data.name = name;
/* Check arguments */
if (H5I_iterate(H5I_VOL, H5VL__get_driver_cb, &op_data, TRUE) < 0)
HGOTO_ERROR(H5E_VOL, H5E_BADITER, FAIL, "can't iterate over VOL ids")
if (op_data.found_id != H5I_INVALID_HID)
ret_value = TRUE;
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLis_registered() */
/*-------------------------------------------------------------------------
* Function: H5VLget_driver_id
*
* Purpose: Retrieves the ID for a registered VOL driver.
*
* Return: Positive if the VOL class has been registered
* Negative on error (if the class is not a valid class or not registered)
*
*-------------------------------------------------------------------------
*/
hid_t
H5VLget_driver_id(const char *name)
{
H5VL_get_driver_ud_t op_data;
hid_t ret_value = H5I_INVALID_HID; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
H5TRACE1("i", "*s", name);
op_data.found_id = H5I_INVALID_HID;
op_data.name = name;
/* Check arguments */
if (H5I_iterate(H5I_VOL, H5VL__get_driver_cb, &op_data, TRUE) < 0)
HGOTO_ERROR(H5E_VOL, H5E_BADITER, H5I_INVALID_HID, "can't iterate over VOL driver IDs")
if (op_data.found_id != H5I_INVALID_HID) {
if (H5I_inc_ref(op_data.found_id, TRUE) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTINC, H5I_INVALID_HID, "unable to increment ref count on VOL driver")
ret_value = op_data.found_id;
}
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLget_driver_id() */
/*-------------------------------------------------------------------------
* Function: H5VLget_driver_name
*
* Purpose: Returns the driver name for the VOL associated with the
* object or file ID
*
* Return: Success: The length of the driver name
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
ssize_t
H5VLget_driver_name(hid_t obj_id, char *name/*out*/, size_t size)
{
ssize_t ret_value = -1;
FUNC_ENTER_API(FAIL)
H5TRACE3("Zs", "ixz", obj_id, name, size);
if ((ret_value = H5VL_get_driver_name(obj_id, name, size)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "Can't get driver name")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLget_driver_name() */
/*---------------------------------------------------------------------------
* Function: H5VLobject_register
*
* Purpose: Public routine to create an HDF5 hid_t with library
* specific types, bypassing the limitation of H5Iregister.
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*---------------------------------------------------------------------------
*/
hid_t
H5VLobject_register(void *obj, H5I_type_t obj_type, hid_t driver_id)
{
hid_t ret_value = FAIL;
FUNC_ENTER_API(FAIL)
H5TRACE3("i", "*xIti", obj, obj_type, driver_id);
if (NULL == obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid object to register")
if ((ret_value = H5VL_object_register(obj, obj_type, driver_id, TRUE)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register object")
done:
FUNC_LEAVE_API(ret_value)
} /* H5VLobject_register */
/*-------------------------------------------------------------------------
* Function: H5VLobject
*
* Purpose: Public utility function to return the VOL object pointer
* associated with an hid_t.
*
* Return: Success: object pointer
* Failure: NULL
*
* Programmer: Jordan Henderson
* January, 2018
*
*-------------------------------------------------------------------------
*/
void *
H5VLobject(hid_t id)
{
void *ret_value = NULL;
FUNC_ENTER_API(NULL)
H5TRACE1("*x", "i", id);
if (NULL == (ret_value = H5VL_object(id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "invalid identifier")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLobject() */
/*---------------------------------------------------------------------------
* Function: H5VLget_object
*
* Purpose: Retrieves the object pointer associated with the ID. This
* also optionally returns the H5VL_t struct that this ID
* belongs to, if the user passes a valid pointer value.
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*---------------------------------------------------------------------------
*/
herr_t
H5VLget_object(hid_t obj_id, void **obj)
{
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE2("e", "i**x", obj_id, obj);
/* Check args */
if (!obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object pointer")
if (NULL == (*obj = H5VL_get_object(obj_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "ID does not contain a valid object")
done:
FUNC_LEAVE_API(ret_value)
} /* H5VLget_object */
/*-------------------------------------------------------------------------
* Function: H5VLattr_create
*
* Purpose: Creates an attribute
*
* Return: Success: Pointer to the new attribute
*
* Failure: NULL
*
*-------------------------------------------------------------------------
*/
void *
H5VLattr_create(void *obj, H5VL_loc_params_t loc_params, hid_t driver_id, const char *name,
hid_t acpl_id, hid_t aapl_id, hid_t dxpl_id, void **req)
{
H5VL_class_t *cls = NULL;
void *ret_value = NULL; /* Return value */
FUNC_ENTER_API(NULL)
H5TRACE8("*x", "*xxi*siii**x", obj, loc_params, driver_id, name, acpl_id,
aapl_id, dxpl_id, req);
if (NULL == obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a VOL driver ID")
if(NULL == (ret_value = H5VL_attr_create(obj, loc_params, cls, name,
acpl_id, aapl_id, dxpl_id, req)))
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, NULL, "unable to create attribute")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLattr_create() */
/*-------------------------------------------------------------------------
* Function: H5VLattr_open
*
* Purpose: Opens an attribute
*
* Return: Success: Pointer to the new attribute
*
* Failure: NULL
*
*-------------------------------------------------------------------------
*/
void *
H5VLattr_open(void *obj, H5VL_loc_params_t loc_params, hid_t driver_id, const char *name,
hid_t aapl_id, hid_t dxpl_id, void **req)
{
H5VL_class_t *cls = NULL;
void *ret_value = NULL; /* Return value */
FUNC_ENTER_API(NULL)
H5TRACE7("*x", "*xxi*sii**x", obj, loc_params, driver_id, name, aapl_id,
dxpl_id, req);
if (NULL == obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a VOL driver ID")
if(NULL == (ret_value = H5VL_attr_open(obj, loc_params, cls, name, aapl_id,
dxpl_id, req)))
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, NULL, "unable to open attribute")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLattr_open() */
/*-------------------------------------------------------------------------
* Function: H5VLattr_read
*
* Purpose: Reads data from an attribute
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t H5VLattr_read(void *attr, hid_t driver_id, hid_t mem_type_id, void *buf, hid_t dxpl_id, void **req)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
if (NULL == attr)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if((ret_value = H5VL_attr_read(attr, cls, mem_type_id, buf, dxpl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "unable to read attribute")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLattr_read() */
/*-------------------------------------------------------------------------
* Function: H5VLattr_write
*
* Purpose: Writes data to an attribute
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t H5VLattr_write(void *attr, hid_t driver_id, hid_t mem_type_id, const void *buf, hid_t dxpl_id, void **req)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
if (NULL == attr)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if((ret_value = H5VL_attr_write(attr, cls, mem_type_id, buf, dxpl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "unable to write attribute")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLattr_write() */
/*-------------------------------------------------------------------------
* Function: H5VLattr_get
*
* Purpose: Gets information about the attribute
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLattr_get(void *obj, hid_t driver_id, H5VL_attr_get_t get_type,
hid_t dxpl_id, void **req, va_list arguments)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE6("e", "*xiVai**xx", obj, driver_id, get_type, dxpl_id, req, arguments);
if (NULL == obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
/* Bypass the H5VLint layer */
if(NULL == cls->attr_cls.get)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol driver has no `attr get' method")
if((ret_value = (cls->attr_cls.get)(obj, get_type, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "Unable to get attribute information")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLattr_get() */
/*-------------------------------------------------------------------------
* Function: H5VLattr_specific
*
* Purpose: Performs a driver-specific operation on an attribute
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLattr_specific(void *obj, H5VL_loc_params_t loc_params, hid_t driver_id,
H5VL_attr_specific_t specific_type, hid_t dxpl_id, void **req, va_list arguments)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE7("e", "*xxiVbi**xx", obj, loc_params, driver_id, specific_type,
dxpl_id, req, arguments);
if (NULL == obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
/* Bypass the H5VLint layer */
if(NULL == cls->attr_cls.specific)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol driver has no `attr specific' method")
if((ret_value = (cls->attr_cls.specific)
(obj, loc_params, specific_type, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTOPERATE, FAIL, "Unable to execute attribute specific callback")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLattr_specific() */
/*-------------------------------------------------------------------------
* Function: H5VLattr_optional
*
* Purpose: Performs an optional driver-specific operation on an attribute
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLattr_optional(void *obj, hid_t driver_id, hid_t dxpl_id, void **req, va_list arguments)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE5("e", "*xii**xx", obj, driver_id, dxpl_id, req, arguments);
if (NULL == obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
/* Have to bypass the H5VLint layer due to unknown val_list arguments */
if(NULL == cls->attr_cls.optional)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol driver has no `attr optional' method")
if((ret_value = (cls->attr_cls.optional)(obj, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTOPERATE, FAIL, "Unable to execute attribute optional callback")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLattr_optional() */
/*-------------------------------------------------------------------------
* Function: H5VLattr_close
*
* Purpose: Closes an attribute
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLattr_close(void *attr, hid_t driver_id, hid_t dxpl_id, void **req)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE4("e", "*xii**x", attr, driver_id, dxpl_id, req);
if (NULL == attr)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if((ret_value = H5VL_attr_close(attr, cls, dxpl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTRELEASE, FAIL, "unable to close attribute")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLattr_close() */
/*-------------------------------------------------------------------------
* Function: H5VLdataset_create
*
* Purpose: Creates a dataset
*
* Return: Success: Pointer to the new dataset
*
* Failure: NULL
*
*-------------------------------------------------------------------------
*/
void *
H5VLdataset_create(void *obj, H5VL_loc_params_t loc_params, hid_t driver_id, const char *name,
hid_t dcpl_id, hid_t dapl_id, hid_t dxpl_id, void **req)
{
H5VL_class_t *cls = NULL;
void *ret_value = NULL; /* Return value */
FUNC_ENTER_API(NULL)
H5TRACE8("*x", "*xxi*siii**x", obj, loc_params, driver_id, name, dcpl_id,
dapl_id, dxpl_id, req);
if (NULL == obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a VOL driver ID")
if(NULL == (ret_value = H5VL_dataset_create(obj, loc_params, cls, name,
dcpl_id, dapl_id, dxpl_id, req)))
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, NULL, "unable to create dataset")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLdataset_create() */
/*-------------------------------------------------------------------------
* Function: H5VLdataset_open
*
* Purpose: Opens a dataset
*
* Return: Success: Pointer to the new dataset
*
* Failure: NULL
*
*-------------------------------------------------------------------------
*/
void *
H5VLdataset_open(void *obj, H5VL_loc_params_t loc_params, hid_t driver_id, const char *name,
hid_t dapl_id, hid_t dxpl_id, void **req)
{
H5VL_class_t *cls = NULL;
void *ret_value = NULL;
FUNC_ENTER_API(NULL)
H5TRACE7("*x", "*xxi*sii**x", obj, loc_params, driver_id, name, dapl_id,
dxpl_id, req);
if (NULL == obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a VOL driver ID")
if(NULL == (ret_value = H5VL_dataset_open(obj, loc_params, cls, name, dapl_id, dxpl_id, req)))
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, NULL, "unable to open dataset")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLdataset_open() */
/*-------------------------------------------------------------------------
* Function: H5VLdataset_read
*
* Purpose: Reads data from a dataset
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLdataset_read(void *dset, hid_t driver_id, hid_t mem_type_id, hid_t mem_space_id,
hid_t file_space_id, hid_t plist_id, void *buf, void **req)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE8("e", "*xiiiii*x**x", dset, driver_id, mem_type_id, mem_space_id,
file_space_id, plist_id, buf, req);
if (NULL == dset)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if((ret_value = H5VL_dataset_read(dset, cls, mem_type_id, mem_space_id, file_space_id,
plist_id, buf, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "unable to read dataset")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLdataset_read() */
/*-------------------------------------------------------------------------
* Function: H5VLdataset_write
*
* Purpose: Writes data to a dataset
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLdataset_write(void *dset, hid_t driver_id, hid_t mem_type_id, hid_t mem_space_id,
hid_t file_space_id, hid_t plist_id, const void *buf, void **req)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE8("e", "*xiiiii*x**x", dset, driver_id, mem_type_id, mem_space_id,
file_space_id, plist_id, buf, req);
if (NULL == dset)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if((ret_value = H5VL_dataset_write(dset, cls, mem_type_id, mem_space_id, file_space_id,
plist_id, buf, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "unable to write dataset")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLdataset_write() */
/*-------------------------------------------------------------------------
* Function: H5VLdataset_get
*
* Purpose: Gets information about a dataset
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLdataset_get(void *dset, hid_t driver_id, H5VL_dataset_get_t get_type,
hid_t dxpl_id, void **req, va_list arguments)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE6("e", "*xiVci**xx", dset, driver_id, get_type, dxpl_id, req, arguments);
if (NULL == dset)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
/* Bypass the H5VLint layer */
if(NULL == cls->dataset_cls.get)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol driver has no `dataset get' method")
if((ret_value = (cls->dataset_cls.get)(dset, get_type, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "Unable to execute dataset get callback")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLdataset_get() */
/*-------------------------------------------------------------------------
* Function: H5VLdataset_specific
*
* Purpose: Performs a driver-specific operation on a dataset
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLdataset_specific(void *obj, hid_t driver_id, H5VL_dataset_specific_t specific_type,
hid_t dxpl_id, void **req, va_list arguments)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE6("e", "*xiVdi**xx", obj, driver_id, specific_type, dxpl_id, req,
arguments);
if (NULL == obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if(NULL == cls->dataset_cls.specific)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol driver has no `dataset specific' method")
if((ret_value = (cls->dataset_cls.specific)
(obj, specific_type, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTOPERATE, FAIL, "Unable to execute dataset specific callback")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLdataset_specific() */
/*-------------------------------------------------------------------------
* Function: H5VLdataset_optional
*
* Purpose: Performs an optional driver-specific operation on a dataset
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLdataset_optional(void *obj, hid_t driver_id, hid_t dxpl_id, void **req, va_list arguments)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE5("e", "*xii**xx", obj, driver_id, dxpl_id, req, arguments);
if (NULL == obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if(NULL == cls->dataset_cls.optional)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol driver has no `dataset optional' method")
if((ret_value = (cls->dataset_cls.optional)(obj, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTOPERATE, FAIL, "Unable to execute dataset optional callback")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLdataset_optional() */
/*-------------------------------------------------------------------------
* Function: H5VLdataset_close
*
* Purpose: Closes a dataset
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLdataset_close(void *dset, hid_t driver_id, hid_t dxpl_id, void **req)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE4("e", "*xii**x", dset, driver_id, dxpl_id, req);
if (NULL == dset)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if((ret_value = H5VL_dataset_close(dset, cls, dxpl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTRELEASE, FAIL, "unable to close dataset")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLdataset_close() */
/*-------------------------------------------------------------------------
* Function: H5VLfile_create
*
* Purpose: Creates a file
*
* Return: Success: Pointer to the new file
*
* Failure: NULL
*
*-------------------------------------------------------------------------
*/
void *
H5VLfile_create(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id,
hid_t dxpl_id, void **req)
{
H5P_genplist_t *plist; /* Property list pointer */
H5VL_driver_prop_t driver_prop; /* Property for vol driver ID & info */
H5VL_class_t *cls = NULL;
void *ret_value = NULL;
FUNC_ENTER_API(NULL)
H5TRACE6("*x", "*sIuiii**x", name, flags, fcpl_id, fapl_id, dxpl_id, req);
/* get the VOL info from the fapl */
if(NULL == (plist = (H5P_genplist_t *)H5I_object(fapl_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list")
if(H5P_peek(plist, H5F_ACS_VOL_DRV_NAME, &driver_prop) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get vol driver info")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_prop.driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a VOL driver ID")
if(NULL == (ret_value = H5VL_file_create(cls, name, flags, fcpl_id, fapl_id,
dxpl_id, req)))
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, NULL, "unable to create file")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLfile_create() */
/*-------------------------------------------------------------------------
* Function: H5VLfile_open
*
* Purpose: Opens a file
*
* Return: Success: Pointer to the new file
*
* Failure: NULL
*
*-------------------------------------------------------------------------
*/
void *
H5VLfile_open(const char *name, unsigned flags, hid_t fapl_id, hid_t dxpl_id, void **req)
{
H5P_genplist_t *plist; /* Property list pointer */
H5VL_driver_prop_t driver_prop; /* Property for vol driver ID & info */
H5VL_class_t *cls = NULL;
void *ret_value = NULL;
FUNC_ENTER_API(NULL)
H5TRACE5("*x", "*sIuii**x", name, flags, fapl_id, dxpl_id, req);
/* get the VOL info from the fapl */
if(NULL == (plist = (H5P_genplist_t *)H5I_object(fapl_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list")
if(H5P_peek(plist, H5F_ACS_VOL_DRV_NAME, &driver_prop) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get vol driver info")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_prop.driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a VOL driver ID")
if(NULL == (ret_value = H5VL_file_open(cls, name, flags, fapl_id, dxpl_id, req)))
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, NULL, "unable to create file")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLfile_open() */
/*-------------------------------------------------------------------------
* Function: H5VLfile_get
*
* Purpose: Gets information about the file
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLfile_get(void *file, hid_t driver_id, H5VL_file_get_t get_type,
hid_t dxpl_id, void **req, va_list arguments)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE6("e", "*xiVgi**xx", file, driver_id, get_type, dxpl_id, req, arguments);
if(NULL == file)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
/* Bypass the H5VLint layer */
if(NULL == cls->file_cls.get)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol driver has no `file get' method")
if((ret_value = (cls->file_cls.get)(file, get_type, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "Unable to execute file get callback")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLfile_get() */
/*-------------------------------------------------------------------------
* Function: H5VLfile_specific
*
* Purpose: Performs a driver-specific operation on a file
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLfile_specific(void *file, hid_t driver_id, H5VL_file_specific_t specific_type,
hid_t dxpl_id, void **req, va_list arguments)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE6("e", "*xiVhi**xx", file, driver_id, specific_type, dxpl_id, req,
arguments);
if(specific_type == H5VL_FILE_IS_ACCESSIBLE) {
H5P_genplist_t *plist; /* Property list pointer */
H5VL_driver_prop_t driver_prop; /* Property for vol driver ID & info */
hid_t fapl_id;
fapl_id = va_arg (arguments, hid_t);
/* get the VOL info from the fapl */
if(NULL == (plist = (H5P_genplist_t *)H5I_object(fapl_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list")
if(H5P_peek(plist, H5F_ACS_VOL_DRV_NAME, &driver_prop) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get vol driver info")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_prop.driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if((ret_value = (cls->file_cls.specific)
(file, specific_type, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "specific failed")
}
else {
if(NULL == file)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if(NULL == cls->file_cls.specific)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol driver has no `file specific' method")
if((ret_value = (cls->file_cls.specific)
(file, specific_type, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTOPERATE, FAIL, "Unable to execute file specific callback")
}
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLfile_specific() */
/*-------------------------------------------------------------------------
* Function: H5VLfile_optional
*
* Purpose: Performs an optional driver-specific operation on a file
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLfile_optional(void *file, hid_t driver_id, hid_t dxpl_id, void **req, va_list arguments)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE5("e", "*xii**xx", file, driver_id, dxpl_id, req, arguments);
if(NULL == file)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if(NULL == cls->file_cls.optional)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol driver has no `file optional' method")
if((ret_value = (cls->file_cls.optional)(file, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTOPERATE, FAIL, "Unable to execute file optional callback")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLfile_optional() */
/*-------------------------------------------------------------------------
* Function: H5VLfile_close
*
* Purpose: Closes a file
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLfile_close(void *file, hid_t driver_id, hid_t dxpl_id, void **req)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE4("e", "*xii**x", file, driver_id, dxpl_id, req);
if(NULL == file)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if((ret_value = H5VL_file_close(file, cls, dxpl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTRELEASE, FAIL, "unable to close file")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLfile_close() */
/*-------------------------------------------------------------------------
* Function: H5VLgroup_create
*
* Purpose: Creates a group
*
* Return: Success: Pointer to the new group
*
* Failure: NULL
*
*-------------------------------------------------------------------------
*/
void *
H5VLgroup_create(void *obj, H5VL_loc_params_t loc_params, hid_t driver_id, const char *name,
hid_t gcpl_id, hid_t gapl_id, hid_t dxpl_id, void **req)
{
H5VL_class_t *cls = NULL;
void *ret_value = NULL;
FUNC_ENTER_API(NULL)
H5TRACE8("*x", "*xxi*siii**x", obj, loc_params, driver_id, name, gcpl_id,
gapl_id, dxpl_id, req);
if (NULL == obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a VOL driver ID")
if(NULL == (ret_value = H5VL_group_create(obj, loc_params, cls, name,
gcpl_id, gapl_id, dxpl_id, req)))
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, NULL, "unable to create group")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLgroup_create() */
/*-------------------------------------------------------------------------
* Function: H5VLgroup_open
*
* Purpose: Opens a group
*
* Return: Success: Pointer to the new group
*
* Failure: NULL
*
*-------------------------------------------------------------------------
*/
void *
H5VLgroup_open(void *obj, H5VL_loc_params_t loc_params, hid_t driver_id, const char *name,
hid_t gapl_id, hid_t dxpl_id, void **req)
{
H5VL_class_t *cls = NULL;
void *ret_value = NULL;
FUNC_ENTER_API(NULL)
H5TRACE7("*x", "*xxi*sii**x", obj, loc_params, driver_id, name, gapl_id,
dxpl_id, req);
if (NULL == obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a VOL driver ID")
if(NULL == (ret_value = H5VL_group_open(obj, loc_params, cls, name,
gapl_id, dxpl_id, req)))
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, NULL, "unable to open group")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLgroup_open() */
/*-------------------------------------------------------------------------
* Function: H5VLgroup_get
*
* Purpose: Gets information about the group
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLgroup_get(void *obj, hid_t driver_id, H5VL_group_get_t get_type,
hid_t dxpl_id, void **req, va_list arguments)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE6("e", "*xiVii**xx", obj, driver_id, get_type, dxpl_id, req, arguments);
if(NULL == obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
/* Bypass the H5VLint layer */
if(NULL == cls->group_cls.get)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol driver has no `group get' method")
if((ret_value = (cls->group_cls.get)(obj, get_type, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "Unable to execute group get callback")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLgroup_get() */
/*-------------------------------------------------------------------------
* Function: H5VLgroup_specific
*
* Purpose: Performs a driver-specific operation on a group
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLgroup_specific(void *obj, hid_t driver_id, H5VL_group_specific_t specific_type,
hid_t dxpl_id, void **req, va_list arguments)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE6("e", "*xiVji**xx", obj, driver_id, specific_type, dxpl_id, req,
arguments);
if (NULL == obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if(NULL == cls->group_cls.specific)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol driver has no `group specific' method")
if((ret_value = (cls->group_cls.specific)
(obj, specific_type, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTOPERATE, FAIL, "Unable to execute group specific callback")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLgroup_specific() */
/*-------------------------------------------------------------------------
* Function: H5VLgroup_optional
*
* Purpose: Performs an optional driver-specific operation on a group
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLgroup_optional(void *obj, hid_t driver_id, hid_t dxpl_id, void **req, va_list arguments)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE5("e", "*xii**xx", obj, driver_id, dxpl_id, req, arguments);
if (NULL == obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if(NULL == cls->group_cls.optional)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol driver has no `group optional' method")
if((ret_value = (cls->group_cls.optional)(obj, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTOPERATE, FAIL, "Unable to execute group optional callback")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLgroup_optional() */
/*-------------------------------------------------------------------------
* Function: H5VLgroup_close
*
* Purpose: Closes a group
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLgroup_close(void *grp, hid_t driver_id, hid_t dxpl_id, void **req)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE4("e", "*xii**x", grp, driver_id, dxpl_id, req);
if(NULL == grp)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if((ret_value = H5VL_group_close(grp, cls, dxpl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTRELEASE, FAIL, "unable to close group")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLgroup_close() */
/*-------------------------------------------------------------------------
* Function: H5VLlink_create
*
* Purpose: Creates a hard link
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLlink_create(H5VL_link_create_type_t create_type, void *obj, H5VL_loc_params_t loc_params,
hid_t driver_id, hid_t lcpl_id, hid_t lapl_id, hid_t dxpl_id, void **req)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE8("e", "Vk*xxiiii**x", create_type, obj, loc_params, driver_id, lcpl_id,
lapl_id, dxpl_id, req);
if(NULL == obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if((ret_value = H5VL_link_create(create_type, obj, loc_params, cls, lcpl_id, lapl_id, dxpl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "unable to create link")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLlink_create() */
/*-------------------------------------------------------------------------
* Function: H5VLlink_copy
*
* Purpose: Copies a link to a new location
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLlink_copy(void *src_obj, H5VL_loc_params_t loc_params1, void *dst_obj,
H5VL_loc_params_t loc_params2, hid_t driver_id,
hid_t lcpl_id, hid_t lapl_id, hid_t dxpl_id, void **req)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE9("e", "*xx*xxiiii**x", src_obj, loc_params1, dst_obj, loc_params2,
driver_id, lcpl_id, lapl_id, dxpl_id, req);
if(NULL == src_obj || NULL == dst_obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if((ret_value = H5VL_link_copy(src_obj, loc_params1, dst_obj, loc_params2, cls,
lcpl_id, lapl_id, dxpl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "unable to copy object")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLlink_copy() */
/*-------------------------------------------------------------------------
* Function: H5VLlink_move
*
* Purpose: Moves a link to another location
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLlink_move(void *src_obj, H5VL_loc_params_t loc_params1, void *dst_obj,
H5VL_loc_params_t loc_params2, hid_t driver_id,
hid_t lcpl_id, hid_t lapl_id, hid_t dxpl_id, void **req)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE9("e", "*xx*xxiiii**x", src_obj, loc_params1, dst_obj, loc_params2,
driver_id, lcpl_id, lapl_id, dxpl_id, req);
if(NULL == src_obj || NULL == dst_obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if((ret_value = H5VL_link_move(src_obj, loc_params1, dst_obj, loc_params2, cls,
lcpl_id, lapl_id, dxpl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "unable to move object")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLlink_move() */
/*-------------------------------------------------------------------------
* Function: H5VLlink_get
*
* Purpose: Gets information about a link
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLlink_get(void *obj, H5VL_loc_params_t loc_params, hid_t driver_id, H5VL_link_get_t get_type,
hid_t dxpl_id, void **req, va_list arguments)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE7("e", "*xxiVli**xx", obj, loc_params, driver_id, get_type, dxpl_id, req,
arguments);
if(NULL == obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if(NULL == cls->link_cls.get)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol driver has no `link get' method")
if((ret_value = (cls->link_cls.get)
(obj, loc_params, get_type, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTOPERATE, FAIL, "Unable to execute link get callback")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLlink_get() */
/*-------------------------------------------------------------------------
* Function: H5VLlink_specific
*
* Purpose: Performs a driver-specific operation on a link
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLlink_specific(void *obj, H5VL_loc_params_t loc_params, hid_t driver_id,
H5VL_link_specific_t specific_type, hid_t dxpl_id, void **req, va_list arguments)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE7("e", "*xxiVmi**xx", obj, loc_params, driver_id, specific_type,
dxpl_id, req, arguments);
if (NULL == obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
/* Bypass the H5VLint layer */
if(NULL == cls->link_cls.specific)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol driver has no `link specific' method")
if((ret_value = (cls->link_cls.specific)
(obj, loc_params, specific_type, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTOPERATE, FAIL, "Unable to execute link specific callback")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLlink_specific() */
/*-------------------------------------------------------------------------
* Function: H5VLlink_optional
*
* Purpose: Performs an optional driver-specific operation on a link
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLlink_optional(void *obj, hid_t driver_id, hid_t dxpl_id, void **req, va_list arguments)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE5("e", "*xii**xx", obj, driver_id, dxpl_id, req, arguments);
if (NULL == obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
/* Have to bypass the H5VLint layer due to unknown val_list arguments */
if(NULL == cls->link_cls.optional)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol driver has no `link optional' method")
if((ret_value = (cls->link_cls.optional)(obj, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTOPERATE, FAIL, "Unable to execute link optional callback")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLlink_optional() */
/*-------------------------------------------------------------------------
* Function: H5VLobject_open
*
* Purpose: Opens an object
*
* Return: Success: Pointer to the new object
*
* Failure: NULL
*
*-------------------------------------------------------------------------
*/
void *
H5VLobject_open(void *obj, H5VL_loc_params_t params, hid_t driver_id, H5I_type_t *opened_type,
hid_t dxpl_id, void **req)
{
H5VL_class_t *cls = NULL;
void *ret_value = NULL;
FUNC_ENTER_API(NULL)
H5TRACE6("*x", "*xxi*Iti**x", obj, params, driver_id, opened_type, dxpl_id, req);
if (NULL == obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a VOL driver ID")
if(NULL == (ret_value = H5VL_object_open(obj, params, cls, opened_type, dxpl_id, req)))
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, NULL, "unable to create group")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLobject_open() */
/*-------------------------------------------------------------------------
* Function: H5VLobject_copy
*
* Purpose: Copies an object to another location
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLobject_copy(void *src_obj, H5VL_loc_params_t loc_params1, hid_t driver_id1, const char *src_name,
void *dst_obj, H5VL_loc_params_t loc_params2, hid_t driver_id2, const char *dst_name,
hid_t ocpypl_id, hid_t lcpl_id, hid_t dxpl_id, void **req)
{
H5VL_class_t *cls1 = NULL;
H5VL_class_t *cls2 = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE12("e", "*xxi*s*xxi*siii**x", src_obj, loc_params1, driver_id1,
src_name, dst_obj, loc_params2, driver_id2, dst_name, ocpypl_id,
lcpl_id, dxpl_id, req);
if(NULL == src_obj || NULL == dst_obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls1 = (H5VL_class_t *)H5I_object_verify(driver_id1, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if(NULL == (cls2 = (H5VL_class_t *)H5I_object_verify(driver_id2, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if((ret_value = H5VL_object_copy(src_obj, loc_params1, cls1, src_name,
dst_obj, loc_params2, cls2, dst_name,
ocpypl_id, lcpl_id, dxpl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "unable to move object")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLobject_copy() */
/*-------------------------------------------------------------------------
* Function: H5VLobject_get
*
* Purpose: Gets information about an object
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLobject_get(void *obj, H5VL_loc_params_t loc_params, hid_t driver_id, H5VL_object_get_t get_type,
hid_t dxpl_id, void **req, va_list arguments)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE7("e", "*xxiVni**xx", obj, loc_params, driver_id, get_type, dxpl_id, req,
arguments);
if(NULL == obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if(NULL == cls->object_cls.get)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol driver has no `object get' method")
if((ret_value = (cls->object_cls.get)
(obj, loc_params, get_type, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTOPERATE, FAIL, "Unable to execute object get callback")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLobject_get() */
/*-------------------------------------------------------------------------
* Function: H5VLobject_specific
*
* Purpose: Performs a driver-specific operation on an object
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLobject_specific(void *obj, H5VL_loc_params_t loc_params, hid_t driver_id,
H5VL_object_specific_t specific_type, hid_t dxpl_id, void **req, va_list arguments)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE7("e", "*xxiVoi**xx", obj, loc_params, driver_id, specific_type,
dxpl_id, req, arguments);
if(NULL == obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
/* Bypass the H5VLint layer */
if(NULL == cls->object_cls.specific)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol driver has no `object specific' method")
if((ret_value = (cls->object_cls.specific)
(obj, loc_params, specific_type, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTOPERATE, FAIL, "Unable to execute object specific callback")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLobject_specific() */
/*-------------------------------------------------------------------------
* Function: H5VLobject_optional
*
* Purpose: Performs an optional driver-specific operation on an object
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLobject_optional(void *obj, hid_t driver_id, hid_t dxpl_id, void **req, va_list arguments)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE5("e", "*xii**xx", obj, driver_id, dxpl_id, req, arguments);
if (NULL == obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
/* Have to bypass the H5VLint layer due to unknown val_list arguments */
if(NULL == cls->object_cls.optional)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol driver has no `object optional' method")
if((ret_value = (cls->object_cls.optional)(obj, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTOPERATE, FAIL, "Unable to execute object optional callback")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLobject_optional() */
/*-------------------------------------------------------------------------
* Function: H5VLdatatype_commit
*
* Purpose: Commits a datatype to the file
*
* Return: Success: Pointer to the new datatype
*
* Failure: NULL
*
*-------------------------------------------------------------------------
*/
void *
H5VLdatatype_commit(void *obj, H5VL_loc_params_t loc_params, hid_t driver_id, const char *name,
hid_t type_id, hid_t lcpl_id, hid_t tcpl_id, hid_t tapl_id, hid_t dxpl_id, void **req)
{
H5VL_class_t *cls = NULL;
void *ret_value = NULL;
FUNC_ENTER_API(NULL)
H5TRACE10("*x", "*xxi*siiiii**x", obj, loc_params, driver_id, name, type_id,
lcpl_id, tcpl_id, tapl_id, dxpl_id, req);
if (NULL == obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a VOL driver ID")
if(NULL == (ret_value = H5VL_datatype_commit(obj, loc_params, cls, name, type_id,
lcpl_id, tcpl_id, tapl_id, dxpl_id, req)))
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, NULL, "unable to commit datatype")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLdatatype_commit() */
/*-------------------------------------------------------------------------
* Function: H5VLdatatype_open
*
* Purpose: Opens a named datatype
*
* Return: Success: Pointer to the new datatype
*
* Failure: NULL
*
*-------------------------------------------------------------------------
*/
void *
H5VLdatatype_open(void *obj, H5VL_loc_params_t loc_params, hid_t driver_id, const char *name,
hid_t tapl_id, hid_t dxpl_id, void **req)
{
H5VL_class_t *cls = NULL;
void *ret_value = NULL;
FUNC_ENTER_API(NULL)
H5TRACE7("*x", "*xxi*sii**x", obj, loc_params, driver_id, name, tapl_id,
dxpl_id, req);
if (NULL == obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a VOL driver ID")
if(NULL == (ret_value = H5VL_datatype_open(obj, loc_params, cls, name,
tapl_id, dxpl_id, req)))
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, NULL, "unable to open datatype")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLdatatype_open() */
/*-------------------------------------------------------------------------
* Function: H5VLdatatype_specific
*
* Purpose: Performs a driver-specific operation on a datatype
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLdatatype_specific(void *obj, hid_t driver_id, H5VL_datatype_specific_t specific_type,
hid_t dxpl_id, void **req, va_list arguments)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE6("e", "*xiVfi**xx", obj, driver_id, specific_type, dxpl_id, req,
arguments);
if (NULL == obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if(NULL == cls->datatype_cls.specific)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol driver has no `datatype specific' method")
if((ret_value = (cls->datatype_cls.specific)
(obj, specific_type, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTOPERATE, FAIL, "Unable to execute datatype specific callback")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLdatatype_specific() */
/*-------------------------------------------------------------------------
* Function: H5VLdatatype_optional
*
* Purpose: Performs an optional driver-specific operation on a datatype
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLdatatype_optional(void *obj, hid_t driver_id, hid_t dxpl_id, void **req, va_list arguments)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE5("e", "*xii**xx", obj, driver_id, dxpl_id, req, arguments);
if (NULL == obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if(NULL == cls->datatype_cls.optional)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol driver has no `datatype optional' method")
if((ret_value = (cls->datatype_cls.optional)(obj, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTOPERATE, FAIL, "Unable to execute datatype optional callback")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLdatatype_optional() */
/*-------------------------------------------------------------------------
* Function: H5VLdatatype_get
*
* Purpose: Gets information about the datatype
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLdatatype_get(void *obj, hid_t driver_id, H5VL_datatype_get_t get_type,
hid_t dxpl_id, void **req, va_list arguments)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE6("e", "*xiVei**xx", obj, driver_id, get_type, dxpl_id, req, arguments);
if(NULL == obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
/* Bypass the H5VLint layer */
if(NULL == cls->datatype_cls.get)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "vol driver has no `datatype get' method")
if((ret_value = (cls->datatype_cls.get)(obj, get_type, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "Unable to execute datatype get callback")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLdatatype_get() */
/*-------------------------------------------------------------------------
* Function: H5VLdatatype_close
*
* Purpose: Closes a datatype
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLdatatype_close(void *dt, hid_t driver_id, hid_t dxpl_id, void **req)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE4("e", "*xii**x", dt, driver_id, dxpl_id, req);
if (NULL == dt)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid object")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if((ret_value = H5VL_datatype_close(dt, cls, dxpl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTRELEASE, FAIL, "unable to close datatype")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLdatatype_close() */
/*-------------------------------------------------------------------------
* Function: H5VLrequest_cancel
*
* Purpose: Cancels a request
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLrequest_cancel(void **req, hid_t driver_id, H5ES_status_t *status)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE3("e", "**xi*Es", req, driver_id, status);
if (NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if ((ret_value = H5VL_request_cancel(req, cls, status)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTRELEASE, FAIL, "unable to cancel request")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLrequest_cancel() */
/*-------------------------------------------------------------------------
* Function: H5VLrequest_test
*
* Purpose: Tests a request
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLrequest_test(void **req, hid_t driver_id, H5ES_status_t *status)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE3("e", "**xi*Es", req, driver_id, status);
if (NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if ((ret_value = H5VL_request_test(req, cls, status)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTRELEASE, FAIL, "unable to test request")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLrequest_test() */
/*-------------------------------------------------------------------------
* Function: H5VLrequest_wait
*
* Purpose: Waits on a request
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VLrequest_wait(void **req, hid_t driver_id, H5ES_status_t *status)
{
H5VL_class_t *cls = NULL;
herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE3("e", "**xi*Es", req, driver_id, status);
if (NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
if ((ret_value = H5VL_request_wait(req, cls, status)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTRELEASE, FAIL, "unable to wait on request")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5VLrequest_wait() */
+2192
View File
@@ -0,0 +1,2192 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright by The HDF Group. *
* All rights reserved. *
* *
* This file is part of HDF5. The full HDF5 copyright notice, including *
* terms governing use, modification, and redistribution, is contained in *
* the COPYING file, which can be found at the root of the source code *
* distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases. *
* If you do not have access to either file, you may request a copy from *
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* Purpose: The Virtual Object Layer as described in documentation.
* The pupose is to provide an abstraction on how to access the
* underlying HDF5 container, whether in a local file with
* a specific file format, or remotely on other machines, etc...
*/
/****************/
/* Module Setup */
/****************/
#include "H5VLmodule.h" /* This source code file is part of the H5VL module */
/***********/
/* Headers */
/***********/
#include "H5private.h" /* Generic Functions */
#include "H5Eprivate.h" /* Error handling */
#include "H5FLprivate.h" /* Free lists */
#include "H5Iprivate.h" /* IDs */
#include "H5MMprivate.h" /* Memory management */
#include "H5Pprivate.h" /* Property lists */
#include "H5Tprivate.h" /* Datatypes */
#include "H5VLpkg.h" /* Virtual Object Layer */
/****************/
/* Local Macros */
/****************/
/******************/
/* Local Typedefs */
/******************/
/********************/
/* Package Typedefs */
/********************/
/********************/
/* Local Prototypes */
/********************/
static herr_t H5VL_free_cls(H5VL_class_t *cls);
/*********************/
/* Package Variables */
/*********************/
/* Package initialization variable */
hbool_t H5_PKG_INIT_VAR = FALSE;
/*****************************/
/* Library Private Variables */
/*****************************/
/*******************/
/* Local Variables */
/*******************/
/* VOL ID class */
static const H5I_class_t H5I_VOL_CLS[1] = {{
H5I_VOL, /* ID class value */
0, /* Class flags */
0, /* # of reserved IDs for class */
(H5I_free_t)H5VL_free_cls /* Callback routine for closing objects of this class */
}};
/* Declare a free list to manage the H5VL_t struct */
H5FL_DEFINE(H5VL_t);
/* Declare a free list to manage the H5VL_object_t struct */
H5FL_DEFINE(H5VL_object_t);
/*-------------------------------------------------------------------------
* Function: H5VL_init
*
* Purpose: Initialize the interface from some other package
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_init(void)
{
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
/* FUNC_ENTER() does all the work */
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_init() */
/*-------------------------------------------------------------------------
* Function: H5VL__init_package
*
* Purpose: Initialize interface-specific information
*
* Return: Success: Non-negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL__init_package(void)
{
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_PACKAGE
/* Initialize the atom group for the VL IDs */
if (H5I_register_type(H5I_VOL_CLS) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "unable to initialize H5VL interface");
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL__init_package() */
/*-------------------------------------------------------------------------
* Function: H5VL_term_package
*
* Purpose: Terminate various H5VL objects
*
* Return: Success: Positive if anything was done that might
* affect other interfaces; zero otherwise.
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
int
H5VL_term_package(void)
{
int n = 0;
FUNC_ENTER_NOAPI_NOINIT_NOERR
if (H5_PKG_INIT_VAR) {
if (H5I_nmembers(H5I_VOL) > 0) {
(void)H5I_clear_type(H5I_VOL, FALSE, FALSE);
n++;
}
else {
/* Destroy the VOL driver ID group */
n += (H5I_dec_type_ref(H5I_VOL) > 0);
/* Mark interface as closed */
if (0 == n)
H5_PKG_INIT_VAR = FALSE;
}
}
FUNC_LEAVE_NOAPI(n)
} /* end H5VL_term_package() */
/*-------------------------------------------------------------------------
* Function: H5VL_free_cls
*
* Purpose: Frees a file VOL class struct and returns an indication of
* success. This function is used as the free callback for the
* virtual object layer object identifiers
* (c.f.: H5VL_init_interface).
*
* Return: SUCCEED/FAIL
*
*-------------------------------------------------------------------------
*/
static herr_t
H5VL_free_cls(H5VL_class_t *cls)
{
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI_NOINIT
/* Sanity check */
HDassert(cls);
/* XXX: Need to retrieve the VOL termination property list for the
* terminate operation - JTH
*/
if (cls->terminate && cls->terminate(H5P_DEFAULT) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTCLOSEOBJ, FAIL, "VOL driver did not terminate cleanly");
/* XXX (VOL MERGE): We'll leak memory if the name string was dynamically allocated. */
H5MM_xfree(cls);
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_free_cls() */
/*-------------------------------------------------------------------------
* Function: H5VL_register_id
*
* Purpose: Wrapper to register an object ID with a VOL aux struct
* and increment ref count on VOL driver ID
*
* Return: Success: A valid HDF5 ID
* Failure: H5I_INVALID_HID
*
*-------------------------------------------------------------------------
*/
hid_t
H5VL_register_id(H5I_type_t type, void *object, H5VL_t *vol_driver, hbool_t app_ref)
{
H5VL_object_t *new_obj = NULL;
hid_t ret_value = H5I_INVALID_HID;
FUNC_ENTER_NOAPI(H5I_INVALID_HID)
/* Check arguments */
HDassert(object);
HDassert(vol_driver);
/* setup VOL object */
if (NULL == (new_obj = H5FL_CALLOC(H5VL_object_t)))
HGOTO_ERROR(H5E_VOL, H5E_CANTALLOC, H5I_INVALID_HID, "can't allocate top object structure");
new_obj->driver = vol_driver;
new_obj->data = object;
vol_driver->nrefs++;
if (H5I_DATATYPE == type) {
H5T_t *dt = NULL;
if (NULL == (dt = H5T_construct_datatype(new_obj)))
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, H5I_INVALID_HID, "can't construct datatype object");
if ((ret_value = H5I_register(type, dt, app_ref)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to atomize handle");
}
else {
if ((ret_value = H5I_register(type, new_obj, app_ref)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to atomize handle");
}
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_register_id() */
/*-------------------------------------------------------------------------
* Function: H5VL_free_object
*
* Purpose: Wrapper to unregister an object ID with a VOL aux struct
* and decrement ref count on VOL driver ID
*
* Return: SUCCEED/FAIL
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_free_object(H5VL_object_t *vol_obj)
{
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(SUCCEED)
/* Check arguments */
HDassert(vol_obj);
vol_obj->driver->nrefs --;
if (0 == vol_obj->driver->nrefs) {
if (H5I_dec_ref(vol_obj->driver->id) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTDEC, FAIL, "unable to decrement ref count on VOL driver");
vol_obj->driver = H5FL_FREE(H5VL_t, vol_obj->driver);
}
vol_obj = H5FL_FREE(H5VL_object_t, vol_obj);
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_free_object() */
/*-------------------------------------------------------------------------
* Function: H5VL_register
*
* Purpose: Registers a new VOL driver as a member of the virtual object
* layer class.
*
* Return: Success: A VOL driver ID which is good until the
* library is closed or the driver is unregistered.
*
* Failure: H5I_INVALID_HID
*
*-------------------------------------------------------------------------
*/
hid_t
H5VL_register(const void *_cls, size_t size, hbool_t app_ref)
{
const H5VL_class_t *cls = (const H5VL_class_t *)_cls;
H5VL_class_t *saved = NULL;
hid_t ret_value = H5I_INVALID_HID;
FUNC_ENTER_NOAPI(H5I_INVALID_HID)
/* Check arguments */
HDassert(cls);
/* Copy the class structure so the caller can reuse or free it */
if (NULL == (saved = (H5VL_class_t *)H5MM_calloc(size)))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, H5I_INVALID_HID, "memory allocation failed for VOL driver class struct");
HDmemcpy(saved, cls, size);
/* Create the new class ID */
if ((ret_value = H5I_register(H5I_VOL, saved, app_ref)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register VOL driver ID");
done:
if (ret_value < 0)
if (saved)
H5MM_xfree(saved);
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_register() */
/*-------------------------------------------------------------------------
* Function: H5VL_object_register
*
* Purpose: Utility function to create a user ID for an object created
* or opened through the VOL
*
* Return: Success: A valid HDF5 ID
* Failure: H5I_INVALID_HID
*
*-------------------------------------------------------------------------
*/
hid_t
H5VL_object_register(void *obj, H5I_type_t obj_type, hid_t driver_id, hbool_t app_ref)
{
H5VL_class_t *cls = NULL;
H5VL_t *driver = NULL; /* VOL driver struct */
hid_t ret_value = H5I_INVALID_HID;
FUNC_ENTER_NOAPI(FAIL)
if (NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a VOL driver ID");
/* Setup VOL info struct */
if (NULL == (driver = H5FL_CALLOC(H5VL_t)))
HGOTO_ERROR(H5E_FILE, H5E_NOSPACE, H5I_INVALID_HID, "can't allocate VOL info struct");
driver->cls = cls;
driver->id = driver_id;
if (H5I_inc_ref(driver->id, FALSE) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTINC, H5I_INVALID_HID, "unable to increment ref count on VOL driver");
/* Get an ID for the VOL object */
if ((ret_value = H5VL_register_id(obj_type, obj, driver, app_ref)) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register object handle");
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_object_register() */
/*-------------------------------------------------------------------------
* Function: H5VL_get_driver_name
*
* Purpose: Private version of H5VLget_driver_name
*
* Return: Success: The length of the driver name
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
ssize_t
H5VL_get_driver_name(hid_t id, char *name /*out*/, size_t size)
{
H5VL_object_t *vol_obj = NULL;
const H5VL_class_t *cls = NULL;
size_t len;
ssize_t ret_value = -1;
FUNC_ENTER_NOAPI(FAIL)
/* get the object pointer */
if (NULL == (vol_obj = H5VL_get_object(id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid file identifier");
cls = vol_obj->driver->cls;
len = HDstrlen(cls->name);
if (name) {
HDstrncpy(name, cls->name, MIN(len + 1,size));
if (len >= size)
name[size-1]='\0';
}
/* Set the return value for the API call */
ret_value = (ssize_t)len;
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_get_driver_name() */
/*-------------------------------------------------------------------------
* Function: H5VL_get_object
*
* Purpose: Utility function to return the object pointer associated with
* a hid_t. This routine is the same as H5I_object for all types
* except for named datatypes, where the vol_obj is returned that
* is attached to the H5T_t struct.
*
* Return: Success: object pointer
* Failure: NULL
*
*-------------------------------------------------------------------------
*/
H5VL_object_t *
H5VL_get_object(hid_t id)
{
void *obj = NULL;
H5I_type_t obj_type = H5I_get_type(id);
H5VL_object_t *ret_value = NULL;
FUNC_ENTER_NOAPI(NULL)
if (H5I_FILE == obj_type || H5I_GROUP == obj_type || H5I_ATTR == obj_type ||
H5I_DATASET == obj_type || H5I_DATATYPE == obj_type) {
/* get the object */
if (NULL == (obj = H5I_object(id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "invalid identifier");
/* if this is a datatype, get the VOL object attached to the H5T_t struct */
if (H5I_DATATYPE == obj_type) {
if (NULL == (obj = H5T_get_named_type((H5T_t *)obj)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a named datatype");
}
}
else
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "invalid identifier type to function");
ret_value = (H5VL_object_t *)obj;
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_get_object() */
/*-------------------------------------------------------------------------
* Function: H5VL_object
*
* Purpose: Utility function to return the VOL object pointer associated with
* a hid_t.
*
* Return: Success: object pointer
* Failure: NULL
*
*-------------------------------------------------------------------------
*/
void *
H5VL_object(hid_t id)
{
H5VL_object_t *vol_obj = NULL;
void *ret_value = NULL;
FUNC_ENTER_NOAPI(NULL)
/* Get the symbol table entry */
switch (H5I_get_type(id)) {
case H5I_GROUP:
case H5I_DATASET:
case H5I_FILE:
case H5I_ATTR:
/* get the object */
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object(id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "invalid identifier");
ret_value = vol_obj->data;
break;
case H5I_DATATYPE:
{
H5T_t *dt = NULL;
/* get the object */
if (NULL == (dt = (H5T_t *)H5I_object(id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "invalid identifier");
/* Get the actual datatype object that should be the vol_obj */
if (NULL == (vol_obj = H5T_get_named_type(dt)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a named datatype");
ret_value = vol_obj->data;
break;
}
case H5I_UNINIT:
case H5I_BADID:
case H5I_DATASPACE:
case H5I_REFERENCE:
case H5I_VFL:
case H5I_VOL:
case H5I_GENPROP_CLS:
case H5I_GENPROP_LST:
case H5I_ERROR_CLASS:
case H5I_ERROR_MSG:
case H5I_ERROR_STACK:
case H5I_NTYPES:
default:
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "unknown data object type");
}
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_object() */
/*-------------------------------------------------------------------------
* Function: H5VL_object_verify
*
* Purpose: Utility function to return the VOL object pointer associated
* with an identifier.
*
* Return: Success: object pointer
* Failure: NULL
*
*-------------------------------------------------------------------------
*/
void *
H5VL_object_verify(hid_t id, H5I_type_t obj_type)
{
H5VL_object_t *vol_obj = NULL;
void *ret_value = NULL;
FUNC_ENTER_NOAPI(NULL)
/* Get the symbol table entry */
switch (obj_type) {
case H5I_GROUP:
case H5I_DATASET:
case H5I_FILE:
case H5I_ATTR:
/* get the object */
if (NULL == (vol_obj = (H5VL_object_t *)H5I_object_verify(id, obj_type)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "invalid identifier");
ret_value = vol_obj->data;
break;
case H5I_DATATYPE:
{
H5T_t *dt = NULL;
/* get the object */
if (NULL == (dt = (H5T_t *)H5I_object_verify(id, obj_type)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "invalid identifier");
/* Get the actual datatype object that should be the vol_obj */
if (NULL == (vol_obj = H5T_get_named_type(dt)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a named datatype");
ret_value = vol_obj->data;
break;
}
case H5I_UNINIT:
case H5I_BADID:
case H5I_DATASPACE:
case H5I_REFERENCE:
case H5I_VFL:
case H5I_VOL:
case H5I_GENPROP_CLS:
case H5I_GENPROP_LST:
case H5I_ERROR_CLASS:
case H5I_ERROR_MSG:
case H5I_ERROR_STACK:
case H5I_NTYPES:
default:
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "unknown data object type")
}
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_object_verify() */
/* XXX (VOL MERGE): This could be a macro like in H5F */
void *
H5VL_driver_object(H5VL_object_t *vol_obj)
{
FUNC_ENTER_NOAPI_NOINIT_NOERR
FUNC_LEAVE_NOAPI(vol_obj->data)
} /* end H5VL_driver_object() */
/*-------------------------------------------------------------------------
* Function: H5VL_attr_create
*
* Purpose: Creates an attribute through the VOL
*
* Return: Success: pointer to the new attribute
*
* Failure: NULL
*
*-------------------------------------------------------------------------
*/
void *
H5VL_attr_create(void *obj, H5VL_loc_params_t loc_params, const H5VL_class_t *cls, const char *name,
hid_t acpl_id, hid_t aapl_id, hid_t dxpl_id, void **req)
{
void *ret_value; /* Return value */
FUNC_ENTER_NOAPI(NULL)
/* check if the corresponding VOL create callback exists */
if (NULL == cls->attr_cls.create)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, NULL, "VOL driver has no 'attr create' method")
/* call the corresponding VOL create callback */
if (NULL == (ret_value = (cls->attr_cls.create)
(obj, loc_params, name, acpl_id, aapl_id, dxpl_id, req)))
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, NULL, "create failed")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_attr_create() */
/*-------------------------------------------------------------------------
* Function: H5VL_attr_open
*
* Purpose: Opens an attribute through the VOL
*
* Return: Success: pointer to the new attr.
*
* Failure: NULL
*
*-------------------------------------------------------------------------
*/
void *
H5VL_attr_open(void *obj, H5VL_loc_params_t loc_params, const H5VL_class_t *cls, const char *name,
hid_t aapl_id, hid_t dxpl_id, void **req)
{
void *ret_value; /* Return value */
FUNC_ENTER_NOAPI(NULL)
/* check if the type specific corresponding VOL open callback exists */
if(NULL == cls->attr_cls.open)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, NULL, "VOL driver has no 'attr open' method")
/* call the corresponding VOL open callback */
if(NULL == (ret_value = (cls->attr_cls.open)
(obj, loc_params, name, aapl_id, dxpl_id, req)))
HGOTO_ERROR(H5E_VOL, H5E_CANTOPENOBJ, NULL, "attribute open failed")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_attr_open() */
/*-------------------------------------------------------------------------
* Function: H5VL_attr_read
*
* Purpose: Reads data from attr through the VOL
*
* Return: Success: Non Negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t H5VL_attr_read(void *attr, const H5VL_class_t *cls, hid_t mem_type_id, void *buf,
hid_t dxpl_id, void **req)
{
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
if(NULL == cls->attr_cls.read)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'attr read' method")
if((ret_value = (cls->attr_cls.read)(attr, mem_type_id, buf, dxpl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTRELEASE, FAIL, "read failed")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_attr_read() */
/*-------------------------------------------------------------------------
* Function: H5VL_attr_write
*
* Purpose: Writes data to attr through the VOL
*
* Return: Success: Non Negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t H5VL_attr_write(void *attr, const H5VL_class_t *cls, hid_t mem_type_id, const void *buf,
hid_t dxpl_id, void **req)
{
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
if(NULL == cls->attr_cls.write)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'attr write' method")
if((ret_value = (cls->attr_cls.write)(attr, mem_type_id, buf, dxpl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTRELEASE, FAIL, "write failed")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_attr_write() */
/*-------------------------------------------------------------------------
* Function: H5VL_attr_get
*
* Purpose: Get specific information about the attribute through the VOL
*
* Return: Success: non negative
*
* Failure: negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_attr_get(void *obj, const H5VL_class_t *cls, H5VL_attr_get_t get_type,
hid_t dxpl_id, void **req, ...)
{
va_list arguments; /* argument list passed from the API call */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
if(NULL == cls->attr_cls.get)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'attr get' method")
va_start (arguments, req);
if((ret_value = (cls->attr_cls.get)(obj, get_type, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "get failed")
va_end (arguments);
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_attr_get() */
/*-------------------------------------------------------------------------
* Function: H5VL_attr_specific
*
* Purpose: specific operation on attributes through the VOL
*
* Return: Success: non negative
*
* Failure: negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_attr_specific(void *obj, H5VL_loc_params_t loc_params, const H5VL_class_t *cls,
H5VL_attr_specific_t specific_type, hid_t dxpl_id, void **req, ...)
{
va_list arguments; /* argument list passed from the API call */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
if(NULL == cls->attr_cls.specific)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'attr specific' method")
va_start (arguments, req);
if((ret_value = (cls->attr_cls.specific)(obj, loc_params, specific_type, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTOPERATE, FAIL, "Unable to execute attribute specific callback")
va_end (arguments);
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_attr_specific() */
/*-------------------------------------------------------------------------
* Function: H5VL_attr_optional
*
* Purpose: optional operation specific to drivers.
*
* Return: Success: non negative
*
* Failure: negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_attr_optional(void *obj, const H5VL_class_t *cls, hid_t dxpl_id, void **req, ...)
{
va_list arguments; /* argument list passed from the API call */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
if(NULL == cls->attr_cls.optional)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'attr optional' method")
va_start (arguments, req);
if((ret_value = (cls->attr_cls.optional)(obj, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTOPERATE, FAIL, "Unable to execute attribute optional callback")
va_end (arguments);
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_attr_optional() */
/*-------------------------------------------------------------------------
* Function: H5VL_attr_close
*
* Purpose: Closes an attribute through the VOL
*
* Return: SUCCEED/FAIL
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_attr_close(void *attr, const H5VL_class_t *cls, hid_t dxpl_id, void **req)
{
herr_t ret_value = SUCCEED;
HDassert(attr);
HDassert(cls);
FUNC_ENTER_NOAPI(FAIL)
/* Check if the corresponding VOL callback exists */
if (NULL == cls->attr_cls.close)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'attr close' method");
/* Call the corresponding VOL callback */
if ((ret_value = (cls->attr_cls.close)(attr, dxpl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTRELEASE, FAIL, "close failed");
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_attr_close() */
/*-------------------------------------------------------------------------
* Function: H5VL_dataset_create
*
* Purpose: Creates a dataset through the VOL
*
* Return: Success: pointer to dataset
*
* Failure: NULL
*
*-------------------------------------------------------------------------
*/
void *
H5VL_dataset_create(void *obj, H5VL_loc_params_t loc_params, const H5VL_class_t *cls, const char *name,
hid_t dcpl_id, hid_t dapl_id, hid_t dxpl_id, void **req)
{
void *ret_value; /* Return value */
FUNC_ENTER_NOAPI(NULL)
/* check if the corresponding VOL create callback exists */
if(NULL == cls->dataset_cls.create)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, NULL, "VOL driver has no 'dataset create' method")
/* call the corresponding VOL create callback */
if(NULL == (ret_value = (cls->dataset_cls.create)
(obj, loc_params, name, dcpl_id, dapl_id, dxpl_id, req)))
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, NULL, "create failed")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_dataset_create() */
/*-------------------------------------------------------------------------
* Function: H5VL_dataset_open
*
* Purpose: Opens a dataset through the VOL
*
* Return: Success: pointer to dataset
*
* Failure: NULL
*
*-------------------------------------------------------------------------
*/
void *
H5VL_dataset_open(void *obj, H5VL_loc_params_t loc_params, const H5VL_class_t *cls, const char *name,
hid_t dapl_id, hid_t dxpl_id, void **req)
{
void *ret_value; /* Return value */
FUNC_ENTER_NOAPI(NULL)
/* check if the type specific corresponding VOL open callback exists */
if(NULL == cls->dataset_cls.open)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, NULL, "VOL driver has no 'dset open' method")
/* call the corresponding VOL open callback */
if(NULL == (ret_value = (cls->dataset_cls.open)
(obj, loc_params, name, dapl_id, dxpl_id, req)))
HGOTO_ERROR(H5E_VOL, H5E_CANTOPENOBJ, NULL, "dataset open failed")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_dataset_open() */
/*-------------------------------------------------------------------------
* Function: H5VL_dataset_read
*
* Purpose: Reads data from dataset through the VOL
*
* Return: Success: Non Negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_dataset_read(void *dset, const H5VL_class_t *cls, hid_t mem_type_id, hid_t mem_space_id,
hid_t file_space_id, hid_t plist_id, void *buf, void **req)
{
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
if(NULL == cls->dataset_cls.read)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'dataset read' method")
if((ret_value = (cls->dataset_cls.read)
(dset, mem_type_id, mem_space_id, file_space_id, plist_id, buf, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_READERROR, FAIL, "read failed")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_dataset_read() */
/*-------------------------------------------------------------------------
* Function: H5VL_dataset_write
*
* Purpose: Writes data from dataset through the VOL
*
* Return: Success: Non Negative
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_dataset_write(void *dset, const H5VL_class_t *cls, hid_t mem_type_id, hid_t mem_space_id,
hid_t file_space_id, hid_t plist_id, const void *buf, void **req)
{
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
if(NULL == cls->dataset_cls.write)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'dataset write' method")
if((ret_value = (cls->dataset_cls.write)
(dset, mem_type_id, mem_space_id, file_space_id, plist_id, buf, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_WRITEERROR, FAIL, "write failed")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_dataset_write() */
/*-------------------------------------------------------------------------
* Function: H5VL_dataset_get
*
* Purpose: Get specific information about the dataset through the VOL
*
* Return: Success: non negative
*
* Failure: negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_dataset_get(void *dset, const H5VL_class_t *cls, H5VL_dataset_get_t get_type,
hid_t dxpl_id, void **req, ...)
{
va_list arguments; /* argument list passed from the API call */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
if(NULL == cls->dataset_cls.get)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'dataset get' method")
va_start (arguments, req);
if((ret_value = (cls->dataset_cls.get)(dset, get_type, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "get failed")
va_end (arguments);
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_dataset_get() */
/*-------------------------------------------------------------------------
* Function: H5VL_dataset_specific
*
* Purpose: specific operation on datasets through the VOL
*
* Return: Success: non negative
*
* Failure: negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_dataset_specific(void *obj, const H5VL_class_t *cls, H5VL_dataset_specific_t specific_type,
hid_t dxpl_id, void **req, ...)
{
va_list arguments; /* argument list passed from the API call */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
if(NULL == cls->dataset_cls.specific)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'dataset specific' method")
va_start (arguments, req);
if((ret_value = (cls->dataset_cls.specific)
(obj, specific_type, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTOPERATE, FAIL, "Unable to execute dataset specific callback")
va_end (arguments);
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_dataset_specific() */
/*-------------------------------------------------------------------------
* Function: H5VL_dataset_optional
*
* Purpose: optional operation specific to drivers.
*
* Return: Success: non negative
*
* Failure: negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_dataset_optional(void *obj, const H5VL_class_t *cls, hid_t dxpl_id, void **req, ...)
{
va_list arguments; /* argument list passed from the API call */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
if(NULL == cls->dataset_cls.optional)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'dataset optional' method")
va_start (arguments, req);
if((ret_value = (cls->dataset_cls.optional)(obj, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTOPERATE, FAIL, "Unable to execute dataset optional callback")
va_end (arguments);
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_dataset_optional() */
/*-------------------------------------------------------------------------
* Function: H5VL_dataset_close
*
* Purpose: Closes a dataset through the VOL
*
* Return: SUCCEED/FAIL
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_dataset_close(void *dset, const H5VL_class_t *cls, hid_t dxpl_id, void **req)
{
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
HDassert(dset);
HDassert(cls);
/* Check if the corresponding VOL callback exists */
if (NULL == cls->dataset_cls.close)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'dset close' method");
/* Call the corresponding VOL callback */
if ((ret_value = (cls->dataset_cls.close)(dset, dxpl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTRELEASE, FAIL, "close failed");
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_dataset_close() */
/*-------------------------------------------------------------------------
* Function: H5VL_file_create
*
* Purpose: Creates a file through the VOL
*
* Return: Success: pointer to file.
*
* Failure: NULL
*
*-------------------------------------------------------------------------
*/
void *
H5VL_file_create(const H5VL_class_t *cls, const char *name, unsigned flags, hid_t fcpl_id,
hid_t fapl_id, hid_t dxpl_id, void **req)
{
void *ret_value = NULL; /* Return value */
FUNC_ENTER_NOAPI(NULL)
/* check if the corresponding VOL create callback exists */
if(NULL == cls->file_cls.create)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, NULL, "VOL driver has no 'file create' method")
/* call the corresponding VOL create callback */
if(NULL == (ret_value = (cls->file_cls.create)(name, flags, fcpl_id, fapl_id, dxpl_id, req)))
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, NULL, "create failed")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_file_create() */
/*-------------------------------------------------------------------------
* Function: H5VL_file_open
*
* Purpose: Opens a file through the VOL.
*
* Return: Success: pointer to file.
*
* Failure: NULL
*
*-------------------------------------------------------------------------
*/
void *
H5VL_file_open(const H5VL_class_t *cls, const char *name, unsigned flags, hid_t fapl_id,
hid_t dxpl_id, void **req)
{
void *ret_value = NULL; /* Return value */
FUNC_ENTER_NOAPI(NULL)
/* check if the corresponding VOL create callback exists */
if(NULL == cls->file_cls.open)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, NULL, "VOL driver has no 'file open' method")
/* call the corresponding VOL create callback */
if(NULL == (ret_value = (cls->file_cls.open)(name, flags, fapl_id, dxpl_id, req)))
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, NULL, "open failed")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_file_open() */
/*-------------------------------------------------------------------------
* Function: H5VL_file_get
*
* Purpose: Get specific information about the file through the VOL
*
* Return: Success: non negative
*
* Failure: negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_file_get(void *file, const H5VL_class_t *cls, H5VL_file_get_t get_type,
hid_t dxpl_id, void **req, ...)
{
va_list arguments; /* argument list passed from the API call */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
if(NULL == cls->file_cls.get)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'file get' method")
va_start(arguments, req);
if((ret_value = (cls->file_cls.get)(file, get_type, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "get failed")
va_end(arguments);
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_file_get() */
/*-------------------------------------------------------------------------
* Function: H5VL_file_specific
*
* Purpose: perform File specific operations through the VOL
*
* Return: Success: non negative
* Failure: negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_file_specific(void *file, const H5VL_class_t *cls, H5VL_file_specific_t specific_type,
hid_t dxpl_id, void **req, ...)
{
va_list arguments; /* argument list passed from the API call */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
if(specific_type == H5VL_FILE_IS_ACCESSIBLE) {
H5P_genplist_t *plist; /* Property list pointer */
H5VL_driver_prop_t driver_prop; /* Property for VOL driver ID & info */
va_list tmp_args; /* argument list passed from the API call */
hid_t fapl_id;
va_start (tmp_args, req);
fapl_id = va_arg (tmp_args, hid_t);
va_end (tmp_args);
/* get the VOL info from the fapl */
if(NULL == (plist = (H5P_genplist_t *)H5I_object(fapl_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list")
if(H5P_peek(plist, H5F_ACS_VOL_DRV_NAME, &driver_prop) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get VOL driver info")
if(NULL == (cls = (H5VL_class_t *)H5I_object_verify(driver_prop.driver_id, H5I_VOL)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a VOL driver ID")
va_start (arguments, req);
if((ret_value = (cls->file_cls.specific)
(file, specific_type, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "specific failed")
va_end (arguments);
}
else {
if(NULL == cls->file_cls.specific)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'file specific' method")
va_start (arguments, req);
if((ret_value = (cls->file_cls.specific)
(file, specific_type, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "specific failed")
va_end (arguments);
}
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_file_specific() */
/*-------------------------------------------------------------------------
* Function: H5VL_file_optional
*
* Purpose: perform a driver specific operation
*
* Return: Success: non negative
* Failure: negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_file_optional(void *file, const H5VL_class_t *cls, hid_t dxpl_id, void **req, ...)
{
va_list arguments; /* argument list passed from the API call */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
if(NULL == cls->file_cls.optional)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'file optional' method")
va_start (arguments, req);
if((ret_value = (cls->file_cls.optional)(file, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "optional failed")
va_end (arguments);
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_file_optional() */
/*-------------------------------------------------------------------------
* Function: H5VL_file_close
*
* Purpose: Closes a file through the VOL
*
* Return: SUCCEED/FAIL
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_file_close(void *file, const H5VL_class_t *cls, hid_t dxpl_id, void **req)
{
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
HDassert(file);
HDassert(cls);
/* Check if the corresponding VOL callback exists */
if (NULL == cls->file_cls.close)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'file close' method");
/* Call the corresponding VOL callback */
if ((ret_value = (cls->file_cls.close)(file, dxpl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTCLOSEFILE, FAIL, "close failed");
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_file_close() */
/*-------------------------------------------------------------------------
* Function: H5VL_group_create
*
* Purpose: Creates a group through the VOL
*
* Return: Success: pointer to new group.
*
* Failure: NULL
*
*-------------------------------------------------------------------------
*/
void *
H5VL_group_create(void *obj, H5VL_loc_params_t loc_params, const H5VL_class_t *cls, const char *name,
hid_t gcpl_id, hid_t gapl_id, hid_t dxpl_id, void **req)
{
void *ret_value = NULL; /* Return value */
FUNC_ENTER_NOAPI(NULL)
/* check if the corresponding VOL create callback exists */
if(NULL == cls->group_cls.create)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, NULL, "VOL driver has no 'group create' method")
/* call the corresponding VOL create callback */
if(NULL == (ret_value = (cls->group_cls.create)
(obj, loc_params, name, gcpl_id, gapl_id, dxpl_id, req)))
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, NULL, "create failed")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_group_create() */
/*-------------------------------------------------------------------------
* Function: H5VL_group_open
*
* Purpose: Opens a group through the VOL
*
* Return: Success: pointer to new group.
*
* Failure: NULL
*
*-------------------------------------------------------------------------
*/
void *
H5VL_group_open(void *obj, H5VL_loc_params_t loc_params, const H5VL_class_t *cls, const char *name,
hid_t gapl_id, hid_t dxpl_id, void **req)
{
void *ret_value; /* Return value */
FUNC_ENTER_NOAPI(NULL)
if(NULL == cls->group_cls.open)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, NULL, "VOL driver has no 'group open' method")
if(NULL == (ret_value = (cls->group_cls.open)
(obj, loc_params, name, gapl_id, dxpl_id, req)))
HGOTO_ERROR(H5E_VOL, H5E_CANTOPENOBJ, NULL, "open failed")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_group_open() */
/*-------------------------------------------------------------------------
* Function: H5VL_group_get
*
* Purpose: Get specific information about the group through the VOL
*
* Return: Success: non negative
*
* Failure: negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_group_get(void *obj, const H5VL_class_t *cls, H5VL_group_get_t get_type,
hid_t dxpl_id, void **req, ...)
{
va_list arguments; /* argument list passed from the API call */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
if(NULL == cls->group_cls.get)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'group get' method")
va_start (arguments, req);
if((ret_value = (cls->group_cls.get)
(obj, get_type, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "get failed")
va_end (arguments);
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_group_get() */
/*-------------------------------------------------------------------------
* Function: H5VL_group_specific
*
* Purpose: specific operation on groups through the VOL
*
* Return: Success: non negative
*
* Failure: negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_group_specific(void *obj, const H5VL_class_t *cls, H5VL_group_specific_t specific_type,
hid_t dxpl_id, void **req, ...)
{
va_list arguments; /* argument list passed from the API call */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
if(NULL == cls->group_cls.specific)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'group specific' method")
va_start (arguments, req);
if((ret_value = (cls->group_cls.specific)
(obj, specific_type, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTOPERATE, FAIL, "Unable to execute group specific callback")
va_end (arguments);
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_group_specific() */
/*-------------------------------------------------------------------------
* Function: H5VL_group_optional
*
* Purpose: optional operation specific to drivers.
*
* Return: Success: non negative
*
* Failure: negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_group_optional(void *obj, const H5VL_class_t *cls, hid_t dxpl_id, void **req, ...)
{
va_list arguments; /* argument list passed from the API call */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
if(NULL == cls->group_cls.optional)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'group optional' method")
va_start (arguments, req);
if((ret_value = (cls->group_cls.optional)(obj, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTOPERATE, FAIL, "Unable to execute group optional callback")
va_end (arguments);
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_group_optional() */
/*-------------------------------------------------------------------------
* Function: H5VL_group_close
*
* Purpose: Closes a group through the VOL
*
* Return: SUCCEED/FAIL
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_group_close(void *grp, const H5VL_class_t *cls, hid_t dxpl_id, void **req)
{
herr_t ret_value = SUCCEED;
HDassert(grp);
HDassert(cls);
FUNC_ENTER_NOAPI(FAIL)
/* Check if the corresponding VOL callback exists */
if (NULL == cls->group_cls.close)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'group close' method");
/* Call the corresponding VOL callback */
if ((ret_value = (cls->group_cls.close)(grp, dxpl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTRELEASE, FAIL, "close failed");
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_group_close() */
/*-------------------------------------------------------------------------
* Function: H5VL_link_create
*
* Purpose: Creates a hard link through the VOL
*
* Return: Non-negative on success/Negative on failure
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_link_create(H5VL_link_create_type_t create_type, void *obj, H5VL_loc_params_t loc_params,
const H5VL_class_t *cls, hid_t lcpl_id, hid_t lapl_id, hid_t dxpl_id, void **req)
{
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
/* check if the corresponding VOL create callback exists */
if(NULL == cls->link_cls.create)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'link create' method")
/* call the corresponding VOL create callback */
if((ret_value = (cls->link_cls.create)
(create_type, obj, loc_params, lcpl_id, lapl_id, dxpl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "link create failed")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_link_create() */
/*-------------------------------------------------------------------------
* Function: H5VL_link_copy
*
* Purpose: Copys a link from src to dst.
*
* Return: Non-negative on success/Negative on failure
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_link_copy(void *src_obj, H5VL_loc_params_t loc_params1, void *dst_obj,
H5VL_loc_params_t loc_params2, const H5VL_class_t *cls,
hid_t lcpl_id, hid_t lapl_id, hid_t dxpl_id, void **req)
{
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
/* check if the corresponding VOL copy callback exists */
if(NULL == cls->link_cls.copy)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'link copy' method")
/* call the corresponding VOL copy callback */
if((ret_value = (cls->link_cls.copy)
(src_obj, loc_params1, dst_obj, loc_params2, lcpl_id,
lapl_id, dxpl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "link copy failed")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_link_copy() */
/*-------------------------------------------------------------------------
* Function: H5VL_link_move
*
* Purpose: Moves a link from src to dst.
*
* Return: Non-negative on success/Negative on failure
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_link_move(void *src_obj, H5VL_loc_params_t loc_params1, void *dst_obj,
H5VL_loc_params_t loc_params2, const H5VL_class_t *cls,
hid_t lcpl_id, hid_t lapl_id, hid_t dxpl_id, void **req)
{
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
/* check if the corresponding VOL move callback exists */
if(NULL == cls->link_cls.move)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'link move' method")
/* call the corresponding VOL move callback */
if((ret_value = (cls->link_cls.move)
(src_obj, loc_params1, dst_obj, loc_params2, lcpl_id,
lapl_id, dxpl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, FAIL, "link move failed")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_link_move() */
/*-------------------------------------------------------------------------
* Function: H5VL_link_get
*
* Purpose: Get specific information about the link through the VOL
*
* Return: Success: non negative
*
* Failure: negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_link_get(void *obj, H5VL_loc_params_t loc_params, const H5VL_class_t *cls, H5VL_link_get_t get_type,
hid_t dxpl_id, void **req, ...)
{
va_list arguments; /* argument list passed from the API call */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
if(NULL == cls->link_cls.get)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'link get' method")
va_start (arguments, req);
if((ret_value = (cls->link_cls.get)
(obj, loc_params, get_type, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "get failed")
va_end (arguments);
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_link_get() */
/*-------------------------------------------------------------------------
* Function: H5VL_link_specific
*
* Purpose: specific operation on links through the VOL
*
* Return: Success: non negative
*
* Failure: negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_link_specific(void *obj, H5VL_loc_params_t loc_params, const H5VL_class_t *cls,
H5VL_link_specific_t specific_type, hid_t dxpl_id, void **req, ...)
{
va_list arguments; /* argument list passed from the API call */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
if(NULL == cls->link_cls.specific)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'link specific' method")
va_start (arguments, req);
if((ret_value = (cls->link_cls.specific)
(obj, loc_params, specific_type, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTOPERATE, FAIL, "Unable to execute link specific callback")
va_end (arguments);
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_link_specific() */
/*-------------------------------------------------------------------------
* Function: H5VL_link_optional
*
* Purpose: optional operation specific to drivers.
*
* Return: Success: non negative
*
* Failure: negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_link_optional(void *obj, const H5VL_class_t *cls, hid_t dxpl_id, void **req, ...)
{
va_list arguments; /* argument list passed from the API call */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
if(NULL == cls->link_cls.optional)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'link optional' method")
va_start (arguments, req);
if((ret_value = (cls->link_cls.optional)(obj, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTOPERATE, FAIL, "Unable to execute link optional callback")
va_end (arguments);
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_link_optional() */
/*-------------------------------------------------------------------------
* Function: H5VL_object_open
*
* Purpose: Opens a object through the VOL
*
* Return: Success: User ID of the new object.
*
* Failure: NULL
*
*-------------------------------------------------------------------------
*/
void *
H5VL_object_open(void *obj, H5VL_loc_params_t params, const H5VL_class_t *cls, H5I_type_t *opened_type,
hid_t dxpl_id, void **req)
{
void *ret_value; /* Return value */
FUNC_ENTER_NOAPI(NULL)
/* check if the corresponding VOL open callback exists */
if(NULL == cls->object_cls.open)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, NULL, "VOL driver has no 'object open' method")
/* call the corresponding VOL open callback */
if(NULL == (ret_value = (cls->object_cls.open)
(obj, params, opened_type, dxpl_id, req)))
HGOTO_ERROR(H5E_VOL, H5E_CANTOPENOBJ, NULL, "open failed")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_object_open() */
/*-------------------------------------------------------------------------
* Function: H5VL_object_copy
*
* Purpose: Copies an object to another destination through the VOL
*
* Return: Success: Non Negative
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_object_copy(void *src_obj, H5VL_loc_params_t loc_params1, const H5VL_class_t *cls1, const char *src_name,
void *dst_obj, H5VL_loc_params_t loc_params2, const H5VL_class_t *cls2, const char *dst_name,
hid_t ocpypl_id, hid_t lcpl_id, hid_t dxpl_id, void **req)
{
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
/* Make sure that the VOL drivers are the same */
if (cls1->value != cls2->value)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "Objects are accessed through different VOL drivers and can't be linked")
if(NULL == cls1->object_cls.copy)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'object copy' method")
if((ret_value = (cls1->object_cls.copy)
(src_obj, loc_params1, src_name, dst_obj, loc_params2, dst_name, ocpypl_id,
lcpl_id, dxpl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTRELEASE, FAIL, "copy failed")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_object_copy() */
/*-------------------------------------------------------------------------
* Function: H5VL_object_get
*
* Purpose: Get specific information about the object through the VOL
*
* Return: Success: non negative
*
* Failure: negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_object_get(void *obj, H5VL_loc_params_t loc_params, const H5VL_class_t *cls, H5VL_object_get_t get_type,
hid_t dxpl_id, void **req, ...)
{
va_list arguments; /* argument list passed from the API call */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
if(NULL == cls->object_cls.get)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'object get' method")
va_start (arguments, req);
if((ret_value = (cls->object_cls.get)
(obj, loc_params, get_type, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "get failed")
va_end (arguments);
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_object_get() */
/*-------------------------------------------------------------------------
* Function: H5VL_object_specific
*
* Purpose: specific operation on objects through the VOL
*
* Return: Success: non negative
* Failure: negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_object_specific(void *obj, H5VL_loc_params_t loc_params, const H5VL_class_t *cls,
H5VL_object_specific_t specific_type, hid_t dxpl_id, void **req, ...)
{
va_list arguments; /* argument list passed from the API call */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
if(NULL == cls->object_cls.specific)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'object specific' method")
va_start (arguments, req);
if((ret_value = (cls->object_cls.specific)
(obj, loc_params, specific_type, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "specific failed")
va_end (arguments);
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_object_specific() */
/*-------------------------------------------------------------------------
* Function: H5VL_object_optional
*
* Purpose: optional operation specific to drivers.
*
* Return: Success: non negative
*
* Failure: negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_object_optional(void *obj, const H5VL_class_t *cls, hid_t dxpl_id, void **req, ...)
{
va_list arguments; /* argument list passed from the API call */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
if(NULL == cls->object_cls.optional)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'object optional' method")
va_start (arguments, req);
if((ret_value = (cls->object_cls.optional)(obj, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTOPERATE, FAIL, "Unable to execute object optional callback")
va_end (arguments);
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_object_optional() */
/*-------------------------------------------------------------------------
* Function: H5VL_datatype_commit
*
* Purpose: Commits a datatype to the file through the VOL
*
* Return: Success: Positive
*
* Failure: Negative
*
*-------------------------------------------------------------------------
*/
void *
H5VL_datatype_commit(void *obj, H5VL_loc_params_t loc_params, const H5VL_class_t *cls, const char *name,
hid_t type_id, hid_t lcpl_id, hid_t tcpl_id, hid_t tapl_id,
hid_t dxpl_id, void **req)
{
void *ret_value = NULL; /* Return value */
FUNC_ENTER_NOAPI(NULL)
/* check if the corresponding VOL commit callback exists */
if(NULL == cls->datatype_cls.commit)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, NULL, "VOL driver has no 'datatype commit' method")
/* call the corresponding VOL commit callback */
if(NULL == (ret_value = (cls->datatype_cls.commit)
(obj, loc_params, name, type_id, lcpl_id, tcpl_id, tapl_id, dxpl_id, req)))
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, NULL, "commit failed")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_datatype_commit() */
/*-------------------------------------------------------------------------
* Function: H5VL_datatype_open
*
* Purpose: Opens a named datatype through the VOL
*
* Return: Success: User ID of the datatype.
*
* Failure: NULL
*
*-------------------------------------------------------------------------
*/
void *
H5VL_datatype_open(void *obj, H5VL_loc_params_t loc_params, const H5VL_class_t *cls, const char *name,
hid_t tapl_id, hid_t dxpl_id, void **req)
{
void *ret_value = NULL; /* Return value */
FUNC_ENTER_NOAPI(NULL)
/* check if the type specific corresponding VOL open callback exists */
if(NULL == cls->datatype_cls.open)
HGOTO_ERROR(H5E_VOL, H5E_CANTINIT, NULL, "no datatype open callback");
/* call the corresponding VOL open callback */
if(NULL == (ret_value = (cls->datatype_cls.open)
(obj, loc_params, name, tapl_id, dxpl_id, req)))
HGOTO_ERROR(H5E_VOL, H5E_CANTOPENOBJ, NULL, "open failed")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_datatype_open() */
/*-------------------------------------------------------------------------
* Function: H5VL_datatype_get
*
* Purpose: Get specific information about the datatype through the VOL
*
* Return: SUCCEED/FAIL
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_datatype_get(void *obj, const H5VL_class_t *cls, H5VL_datatype_get_t get_type,
hid_t dxpl_id, void **req, ...)
{
va_list arguments; /* argument list passed from the API call */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
/* Check if the corresponding VOL callback exists */
if (NULL == cls->datatype_cls.get)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'datatype get' method");
va_start (arguments, req);
/* Call the corresponding VOL callback */
if ((ret_value = (cls->datatype_cls.get)(obj, get_type, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "get failed");
va_end (arguments);
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_datatype_get() */
/*-------------------------------------------------------------------------
* Function: H5VL_datatype_specific
*
* Purpose: specific operation on datatypes through the VOL
*
* Return: Success: non negative
*
* Failure: negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_datatype_specific(void *obj, const H5VL_class_t *cls, H5VL_datatype_specific_t specific_type,
hid_t dxpl_id, void **req, ...)
{
va_list arguments; /* argument list passed from the API call */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
if(NULL == cls->datatype_cls.specific)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'datatype specific' method")
va_start (arguments, req);
if((ret_value = (cls->datatype_cls.specific)
(obj, specific_type, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTOPERATE, FAIL, "Unable to execute datatype specific callback")
va_end (arguments);
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_datatype_specific() */
/*-------------------------------------------------------------------------
* Function: H5VL_datatype_optional
*
* Purpose: optional operation specific to drivers.
*
* Return: Success: non negative
*
* Failure: negative
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_datatype_optional(void *obj, const H5VL_class_t *cls, hid_t dxpl_id, void **req, ...)
{
va_list arguments; /* argument list passed from the API call */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
if(NULL == cls->datatype_cls.optional)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'datatype optional' method")
va_start (arguments, req);
if((ret_value = (cls->datatype_cls.optional)(obj, dxpl_id, req, arguments)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTOPERATE, FAIL, "Unable to execute datatype optional callback")
va_end (arguments);
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_datatype_optional() */
/*-------------------------------------------------------------------------
* Function: H5VL_datatype_close
*
* Purpose: Closes a datatype through the VOL
*
* Return: SUCCEED/FAIL
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_datatype_close(void *dt, const H5VL_class_t *cls, hid_t dxpl_id, void **req)
{
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
/* Check if the corresponding VOL callback exists */
if (NULL == cls->datatype_cls.close)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'datatype close' method");
/* Call the corresponding VOL callback */
if ((ret_value = (cls->datatype_cls.close)(dt, dxpl_id, req)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTRELEASE, FAIL, "close failed");
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_datatype_close() */
/*-------------------------------------------------------------------------
* Function: H5VL_request_cancel
*
* Purpose: Cancels an asynchronous request through the VOL
*
* Return: SUCCEED/FAIL
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_request_cancel(void **req, const H5VL_class_t *cls, H5ES_status_t *status)
{
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
HDassert(req);
HDassert(cls);
HDassert(status);
/* Check if the corresponding VOL callback exists */
if (NULL == cls->async_cls.cancel)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'async cancel' method");
/* Call the corresponding VOL callback */
if ((ret_value = (cls->async_cls.cancel)(req, status)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTRELEASE, FAIL, "request cancel failed");
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_request_cancel() */
/*-------------------------------------------------------------------------
* Function: H5VL_request_test
*
* Purpose: Tests an asynchronous request through the VOL
*
* Return: SUCCEED/FAIL
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_request_test(void **req, const H5VL_class_t *cls, H5ES_status_t *status)
{
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
HDassert(req);
HDassert(cls);
HDassert(status);
/* Check if the corresponding VOL callback exists */
if (NULL == cls->async_cls.test)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'async test' method");
/* Call the corresponding VOL callback */
if ((ret_value = (cls->async_cls.test)(req, status)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTRELEASE, FAIL, "request test failed");
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_request_test() */
/*-------------------------------------------------------------------------
* Function: H5VL_request_wait
*
* Purpose: Waits on an asychronous request through the VOL
*
* Return: SUCCEED/FAIL
*
*-------------------------------------------------------------------------
*/
herr_t
H5VL_request_wait(void **req, const H5VL_class_t *cls, H5ES_status_t *status)
{
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(FAIL)
HDassert(req);
HDassert(cls);
HDassert(status);
/* Check if the corresponding VOL callback exists */
if (NULL == cls->async_cls.wait)
HGOTO_ERROR(H5E_VOL, H5E_UNSUPPORTED, FAIL, "VOL driver has no 'async wait' method");
/* Call the corresponding VOL callback */
if ((ret_value = (cls->async_cls.wait)(req, status)) < 0)
HGOTO_ERROR(H5E_VOL, H5E_CANTRELEASE, FAIL, "request wait failed");
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_request_wait() */

Some files were not shown because too many files have changed in this diff Show More