From b009754d1bc09d9cb26b35e41146029491044b6d Mon Sep 17 00:00:00 2001 From: LaG1924 <12997935+LaG1924@users.noreply.github.com> Date: Fri, 12 Jan 2018 16:48:42 +0500 Subject: Added more mutexes -> It's working fine now --- src/Event.hpp | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) (limited to 'src/Event.hpp') diff --git a/src/Event.hpp b/src/Event.hpp index 0f60d1a..4cdcdc3 100644 --- a/src/Event.hpp +++ b/src/Event.hpp @@ -63,9 +63,12 @@ public: class EventListener { friend class EventSystem; using HandlerType = std::function; - std::queue events; std::map handlers; - std::recursive_mutex mutex; + std::recursive_mutex handlersMutex; + std::queue events; + std::recursive_mutex eventsMutex; + std::queue rawEvents; + std::recursive_mutex rawEventsMutex; public: EventListener(); @@ -77,13 +80,13 @@ public: bool NotEmpty(); - void WaitEvent(); - void RegisterHandler(size_t eventId, const HandlerType &data); void RegisterHandler(const char *eventId, const HandlerType & data) { RegisterHandler(StrHash(eventId), data); } + + void PollEvents(); }; class EventSystem { @@ -96,33 +99,28 @@ public: static void PushEvent(size_t eventId, T data) { Event event(eventId, data); + std::lock_guard lock(EventSystem::listenersMutex); for (auto& listener : listeners) { - std::lock_guard lock(EventSystem::listenersMutex); - - auto it = listener->handlers.find(eventId); - if (it == listener->handlers.end()) - continue; - - listener->events.push(event); + std::lock_guard rawEventLock (listener->rawEventsMutex); + listener->rawEvents.push(event); } } template static void DirectEventCall(size_t eventId, T data) { Event event(eventId, data); - + std::lock_guard lock(EventSystem::listenersMutex); for (auto & listener : listeners) { - std::lock_guard lock(EventSystem::listenersMutex); - + std::lock_guard handlersLock (listener->handlersMutex); auto it = listener->handlers.find(eventId); if (it == listener->handlers.end()) - continue; + continue; it->second(event); } } }; -#define PUSH_EVENT(eventName, data) EventSystem::PushEvent(StrHash(eventName),data); LOG(INFO)<<"PUSH_EVENT "<