Skip to content
Snippets Groups Projects
mutex.cc 631 B
Newer Older
  • Learn to ignore specific revisions
  • Avi Kivity's avatar
    Avi Kivity committed
    #include "mutex.hh"
    
    #include "sched.hh"
    
    Avi Kivity's avatar
    Avi Kivity committed
    
    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();
        }
    
    Avi Kivity's avatar
    Avi Kivity committed
    }
    
    bool mutex::try_lock()
    {
    
        if (_locked) {
            return false;
        } else {
            _locked = true;
            return true;
        }
    
    Avi Kivity's avatar
    Avi Kivity committed
    }
    
    void mutex::unlock()
    {
    
        _locked = false;
        if (!_waiters.empty()) {
            _waiters.front()->wake();
        }
    
    Avi Kivity's avatar
    Avi Kivity committed
    }