/** \page InitShut HDF5 Library initialization and shutdown

\section sec_initshut_app Application perspective

\subsection subsec_initshut_app_implicit Implicit initialization and shutdown
When a developer exports a new symbol as part of the HDF5 library,
they should make sure that an application cannot enter the library in an
uninitialized state through a new API function, or read an uninitialized
value from a non-function HDF5 symbol.

The HDF5 library initializes itself when an application either enters
the library through an API function call such as #H5Fopen, or when
an application evaluates an HDF5 symbol that represents either a
property-list identifier such as #H5F_ACC_RDONLY or #H5F_ACC_RDWR,
a property-list class identifier such as #H5P_FILE_ACCESS, a VFD
identifier such as #H5FD_FAMILY or #H5FD_SEC2, or a type identifier
such as #H5T_NATIVE_INT64.

The library sets a flag when initialization occurs and as long as the
flag is set, skips initialization.

The library provides a couple of macros that initialize the library
as necessary. The library is initialized as a side-effect of the
<code>FUNC_ENTER_API*</code> macros used at the top of most API functions. HDF5
library symbols other than functions are provided through <code>\#define</code>s
that use #H5OPEN to introduce a library-initialization call (#H5open)
at each site where a non-function symbol is used.

Ordinarily the library registers an <code>atexit(3)</code> handler to shut itself
down when the application exits.

\subsection subsec_initshut_app_explicit Explicit initialization and shutdown
An application may use an API call, #H5open, to explicitly initialize
the library. #H5close explicitly shuts down the library.

\section sec_initshut_int Library internals perspective
No matter how library initialization begins, eventually the internal
function <code>H5_init_library</code> will be called. <code>H5_init_library</code> is
responsible for calling the initializers for every internal HDF5
library module (aka "package") in the correct order so that no module is
initialized before its prerequisite modules. A table in <code>H5_init_library</code>
establishes the order of initialization. If a developer adds a
module to the library that it is appropriate to initialize with the rest
of the library, then they should insert its initializer into the right
place in the table.

<code>H5_term_library</code> drives library shutdown. Library shutdown is
table-driven, too. If a developer adds a module that needs to release
resources during library shutdown, then they should add a call at the
right place to the shutdown table. Note that some entries in the shutdown
table are marked as "barriers," and if a new module should only be
shutdown <strong>strictly after</strong> the preceding modules, then it should be marked
as a barrier. See the comments in <code>H5_term_library</code> for more information.

*/
