From d5c754b58013ef929903ceea9db3345ee2086f72 Mon Sep 17 00:00:00 2001 From: Peter L Jones Date: Fri, 15 May 2020 20:01:57 +0100 Subject: [PATCH] Expanded signal handling --- src/server.cpp | 29 +++++++++++++++++++++++++---- src/server.h | 2 +- src/signalhandler.cpp | 8 +++++--- src/signalhandler.h | 4 ++-- 4 files changed, 33 insertions(+), 10 deletions(-) diff --git a/src/server.cpp b/src/server.cpp index 87af18bb..b6c7f3b2 100755 --- a/src/server.cpp +++ b/src/server.cpp @@ -471,8 +471,8 @@ CServer::CServer ( const int iNewMaxNumChan, this, SLOT ( OnAboutToQuit() ) ); QObject::connect ( pSignalHandler, - SIGNAL ( ShutdownSignal ( int ) ), - this, SLOT ( OnShutdown ( int ) ) ); + SIGNAL ( HandledSignal ( int ) ), + this, SLOT ( OnHandledSignal ( int ) ) ); connectChannelSignalsToServerSlots(); @@ -665,10 +665,31 @@ void CServer::OnAboutToQuit() } } -void CServer::OnShutdown ( int ) +void CServer::OnHandledSignal ( int sigNum ) { - // This should trigger OnAboutToQuit +#ifdef _WIN32 + + // Windows does not actually get OnHandledSignal triggered QCoreApplication::instance()->exit(); + Q_UNUSED ( sigNum ) + +#else + + switch ( sigNum ) + { + + case SIGINT: + case SIGTERM: + // This should trigger OnAboutToQuit + QCoreApplication::instance()->exit(); + break; + + default: + break; + + } + +#endif } void CServer::Start() diff --git a/src/server.h b/src/server.h index da38bc35..52633b4a 100755 --- a/src/server.h +++ b/src/server.h @@ -441,5 +441,5 @@ public slots: void OnAboutToQuit(); - void OnShutdown ( int ); + void OnHandledSignal ( int sigNum ); }; diff --git a/src/signalhandler.cpp b/src/signalhandler.cpp index 4c37d018..d0205c9e 100755 --- a/src/signalhandler.cpp +++ b/src/signalhandler.cpp @@ -75,7 +75,7 @@ CSignalHandler* CSignalHandler::getSingletonP() { return singleton; } bool CSignalHandler::emitSignal ( int sigNum ) { - return QMetaObject::invokeMethod( singleton, "ShutdownSignal", Qt::QueuedConnection, Q_ARG( int, sigNum ) ); + return QMetaObject::invokeMethod( singleton, "HandledSignal", Qt::QueuedConnection, Q_ARG( int, sigNum ) ); } #ifndef _WIN32 @@ -124,11 +124,11 @@ QReadWriteLock* CSignalWin::getLock() const return &lock; } -BOOL WINAPI CSignalWin::signalHandler ( _In_ DWORD sigNum ) +BOOL WINAPI CSignalWin::signalHandler ( _In_ DWORD ) { auto self = getSelf(); QReadLocker lock ( self->getLock() ); - return self->pSignalHandler->emitSignal ( static_cast( sigNum ) ); + return self->pSignalHandler->emitSignal ( -1 ); } #else @@ -145,12 +145,14 @@ CSignalUnix::CSignalUnix ( CSignalHandler* nPSignalHandler ) : socketNotifier->setEnabled ( true ); + setSignalHandled ( SIGUSR1, true ); setSignalHandled ( SIGINT, true ); setSignalHandled ( SIGTERM, true ); } } CSignalUnix::~CSignalUnix() { + setSignalHandled ( SIGUSR1, false ); setSignalHandled ( SIGINT, false ); setSignalHandled ( SIGTERM, false ); } diff --git a/src/signalhandler.h b/src/signalhandler.h index 1263ee6a..59409d13 100755 --- a/src/signalhandler.h +++ b/src/signalhandler.h @@ -104,7 +104,7 @@ public slots: #endif signals: - void ShutdownSignal ( int sigNum ); + void HandledSignal ( int sigNum ); private: QScopedPointer pSignalBase; @@ -153,7 +153,7 @@ public: private: mutable QReadWriteLock lock; - static BOOL WINAPI signalHandler ( _In_ DWORD sigNum ); + static BOOL WINAPI signalHandler ( _In_ DWORD ); }; #else