diff --git a/src/DebugServers/DebugServer.cpp b/src/DebugServers/DebugServer.cpp index ae77f553..83a72948 100644 --- a/src/DebugServers/DebugServer.cpp +++ b/src/DebugServers/DebugServer.cpp @@ -32,7 +32,6 @@ void DebugServer::startup() { this->eventManager.registerListener(this->eventListener); this->interruptEventNotifier = std::make_shared(); - this->interruptEventNotifier->init(); this->eventListener->setInterruptEventNotifier(this->interruptEventNotifier); // Register event handlers @@ -52,8 +51,8 @@ void DebugServer::shutdown() { this->setThreadState(ThreadState::SHUTDOWN_INITIATED); Logger::info("Shutting down DebugServer"); this->close(); - this->interruptEventNotifier->close(); this->setThreadStateAndEmitEvent(ThreadState::STOPPED); + this->eventManager.deregisterListener(this->eventListener->getId()); } void DebugServer::onShutdownDebugServerEvent(EventPointer event) { diff --git a/src/EventManager/EventListener.cpp b/src/EventManager/EventListener.cpp index df9a94ac..1bdf2eff 100644 --- a/src/EventManager/EventListener.cpp +++ b/src/EventManager/EventListener.cpp @@ -31,7 +31,7 @@ void EventListener::registerEvent(GenericEventPointer event) { eventQueueByType[eventName].push(event); this->eventQueueByEventTypeCV.notify_all(); - if (this->interruptEventNotifier != nullptr) { + if (this->interruptEventNotifier != nullptr && this->interruptEventNotifier->isInitialised()) { this->interruptEventNotifier->notify(); } } diff --git a/src/Helpers/EventNotifier.hpp b/src/Helpers/EventNotifier.hpp index 08d3812d..a9c1bc35 100644 --- a/src/Helpers/EventNotifier.hpp +++ b/src/Helpers/EventNotifier.hpp @@ -4,6 +4,7 @@ #include #include #include +#include #include "src/Exceptions/Exception.hpp" @@ -26,9 +27,7 @@ namespace Bloom { private: int fileDescriptor = -1; - - public: - EventNotifier() = default; + std::atomic initialised = false; void init() { this->fileDescriptor = ::eventfd(0, EFD_NONBLOCK); @@ -37,12 +36,34 @@ namespace Bloom throw Exceptions::Exception("Failed to create new eventfd object - error number: " + std::to_string(errno)); } + + this->initialised = true; + } + + void close() { + ::close(this->fileDescriptor); + this->initialised = false; + } + + public: + EventNotifier() { + this->init(); + }; + + ~EventNotifier() { + if (this->initialised) { + this->close(); + } } int getFileDescriptor() { return this->fileDescriptor; } + bool isInitialised() { + return this->initialised; + } + void notify() { if (::eventfd_write(this->fileDescriptor, 1) < 0) { throw Exceptions::Exception("Failed to increment eventfd counter - error number: " @@ -57,9 +78,5 @@ namespace Bloom "error number: " + std::to_string(errno)); } } - - void close() { - ::close(this->fileDescriptor); - } }; -} \ No newline at end of file +}