# HG changeset patch # User Sebastien Decugis # Date 1351959528 -3600 # Node ID 901526bc034c37bbd2a360efe7adabbc748ba098 # Parent e815a8cfca4b3cab8419b1d931f9b988af916124 Added simple implementation of barriers for Mac OS X diff -r e815a8cfca4b -r 901526bc034c include/freeDiameter/freeDiameter-host.h.in --- a/include/freeDiameter/freeDiameter-host.h.in Sat Nov 03 13:14:58 2012 +0100 +++ b/include/freeDiameter/freeDiameter-host.h.in Sat Nov 03 17:18:48 2012 +0100 @@ -43,6 +43,7 @@ #cmakedefine HAVE_AI_ADDRCONFIG #cmakedefine HAVE_CLOCK_GETTIME #cmakedefine HAVE_STRNDUP +#cmakedefine HAVE_PTHREAD_BAR #cmakedefine HOST_BIG_ENDIAN @HOST_BIG_ENDIAN@ diff -r e815a8cfca4b -r 901526bc034c tests/CMakeLists.txt --- a/tests/CMakeLists.txt Sat Nov 03 13:14:58 2012 +0100 +++ b/tests/CMakeLists.txt Sat Nov 03 17:18:48 2012 +0100 @@ -21,6 +21,7 @@ SET(TEST_LIST testsctp testostr + testfifo testpeers testdict testmesg @@ -30,14 +31,6 @@ testloadext ) -IF(HAVE_PTHREAD_BAR) -SET(TEST_LIST - ${TEST_LIST} - testfifo -) -ENDIF(HAVE_PTHREAD_BAR) - - ############################# # Some parameters for the tests diff -r e815a8cfca4b -r 901526bc034c tests/testfifo.c --- a/tests/testfifo.c Sat Nov 03 13:14:58 2012 +0100 +++ b/tests/testfifo.c Sat Nov 03 17:18:48 2012 +0100 @@ -37,6 +37,63 @@ #include #include +/* Wrapper for pthread_barrier stuff on Mac OS X */ +#ifndef HAVE_PTHREAD_BAR + +#define PTHREAD_BARRIER_SERIAL_THREAD 1 +typedef struct { + int count; + int entered; + int serial; + pthread_mutex_t mutex; + pthread_cond_t cond; +} pthread_barrier_t; + +int pthread_barrier_init(pthread_barrier_t * barrier, int * barrier_attr, int count) +{ + memset(barrier, 0, sizeof(pthread_barrier_t)); + barrier->count = count; + pthread_mutex_init(&barrier->mutex, NULL); + pthread_cond_init(&barrier->cond, NULL); + return 0; +} + +int pthread_barrier_destroy(pthread_barrier_t * barrier) +{ + pthread_mutex_destroy(&barrier->mutex); + pthread_cond_destroy(&barrier->cond); + return 0; +} + +int pthread_barrier_wait(pthread_barrier_t * barrier) +{ + int ret = 0; + int serial; + pthread_mutex_lock(&barrier->mutex); + serial = barrier->serial; + + /* first thread gets the special value */ + if (barrier->entered++ == 0) + ret = PTHREAD_BARRIER_SERIAL_THREAD; + + /* Count was achieved? */ + if (barrier->entered == barrier->count) { + /* Ok, increase serial, reset number of threads, and signal everyone */ + barrier->entered = 0; + barrier->serial++; + pthread_cond_broadcast(&barrier->cond); + } else { + do { + pthread_cond_wait(&barrier->cond, &barrier->mutex); + } while (barrier->serial == serial); + /* this protects against spurious wakes */ + } + pthread_mutex_unlock(&barrier->mutex); + return 0; +} + +#endif /* HAVE_PTHREAD_BAR */ + /* Structure for testing threshold function */ static struct thrh_test { struct fifo * queue; /* pointer to the queue */