Removed redundant 'Bloom' namespace from entire codebase
This commit is contained in:
@@ -6,80 +6,77 @@
|
||||
#include "src/Logger/Logger.hpp"
|
||||
#include "src/Exceptions/Exception.hpp"
|
||||
|
||||
namespace Bloom
|
||||
{
|
||||
void SignalHandler::run() {
|
||||
try {
|
||||
this->startup();
|
||||
const auto signalSet = this->getRegisteredSignalSet();
|
||||
int signalNumber = 0;
|
||||
void SignalHandler::run() {
|
||||
try {
|
||||
this->startup();
|
||||
const auto signalSet = this->getRegisteredSignalSet();
|
||||
int signalNumber = 0;
|
||||
|
||||
Logger::debug("SignalHandler ready");
|
||||
while(Thread::getThreadState() == ThreadState::READY) {
|
||||
if (::sigwait(&signalSet, &signalNumber) == 0) {
|
||||
Logger::debug("SIGNAL " + std::to_string(signalNumber) + " received");
|
||||
Logger::debug("SignalHandler ready");
|
||||
while(Thread::getThreadState() == ThreadState::READY) {
|
||||
if (::sigwait(&signalSet, &signalNumber) == 0) {
|
||||
Logger::debug("SIGNAL " + std::to_string(signalNumber) + " received");
|
||||
|
||||
const auto& handlerIt = this->handlersBySignalNum.find(signalNumber);
|
||||
if (handlerIt != this->handlersBySignalNum.end()) {
|
||||
// We have a registered handler for this signal.
|
||||
handlerIt->second();
|
||||
}
|
||||
const auto& handlerIt = this->handlersBySignalNum.find(signalNumber);
|
||||
if (handlerIt != this->handlersBySignalNum.end()) {
|
||||
// We have a registered handler for this signal.
|
||||
handlerIt->second();
|
||||
}
|
||||
}
|
||||
|
||||
} catch (std::exception& exception) {
|
||||
Logger::error("SignalHandler fatal error: " + std::string(exception.what()));
|
||||
}
|
||||
|
||||
Logger::info("Shutting down SignalHandler");
|
||||
this->threadState = ThreadState::STOPPED;
|
||||
} catch (std::exception& exception) {
|
||||
Logger::error("SignalHandler fatal error: " + std::string(exception.what()));
|
||||
}
|
||||
|
||||
void SignalHandler::startup() {
|
||||
this->setName("SH");
|
||||
this->threadState = ThreadState::STARTING;
|
||||
Logger::debug("Starting SignalHandler");
|
||||
// Block all signal interrupts
|
||||
auto signalSet = this->getRegisteredSignalSet();
|
||||
::sigprocmask(SIG_SETMASK, &signalSet, NULL);
|
||||
Logger::info("Shutting down SignalHandler");
|
||||
this->threadState = ThreadState::STOPPED;
|
||||
}
|
||||
|
||||
// Register handlers
|
||||
this->handlersBySignalNum.insert(std::pair(
|
||||
SIGINT,
|
||||
std::bind(&SignalHandler::triggerApplicationShutdown, this)
|
||||
));
|
||||
void SignalHandler::startup() {
|
||||
this->setName("SH");
|
||||
this->threadState = ThreadState::STARTING;
|
||||
Logger::debug("Starting SignalHandler");
|
||||
// Block all signal interrupts
|
||||
auto signalSet = this->getRegisteredSignalSet();
|
||||
::sigprocmask(SIG_SETMASK, &signalSet, NULL);
|
||||
|
||||
this->handlersBySignalNum.insert(std::pair(
|
||||
SIGTERM,
|
||||
std::bind(&SignalHandler::triggerApplicationShutdown, this)
|
||||
));
|
||||
// Register handlers
|
||||
this->handlersBySignalNum.insert(std::pair(
|
||||
SIGINT,
|
||||
std::bind(&SignalHandler::triggerApplicationShutdown, this)
|
||||
));
|
||||
|
||||
// It's possible that the SignalHandler has been instructed to shut down, before it could finish starting up.
|
||||
if (this->getThreadState() != ThreadState::SHUTDOWN_INITIATED) {
|
||||
this->threadState = ThreadState::READY;
|
||||
}
|
||||
}
|
||||
this->handlersBySignalNum.insert(std::pair(
|
||||
SIGTERM,
|
||||
std::bind(&SignalHandler::triggerApplicationShutdown, this)
|
||||
));
|
||||
|
||||
::sigset_t SignalHandler::getRegisteredSignalSet() const {
|
||||
::sigset_t set = {};
|
||||
if (::sigfillset(&set) == -1) {
|
||||
throw Exceptions::Exception("::sigfillset() failed - error number: " + std::to_string(errno));
|
||||
}
|
||||
|
||||
return set;
|
||||
}
|
||||
|
||||
void SignalHandler::triggerApplicationShutdown() {
|
||||
Logger::warning("Shutdown signal received");
|
||||
this->shutdownSignalsReceived++;
|
||||
|
||||
if (this->shutdownSignalsReceived > 1) {
|
||||
// User has likely run out of patience
|
||||
Logger::warning("Aborting immediately");
|
||||
std::exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
Logger::info("Attempting clean shutdown");
|
||||
EventManager::triggerEvent(std::make_shared<Events::ShutdownApplication>());
|
||||
// It's possible that the SignalHandler has been instructed to shut down, before it could finish starting up.
|
||||
if (this->getThreadState() != ThreadState::SHUTDOWN_INITIATED) {
|
||||
this->threadState = ThreadState::READY;
|
||||
}
|
||||
}
|
||||
|
||||
::sigset_t SignalHandler::getRegisteredSignalSet() const {
|
||||
::sigset_t set = {};
|
||||
if (::sigfillset(&set) == -1) {
|
||||
throw Exceptions::Exception("::sigfillset() failed - error number: " + std::to_string(errno));
|
||||
}
|
||||
|
||||
return set;
|
||||
}
|
||||
|
||||
void SignalHandler::triggerApplicationShutdown() {
|
||||
Logger::warning("Shutdown signal received");
|
||||
this->shutdownSignalsReceived++;
|
||||
|
||||
if (this->shutdownSignalsReceived > 1) {
|
||||
// User has likely run out of patience
|
||||
Logger::warning("Aborting immediately");
|
||||
std::exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
Logger::info("Attempting clean shutdown");
|
||||
EventManager::triggerEvent(std::make_shared<Events::ShutdownApplication>());
|
||||
}
|
||||
|
||||
@@ -6,57 +6,54 @@
|
||||
#include "src/EventManager/EventManager.hpp"
|
||||
#include "src/Helpers/Synchronised.hpp"
|
||||
|
||||
namespace Bloom
|
||||
class SignalHandler: public Thread
|
||||
{
|
||||
class SignalHandler: public Thread
|
||||
{
|
||||
public:
|
||||
SignalHandler() = default;
|
||||
public:
|
||||
SignalHandler() = default;
|
||||
|
||||
/**
|
||||
* Entry point for SignalHandler thread.
|
||||
*/
|
||||
void run();
|
||||
/**
|
||||
* Entry point for SignalHandler thread.
|
||||
*/
|
||||
void run();
|
||||
|
||||
/**
|
||||
* Triggers the shutdown of the SignalHandler thread.
|
||||
*/
|
||||
void triggerShutdown() {
|
||||
this->threadState = ThreadState::SHUTDOWN_INITIATED;
|
||||
};
|
||||
|
||||
private:
|
||||
/**
|
||||
* Mapping of signal numbers to handler functions.
|
||||
*/
|
||||
std::map<int, std::function<void()>> handlersBySignalNum;
|
||||
|
||||
/**
|
||||
* We keep record of the number of shutdown signals received. See definition of triggerApplicationShutdown()
|
||||
* for more on this.
|
||||
*/
|
||||
int shutdownSignalsReceived = 0;
|
||||
|
||||
/**
|
||||
* Initiates the SignalHandler thread.
|
||||
*/
|
||||
void startup();
|
||||
|
||||
/**
|
||||
* Fetches all signals currently of interest to the application.
|
||||
*
|
||||
* Currently this just returns a set of all signals (using sigfillset())
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
[[nodiscard]] ::sigset_t getRegisteredSignalSet() const;
|
||||
|
||||
/**
|
||||
* Handler for SIGINT, SIGTERM, etc signals.
|
||||
*
|
||||
* Will trigger a ShutdownApplication event to kick-off a clean shutdown or it will terminate the
|
||||
* program immediately if numerous SIGINT signals have been received.
|
||||
*/
|
||||
void triggerApplicationShutdown();
|
||||
/**
|
||||
* Triggers the shutdown of the SignalHandler thread.
|
||||
*/
|
||||
void triggerShutdown() {
|
||||
this->threadState = ThreadState::SHUTDOWN_INITIATED;
|
||||
};
|
||||
}
|
||||
|
||||
private:
|
||||
/**
|
||||
* Mapping of signal numbers to handler functions.
|
||||
*/
|
||||
std::map<int, std::function<void()>> handlersBySignalNum;
|
||||
|
||||
/**
|
||||
* We keep record of the number of shutdown signals received. See definition of triggerApplicationShutdown()
|
||||
* for more on this.
|
||||
*/
|
||||
int shutdownSignalsReceived = 0;
|
||||
|
||||
/**
|
||||
* Initiates the SignalHandler thread.
|
||||
*/
|
||||
void startup();
|
||||
|
||||
/**
|
||||
* Fetches all signals currently of interest to the application.
|
||||
*
|
||||
* Currently this just returns a set of all signals (using sigfillset())
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
[[nodiscard]] ::sigset_t getRegisteredSignalSet() const;
|
||||
|
||||
/**
|
||||
* Handler for SIGINT, SIGTERM, etc signals.
|
||||
*
|
||||
* Will trigger a ShutdownApplication event to kick-off a clean shutdown or it will terminate the
|
||||
* program immediately if numerous SIGINT signals have been received.
|
||||
*/
|
||||
void triggerApplicationShutdown();
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user