diff options
author | LaG1924 <12997935+LaG1924@users.noreply.github.com> | 2017-07-29 16:55:16 +0200 |
---|---|---|
committer | LaG1924 <12997935+LaG1924@users.noreply.github.com> | 2017-07-29 16:55:16 +0200 |
commit | f942405184c2d6067fb5303b58a225edf7e452b1 (patch) | |
tree | 83e70c7e3019e5b195c9caf41194b2113fa76d7f /src/Event.cpp | |
parent | 2017-07-26 (diff) | |
download | AltCraft-f942405184c2d6067fb5303b58a225edf7e452b1.tar AltCraft-f942405184c2d6067fb5303b58a225edf7e452b1.tar.gz AltCraft-f942405184c2d6067fb5303b58a225edf7e452b1.tar.bz2 AltCraft-f942405184c2d6067fb5303b58a225edf7e452b1.tar.lz AltCraft-f942405184c2d6067fb5303b58a225edf7e452b1.tar.xz AltCraft-f942405184c2d6067fb5303b58a225edf7e452b1.tar.zst AltCraft-f942405184c2d6067fb5303b58a225edf7e452b1.zip |
Diffstat (limited to 'src/Event.cpp')
-rw-r--r-- | src/Event.cpp | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/src/Event.cpp b/src/Event.cpp new file mode 100644 index 0000000..ff16178 --- /dev/null +++ b/src/Event.cpp @@ -0,0 +1,100 @@ +#include "Event.hpp" +#include <easylogging++.h> + +std::queue <Event> EventAgregator::eventsToHandle; +std::mutex EventAgregator::queueMutex; +bool EventAgregator::isStarted = false; +std::vector<EventListener*> EventAgregator::listeners; +std::mutex EventAgregator::listenersMutex; + +EventListener::EventListener() { + EventAgregator::RegisterListener(*this); +} + +EventListener::~EventListener() { + EventAgregator::UnregisterListener(*this); +} + +void EventListener::PushEvent(Event event) { + eventsMutex.lock(); + events.push(event); + eventsMutex.unlock(); +} + +bool EventListener::IsEventsQueueIsNotEmpty() { + eventsMutex.lock(); + bool value = !events.empty(); + eventsMutex.unlock(); + return value; +} + + +void EventListener::RegisterHandler(EventType type, EventListener::HandlerFunc handler) { + handlers[type] = handler; +} + +void EventListener::HandleEvent() { + eventsMutex.lock(); + if (events.empty()) { + eventsMutex.unlock(); + return; + } + Event event = events.front(); + events.pop(); + eventsMutex.unlock(); + auto function = handlers[event.type]; + function(event.data); +} + + + +void EventAgregator::RegisterListener(EventListener &listener) { + listenersMutex.lock(); + LOG(WARNING)<<"Registered handler "<<&listener; + listeners.push_back(&listener); + listenersMutex.unlock(); +} + +void EventAgregator::UnregisterListener(EventListener &listener) { + listenersMutex.lock(); + LOG(WARNING)<<"Unregistered handler "<<&listener; + listeners.erase(std::find(listeners.begin(), listeners.end(), &listener)); + listenersMutex.unlock(); +} + +void EventAgregator::PushEvent(EventType type, EventData data) { + Event event; + event.type = type; + event.data = data; + eventsToHandle.push(event); + if (!isStarted) { + isStarted = true; + std::thread(&EventAgregator::EventHandlingLoop).detach(); + } +} + +void EventAgregator::EventHandlingLoop() { + while (true) { + queueMutex.lock(); + if (!eventsToHandle.empty()) { + auto queue = eventsToHandle; + while (!eventsToHandle.empty()) + eventsToHandle.pop(); + queueMutex.unlock(); + + while (!queue.empty()) { + auto event = queue.front(); + listenersMutex.lock(); + for (auto& listener : listeners) { + LOG(ERROR)<<"Listener notified about event"; + listener->PushEvent(event); + } + listenersMutex.unlock(); + queue.pop(); + } + + queueMutex.lock(); + } + queueMutex.unlock(); + } +} |