From d81f817f70a171399bbc849f0a7b4d31957c81fc Mon Sep 17 00:00:00 2001 From: ridiculousfish Date: Tue, 2 Nov 2021 12:46:32 -0700 Subject: [PATCH] Correct a dropped lock When iterating the event handler list, we inadverently dropped a lock because of how range-based for loops work. Hold the lock outside of the loop. --- src/event.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/event.cpp b/src/event.cpp index 50341862d..fab35bd5e 100644 --- a/src/event.cpp +++ b/src/event.cpp @@ -44,7 +44,7 @@ class pending_signals_t { /// No copying. pending_signals_t(const pending_signals_t &) = delete; - pending_signals_t& operator=(const pending_signals_t &) = delete; + pending_signals_t &operator=(const pending_signals_t &) = delete; /// Mark a signal as pending. This may be called from a signal handler. /// We expect only one signal handler to execute at once. @@ -252,7 +252,8 @@ static void event_fire_internal(parser_t &parser, const event_t &event) { }; std::vector fire; { - for (const auto &handler : *s_event_handlers.acquire()) { + auto event_handlers = s_event_handlers.acquire(); + for (const auto &handler : *event_handlers) { // Check if this event is a match. bool only_once = false; if (!handler_matches(*handler, event, only_once)) {