event/Loop: use std::lock_guard

This commit is contained in:
Max Kellermann 2017-02-09 21:26:55 +01:00
parent 9e503b21c1
commit 14986b153a

View File

@ -181,17 +181,17 @@ EventLoop::Run()
/* try to handle DeferredMonitors without WakeFD
overhead */
mutex.lock();
HandleDeferred();
busy = false;
const bool _again = again;
mutex.unlock();
{
const std::lock_guard<Mutex> lock(mutex);
HandleDeferred();
busy = false;
if (_again)
/* re-evaluate timers because one of the
IdleMonitors may have added a new
timeout */
continue;
if (again)
/* re-evaluate timers because one of
the IdleMonitors may have added a
new timeout */
continue;
}
/* wait for new event */
@ -199,9 +199,10 @@ EventLoop::Run()
now = std::chrono::steady_clock::now();
mutex.lock();
busy = true;
mutex.unlock();
{
const std::lock_guard<Mutex> lock(mutex);
busy = true;
}
/* invoke sockets */
for (int i = 0; i < poll_result.GetSize(); ++i) {
@ -230,24 +231,25 @@ EventLoop::Run()
void
EventLoop::AddDeferred(DeferredMonitor &d)
{
mutex.lock();
if (d.pending) {
mutex.unlock();
return;
bool must_wake;
{
const std::lock_guard<Mutex> lock(mutex);
if (d.pending)
return;
assert(std::find(deferred.begin(),
deferred.end(), &d) == deferred.end());
/* we don't need to wake up the EventLoop if another
DeferredMonitor has already done it */
must_wake = !busy && deferred.empty();
d.pending = true;
deferred.push_back(&d);
again = true;
}
assert(std::find(deferred.begin(),
deferred.end(), &d) == deferred.end());
/* we don't need to wake up the EventLoop if another
DeferredMonitor has already done it */
const bool must_wake = !busy && deferred.empty();
d.pending = true;
deferred.push_back(&d);
again = true;
mutex.unlock();
if (must_wake)
wake_fd.Write();
}
@ -281,9 +283,8 @@ EventLoop::HandleDeferred()
deferred.pop_front();
m.pending = false;
mutex.unlock();
const ScopeUnlock unlock(mutex);
m.RunDeferred();
mutex.lock();
}
}
@ -294,9 +295,8 @@ EventLoop::OnSocketReady(gcc_unused unsigned flags)
wake_fd.Read();
mutex.lock();
const std::lock_guard<Mutex> lock(mutex);
HandleDeferred();
mutex.unlock();
return true;
}