diff --git a/api/icsneocpp/eventmanager.cpp b/api/icsneocpp/eventmanager.cpp index a917678..1481395 100644 --- a/api/icsneocpp/eventmanager.cpp +++ b/api/icsneocpp/eventmanager.cpp @@ -16,7 +16,7 @@ void EventManager::ResetInstance() { } void EventManager::get(std::vector& eventOutput, size_t max, EventFilter filter) { - std::unique_lock lk(mutex); + std::lock_guard lk(mutex); if(max == 0) // A limit of 0 indicates no limit max = (size_t)-1; @@ -41,7 +41,7 @@ void EventManager::get(std::vector& eventOutput, size_t max, EventFilt * If no error was found, return a NoErrorFound Info event */ APIEvent EventManager::getLastError() { - std::unique_lock lk(mutex); + std::lock_guard lk(mutex); auto it = lastUserErrors.find(std::this_thread::get_id()); if(it == lastUserErrors.end()) { @@ -54,10 +54,15 @@ APIEvent EventManager::getLastError() { } void EventManager::discard(EventFilter filter) { - std::unique_lock lk(mutex); - events.remove_if([&filter](const APIEvent& event) { - return filter.match(event); - }); + std::lock_guard lk(mutex); + + auto it = events.begin(); + while(it != events.end()) { + if(filter.match(*it)) + it = events.erase(it); + else + it++; + } } size_t EventManager::count_internal(EventFilter filter) const { @@ -73,8 +78,15 @@ size_t EventManager::count_internal(EventFilter filter) const { * Returns true if any events were removed in the process of doing so. */ bool EventManager::enforceLimit() { - // Remove all TooManyEvents before checking - events.remove_if([](icsneo::APIEvent err){ return err.getType() == APIEvent::Type::TooManyEvents; }); + // Remove all TooManyEvents before checking. TODO: is this worth doing? not efficient. maybe start from the end and erase any from there + auto filter = EventFilter(APIEvent::Type::TooManyEvents); + auto it = events.begin(); + while(it != events.end()) { + if(filter.match(*it)) + it = events.erase(it); + else + it++; + } // We are not overflowing if(events.size() < eventLimit) diff --git a/include/icsneo/api/eventmanager.h b/include/icsneo/api/eventmanager.h index 8e77284..dae4e94 100644 --- a/include/icsneo/api/eventmanager.h +++ b/include/icsneo/api/eventmanager.h @@ -2,11 +2,8 @@ #define __ICSNEO_API_EVENTMANAGER_H_ #include -#include #include -#include #include -#include #include #include #include "icsneo/api/event.h" @@ -22,7 +19,7 @@ public: static void ResetInstance(); size_t eventCount(EventFilter filter = EventFilter()) const { - std::shared_lock lk(mutex); + std::lock_guard lk(mutex); return count_internal(filter); }; @@ -38,11 +35,11 @@ public: APIEvent getLastError(); void add(APIEvent event) { - std::unique_lock lk(mutex); + std::lock_guard lk(mutex); add_internal(event); } void add(APIEvent::Type type, APIEvent::Severity severity, const Device* forDevice = nullptr) { - std::unique_lock lk(mutex); + std::lock_guard lk(mutex); add_internal(APIEvent(type, severity, forDevice)); } @@ -57,14 +54,14 @@ public: return; } - std::unique_lock lk(mutex); + std::lock_guard lk(mutex); eventLimit = newLimit; if(enforceLimit()) add_internal(APIEvent(APIEvent::Type::TooManyEvents, APIEvent::Severity::EventWarning)); } size_t getEventLimit() const { - std::shared_lock lk(mutex); + std::lock_guard lk(mutex); return eventLimit; } @@ -74,10 +71,10 @@ private: EventManager& operator=(const EventManager &other); // Used by functions for threadsafety - mutable std::shared_mutex mutex; + mutable std::mutex mutex; // Stores all events - std::list events; + std::vector events; std::map lastUserErrors; size_t eventLimit = 10000;