- /* Get a job, signal the pool to inform jobs submitters and unlock it */
- job = xbt_dynar_pop_as(tpool->jobs_queue, s_xbt_tpool_job_t);
- xbt_os_cond_signal(tpool->job_taken);
- tpool->num_idle_workers--;
- xbt_os_mutex_release(tpool->mutex);
-
- /* Run the job and loop again ... */
- job.fun(job.fun_arg);
+static void futex_wait(int *uaddr, int val)
+{
+ DEBUG1("Waiting on futex %d", *uaddr);
+ syscall(SYS_futex, uaddr, FUTEX_WAIT, val, NULL, NULL, 0);
+}
+
+static void futex_wake(int *uaddr, int val)
+{
+ DEBUG1("Waking futex %d", *uaddr);
+ syscall(SYS_futex, uaddr, FUTEX_WAKE, val, NULL, NULL, 0);
+}
+
+/* Futex based implementation of the barrier */
+void xbt_barrier_init(xbt_barrier_t barrier, unsigned int threads_to_wait)
+{
+ barrier->threads_to_wait = threads_to_wait;
+ barrier->thread_count = 0;
+}
+
+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);