-#ifdef HAVE_FUTEX_H
- void xbt_barrier_wait(xbt_barrier_t barrier)
- {
- int myflag = 0;
- unsigned int mycount = 0;
-
- myflag = barrier->futex;
- mycount = __sync_add_and_fetch(&barrier->thread_count, 1);
- if(mycount < barrier->threads_to_wait){
- futex_wait(&barrier->futex, myflag);
- }else{
- barrier->futex = __sync_add_and_fetch(&barrier->futex, 1);
- barrier->thread_count = 0;
- futex_wake(&barrier->futex, barrier->threads_to_wait);
- }
- }
-#else
- void xbt_barrier_wait(xbt_barrier_t barrier)
- {
- xbt_os_mutex_acquire(barrier->mutex);
-
- barrier->thread_count++;
- if(barrier->thread_count < barrier->threads_to_wait){
- xbt_os_cond_wait(barrier->cond,barrier->mutex);
- }else{
- barrier->thread_count = 0;
- xbt_os_cond_broadcast(barrier->cond);
- }
- xbt_os_mutex_release(barrier->mutex);
- }
+void xbt_event_init(xbt_event_t event)
+{
+ int myflag = event->done;
+ if(event->thread_counter < event->threads_to_wait)
+ futex_wait(&event->done, myflag);
+}
+
+void xbt_event_signal(xbt_event_t event)
+{
+ int myflag = event->done;
+ event->thread_counter = 0;
+ event->work++;
+ futex_wake(&event->work, event->threads_to_wait);
+ futex_wait(&event->done, myflag);
+}
+
+void xbt_event_wait(xbt_event_t event)
+{
+ int myflag;
+ unsigned int mycount;
+
+ myflag = event->work;
+ mycount = __sync_add_and_fetch(&event->thread_counter, 1);
+ if(mycount == event->threads_to_wait){
+ event->done++;
+ futex_wake(&event->done, 1);
+ }
+
+ futex_wait(&event->work, myflag);
+}
+
+void xbt_event_end(xbt_event_t event)
+{
+ int myflag;
+ unsigned int mycount;
+
+ myflag = event->work;
+ mycount = __sync_add_and_fetch(&event->thread_counter, 1);
+ if(mycount == event->threads_to_wait){
+ event->done++;
+ futex_wake(&event->done, 1);
+ }
+}