From 9b3d36c8c1107c2d4bdbae2be3aecdccc0703d8b Mon Sep 17 00:00:00 2001 From: EricLiu2000 Date: Mon, 5 Aug 2019 11:40:17 -0400 Subject: [PATCH] Moved calling of event callbacks to after the event is added. Now using unique_locks on the list of events to allow event callbacks to safely modify the list of events --- include/icsneo/api/eventmanager.h | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/include/icsneo/api/eventmanager.h b/include/icsneo/api/eventmanager.h index b035a44..ebf9cef 100644 --- a/include/icsneo/api/eventmanager.h +++ b/include/icsneo/api/eventmanager.h @@ -52,17 +52,21 @@ public: auto i = downgradedThreads.find(std::this_thread::get_id()); if(i != downgradedThreads.end() && i->second) { event.downgradeFromError(); - runCallbacks(event); - std::lock_guard lk(eventsMutex); + std::unique_lock eventsLock(eventsMutex); add_internal_event(event); + // free the lock so that callbacks may modify events + eventsLock.unlock(); + runCallbacks(event); } else { std::lock_guard lk(errorsMutex); add_internal_error(event); } } else { - runCallbacks(event); - std::lock_guard lk(eventsMutex); + std::unique_lock eventsLock(eventsMutex); add_internal_event(event); + // free the lock so that callbacks may modify events + eventsLock.unlock(); + runCallbacks(event); } } void add(APIEvent::Type type, APIEvent::Severity severity, const Device* forDevice = nullptr) {