Skip to content
This repository was archived by the owner on Aug 13, 2025. It is now read-only.

Commit d07c4a9

Browse files
committed
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.
1 parent 5139b04 commit d07c4a9

File tree

2 files changed

+39
-24
lines changed

2 files changed

+39
-24
lines changed

configure.ac

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -508,7 +508,7 @@ LIBS="$PTHREAD_LIBS $LIBS"
508508
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
509509
CC="$PTHREAD_CC"
510510

511-
AC_CHECK_FUNCS([pthread_attr_getstacksize pthread_attr_setstacksize])
511+
AC_CHECK_FUNCS([pthread_attr_getstacksize pthread_attr_setstacksize pthread_barrier_init])
512512

513513
# [pairwise: --with-locktype=adaptive, --with-locktype=standard]
514514
AC_ARG_WITH([locktype],

lib/isc/include/isc/barrier.h

Lines changed: 38 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,53 @@
1515

1616
#include <isc/util.h>
1717

18-
#if __SANITIZE_THREAD__
18+
#if HAVE_PTHREAD_BARRIER_INIT
1919

2020
#include <pthread.h>
2121

22-
#define isc_barrier_t pthread_barrier_t
22+
#if ISC_TRACK_PTHREADS_OBJECTS
23+
typedef pthread_barrier_t *isc_barrier_t;
24+
#else
25+
typedef pthread_barrier_t isc_barrier_t;
26+
#endif
27+
28+
#define isc__barrier_init(bp, count) \
29+
{ \
30+
int _ret = pthread_barrier_init(bp, NULL, count); \
31+
PTHREADS_RUNTIME_CHECK(pthread_barrier_init, _ret); \
32+
}
2333

24-
#define isc_barrier_init(barrier, count) \
25-
pthread_barrier_init(barrier, NULL, count)
26-
#define isc_barrier_destroy(barrier) pthread_barrier_destroy(barrier)
27-
#define isc_barrier_wait(barrier) pthread_barrier_wait(barrier)
34+
#define isc__barrier_wait(bp) pthread_barrier_wait(bp)
2835

29-
#else /* __SANITIZE_THREAD__ */
36+
#define isc__barrier_destroy(bp) \
37+
{ \
38+
int _ret = pthread_barrier_destroy(bp); \
39+
PTHREADS_RUNTIME_CHECK(pthread_barrier_destroy, _ret); \
40+
}
3041

31-
#include <isc/uv.h>
42+
#else
3243

33-
#if ISC_TRACK_PTHREADS_OBJECTS
44+
#include <uv.h>
3445

46+
#if ISC_TRACK_PTHREADS_OBJECTS
3547
typedef uv_barrier_t *isc_barrier_t;
48+
#else
49+
typedef uv_barrier_t isc_barrier_t;
50+
#endif
51+
52+
#define isc__barrier_init(bp, count) \
53+
{ \
54+
int _ret = uv_barrier_init(bp, count); \
55+
UV_RUNTIME_CHECK(uv_barrier_init, _ret); \
56+
}
57+
58+
#define isc__barrier_wait(bp) uv_barrier_wait(bp)
59+
60+
#define isc__barrier_destroy(bp) uv_barrier_destroy(bp)
61+
62+
#endif
63+
64+
#if ISC_TRACK_PTHREADS_OBJECTS
3665

3766
#define isc_barrier_init(bp, count) \
3867
{ \
@@ -48,22 +77,8 @@ typedef uv_barrier_t *isc_barrier_t;
4877

4978
#else /* ISC_TRACK_PTHREADS_OBJECTS */
5079

51-
typedef uv_barrier_t isc_barrier_t;
52-
5380
#define isc_barrier_init(bp, count) isc__barrier_init(bp, count)
5481
#define isc_barrier_wait(bp) isc__barrier_wait(bp)
5582
#define isc_barrier_destroy(bp) isc__barrier_destroy(bp)
5683

5784
#endif /* ISC_TRACK_PTHREADS_OBJECTS */
58-
59-
#define isc__barrier_init(bp, count) \
60-
{ \
61-
int _ret = uv_barrier_init(bp, count); \
62-
UV_RUNTIME_CHECK(uv_barrier_init, _ret); \
63-
}
64-
65-
#define isc__barrier_wait(bp) uv_barrier_wait(bp)
66-
67-
#define isc__barrier_destroy(bp) uv_barrier_destroy(bp)
68-
69-
#endif /* __SANITIZE_THREAD__ */

0 commit comments

Comments
 (0)