summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Young <dyoung@hdfgroup.org>2020-02-17 16:47:29 (GMT)
committerDavid Young <dyoung@hdfgroup.org>2020-02-17 16:47:29 (GMT)
commit47b79b7422c91e53ae5d87bcda45d52798a64fb6 (patch)
treee00ad2dc80ba285fb12d7dfa1a7be7402c0f28e6
parentfa2b89c6b0c894915f12a1df594ef8c427adbc2d (diff)
parentb4697f969295245840350e17d75d92a0fdd7e7a9 (diff)
downloadhdf5-47b79b7422c91e53ae5d87bcda45d52798a64fb6.zip
hdf5-47b79b7422c91e53ae5d87bcda45d52798a64fb6.tar.gz
hdf5-47b79b7422c91e53ae5d87bcda45d52798a64fb6.tar.bz2
Merge pull request #2369 in HDFFV/hdf5 from ~DYOUNG/vs2010:develop to develop
Merged per discussion with Elena. * commit 'b4697f969295245840350e17d75d92a0fdd7e7a9': Use HD prefix. Delete unhelpful comment per Jordan's question. Make sure that H5TS_thread_id() is available as either a function or a macro in all configurations. Provide local copies of err(3)- and errx(3)-alike functions for Visual Studio compatibility. Provide C99/POSIX.1 format strings PRI[doux]{8,16,32,64,MAX,PTR} on systems that are missing <inttypes.h>.
-rw-r--r--src/H5TS.c9
-rw-r--r--src/H5private.h5
-rw-r--r--src/H5public.h40
-rw-r--r--test/thread_id.c46
4 files changed, 79 insertions, 21 deletions
diff --git a/src/H5TS.c b/src/H5TS.c
index 7a801e2..9503e05 100644
--- a/src/H5TS.c
+++ b/src/H5TS.c
@@ -639,13 +639,4 @@ H5TS_create_thread(void *(*func)(void *), H5TS_attr_t *attr, void *udata)
} /* H5TS_create_thread */
-#else /* H5_HAVE_THREADSAFE */
-
-uint64_t
-H5TS_thread_id(void)
-{
- return 0;
-}
-
#endif /* H5_HAVE_THREADSAFE */
-
diff --git a/src/H5private.h b/src/H5private.h
index f0f3687..700fe8a 100644
--- a/src/H5private.h
+++ b/src/H5private.h
@@ -1897,12 +1897,11 @@ H5_DLL double H5_trace(const double *calltime, const char *func, const char *typ
/* global library version information string */
extern char H5_lib_vers_info_g[];
+#include "H5TSprivate.h"
+
/* Lock headers */
#ifdef H5_HAVE_THREADSAFE
-/* Include required thread-safety header */
-#include "H5TSprivate.h"
-
/* replacement structure for original global variable */
typedef struct H5_api_struct {
H5TS_mutex_t init_lock; /* API entrance mutex */
diff --git a/src/H5public.h b/src/H5public.h
index 86a1fbb..3312cf4 100644
--- a/src/H5public.h
+++ b/src/H5public.h
@@ -51,7 +51,45 @@
# endif
#endif
#ifdef H5_HAVE_INTTYPES_H
-# include <inttypes.h> /* For uint64_t on some platforms */
+# include <inttypes.h> /* C99/POSIX.1 header for uint64_t, PRIu64 */
+#else /* H5_HAVE_INTTYPES_H */
+/* The following definitions should be suitable for 64-bit Windows, which is
+ * LLP64, and for 32-bit Windows, which is ILP32. Those are the only
+ * platforms where <inttypes.h> is likely to be missing. VS2015 and later
+ * *may* provide these definitions.
+ */
+#ifdef _WIN64
+# define PRIdPTR "lld"
+# define PRIoPTR "llo"
+# define PRIuPTR "llu"
+# define PRIxPTR "llx"
+#else /* _WIN64 */
+# define PRIdPTR "ld"
+# define PRIoPTR "lo"
+# define PRIuPTR "lu"
+# define PRIxPTR "lx"
+#endif /* _WIN64 */
+
+# define PRId8 "d"
+# define PRIo8 "o"
+# define PRIu8 "u"
+# define PRIx8 "x"
+# define PRId16 "d"
+# define PRIo16 "o"
+# define PRIu16 "u"
+# define PRIx16 "x"
+# define PRId32 "d"
+# define PRIo32 "o"
+# define PRIu32 "u"
+# define PRIx32 "x"
+# define PRId64 "lld"
+# define PRIo64 "llo"
+# define PRIu64 "llu"
+# define PRIx64 "llx"
+# define PRIdMAX "lld"
+# define PRIoMAX "llo"
+# define PRIuMAX "llu"
+# define PRIxMAX "llx"
#endif
#ifdef H5_HAVE_STDDEF_H
# include <stddef.h>
diff --git a/test/thread_id.c b/test/thread_id.c
index 9b289fa..af36625 100644
--- a/test/thread_id.c
+++ b/test/thread_id.c
@@ -18,7 +18,6 @@
* 3 No two threads share an ID during their lifetimes.
* 4 A thread's ID is available for reuse as soon as it is joined.
*/
-#include <err.h>
/*
* Include required headers. This file tests internal library functions,
@@ -26,11 +25,42 @@
*/
#include "testhdf5.h"
+static void my_errx(int, const char *, ...) H5_ATTR_FORMAT(printf, 2, 3);
+
+static void
+my_errx(int code, const char *fmt, ...)
+{
+ va_list ap;
+
+ (void)HDfprintf(stderr, "thread_id: ");
+ HDva_start(ap, fmt);
+ (void)HDvfprintf(stderr, fmt, ap);
+ HDva_end(ap);
+ (void)HDfputc('\n', stderr);
+ HDexit(code);
+}
+
#if defined(H5_HAVE_THREADSAFE) && !defined(H5_HAVE_WIN_THREADS)
+static void my_err(int, const char *, ...) H5_ATTR_FORMAT(printf, 2, 3);
+
+static void
+my_err(int code, const char *fmt, ...)
+{
+ va_list ap;
+ int errno_copy = errno;
+
+ (void)HDfprintf(stderr, "thread_id: ");
+ HDva_start(ap, fmt);
+ (void)HDvfprintf(stderr, fmt, ap);
+ HDva_end(ap);
+ (void)HDfprintf(stderr, ": %s\n", HDstrerror(errno_copy));
+ HDexit(code);
+}
+
#define threads_failure(_call, _result) do { \
- errx(EXIT_FAILURE, "%s.%d: " #_call ": %s", __func__, \
- __LINE__, strerror(_result)); \
+ my_errx(EXIT_FAILURE, "%s.%d: " #_call ": %s", __func__, \
+ __LINE__, HDstrerror(_result)); \
} while (false)
#define NTHREADS 5
@@ -52,13 +82,13 @@ atomic_printf(const char *fmt, ...)
va_end(ap);
if (nprinted == -1)
- err(EXIT_FAILURE, "%s.%d: vsnprintf", __func__, __LINE__);
+ my_err(EXIT_FAILURE, "%s.%d: vsnprintf", __func__, __LINE__);
else if (nprinted >= (ssize_t)sizeof(buf))
- errx(EXIT_FAILURE, "%s.%d: vsnprintf overflowed", __func__, __LINE__);
+ my_errx(EXIT_FAILURE, "%s.%d: vsnprintf overflowed", __func__, __LINE__);
nwritten = write(STDOUT_FILENO, buf, (size_t)nprinted);
if (nwritten < nprinted) {
- errx(EXIT_FAILURE, "%s.%d: write error or short write",
+ my_errx(EXIT_FAILURE, "%s.%d: write error or short write",
__func__, __LINE__);
}
}
@@ -114,7 +144,7 @@ main(void)
* mutex, etc.
*/
if (H5open() != SUCCEED)
- errx(EXIT_FAILURE, "%s.%d: H5open failed", __func__, __LINE__);
+ my_errx(EXIT_FAILURE, "%s.%d: H5open failed", __func__, __LINE__);
if ((rc = pthread_mutex_init(&used_lock, NULL)) == -1)
threads_failure(pthread_mutex_init, rc);
@@ -144,7 +174,7 @@ main(void)
for (i = 0; i < NTHREADS; i++) {
if (!used[i]) // access synchronized by thread create/join
- errx(EXIT_FAILURE, "thread ID %d did not run.", i + 1);
+ my_errx(EXIT_FAILURE, "thread ID %d did not run.", i + 1);
}
}
if ((rc = pthread_barrier_destroy(&barrier)) != 0)