/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright by The HDF Group. * * All rights reserved. * * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * * the COPYING file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * Purpose: This file contains declarations which define macros for the * H5VL package. Including this header means that the source file * is part of the H5VL package. */ #ifndef H5VLmodule_H #define H5VLmodule_H /* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error * reporting macros. */ #define H5VL_MODULE #define H5_MY_PKG H5VL #define H5_MY_PKG_ERR H5E_VOL /** \page H5VL_UG The HDF5 VOL plugin * * \section sec_vol The HDF5 VOL plugin * * \section subsec_vol_intro Introduction * The virtual object layer is an abstraction layer in the HDF5 library that intercepts all API calls * that could potentially access objects in an HDF5 container and forwards those calls to a VOL connector, * which implements the storage. The user or application gets the benefit of using the familiar and * widely-used HDF5 data model and API, but can map the physical storage of the HDF5 file and objects * to storage that better meets the application's data needs. * * \section subsec_vol_abstract_layer The VOL Abstraction Layer * The VOL lies just under the public API. When a storage-oriented public APIcall is made, the library * performs a few sanity checks on the input parameters and then immediately invokes a VOL callback, * which resolves to an implementation in the VOL connector that was selected when opening or creating * the file. The VOL connector then performs whatever operations are needed before control returns to the * library, where any final library operations such as assigning IDs for newly created/opened datasets are * performed before returning. This means that, for calls that utilize the VOL, all of the functionality * is deferred to the VOL connector and the HDF5 library does very little work. An important consideration * of this is that most of the HDF5 caching layers (metadata and chunk caches, page buffering, etc.) will * not be available as those are implemented in the HDF5 native VOL connector and cannot be easily reused * by external connectors. * * * * * *
* \image html vol_architecture.png "The VOL Architecture" *
* * Not all public HDF5 API calls pass through the VOL. Only calls which require manipulating storage go * through the VOL and require a VOL connector author to implement the appropriate callback. Dataspace, * property list, error stack, etc. calls have nothing to do with storage manipulation or querying and * do not use the VOL. This may be confusing when it comes to property list calls, since many of those * calls set properties for storage. Property lists are just collections of key-value pairs, though, so * a particular VOL connector is not required to set or get properties. * * Another thing to keep in mind is that not every VOL connector will implement the full HDF5 public API. * In some cases, a particular feature like variable-length types may not have been developed yet or may * not have an equivalent in the target storage system. Also, many HDF5 public API calls are specific to * the native HDF5 file format and are unlikely to have any use in other VOL connectors. A * feature/capabilities flag scheme is being developed to help navigate this. * * For more information about which calls go through the VOL and the mechanism by which this is implemented, * see the connector author and library internals documentation. * * \section subsec_vol_connect VOL Connectors * A VOL connector can be implemented in several ways: * \li as a shared or static library linked to an application * \li as a dynamically loaded plugin, implemented as a shared library * \li and even as an internal connector, built into the HDF5 libraryitself * * This section mostly focuses on external connectors, both libraries and plugins, as those are expected * to be much more common than internal implementations. * * A list of VOL connectors can be found here: * * Registered VOL Connectors * * This list is incomplete and only includes the VOL connectors that have been registered with * The HDF Group. * * Not every connector in this collection is actively maintained by The HDF Group. It simply serves as a * single location where important VOL connectors can be found. See the documentation in a connector's * repository to determine its development status and the parties responsible for it. * * A VOL template that contains build scripts (Autotools and CMake) and an empty VOL connector "shell" * which can be copied and used as a starting point for building new connectors is located here: * VOL Connector Template * * This template VOL connector is for use in constructing terminal VOL connectors that do not forward * calls to an underlying connector. The external pass-through VOL connector listed on the registered * connector page can be used as a starting point for pass-through connectors. * * The only current (non-test) internal VOL connector distributed with the library is the native file * format connector (the "native VOL connector") which contains the code that handles native HDF5 (*.h5/hdf5) * files. In other words, even the canonical HDF5 file format is implemented via the VOL, making it a core * part of the HDF5 library and not an optional component which could be disabled. * * It has not been completely abstracted from the HDF5 library, though, and is treated as a special case. * For example, it cannot be unloaded and is always present. * * \section subsec_vol_use Connector Use * * Previous Chapter \ref sec_plist - Next Chapter \ref sec_async * */ /** *\defgroup H5VL VOL connector (H5VL) * * \todo Describe the VOL plugin life cycle. * * \defgroup ASYNC Asynchronous Functions * \brief Asynchronous Functions * * \defgroup H5VLDEF Definitions * \ingroup H5VL * \defgroup H5VLDEV VOL Developer * \ingroup H5VL * \defgroup H5VLNAT Native VOL * \ingroup H5VL * \defgroup H5VLPT Pass-through VOL * \ingroup H5VL */ #endif /* H5VLmodule_H */