summaryrefslogtreecommitdiffstats
path: root/test/thread_id.c
diff options
context:
space:
mode:
authorDavid Young <dyoung@hdfgroup.org>2020-02-07 20:45:08 (GMT)
committerDavid Young <dyoung@hdfgroup.org>2020-02-07 20:45:08 (GMT)
commitc7ad81b0ea0eab3a48a13b094aad65587f30aa27 (patch)
tree098662a6136fbd38b65a739f4946cce8232d39a2 /test/thread_id.c
parentb2cb485268b1290b6c0984c328fd5ffbddfada78 (diff)
downloadhdf5-c7ad81b0ea0eab3a48a13b094aad65587f30aa27.zip
hdf5-c7ad81b0ea0eab3a48a13b094aad65587f30aa27.tar.gz
hdf5-c7ad81b0ea0eab3a48a13b094aad65587f30aa27.tar.bz2
Provide local copies of err(3)- and errx(3)-alike functions
for Visual Studio compatibility.
Diffstat (limited to 'test/thread_id.c')
-rw-r--r--test/thread_id.c44
1 files changed, 37 insertions, 7 deletions
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)