diff options
Diffstat (limited to 'src/trinitycore')
-rw-r--r-- | src/trinitycore/Master.cpp | 86 | ||||
-rw-r--r-- | src/trinitycore/Master.h | 4 |
2 files changed, 39 insertions, 51 deletions
diff --git a/src/trinitycore/Master.cpp b/src/trinitycore/Master.cpp index ff9085a62ab..a4618e01562 100644 --- a/src/trinitycore/Master.cpp +++ b/src/trinitycore/Master.cpp @@ -22,10 +22,11 @@ \ingroup Trinityd */ -#include <ace/OS_NS_signal.h> +#include <ace/Sig_Handler.h> #include "Common.h" #include "SystemConfig.h" +#include "SignalHandler.h" #include "World.h" #include "WorldRunnable.h" #include "WorldSocket.h" @@ -60,6 +61,28 @@ INSTANTIATE_SINGLETON_1( Master ); volatile uint32 Master::m_masterLoopCounter = 0; +/// Handle cored's termination signals +class CoredSignalHandler : public Trinity::SignalHandler +{ + public: + virtual void HandleSignal(int SigNum) + { + switch (SigNum) + { + case SIGINT: + World::StopNow(RESTART_EXIT_CODE); + break; + case SIGTERM: + #ifdef _WIN32 + case SIGBREAK: + if (m_ServiceStatus != 1) + #endif /* _WIN32 */ + World::StopNow(SHUTDOWN_EXIT_CODE); + break; + } + } +}; + class FreezeDetectorRunnable : public ACE_Based::Runnable { public: @@ -233,8 +256,21 @@ int Master::Run() ///- Initialize the World sWorld.SetInitialWorldSettings(); - ///- Catch termination signals - _HookSignals(); + + // Initialise the signal handlers + CoredSignalHandler SignalINT, SignalTERM; + #ifdef _WIN32 + CoredSignalHandler SignalBREAK; + #endif /* _WIN32 */ + + // Register realmd's signal handlers + ACE_Sig_Handler Handler; + Handler.register_handler(SIGINT, &SignalINT); + Handler.register_handler(SIGTERM, &SignalTERM); + #ifdef _WIN32 + Handler.register_handler(SIGBREAK, &SignalBREAK); + #endif /* _WIN32 */ + ///- Launch WorldRunnable thread ACE_Based::Thread world_thread(new WorldRunnable); @@ -329,9 +365,6 @@ int Master::Run() // set server offline LoginDatabase.PExecute("UPDATE realmlist SET color = 2 WHERE id = '%d'",realmID); - ///- Remove signal handling before leaving - _UnhookSignals(); - // when the main thread closes the singletons get unloaded // since worldrunnable uses them, it will crash if unloaded after master world_thread.wait(); @@ -507,44 +540,3 @@ void Master::clearOnlineAccounts() // Battleground instance ids reset at server restart CharacterDatabase.Execute("UPDATE character_battleground_data SET instance_id = 0"); } - -/// Handle termination signals -void Master::_OnSignal(int s) -{ - switch (s) - { - case SIGINT: - World::StopNow(RESTART_EXIT_CODE); - break; - case SIGTERM: - #ifdef _WIN32 - case SIGBREAK: - if (m_ServiceStatus != 1) - #endif - World::StopNow(SHUTDOWN_EXIT_CODE); - break; - } - - signal(s, _OnSignal); -} - -/// Define hook '_OnSignal' for all termination signals -void Master::_HookSignals() -{ - signal(SIGINT, _OnSignal); - signal(SIGTERM, _OnSignal); - #ifdef _WIN32 - if (m_ServiceStatus != 1) - signal(SIGBREAK, _OnSignal); - #endif -} - -/// Unhook the signals before leaving -void Master::_UnhookSignals() -{ - signal(SIGINT, 0); - signal(SIGTERM, 0); - #ifdef _WIN32 - signal(SIGBREAK, 0); - #endif -} diff --git a/src/trinitycore/Master.h b/src/trinitycore/Master.h index 9fefb6c083c..76ff2af1457 100644 --- a/src/trinitycore/Master.h +++ b/src/trinitycore/Master.h @@ -40,10 +40,6 @@ class Master private: bool _StartDB(); - void _HookSignals(); - void _UnhookSignals(); - static void _OnSignal(int s); - void clearOnlineAccounts(); }; |