changeset 878:901526bc034c

Added simple implementation of barriers for Mac OS X
author Sebastien Decugis <sdecugis@freediameter.net>
date Sat, 03 Nov 2012 17:18:48 +0100
parents e815a8cfca4b
children 2b14ccdd0b92
files include/freeDiameter/freeDiameter-host.h.in tests/CMakeLists.txt tests/testfifo.c
diffstat 3 files changed, 59 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- 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@
 
--- 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
 
--- 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 <unistd.h>
 #include <limits.h>
 
+/* 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 */
"Welcome to our mercurial repository"