event/Loop: use std::lock_guard
This commit is contained in:
parent
9e503b21c1
commit
14986b153a
@ -181,17 +181,17 @@ EventLoop::Run()
|
|||||||
|
|
||||||
/* try to handle DeferredMonitors without WakeFD
|
/* try to handle DeferredMonitors without WakeFD
|
||||||
overhead */
|
overhead */
|
||||||
mutex.lock();
|
{
|
||||||
HandleDeferred();
|
const std::lock_guard<Mutex> lock(mutex);
|
||||||
busy = false;
|
HandleDeferred();
|
||||||
const bool _again = again;
|
busy = false;
|
||||||
mutex.unlock();
|
|
||||||
|
|
||||||
if (_again)
|
if (again)
|
||||||
/* re-evaluate timers because one of the
|
/* re-evaluate timers because one of
|
||||||
IdleMonitors may have added a new
|
the IdleMonitors may have added a
|
||||||
timeout */
|
new timeout */
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
/* wait for new event */
|
/* wait for new event */
|
||||||
|
|
||||||
@ -199,9 +199,10 @@ EventLoop::Run()
|
|||||||
|
|
||||||
now = std::chrono::steady_clock::now();
|
now = std::chrono::steady_clock::now();
|
||||||
|
|
||||||
mutex.lock();
|
{
|
||||||
busy = true;
|
const std::lock_guard<Mutex> lock(mutex);
|
||||||
mutex.unlock();
|
busy = true;
|
||||||
|
}
|
||||||
|
|
||||||
/* invoke sockets */
|
/* invoke sockets */
|
||||||
for (int i = 0; i < poll_result.GetSize(); ++i) {
|
for (int i = 0; i < poll_result.GetSize(); ++i) {
|
||||||
@ -230,24 +231,25 @@ EventLoop::Run()
|
|||||||
void
|
void
|
||||||
EventLoop::AddDeferred(DeferredMonitor &d)
|
EventLoop::AddDeferred(DeferredMonitor &d)
|
||||||
{
|
{
|
||||||
mutex.lock();
|
bool must_wake;
|
||||||
if (d.pending) {
|
|
||||||
mutex.unlock();
|
{
|
||||||
return;
|
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)
|
if (must_wake)
|
||||||
wake_fd.Write();
|
wake_fd.Write();
|
||||||
}
|
}
|
||||||
@ -281,9 +283,8 @@ EventLoop::HandleDeferred()
|
|||||||
deferred.pop_front();
|
deferred.pop_front();
|
||||||
m.pending = false;
|
m.pending = false;
|
||||||
|
|
||||||
mutex.unlock();
|
const ScopeUnlock unlock(mutex);
|
||||||
m.RunDeferred();
|
m.RunDeferred();
|
||||||
mutex.lock();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -294,9 +295,8 @@ EventLoop::OnSocketReady(gcc_unused unsigned flags)
|
|||||||
|
|
||||||
wake_fd.Read();
|
wake_fd.Read();
|
||||||
|
|
||||||
mutex.lock();
|
const std::lock_guard<Mutex> lock(mutex);
|
||||||
HandleDeferred();
|
HandleDeferred();
|
||||||
mutex.unlock();
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user