#include "mutex.hh" #include "sched.hh" void mutex::lock() { // 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(); } } bool mutex::try_lock() { if (_locked) { return false; } else { _locked = true; return true; } } void mutex::unlock() { _locked = false; if (!_waiters.empty()) { _waiters.front()->wake(); } }