38 #include "blocxx/BLOCXX_config.h"
45 #if defined(BLOCXX_USE_PTHREAD) && defined(BLOCXX_HAVE_PTHREAD_BARRIER) && !defined(BLOCXX_VALGRIND_SUPPORT)
61 #if defined(BLOCXX_USE_PTHREAD) && defined(BLOCXX_HAVE_PTHREAD_BARRIER) && !defined(BLOCXX_VALGRIND_SUPPORT) // valgrind doesn't support pthread_barrier_*()
62 class ThreadBarrierImpl :
public IntrusiveCountableBase
68 memset(&barrier, 0,
sizeof(barrier));
69 int res = pthread_barrier_init(&barrier, NULL, threshold);
72 BLOCXX_THROW(ThreadBarrierException, Format(
"pthread_barrier_init failed: %1(%2)", res, strerror(res)).c_str());
77 int res = pthread_barrier_destroy(&barrier);
86 int res = pthread_barrier_wait(&barrier);
87 if (res != 0 && res != PTHREAD_BARRIER_SERIAL_THREAD)
93 pthread_barrier_t barrier;
100 class ThreadBarrierImpl :
public IntrusiveCountableBase
128 NonRecursiveMutexLock l(
m_mutex);
131 ++curBarrier.m_waitingCount;
135 curBarrier.m_waitingCount = 0;
139 curBarrier.m_cond.notifyAll();
146 while (curBarrier.m_waitingCount != 0)
148 curBarrier.m_cond.wait(l);
167 :
m_impl(new ThreadBarrierImpl(threshold))