summaryrefslogtreecommitdiffstats
path: root/src/H5PL.c
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2013-03-19 04:22:34 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2013-03-19 04:22:34 (GMT)
commitaf9a3abb3dcb01e719abf8eba5fd588c20c89d5c (patch)
tree6aa572a2460bc06332c7abedac2af45668a97853 /src/H5PL.c
parentbeccb8a0fcb8a380c7cd140852a486885b8e38c0 (diff)
downloadhdf5-af9a3abb3dcb01e719abf8eba5fd588c20c89d5c.zip
hdf5-af9a3abb3dcb01e719abf8eba5fd588c20c89d5c.tar.gz
hdf5-af9a3abb3dcb01e719abf8eba5fd588c20c89d5c.tar.bz2
[svn-r23380] Description:
Review & cleanup code.
Diffstat (limited to 'src/H5PL.c')
-rw-r--r--src/H5PL.c602
1 files changed, 348 insertions, 254 deletions
diff --git a/src/H5PL.c b/src/H5PL.c
index 4d18926..4d84f31 100644
--- a/src/H5PL.c
+++ b/src/H5PL.c
@@ -13,32 +13,127 @@
* access to either file, you may request a copy from help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-#define H5PL_PACKAGE /*suppress error about including H5PLpkg */
+/****************/
+/* Module Setup */
+/****************/
/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC H5PL_init_interface
+#define H5_INTERFACE_INIT_FUNC H5PL__init_interface
+
+/***********/
+/* Headers */
+/***********/
#include "H5private.h" /* Generic Functions */
-#include "H5Dprivate.h" /* Dataset functions */
#include "H5Eprivate.h" /* Error handling */
-#include "H5Iprivate.h" /* IDs */
#include "H5MMprivate.h" /* Memory management */
-#include "H5Oprivate.h" /* Object headers */
-#include "H5Pprivate.h" /* Property lists */
-#include "H5Sprivate.h" /* Dataspace functions */
+#include "H5PLprivate.h" /* Plugin */
#include "H5Zprivate.h" /* Filter pipeline */
-#include "H5PLpkg.h" /* Plugin */
+
+
+/****************/
+/* Local Macros */
+/****************/
#define H5PL_DEFAULT_PATH "/usr:/usr/lib:/usr/local"
-#define H5PL_PATH_SEPERATOR ":"
+#define H5PL_PATH_SEPARATOR ":"
+#define H5PL_MAX_PATH_NUM 16
+
+/****************************/
+/* Macros for supporting
+ * both Windows and Unix */
+/****************************/
+
+/* Handle for dynamic library */
+#ifdef H5_HAVE_WIN32_API
+/* Handle for dynamic library */
+#define H5PL_HANDLE HINSTANCE
+
+/* Get a handle to a plugin library. Windows: TEXT macro handles Unicode strings */
+#define H5PL_OPEN_DLIB(S) LoadLibraryEx(TEXT(S), NULL, LOAD_WITH_ALTERED_SEARCH_PATH)
+
+/* Get the address of a symbol in dynamic library */
+#define H5PL_GET_LIB_FUNC(H,N) GetProcAddress(H,N)
+
+/* Close dynamic library */
+#define H5PL_CLOSE_LIB(H) FreeLibrary(H)
+
+/* Clear error - nothing to do */
+#define H5PL_CLR_ERROR
+
+#else /* H5_HAVE_WIN32_API */
+/* Handle for dynamic library */
+#define H5PL_HANDLE void *
+
+/* Get a handle to a plugin library. Windows: TEXT macro handles Unicode strings */
+#define H5PL_OPEN_DLIB(S) dlopen(S, RTLD_NOW|RTLD_LAZY)
+
+/* Get the address of a symbol in dynamic library */
+#define H5PL_GET_LIB_FUNC(H,N) dlsym(H,N)
+
+/* Close dynamic library */
+#define H5PL_CLOSE_LIB(H) dlclose(H)
+
+/* Clear error */
+#define H5PL_CLR_ERROR dlerror()
+
+#endif /* H5_HAVE_WIN32_API */
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* Type for the list of info for opened plugin libraries */
+typedef struct H5PL_table_t {
+ H5PL_type_t pl_type; /* plugin type */
+ int pl_id; /* ID for the plugin */
+ H5PL_HANDLE handle; /* plugin handle */
+} H5PL_table_t;
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static herr_t H5PL__init_path_table(void);
+static htri_t H5PL__find(H5PL_type_t plugin_type, int type_id, char *dir, void **info);
+static htri_t H5PL__open(H5PL_type_t pl_type, char *libname, int plugin_id, void **pl_info);
+static htri_t H5PL__search_table(H5PL_type_t plugin_type, int type_id, void **info);
+static herr_t H5PL__close(H5PL_HANDLE handle);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Table for opened plugin libraries */
+static size_t H5PL_table_alloc_g = 0;
+static size_t H5PL_table_used_g = 0;
+static H5PL_table_t *H5PL_table_g = NULL;
+
+/* Table of location paths for plugin libraries */
+static char *H5PL_path_table_g[H5PL_MAX_PATH_NUM];
+static size_t H5PL_num_paths_g = 0;
+static htri_t H5PL_path_found_g = FALSE;
+
/*--------------------------------------------------------------------------
NAME
- H5PL_init_interface -- Initialize interface-specific information
+ H5PL__init_interface -- Initialize interface-specific information
USAGE
- herr_t H5PL_init_interface()
-
+ herr_t H5PL__init_interface()
RETURNS
Non-negative on success/Negative on failure
DESCRIPTION
@@ -46,12 +141,12 @@ DESCRIPTION
--------------------------------------------------------------------------*/
static herr_t
-H5PL_init_interface(void)
+H5PL__init_interface(void)
{
- FUNC_ENTER_NOAPI_NOINIT_NOERR
+ FUNC_ENTER_STATIC_NOERR
FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5PL_init_interface() */
+} /* end H5PL__init_interface() */
/*-------------------------------------------------------------------------
@@ -69,36 +164,32 @@ H5PL_init_interface(void)
* Programmer: Raymond Lu
* 20 February 2013
*
- * Modifications:
- *
*-------------------------------------------------------------------------
*/
int
H5PL_term_interface(void)
{
- void *handle = NULL;
- size_t i = 0;
+ int i = 0;
FUNC_ENTER_NOAPI_NOINIT_NOERR
if(H5_interface_initialize_g) {
+ size_t u; /* Local index variable */
+
/* Close opened dynamic libraries */
- for(i=0; i<H5PL_table_used_g; i++) {
- handle = (H5PL_table_g[i]).handle;
- H5PL_close(handle);
- }
+ for(u = 0; u < H5PL_table_used_g; u++)
+ H5PL__close((H5PL_table_g[u]).handle);
/* Free the table of dynamic libraries */
H5PL_table_g = (H5PL_table_t *)H5MM_xfree(H5PL_table_g);
H5PL_table_used_g = H5PL_table_alloc_g = 0;
/* Free the table of search paths */
- for(i = 0; i < num_paths; i++) {
- if(path_table[i])
- path_table[i] = (char *)H5MM_xfree(path_table[i]);
- }
- num_paths = 0;
- path_found = FALSE;
+ for(u = 0; u < H5PL_num_paths_g; u++)
+ if(H5PL_path_table_g[u])
+ H5PL_path_table_g[u] = (char *)H5MM_xfree(H5PL_path_table_g[u]);
+ H5PL_num_paths_g = 0;
+ H5PL_path_found_g = FALSE;
H5_interface_initialize_g = 0;
i = 1;
@@ -107,7 +198,6 @@ H5PL_term_interface(void)
FUNC_LEAVE_NOAPI(i)
} /* end H5PL_term_interface() */
-
/*-------------------------------------------------------------------------
* Function: H5PL_load
@@ -116,91 +206,112 @@ H5PL_term_interface(void)
* and/or loads a dynamic plugin library first among the already
* opened libraries then in the designated location paths.
*
- * Return: Non-negative on success/Negative on failure
+ * Return: Non-NULL on success/NULL on failure
*
* Programmer: Raymond Lu
* 13 February 2013
*
- * Modifications:
- *
*-------------------------------------------------------------------------
*/
void *
H5PL_load(H5PL_type_t type, int id)
{
- char *dl_path = NULL;
- char *origin_dl_path = NULL;
- size_t len = 0;
- char *dir = NULL;
- size_t i;
- htri_t found_in_table = FALSE;
- htri_t found_in_path = FALSE;
+ htri_t found; /* Whether the plugin was found */
H5Z_class2_t *plugin_info = NULL;
void *ret_value = NULL;
FUNC_ENTER_NOAPI(NULL)
+ /* Initialize the location paths for dynamic libraries, if they aren't
+ * already set up.
+ */
+ if(FALSE == H5PL_path_found_g)
+ if(H5PL__init_path_table() < 0)
+ HGOTO_ERROR(H5E_PLUGIN, H5E_CANTINIT, NULL, "can't initialize search path table")
+
/* Search in the table of already loaded plugin libraries */
- if((found_in_table = H5PL_search_table(type, id, (void **)&plugin_info)) < 0)
+ if((found = H5PL__search_table(type, id, (void **)&plugin_info)) < 0)
HGOTO_ERROR(H5E_PLUGIN, H5E_CANTGET, NULL, "search in table failed")
- /* Finish the function if found */
- if(found_in_table && plugin_info) {
- ret_value = (void *)plugin_info;
- HGOTO_DONE(ret_value)
- }
-
- /* Find the location paths for dynamic libraries */
- if(FALSE == path_found) {
- /* Retrieve paths from HDF5_PLUGIN_PATH if the user sets it
- * or from the default paths if it isn't set */
- origin_dl_path = HDgetenv("HDF5_PLUGIN_PATH");
- if(origin_dl_path == NULL) {
- len = HDstrlen(H5PL_DEFAULT_PATH) + 1;
- dl_path = (char *)H5MM_malloc(len*sizeof(char));
- HDstrncpy(dl_path, H5PL_DEFAULT_PATH, len-1);
- dl_path[len-1] = '\0';
- } else {
- len = HDstrlen(origin_dl_path) + 1;
- dl_path = (char *)H5MM_malloc(len*sizeof(char));
- HDstrncpy(dl_path, origin_dl_path, len);
- }
-
- /* Put paths in the path table. They are seperated by ":" */
- dir = HDstrtok(dl_path, H5PL_PATH_SEPERATOR);
- while(dir) {
- path_table[num_paths] = (char *)HDmalloc(HDstrlen(dir) + 1);
- path_table[num_paths][0] = '\0';
- HDstrcat(path_table[num_paths], dir);
- num_paths++;
- dir = HDstrtok(NULL, H5PL_PATH_SEPERATOR);
- }
-
- path_found = TRUE;
- }
-
- /* Iterate through the path table to find the right dynamic libraries */
- for(i=0; i<num_paths; i++) {
- if((found_in_path = H5PL_find(type, id, path_table[i], (void **)&plugin_info)) < 0)
- HGOTO_ERROR(H5E_PLUGIN, H5E_CANTGET, NULL, "search in paths failed")
-
- /* Finish the function if found */
- if(found_in_path && plugin_info) {
- ret_value = (void *)plugin_info;
- HGOTO_DONE(ret_value)
- }
- }
+ /* If not found, iterate through the path table to find the right dynamic library */
+ if(!found) {
+ size_t i; /* Local index variable */
+
+ for(i = 0; i < H5PL_num_paths_g; i++) {
+ if((found = H5PL__find(type, id, H5PL_path_table_g[i], (void **)&plugin_info)) < 0)
+ HGOTO_ERROR(H5E_PLUGIN, H5E_CANTGET, NULL, "search in paths failed")
+
+ /* Break out if found */
+ if(found) {
+ HDassert(plugin_info);
+ break;
+ } /* end if */
+ } /* end for */
+ } /* end if */
+
+ /* Check if we found the plugin */
+ if(found)
+ ret_value = plugin_info;
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5PL_load() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5PL__init_path_table
+ *
+ * Purpose: Initialize the path table.
+ *
+ * Return: Non-negative on success/Negative on failure
+ *
+ * Programmer: Quincey Koziol
+ * 18 March 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5PL__init_path_table(void)
+{
+ char *dl_path = NULL;
+ char *origin_dl_path;
+ char *dir;
+ herr_t ret_value = SUCCEED; /* Return value */
+
+ FUNC_ENTER_STATIC
+
+ /* Retrieve paths from HDF5_PLUGIN_PATH if the user sets it
+ * or from the default paths if it isn't set.
+ */
+ origin_dl_path = HDgetenv("HDF5_PLUGIN_PATH");
+ if(NULL == origin_dl_path)
+ dl_path = HDstrdup(H5PL_DEFAULT_PATH);
+ else
+ dl_path = HDstrdup(origin_dl_path);
+ if(NULL == dl_path)
+ HGOTO_ERROR(H5E_PLUGIN, H5E_CANTALLOC, FAIL, "can't allocate memory for path")
+
+ /* Put paths in the path table. They are separated by ":" */
+ dir = HDstrtok(dl_path, H5PL_PATH_SEPARATOR);
+ while(dir) {
+ if(NULL == (H5PL_path_table_g[H5PL_num_paths_g] = HDstrdup(dir)))
+ HGOTO_ERROR(H5E_PLUGIN, H5E_CANTALLOC, FAIL, "can't allocate memory for path")
+ H5PL_num_paths_g++;
+ dir = HDstrtok(NULL, H5PL_PATH_SEPARATOR);
+ } /* end while */
+
+ H5PL_path_found_g = TRUE;
done:
if(dl_path)
dl_path = (char *)H5MM_xfree(dl_path);
FUNC_LEAVE_NOAPI(ret_value)
-}
+} /* end H5PL__init_path_table() */
/*-------------------------------------------------------------------------
- * Function: H5PL_find
+ * Function: H5PL__find
*
* Purpose: Given a path, this function opens the directory and envokes
* another function to go through all files to find the right
@@ -214,98 +325,91 @@ done:
* Programmer: Raymond Lu
* 13 February 2013
*
- * Modifications:
- *
*-------------------------------------------------------------------------
*/
#ifndef H5_HAVE_WIN32_API
-htri_t
-H5PL_find(H5PL_type_t plugin_type, int type_id, char *dir, void **info)
+static htri_t
+H5PL__find(H5PL_type_t plugin_type, int type_id, char *dir, void **info)
{
char *pathname = NULL;
DIR *dirp = NULL;
- struct dirent *dp = NULL;
- struct stat my_stat;
- htri_t found_in_dir = FALSE;
+ struct dirent *dp;
htri_t ret_value = FALSE;
- FUNC_ENTER_NOAPI(FAIL)
+ FUNC_ENTER_STATIC
/* Open the directory */
if(!(dirp = HDopendir(dir)))
HGOTO_ERROR(H5E_PLUGIN, H5E_OPENERROR, FAIL, "can't open directory")
/* Iterates through all entries in the directory to find the right plugin library */
- while ((dp = HDreaddir(dirp)) != NULL) {
- /* The library we are looking for should be called libxxx.so... on Unix
- * or libxxx.xxx.dylib on Mac */
- if(!HDstrncmp(dp->d_name, "lib", (size_t)3) &&
- (HDstrstr(dp->d_name, ".so") || HDstrstr(dp->d_name, ".dylib"))) {
- pathname = (char *)H5MM_malloc(strlen(dir) + strlen(dp->d_name) + 2);
- HDstrncpy(pathname, dir, strlen(dir)+1);
- HDstrcat(pathname, "/");
- HDstrcat(pathname, dp->d_name);
-
- /*fprintf(stderr, "dp->d_name=%s, pathname=%s. ", dp->d_name, pathname);
- fprintf(stderr, "\n");*/
-
- if(HDstat(pathname, &my_stat) == -1)
- HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't stat file: %s", strerror(errno))
-
- /* If it is a directory, skip it */
- if(S_ISDIR(my_stat.st_mode))
- continue;
-
- if((found_in_dir = H5PL_open(plugin_type, pathname, type_id, info)) < 0)
- HGOTO_ERROR(H5E_PLUGIN, H5E_CANTGET, FAIL, "search in directory failed")
-
- if(found_in_dir) {
- ret_value = TRUE;
- HGOTO_DONE(ret_value)
- } else
- if(pathname)
- pathname = (char *)H5MM_xfree(pathname);
- }
- }
-
- if(HDclosedir(dirp) < 0)
- HGOTO_ERROR(H5E_FILE, H5E_CLOSEERROR, FAIL, "can't close directory: %s", strerror(errno))
- dirp = NULL;
+ while((dp = HDreaddir(dirp)) != NULL) {
+ /* The library we are looking for should be called libxxx.so... on Unix
+ * or libxxx.xxx.dylib on Mac.
+ */
+ if(!HDstrncmp(dp->d_name, "lib", (size_t)3) &&
+ (HDstrstr(dp->d_name, ".so") || HDstrstr(dp->d_name, ".dylib"))) {
+ h5_stat_t my_stat;
+ htri_t found_in_dir;
+
+ pathname = (char *)H5MM_malloc(HDstrlen(dir) + HDstrlen(dp->d_name) + 2);
+ HDstrncpy(pathname, dir, HDstrlen(dir) + 1);
+ HDstrcat(pathname, "/");
+ HDstrcat(pathname, dp->d_name);
+
+ if(HDstat(pathname, &my_stat) == -1)
+ HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't stat file: %s", strerror(errno))
+
+ /* If it is a directory, skip it */
+ if(S_ISDIR(my_stat.st_mode))
+ continue;
+
+ /* Attempt to open the dynamic library as a filter library */
+ if((found_in_dir = H5PL__open(plugin_type, pathname, type_id, info)) < 0)
+ HGOTO_ERROR(H5E_PLUGIN, H5E_CANTGET, FAIL, "search in directory failed")
+ if(found_in_dir) {
+ /* Indicate success */
+ ret_value = TRUE;
+ break;
+ } /* end if */
+ else
+ if(pathname)
+ pathname = (char *)H5MM_xfree(pathname);
+ } /* end if */
+ } /* end while */
done:
+ if(dirp)
+ if(HDclosedir(dirp) < 0)
+ HDONE_ERROR(H5E_FILE, H5E_CLOSEERROR, FAIL, "can't close directory: %s", strerror(errno))
if(pathname)
pathname = (char *)H5MM_xfree(pathname);
- if(dirp)
- HDclosedir(dirp);
FUNC_LEAVE_NOAPI(ret_value)
-}
+} /* end H5PL__find() */
#else
-htri_t
-H5PL_find(H5PL_type_t plugin_type, int type_id, char *dir, void **info)
+static htri_t
+H5PL__find(H5PL_type_t plugin_type, int type_id, char *dir, void **info)
{
- char *pathname = NULL;
- struct dirent *dp = NULL;
-
WIN32_FIND_DATA fdFile;
- HANDLE hFind = NULL;
-
- htri_t found_in_dir = FALSE;
- htri_t ret_value = FALSE;
+ HANDLE hFind;
+ char *pathname = NULL;
+ htri_t ret_value = FALSE;
- FUNC_ENTER_NOAPI(FAIL)
+ FUNC_ENTER_STATIC
- if((hFind = FindFirstFile(dir, &fdFile)) == INVALID_HANDLE_VALUE) {
- /*fprintf(stderr, "Path not found: [%s]\n", dir);*/
+ if((hFind = FindFirstFile(dir, &fdFile)) == INVALID_HANDLE_VALUE)
HGOTO_ERROR(H5E_PLUGIN, H5E_OPENERROR, FAIL, "can't open directory")
- }
do {
/* Find first file will always return "."
- * and ".." as the first two directories. */
+ * and ".." as the first two directories.
+ */
if(HDstrcmp(fdFile.cFileName, ".") != 0 && HDstrcmp(fdFile.cFileName, "..") != 0) {
- pathname = (char *)H5MM_malloc(strlen(dir) + strlen(fdFile.cFileName) + 2);
- HDstrncpy(pathname, dir, strlen(dir)+1);
+ htri_t found_in_dir;
+
+ pathname = (char *)H5MM_malloc(HDstrlen(dir) + HDstrlen(fdFile.cFileName) + 2);
+ HDstrncpy(pathname, dir, HDstrlen(dir)+1);
HDstrcat(pathname, "\\");
HDstrcat(pathname, fdFile.cFileName);
@@ -313,35 +417,32 @@ H5PL_find(H5PL_type_t plugin_type, int type_id, char *dir, void **info)
if(fdFile.dwFileAttributes &FILE_ATTRIBUTE_DIRECTORY)
continue;
- if((found_in_dir = H5PL_open(plugin_type, pathname, type_id, info)) < 0)
+ if((found_in_dir = H5PL__open(plugin_type, pathname, type_id, info)) < 0)
HGOTO_ERROR(H5E_PLUGIN, H5E_CANTGET, FAIL, "search in directory failed")
-
if(found_in_dir) {
- ret_value = TRUE;
- HGOTO_DONE(ret_value)
- } else
+ /* Indicate success */
+ ret_value = TRUE;
+ break;
+ } /* end if */
+ else
if(pathname)
pathname = (char *)H5MM_xfree(pathname);
- }
+ } /* end if */
} while(FindNextFile(hFind, &fdFile)); /* Find the next file. */
- /* Clean things up! */
- FindClose(hFind);
- hFind = NULL;
-
done:
- if(pathname)
- pathname = (char *)H5MM_xfree(pathname);
if(hFind)
FindClose(hFind);
+ if(pathname)
+ pathname = (char *)H5MM_xfree(pathname);
FUNC_LEAVE_NOAPI(ret_value)
-}
+} /* end H5PL__find() */
#endif
/*-------------------------------------------------------------------------
- * Function: H5PL_open
+ * Function: H5PL__open
*
* Purpose: Iterates through all files to find the right plugin library.
* It loads the dynamic plugin library and keeps it on the list
@@ -354,131 +455,129 @@ done:
* Programmer: Raymond Lu
* 13 February 2013
*
- * Modifications:
- *
*-------------------------------------------------------------------------
*/
-htri_t
-H5PL_open(H5PL_type_t pl_type, char *libname, int pl_id, void **pl_info)
+static htri_t
+H5PL__open(H5PL_type_t pl_type, char *libname, int pl_id, void **pl_info)
{
H5PL_HANDLE handle = NULL;
- H5Z_class2_t* (*H5PL_get_plugin_info)(void) = NULL;
- H5Z_class2_t *plugin_info = NULL;
htri_t ret_value = FALSE;
- FUNC_ENTER_NOAPI(FAIL)
+ FUNC_ENTER_STATIC
/* There are different reasons why a library can't be open, e.g. wrong architecture.
- * simply continue if we can't open it */
- if(NULL == (handle = H5PL_OPEN_DLIB(libname)))
- /*fprintf(stderr, "not open dl library: %s\n", H5PL_CLR_ERROR);*/
- HGOTO_DONE(ret_value)
-
- H5PL_CLR_ERROR; /*clear error*/
-
- /* Return a handle for the function H5PL_get_plugin_info in the dynamic library.
- * The plugin library is suppose to define this function. */
- if(NULL == (H5PL_get_plugin_info = H5PL_GET_LIB_FUNC(handle, "H5PL_get_plugin_info"))) {
- if(H5PL_close(handle) < 0)
- HGOTO_ERROR(H5E_PLUGIN, H5E_CLOSEERROR, FAIL, "can't close dynamic library")
- }
-
- /* Envoke H5PL_get_plugin_info to verify this is the right library we are looking for.
- * Move on if it isn't. */
- if(H5PL_get_plugin_info) {
- if(NULL == (plugin_info = (*H5PL_get_plugin_info)())) {
- if(H5PL_close(handle) < 0)
- HGOTO_ERROR(H5E_PLUGIN, H5E_CLOSEERROR, FAIL, "can't close dynamic library")
- HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, FAIL, "can't get plugin info")
- }
-
- if(plugin_info->id == pl_id) {
- (H5PL_table_g[H5PL_table_used_g]).handle = handle;
- (H5PL_table_g[H5PL_table_used_g]).pl_type = pl_type;
- (H5PL_table_g[H5PL_table_used_g]).pl_id = plugin_info->id;
-/*fprintf(stderr, "%s: H5PL_table_used_g=%d, id=%d, id 2=%d\n", FUNC, H5PL_table_used_g, (H5PL_table_g[H5PL_table_used_g]).pl_id, plugin_info->id);*/
- H5PL_table_used_g++;
-
- *pl_info = (void *)plugin_info;
- ret_value = TRUE;
-
- HGOTO_DONE(ret_value)
- } else if(H5PL_close(handle) < 0)
- HGOTO_ERROR(H5E_PLUGIN, H5E_CLOSEERROR, FAIL, "can't close dynamic library")
- }
+ * simply continue if we can't open it.
+ */
+ if(NULL == (handle = H5PL_OPEN_DLIB(libname))) {
+ H5PL_CLR_ERROR; /* clear error */
+ } /* end if */
+ else {
+ H5Z_class2_t * (*H5PL_get_plugin_info)(void);
+
+ /* Return a handle for the function H5PL_get_plugin_info in the dynamic library.
+ * The plugin library is suppose to define this function.
+ */
+ if(NULL == (H5PL_get_plugin_info = (H5Z_class2_t *(*)(void))H5PL_GET_LIB_FUNC(handle, "H5PL_get_plugin_info"))) {
+ if(H5PL__close(handle) < 0)
+ HGOTO_ERROR(H5E_PLUGIN, H5E_CLOSEERROR, FAIL, "can't close dynamic library")
+ } /* end if */
+ else {
+ H5Z_class2_t *plugin_info;
+
+ /* Invoke H5PL_get_plugin_info to verify this is the right library we are looking for.
+ * Move on if it isn't.
+ */
+ if(NULL == (plugin_info = (*H5PL_get_plugin_info)())) {
+ if(H5PL__close(handle) < 0)
+ HGOTO_ERROR(H5E_PLUGIN, H5E_CLOSEERROR, FAIL, "can't close dynamic library")
+ HGOTO_ERROR(H5E_PLUGIN, H5E_CANTGET, FAIL, "can't get plugin info")
+ } /* end if */
+
+ /* Successfully found plugin library, check if it's the right one */
+ if(plugin_info->id == pl_id) {
+ /* Expand the table if it is too small */
+ if(H5PL_table_used_g >= H5PL_table_alloc_g) {
+ size_t n = MAX(H5Z_MAX_NFILTERS, 2 * H5PL_table_alloc_g);
+ H5PL_table_t *table = (H5PL_table_t *)H5MM_realloc(H5PL_table_g, n * sizeof(H5PL_table_t));
+
+ if(!table)
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to extend dynamic library table")
+
+ H5PL_table_g = table;
+ H5PL_table_alloc_g = n;
+ } /* end if */
+
+ (H5PL_table_g[H5PL_table_used_g]).handle = handle;
+ (H5PL_table_g[H5PL_table_used_g]).pl_type = pl_type;
+ (H5PL_table_g[H5PL_table_used_g]).pl_id = plugin_info->id;
+ H5PL_table_used_g++;
+
+ /* Set the plugin info to return */
+ *pl_info = (void *)plugin_info;
+
+ /* Indicate success */
+ ret_value = TRUE;
+ } /* end if */
+ else
+ if(H5PL__close(handle) < 0)
+ HGOTO_ERROR(H5E_PLUGIN, H5E_CLOSEERROR, FAIL, "can't close dynamic library")
+ } /* end if */
+ } /* end else */
done:
FUNC_LEAVE_NOAPI(ret_value)
-}
+} /* end H5PL__open() */
/*-------------------------------------------------------------------------
- * Function: H5PL_search_table
+ * Function: H5PL__search_table
*
* Purpose: Search in the list of already opened dynamic libraries
* to see if the one we are looking for is already opened.
*
* Return: TRUE on success,
* FALSE on not found,
- * negative on failure
+ * Negative on failure
*
* Programmer: Raymond Lu
* 13 February 2013
*
- * Modifications:
- *
*-------------------------------------------------------------------------
*/
-htri_t
-H5PL_search_table(H5PL_type_t plugin_type, int type_id, void **info)
+static htri_t
+H5PL__search_table(H5PL_type_t plugin_type, int type_id, void **info)
{
- H5Z_class2_t* (*H5PL_get_plugin_info)(void) = NULL;
- H5Z_class2_t *plugin_info = NULL;
size_t i;
htri_t ret_value = FALSE;
- FUNC_ENTER_NOAPI(FAIL)
-
-/*if(0 < H5PL_table_used_g)
-fprintf(stderr, "%s: H5PL_table_used_g=%d, id=%d\n", FUNC, H5PL_table_used_g, (H5PL_table_g[H5PL_table_used_g-1]).pl_id);*/
+ FUNC_ENTER_STATIC
/* Search in the table of already opened dynamic libraries */
- if(0 < H5PL_table_used_g) {
- for(i=0; i<H5PL_table_used_g; i++) {
+ if(H5PL_table_used_g > 0) {
+ for(i = 0; i < H5PL_table_used_g; i++) {
if((plugin_type == (H5PL_table_g[i]).pl_type) && (type_id == (H5PL_table_g[i]).pl_id)) {
- if(NULL == (H5PL_get_plugin_info = H5PL_GET_LIB_FUNC((H5PL_table_g[i]).handle, "H5PL_get_plugin_info")))
- HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, FAIL, "can't get function for H5PL_get_plugin_info")
+ H5Z_class2_t *(*H5PL_get_plugin_info)(void);
+ H5Z_class2_t *plugin_info;
+ if(NULL == (H5PL_get_plugin_info = (H5Z_class2_t *(*)(void))H5PL_GET_LIB_FUNC((H5PL_table_g[i]).handle, "H5PL_get_plugin_info")))
+ HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, FAIL, "can't get function for H5PL_get_plugin_info")
if(NULL == (plugin_info = (*H5PL_get_plugin_info)()))
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, FAIL, "can't get plugin info")
- /*fprintf(stderr, "%s: handle=%p, H5PL_get_plugin_info=%p, plugin_info=%p, id=%d\n", FUNC, (H5PL_table_g[i]).handle, H5PL_get_plugin_info, plugin_info, plugin_info->id);*/
-
*info = (void *)plugin_info;
ret_value = TRUE;
- }
- }
- }
-
- /* Expand the table if it is too small */
- if(H5PL_table_used_g >= H5PL_table_alloc_g) {
- size_t n = MAX(H5Z_MAX_NFILTERS, 2*H5PL_table_alloc_g);
- H5PL_table_t *table = (H5PL_table_t *)H5MM_realloc(H5PL_table_g, n * sizeof(H5PL_table_t));
-
- if(!table)
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to extend dynamic library table")
-
- H5PL_table_g = table;
- H5PL_table_alloc_g = n;
+ break;
+ } /* end if */
+ } /* end for */
} /* end if */
done:
FUNC_LEAVE_NOAPI(ret_value)
-}
+} /* end H5PL__search_table() */
/*-------------------------------------------------------------------------
- * Function: H5PL_close
+ * Function: H5PL__close
*
* Purpose: Closes the handle for dynamic library
*
@@ -487,20 +586,15 @@ done:
* Programmer: Raymond Lu
* 13 February 2013
*
- * Modifications:
- *
*-------------------------------------------------------------------------
*/
-herr_t
-H5PL_close(H5PL_HANDLE handle)
+static herr_t
+H5PL__close(H5PL_HANDLE handle)
{
- herr_t ret_value = SUCCEED;
+ FUNC_ENTER_STATIC_NOERR
- FUNC_ENTER_NOAPI(FAIL)
-/*fprintf(stderr, "%s: closing. handle=%p\n", FUNC, handle);*/
H5PL_CLOSE_LIB(handle);
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-}
+ FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5PL__close() */