blob: 17fa23e2a5a6cab0ce1360af129a2844daa082d9 [file] [log] [blame]
#include "atomic.h"
#include "futex_impl.h"
void __wait(atomic_int* futex, atomic_int* waiters, int current_value) {
int spins = 100;
while (spins-- && (!waiters || !atomic_load(waiters))) {
if (atomic_load(futex) == current_value)
a_spin();
else
return;
}
if (waiters)
atomic_fetch_add(waiters, 1);
while (atomic_load(futex) == current_value) {
_zx_futex_wait(futex, current_value, ZX_TIME_INFINITE);
}
if (waiters)
atomic_fetch_sub(waiters, 1);
}