diff --git a/src/server.cpp b/src/server.cpp index 81612155..40e2e63b 100755 --- a/src/server.cpp +++ b/src/server.cpp @@ -251,7 +251,8 @@ CServer::CServer ( const int iNewMaxNumChan, bAutoRunMinimized ( false ), strWelcomeMessage ( strNewWelcomeMessage ), eLicenceType ( eNLicenceType ), - bDisconnectAllClients ( bNDisconnectAllClients ) + bDisconnectAllClients ( bNDisconnectAllClients ), + pSignalHandler ( CSignalHandler::getSingletonP() ) { int iOpusError; int i; @@ -917,11 +918,7 @@ void CServer::OnCLDisconnection ( CHostAddress InetAddr ) void CServer::OnAboutToQuit() { - if ( IsRunning() ) - { - // Clean up - CleanShutdown(); - } + Stop(); // if server was registered at the central server, unregister on shutdown if ( GetServerListEnabled() ) @@ -936,33 +933,6 @@ void CServer::OnShutdown ( int ) QCoreApplication::instance()->exit(); } - -void CServer::CleanShutdown() { - Mutex.lock(); - { - bool oldDAC = bDisconnectAllClients; - - // This is to prevent new connections - bDisconnectAllClients = true; - - // This is to disconnect all connected channels - for ( int i = 0; i < iMaxNumChannels; i++ ) - { - if ( vecChannels[i].IsConnected() ) - { - vecChannels[i].Disconnect(); - } - } - - // This should tell the jam recorder than the jam has ended... - Stop(); - - // Restore the value in case we are not exiting - bDisconnectAllClients = oldDAC; - } - Mutex.unlock(); -} - void CServer::Start() { // only start if not already running diff --git a/src/server.h b/src/server.h index fc422c2c..d68cac38 100755 --- a/src/server.h +++ b/src/server.h @@ -258,8 +258,6 @@ protected: int GetNumberOfConnectedClients(); CVector CreateChannelList(); - CSignalHandler* pSignalHandler = CSignalHandler::getSingletonP(); - #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) virtual void CreateAndSendChanListForAllConChannels(); virtual void CreateAndSendChanListForThisChan ( const int iCurChanID ); @@ -306,8 +304,6 @@ protected: const CVector > vecvecsData, CVector& vecLevelsOut ); - void CleanShutdown(); - // do not use the vector class since CChannel does not have appropriate // copy constructor/operator CChannel vecChannels[MAX_NUM_CHANNELS]; @@ -375,6 +371,8 @@ protected: ELicenceType eLicenceType; bool bDisconnectAllClients; + CSignalHandler* pSignalHandler; + signals: void Started(); void Stopped(); diff --git a/src/signalhandler.cpp b/src/signalhandler.cpp index 648506e3..4c37d018 100755 --- a/src/signalhandler.cpp +++ b/src/signalhandler.cpp @@ -20,6 +20,43 @@ * this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + ****************************************************************************** + * + * This code contains some ideas derived from QCtrlSignals + * https://github.com/Skycoder42/QCtrlSignals.git + * - mostly the singleton and emitSignal code, plus some of the structure + * - virtually everything else is common knowledge across SourceForge answers + * + * BSD 3-Clause License + * + * Copyright (c) 2016, Felix Barz + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * \******************************************************************************/ #include "signalhandler.h" diff --git a/src/signalhandler.h b/src/signalhandler.h index d1e571d7..1263ee6a 100755 --- a/src/signalhandler.h +++ b/src/signalhandler.h @@ -1,140 +1,177 @@ -/******************************************************************************\ - * Copyright (c) 2020 - * - * Author(s): - * Peter L Jones - * - ****************************************************************************** - * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * -\******************************************************************************/ - -#pragma once - -#include -#include -#include -#include -#include -#include - -#ifdef _WIN32 -#include -#include -#include -#include -#include -#else -#include -#include -#include -#include -#include -#include -#include -#endif - -class CSignalBase; - -class CSignalHandler : public QObject -{ - Q_OBJECT - - friend class CSignalBase; - friend class CSignalHandlerSingleton; - -public: - static CSignalHandler* getSingletonP(); - - bool emitSignal ( int ); - -#ifndef _WIN32 -public slots: - void OnSocketNotify ( int socket ); -#endif - -signals: - void ShutdownSignal ( int sigNum ); - -private: - QScopedPointer pSignalBase; - - explicit CSignalHandler(); - ~CSignalHandler() override; -}; - -// ---------------------------------------------------------- - -class CSignalBase -{ - Q_DISABLE_COPY ( CSignalBase ) - -public: - static CSignalBase* withSignalHandler ( CSignalHandler* ); - virtual ~CSignalBase(); - - virtual QReadWriteLock* getLock() const = 0; - - QSet sHandledSigNums; - -protected: - CSignalBase ( CSignalHandler* ); - - CSignalHandler* pSignalHandler; - - template - static T *getSelf() - { - return static_cast( CSignalHandler::getSingletonP()->pSignalBase.data() ); - } - -}; - -#ifdef _WIN32 - -class CSignalWin : public CSignalBase -{ -public: - CSignalWin ( CSignalHandler* ); - ~CSignalWin() override; - - virtual QReadWriteLock* getLock() const override; - -private: - mutable QReadWriteLock lock; - - static BOOL WINAPI signalHandler ( _In_ DWORD sigNum ); -}; - -#else - -class CSignalUnix : public CSignalBase -{ -public: - CSignalUnix ( CSignalHandler* ); - ~CSignalUnix() override; - - virtual QReadWriteLock* getLock() const override; - -private: - QSocketNotifier* socketNotifier = nullptr; - bool setSignalHandled ( int sigNum, bool state ); - - static int socketPair[2]; - static void signalHandler ( int sigNum ); -}; - -#endif +/******************************************************************************\ + * Copyright (c) 2020 + * + * Author(s): + * Peter L Jones + * + ****************************************************************************** + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ****************************************************************************** + * + * This code contains some ideas derived from QCtrlSignals + * https://github.com/Skycoder42/QCtrlSignals.git + * - mostly the singleton and emitSignal code, plus some of the structure + * - virtually everything else is common knowledge across SourceForge answers + * + * BSD 3-Clause License + * + * Copyright (c) 2016, Felix Barz + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * +\******************************************************************************/ + +#pragma once + +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#include +#include +#include +#include +#include +#else +#include +#include +#include +#include +#include +#include +#include +#endif + +class CSignalBase; + +class CSignalHandler : public QObject +{ + Q_OBJECT + + friend class CSignalBase; + friend class CSignalHandlerSingleton; + +public: + static CSignalHandler* getSingletonP(); + + bool emitSignal ( int ); + +#ifndef _WIN32 +public slots: + void OnSocketNotify ( int socket ); +#endif + +signals: + void ShutdownSignal ( int sigNum ); + +private: + QScopedPointer pSignalBase; + + explicit CSignalHandler(); + ~CSignalHandler() override; +}; + +// ---------------------------------------------------------- + +class CSignalBase +{ + Q_DISABLE_COPY ( CSignalBase ) + +public: + static CSignalBase* withSignalHandler ( CSignalHandler* ); + virtual ~CSignalBase(); + + virtual QReadWriteLock* getLock() const = 0; + + QSet sHandledSigNums; + +protected: + CSignalBase ( CSignalHandler* ); + + CSignalHandler* pSignalHandler; + + template + static T *getSelf() + { + return static_cast( CSignalHandler::getSingletonP()->pSignalBase.data() ); + } + +}; + +#ifdef _WIN32 + +class CSignalWin : public CSignalBase +{ +public: + CSignalWin ( CSignalHandler* ); + ~CSignalWin() override; + + virtual QReadWriteLock* getLock() const override; + +private: + mutable QReadWriteLock lock; + + static BOOL WINAPI signalHandler ( _In_ DWORD sigNum ); +}; + +#else + +class CSignalUnix : public CSignalBase +{ +public: + CSignalUnix ( CSignalHandler* ); + ~CSignalUnix() override; + + virtual QReadWriteLock* getLock() const override; + +private: + QSocketNotifier* socketNotifier = nullptr; + bool setSignalHandled ( int sigNum, bool state ); + + static int socketPair[2]; + static void signalHandler ( int sigNum ); +}; + +#endif