blob: 4eb13dde7aee8baac8bf4b9a37f07812a11cada1 [file] [log] [blame]
#include "pthread_impl.h"
void __wait(volatile int* addr, volatile int* waiters, int val, int priv) {
int spins = 100;
if (priv)
priv = FUTEX_PRIVATE;
while (spins-- && (!waiters || !*waiters)) {
if (*addr == val)
a_spin();
else
return;
}
if (waiters)
a_inc(waiters);
while (*addr == val) {
__syscall(SYS_futex, addr, FUTEX_WAIT | priv, val, 0) != -ENOSYS ||
__syscall(SYS_futex, addr, FUTEX_WAIT, val, 0);
}
if (waiters)
a_dec(waiters);
}