]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Prefer the pthread_barrier implementation over uv_barrier
authorOndřej Surý <ondrej@isc.org>
Wed, 11 Jan 2023 08:28:10 +0000 (09:28 +0100)
committerOndřej Surý <ondrej@isc.org>
Wed, 11 Jan 2023 08:51:02 +0000 (09:51 +0100)
Prefer the pthread_barrier implementation on platforms where it is
available over uv_barrier implementation.  This also solves the problem
with thread sanitizer builds on macOS that doesn't have pthread barrier.

configure.ac
lib/isc/include/isc/barrier.h

index 4576c64da1447d6c50ca572be887cbbfea868be4..c5d0cd54fc508e07c8cfcf3ce3a5a1013583d5c6 100644 (file)
@@ -508,7 +508,7 @@ LIBS="$PTHREAD_LIBS $LIBS"
 CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
 CC="$PTHREAD_CC"
 
-AC_CHECK_FUNCS([pthread_attr_getstacksize pthread_attr_setstacksize])
+AC_CHECK_FUNCS([pthread_attr_getstacksize pthread_attr_setstacksize pthread_barrier_init])
 
 # [pairwise: --with-locktype=adaptive, --with-locktype=standard]
 AC_ARG_WITH([locktype],
index 5dcc13ccaf7a9b1351d23e5901e32f45155566eb..c9a7f74e1fbd20c0e9f033e447705cf3139c5e7d 100644 (file)
 
 #include <isc/util.h>
 
-#if __SANITIZE_THREAD__
+#if HAVE_PTHREAD_BARRIER_INIT
 
 #include <pthread.h>
 
-#define isc_barrier_t pthread_barrier_t
+#if ISC_TRACK_PTHREADS_OBJECTS
+typedef pthread_barrier_t *isc_barrier_t;
+#else
+typedef pthread_barrier_t isc_barrier_t;
+#endif
+
+#define isc__barrier_init(bp, count)                                \
+       {                                                           \
+               int _ret = pthread_barrier_init(bp, NULL, count);   \
+               PTHREADS_RUNTIME_CHECK(pthread_barrier_init, _ret); \
+       }
 
-#define isc_barrier_init(barrier, count) \
-       pthread_barrier_init(barrier, NULL, count)
-#define isc_barrier_destroy(barrier) pthread_barrier_destroy(barrier)
-#define isc_barrier_wait(barrier)    pthread_barrier_wait(barrier)
+#define isc__barrier_wait(bp) pthread_barrier_wait(bp)
 
-#else /* __SANITIZE_THREAD__ */
+#define isc__barrier_destroy(bp)                                       \
+       {                                                              \
+               int _ret = pthread_barrier_destroy(bp);                \
+               PTHREADS_RUNTIME_CHECK(pthread_barrier_destroy, _ret); \
+       }
 
-#include <isc/uv.h>
+#else
 
-#if ISC_TRACK_PTHREADS_OBJECTS
+#include <uv.h>
 
+#if ISC_TRACK_PTHREADS_OBJECTS
 typedef uv_barrier_t *isc_barrier_t;
+#else
+typedef uv_barrier_t isc_barrier_t;
+#endif
+
+#define isc__barrier_init(bp, count)                     \
+       {                                                \
+               int _ret = uv_barrier_init(bp, count);   \
+               UV_RUNTIME_CHECK(uv_barrier_init, _ret); \
+       }
+
+#define isc__barrier_wait(bp) uv_barrier_wait(bp)
+
+#define isc__barrier_destroy(bp) uv_barrier_destroy(bp)
+
+#endif
+
+#if ISC_TRACK_PTHREADS_OBJECTS
 
 #define isc_barrier_init(bp, count)            \
        {                                      \
@@ -48,22 +77,8 @@ typedef uv_barrier_t *isc_barrier_t;
 
 #else /* ISC_TRACK_PTHREADS_OBJECTS */
 
-typedef uv_barrier_t isc_barrier_t;
-
 #define isc_barrier_init(bp, count) isc__barrier_init(bp, count)
 #define isc_barrier_wait(bp)       isc__barrier_wait(bp)
 #define isc_barrier_destroy(bp)            isc__barrier_destroy(bp)
 
 #endif /* ISC_TRACK_PTHREADS_OBJECTS */
-
-#define isc__barrier_init(bp, count)                     \
-       {                                                \
-               int _ret = uv_barrier_init(bp, count);   \
-               UV_RUNTIME_CHECK(uv_barrier_init, _ret); \
-       }
-
-#define isc__barrier_wait(bp) uv_barrier_wait(bp)
-
-#define isc__barrier_destroy(bp) uv_barrier_destroy(bp)
-
-#endif /* __SANITIZE_THREAD__ */