#include "pthread_impl.h"
-void __vm_lock_impl(int);
-void __vm_unlock_impl(void);
-
static int pshared_barrier_wait(pthread_barrier_t *b)
{
int limit = (b->_b_limit & INT_MAX) + 1;
__wait(&b->_b_count, &b->_b_waiters2, v, 0);
}
- __vm_lock_impl(+1);
+ __vm_lock();
/* Ensure all threads have a vm lock before proceeding */
if (a_fetch_add(&b->_b_count, -1)==1-limit) {
if (v==INT_MIN+1 || (v==1 && w))
__wake(&b->_b_lock, 1, 0);
- __vm_unlock_impl();
+ __vm_unlock();
return ret;
}
struct instance
{
- int count;
- int last;
- int waiters;
- int finished;
+ volatile int count;
+ volatile int last;
+ volatile int waiters;
+ volatile int finished;
};
int pthread_barrier_wait(pthread_barrier_t *b)
a_spin();
a_inc(&inst->finished);
while (inst->finished == 1)
- __syscall(SYS_futex,&inst->finished,FUTEX_WAIT|128,1,0) != -ENOSYS
+ __syscall(SYS_futex,&inst->finished,FUTEX_WAIT|FUTEX_PRIVATE,1,0) != -ENOSYS
|| __syscall(SYS_futex,&inst->finished,FUTEX_WAIT,1,0);
return PTHREAD_BARRIER_SERIAL_THREAD;
}