diff --git a/src/event/Loop.cxx b/src/event/Loop.cxx index ada820c2d..9e09534da 100644 --- a/src/event/Loop.cxx +++ b/src/event/Loop.cxx @@ -27,7 +27,7 @@ #include EventLoop::EventLoop() - :SocketMonitor(*this) + :SocketMonitor(*this), quit(false) { SocketMonitor::Open(wake_fd.Get()); SocketMonitor::Schedule(SocketMonitor::READ); @@ -46,7 +46,9 @@ EventLoop::~EventLoop() void EventLoop::Break() { - quit = true; + if (quit.exchange(true)) + return; + wake_fd.Write(); } diff --git a/src/event/Loop.hxx b/src/event/Loop.hxx index 1060a8769..cf2ec33b2 100644 --- a/src/event/Loop.hxx +++ b/src/event/Loop.hxx @@ -30,6 +30,7 @@ #include "SocketMonitor.hxx" #include +#include #include #include @@ -82,7 +83,7 @@ class EventLoop final : SocketMonitor std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now(); - bool quit = false; + std::atomic_bool quit; /** * True when the object has been modified and another check is