| #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); | |
| } |