From d07c4a98da3d930aca83465347a4dd7bb423909f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= Date: Wed, 11 Jan 2023 09:28:10 +0100 Subject: [PATCH] Prefer the pthread_barrier implementation over uv_barrier 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 | 2 +- lib/isc/include/isc/barrier.h | 61 ++++++++++++++++++++++------------- 2 files changed, 39 insertions(+), 24 deletions(-) diff --git a/configure.ac b/configure.ac index 4576c64da1..c5d0cd54fc 100644 --- a/configure.ac +++ b/configure.ac @@ -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], diff --git a/lib/isc/include/isc/barrier.h b/lib/isc/include/isc/barrier.h index 5dcc13ccaf..c9a7f74e1f 100644 --- a/lib/isc/include/isc/barrier.h +++ b/lib/isc/include/isc/barrier.h @@ -15,24 +15,53 @@ #include -#if __SANITIZE_THREAD__ +#if HAVE_PTHREAD_BARRIER_INIT #include -#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(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_init(bp, count) \ + { \ + int _ret = pthread_barrier_init(bp, NULL, count); \ + PTHREADS_RUNTIME_CHECK(pthread_barrier_init, _ret); \ + } -#else /* __SANITIZE_THREAD__ */ +#define isc__barrier_wait(bp) pthread_barrier_wait(bp) -#include +#define isc__barrier_destroy(bp) \ + { \ + int _ret = pthread_barrier_destroy(bp); \ + PTHREADS_RUNTIME_CHECK(pthread_barrier_destroy, _ret); \ + } + +#else + +#include #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__ */