summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/H5public.h40
-rw-r--r--test/thread_id.c44
2 files changed, 76 insertions, 8 deletions
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..21be12d 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,10 +25,41 @@
*/
#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)fprintf(stderr, "thread_id: ");
+ va_start(ap, fmt);
+ (void)vfprintf(stderr, fmt, ap);
+ va_end(ap);
+ (void)fputc('\n', stderr);
+ exit(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)fprintf(stderr, "thread_id: ");
+ va_start(ap, fmt);
+ (void)vfprintf(stderr, fmt, ap);
+ va_end(ap);
+ (void)fprintf(stderr, ": %s\n", strerror(errno_copy));
+ exit(code);
+}
+
#define threads_failure(_call, _result) do { \
- errx(EXIT_FAILURE, "%s.%d: " #_call ": %s", __func__, \
+ my_errx(EXIT_FAILURE, "%s.%d: " #_call ": %s", __func__, \
__LINE__, strerror(_result)); \
} while (false)
@@ -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)