Newer
Older
// FIXME: use atomics
if (!_locked) {
_locked = true;
return;
} else {
auto me = sched::thread::current();
_waiters.push_back(me);
sched::thread::wait_until([=] {
return !_locked && _waiters.front() == me;
});
_waiters.pop_front();
}
if (_locked) {
return false;
} else {
_locked = true;
return true;
}
_locked = false;
if (!_waiters.empty()) {
_waiters.front()->wake();
}