diff options
-rw-r--r-- | src/Event.cpp | 34 | ||||
-rw-r--r-- | src/Event.hpp | 32 |
2 files changed, 37 insertions, 29 deletions
diff --git a/src/Event.cpp b/src/Event.cpp index 7604609..08c9ee7 100644 --- a/src/Event.cpp +++ b/src/Event.cpp @@ -17,9 +17,10 @@ void EventListener::HandleEvent() { if (!NotEmpty()) return; - std::lock_guard<std::recursive_mutex> lock(EventSystem::listenersMutex); + std::lock_guard<std::recursive_mutex> eventsLock (eventsMutex); Event event = events.front(); - events.pop(); + events.pop(); + std::lock_guard<std::recursive_mutex> handlersLock (handlersMutex); if (handlers[event.id]) { handlers[event.id](event); } @@ -29,7 +30,8 @@ void EventListener::HandleAllEvents() { if (!NotEmpty()) return; - std::lock_guard<std::recursive_mutex> lock(EventSystem::listenersMutex); + std::lock_guard<std::recursive_mutex> eventsLock (eventsMutex); + std::lock_guard<std::recursive_mutex> handlersLock (handlersMutex); while (!events.empty()) { Event event = events.front(); events.pop(); @@ -40,19 +42,27 @@ void EventListener::HandleAllEvents() { } bool EventListener::NotEmpty() { + PollEvents(); + std::lock_guard<std::recursive_mutex> eventsLock (eventsMutex); bool ret = !events.empty(); return ret; } -void EventListener::WaitEvent() { - std::lock_guard<std::recursive_mutex> lock(EventSystem::listenersMutex); - while (events.empty()) { - mutex.unlock(); - mutex.lock(); - } -} - void EventListener::RegisterHandler(size_t eventId, const EventListener::HandlerType &data) { - std::lock_guard<std::recursive_mutex> lock(EventSystem::listenersMutex); + std::lock_guard<std::recursive_mutex> handlersLock (handlersMutex); handlers[eventId] = data; } + +void EventListener::PollEvents() { + std::lock_guard<std::recursive_mutex> rawLock (rawEventsMutex); + if (rawEvents.empty()) + return; + std::lock_guard<std::recursive_mutex> eventsLock (eventsMutex); + std::lock_guard<std::recursive_mutex> handlersLock (handlersMutex); + while (!rawEvents.empty()) { + Event event = rawEvents.front(); + rawEvents.pop(); + if (handlers[event.id]) + events.push(event); + } +} 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<void(const Event&)>; - std::queue<Event> events; std::map<size_t, HandlerType> handlers; - std::recursive_mutex mutex; + std::recursive_mutex handlersMutex; + std::queue<Event> events; + std::recursive_mutex eventsMutex; + std::queue<Event> 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<std::recursive_mutex> lock(EventSystem::listenersMutex); for (auto& listener : listeners) { - std::lock_guard<std::recursive_mutex> lock(EventSystem::listenersMutex); - - auto it = listener->handlers.find(eventId); - if (it == listener->handlers.end()) - continue; - - listener->events.push(event); + std::lock_guard<std::recursive_mutex> rawEventLock (listener->rawEventsMutex); + listener->rawEvents.push(event); } } template <typename T> static void DirectEventCall(size_t eventId, T data) { Event event(eventId, data); - + std::lock_guard<std::recursive_mutex> lock(EventSystem::listenersMutex); for (auto & listener : listeners) { - std::lock_guard<std::recursive_mutex> lock(EventSystem::listenersMutex); - + std::lock_guard<std::recursive_mutex> 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 "<<eventName; +#define PUSH_EVENT(eventName, data) EventSystem::PushEvent(StrHash(eventName),data) //; LOG(INFO)<<"PUSH_EVENT "<<eventName; -#define DIRECT_EVENT_CALL(eventName,data) EventSystem::DirectEventCall(StrHash(eventName),data); LOG(INFO)<<"DIRECT_CALL "<<eventName;
\ No newline at end of file +#define DIRECT_EVENT_CALL(eventName,data) EventSystem::DirectEventCall(StrHash(eventName),data) //; LOG(INFO)<<"DIRECT_CALL "<<eventName;
\ No newline at end of file |