summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDana Robinson <derobins@hdfgroup.org>2015-09-01 07:12:41 (GMT)
committerDana Robinson <derobins@hdfgroup.org>2015-09-01 07:12:41 (GMT)
commit96360ad86e25159be8ef0647f77f5618012b99e5 (patch)
tree47d7a383e8b8331312c9f8a436795805633a88be
parent49ef02b3a11f4757beecf1f4008ec47bd6006f52 (diff)
downloadhdf5-96360ad86e25159be8ef0647f77f5618012b99e5.zip
hdf5-96360ad86e25159be8ef0647f77f5618012b99e5.tar.gz
hdf5-96360ad86e25159be8ef0647f77f5618012b99e5.tar.bz2
[svn-r27643] Merge of r27581, 27587, and 27601 from trunk
Added a new public API call: H5is_library_threadsafe This API call can determine, at runtime, if the library was built with thread-safety enabled. Also fixes a minor bug in the FUNC_ENTER macros. Tested on: h5committest jam w/ threadsafe
-rw-r--r--release_docs/RELEASE.txt6
-rw-r--r--src/H5.c47
-rw-r--r--src/H5private.h21
-rw-r--r--src/H5public.h4
-rw-r--r--test/ttsafe.c43
-rw-r--r--test/ttsafe.h10
-rw-r--r--test/ttsafe_error.c1
7 files changed, 104 insertions, 28 deletions
diff --git a/release_docs/RELEASE.txt b/release_docs/RELEASE.txt
index 5c292d9..713898b 100644
--- a/release_docs/RELEASE.txt
+++ b/release_docs/RELEASE.txt
@@ -102,6 +102,12 @@ New Features
(DER - 2015-05-02, HDFFV-1074)
+ - New public API call: H5is_library_threadsafe()
+
+ This API call indicates if the library was built with thread-
+ safety enabled.
+
+ (DER - 2015-09-01, HDFFV-9496)
Parallel Library
----------------
diff --git a/src/H5.c b/src/H5.c
index bd8ec80..b1ceb71 100644
--- a/src/H5.c
+++ b/src/H5.c
@@ -21,17 +21,16 @@
/***********/
/* Headers */
/***********/
-#include "H5private.h" /* Generic Functions */
-#include "H5ACprivate.h" /* Metadata cache */
-#include "H5Dprivate.h" /* Datasets */
-#include "H5Eprivate.h" /* Error handling */
-#include "H5FLprivate.h" /* Free lists */
-#include "H5Lprivate.h" /* Links */
+#include "H5private.h" /* Generic Functions */
+#include "H5ACprivate.h" /* Metadata cache */
+#include "H5Dprivate.h" /* Datasets */
+#include "H5Eprivate.h" /* Error handling */
+#include "H5FLprivate.h" /* Free lists */
+#include "H5Lprivate.h" /* Links */
#include "H5MMprivate.h" /* Memory management */
-#include "H5Pprivate.h" /* Property lists */
-#include "H5Tprivate.h" /* Datatypes */
+#include "H5Pprivate.h" /* Property lists */
#include "H5SLprivate.h" /* Skip lists */
-
+#include "H5Tprivate.h" /* Datatypes */
/****************/
/* Local Macros */
@@ -971,6 +970,36 @@ H5free_memory(void *mem)
} /* end H5free_memory() */
+/*-------------------------------------------------------------------------
+ * Function: H5is_library_threadsafe
+ *
+ * Purpose: Checks to see if the library was built with thread-safety
+ * enabled.
+ *
+ * Return: SUCCEED/FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5is_library_threadsafe(hbool_t *is_ts)
+{
+ herr_t ret_value = SUCCEED;
+
+ FUNC_ENTER_API_NOINIT
+ H5TRACE1("e", "*b", is_ts);
+
+ HDassert(is_ts);
+
+#ifdef H5_HAVE_THREADSAFE
+ *is_ts = TRUE;
+#else /* H5_HAVE_THREADSAFE */
+ *is_ts = FALSE;
+#endif /* H5_HAVE_THREADSAFE */
+
+ FUNC_LEAVE_API(ret_value)
+} /* end H5is_library_threadsafe() */
+
+
#if defined(H5_HAVE_THREADSAFE) && defined(H5_BUILT_AS_DYNAMIC_LIB) \
&& defined(H5_HAVE_WIN32_API) && defined(H5_HAVE_WIN_THREADS)
/*-------------------------------------------------------------------------
diff --git a/src/H5private.h b/src/H5private.h
index 6534f6f..15bb61c 100644
--- a/src/H5private.h
+++ b/src/H5private.h
@@ -1741,9 +1741,24 @@ H5_DLL double H5_trace(const double *calltime, const char *func, const char *typ
*-------------------------------------------------------------------------
*/
-/* `S' is the name of a function which is being tested to check if its */
-/* an API function */
-#define H5_IS_API(S) ('_'!=((const char *)S)[2] && '_'!=((const char *)S)[3] && (!((const char *)S)[4] || '_'!=((const char *)S)[4]))
+/* `S' is the name of a function which is being tested to check if it's
+ * an API function.
+ *
+ * BADNESS:
+ * - Underscore at positions 2 or 3 (0-indexed string). Handles
+ * H5_ and H5X_.
+ * - Underscore at position 4 if position 3 is uppercase or a digit.
+ * Handles H5XY_.
+ */
+#define H5_IS_API(S) (\
+ '_'!=((const char *)S)[2] /* underscore at position 2 */ \
+ && '_'!=((const char *)S)[3] /* underscore at position 3 */ \
+ && !( /* NOT */ \
+ ((const char *)S)[4] /* pos 4 exists */ \
+ && (HDisupper(S[3]) || HDisdigit(S[3])) /* pos 3 dig | uc */ \
+ && '_'==((const char *)S)[4] /* pos 4 underscore */ \
+ )\
+)
/* `S' is the name of a function which is being tested to check if it's */
/* a public API function */
diff --git a/src/H5public.h b/src/H5public.h
index b1b87e2..81953c2 100644
--- a/src/H5public.h
+++ b/src/H5public.h
@@ -331,6 +331,7 @@ H5_DLL herr_t H5get_libversion(unsigned *majnum, unsigned *minnum,
unsigned *relnum);
H5_DLL herr_t H5check_version(unsigned majnum, unsigned minnum,
unsigned relnum);
+H5_DLL herr_t H5is_library_threadsafe(hbool_t *is_ts);
H5_DLL herr_t H5free_memory(void *mem);
H5_DLL void *H5allocate_memory(size_t size, hbool_t clear);
H5_DLL void *H5resize_memory(void *mem, size_t size);
@@ -338,5 +339,6 @@ H5_DLL void *H5resize_memory(void *mem, size_t size);
#ifdef __cplusplus
}
#endif
-#endif
+#endif /* _H5public_H */
+
diff --git a/test/ttsafe.c b/test/ttsafe.c
index d0ab81a..d3c5cfb 100644
--- a/test/ttsafe.c
+++ b/test/ttsafe.c
@@ -40,13 +40,6 @@
/* ANY new test needs to have a prototype in ttsafe.h */
#include "ttsafe.h"
-#ifndef H5_HAVE_THREADSAFE
-int main(void)
-{
- printf("Test skipped because THREADSAFE not enabled\n");
- return 0;
-}
-#else
#define MAX_NUM_NAME 1000
#define NAME_OFFSET 6 /* offset for "name<num>" */
@@ -66,6 +59,30 @@ num_digits(int num)
return u;
}
+/* Test the H5is_library_threadsafe() function */
+void
+tts_is_threadsafe(void)
+{
+ hbool_t is_ts;
+ hbool_t should_be;
+
+#ifdef H5_HAVE_THREADSAFE
+ is_ts = FALSE;
+ should_be = TRUE;
+#else /* H5_HAVE_THREADSAFE */
+ is_ts = TRUE;
+ should_be = FALSE;
+#endif /* H5_HAVE_THREADSAFE */
+
+ if(H5is_library_threadsafe(&is_ts) != SUCCEED)
+ TestErrPrintf("H5_is_library_threadsafe() call failed - test failed\n");
+
+ if(is_ts != should_be)
+ TestErrPrintf("Thread-safety value incorrect - test failed\n");
+
+ return;
+}
+
/* Routine to generate attribute names for numeric values */
char *gen_name(int value)
{
@@ -88,10 +105,13 @@ char *gen_name(int value)
int main(int argc, char *argv[])
{
+
/* Initialize testing framework */
TestInit(argv[0], NULL, NULL);
/* Tests are generally arranged from least to most complexity... */
+ AddTest("is_threadsafe", tts_is_threadsafe, NULL, "library threadsafe status", NULL);
+#ifdef H5_HAVE_THREADSAFE
AddTest("dcreate", tts_dcreate, cleanup_dcreate, "multi-dataset creation", NULL);
AddTest("error", tts_error, cleanup_error, "per-thread error stacks", NULL);
#ifdef H5_HAVE_PTHREAD_H
@@ -100,6 +120,12 @@ int main(int argc, char *argv[])
#endif /* H5_HAVE_PTHREAD_H */
AddTest("acreate", tts_acreate, cleanup_acreate, "multi-attribute creation", NULL);
+#else /* H5_HAVE_THREADSAFE */
+
+ printf("Most thread-safety tests skipped because THREADSAFE not enabled\n");
+
+#endif /* H5_HAVE_THREADSAFE */
+
/* Display testing information */
TestInfo(argv[0]);
@@ -118,5 +144,6 @@ int main(int argc, char *argv[])
TestCleanup();
return GetTestNumErrs();
+
} /* end main() */
-#endif /*H5_HAVE_THREADSAFE*/
+
diff --git a/test/ttsafe.h b/test/ttsafe.h
index b4826fc..f2e9e86 100644
--- a/test/ttsafe.h
+++ b/test/ttsafe.h
@@ -20,8 +20,6 @@
#ifndef TTSAFE_H
#define TTSAFE_H
-#include <string.h>
-
/*
* Include required headers. This file tests internal library functions,
* so we include the private headers here.
@@ -31,16 +29,13 @@
#include "H5Eprivate.h"
#include "testhdf5.h"
-#ifdef H5_HAVE_THREADSAFE
-/* Include pthread library for threadsafe tests */
-#ifdef H5_HAVE_PTHREAD_H
-#include <pthread.h>
-#endif /* H5_HAVE_PTHREAD_H */
/* Prototypes for the support routines */
extern char* gen_name(int);
/* Prototypes for the test routines */
+void tts_is_threadsafe(void);
+#ifdef H5_HAVE_THREADSAFE
void tts_dcreate(void);
void tts_error(void);
void tts_cancel(void);
@@ -54,3 +49,4 @@ void cleanup_acreate(void);
#endif /* H5_HAVE_THREADSAFE */
#endif /* TTSAFE_H */
+
diff --git a/test/ttsafe_error.c b/test/ttsafe_error.c
index e143263..a2f25db 100644
--- a/test/ttsafe_error.c
+++ b/test/ttsafe_error.c
@@ -231,3 +231,4 @@ void cleanup_error(void)
}
#endif /*H5_HAVE_THREADSAFE*/
+