#define isc_barrier_destroy(barrier) pthread_barrier_destroy(barrier)
#define isc_barrier_wait(barrier) pthread_barrier_wait(barrier)
-#else
+#else /* __SANITIZE_THREAD__ */
#include <isc/uv.h>
-#define isc_barrier_t uv_barrier_t
+#if ISC_TRACK_PTHREADS_OBJECTS
-#define isc_barrier_init(barrier, count) uv_barrier_init(barrier, count)
-#define isc_barrier_destroy(barrier) uv_barrier_destroy(barrier)
-#define isc_barrier_wait(barrier) uv_barrier_wait(barrier)
+typedef uv_barrier_t *isc_barrier_t;
+
+#define isc_barrier_init(bp, count) \
+ { \
+ *bp = malloc(sizeof(**bp)); \
+ isc__barrier_init(*bp, count); \
+ }
+#define isc_barrier_wait(bp) isc__barrier_wait(*bp)
+#define isc_barrier_destroy(bp) \
+ { \
+ isc__barrier_destroy(*bp); \
+ free(*bp); \
+ }
+
+#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) uv_barrier_init(bp, count)
+#define isc__barrier_wait(bp) uv_barrier_wait(bp)
+#define isc__barrier_destroy(bp) uv_barrier_destroy(bp)
#endif /* __SANITIZE_THREAD__ */