diff --git a/pokerth_lib.pro b/pokerth_lib.pro index 44640b71..3b9e32bb 100644 --- a/pokerth_lib.pro +++ b/pokerth_lib.pro @@ -70,6 +70,7 @@ HEADERS += \ src/net/genericsocket.h \ src/net/netpacket.h \ src/net/resolverthread.h \ + src/net/senderinterface.h \ src/net/senderthread.h \ src/net/serveracceptthread.h \ src/net/servergamethread.h \ @@ -155,6 +156,7 @@ SOURCES += \ src/net/common/downloadhelper.cpp \ src/net/common/netpacket.cpp \ src/net/common/resolverthread.cpp \ + src/net/common/senderinterface.cpp \ src/net/common/senderthread.cpp \ src/net/common/sendercallback.cpp \ src/net/common/servercontext.cpp \ diff --git a/src/net/common/senderinterface.cpp b/src/net/common/senderinterface.cpp new file mode 100644 index 00000000..0300299c --- /dev/null +++ b/src/net/common/senderinterface.cpp @@ -0,0 +1,26 @@ +/*************************************************************************** + * Copyright (C) 2009 by Lothar May * + * * + * 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. * + ***************************************************************************/ + +#include + + +SenderInterface::~SenderInterface() +{ +} + diff --git a/src/net/common/senderthread.cpp b/src/net/common/senderthread.cpp index 5783890f..1433025d 100644 --- a/src/net/common/senderthread.cpp +++ b/src/net/common/senderthread.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2007 by Lothar May * + * Copyright (C) 2007-2009 by Lothar May * * * * 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 * @@ -44,6 +44,24 @@ SenderThread::~SenderThread() { } +void +SenderThread::Start() +{ + Run(); +} + +void +SenderThread::SignalStop() +{ + SignalTermination(); +} + +void +SenderThread::WaitStop() +{ + Join(SENDER_THREAD_TERMINATE_TIMEOUT); +} + void SenderThread::Send(boost::shared_ptr session, boost::shared_ptr packet) { diff --git a/src/net/common/servergamethread.cpp b/src/net/common/servergamethread.cpp index 721e4edf..8f3db82a 100644 --- a/src/net/common/servergamethread.cpp +++ b/src/net/common/servergamethread.cpp @@ -772,7 +772,7 @@ ServerGameThread::SetStateTimerFlag(unsigned flag) m_stateTimerFlag = flag; } -SenderThread & +SenderInterface & ServerGameThread::GetSender() { return GetLobbyThread().GetSender(); diff --git a/src/net/common/serverlobbythread.cpp b/src/net/common/serverlobbythread.cpp index 9d45b515..166ee679 100644 --- a/src/net/common/serverlobbythread.cpp +++ b/src/net/common/serverlobbythread.cpp @@ -344,7 +344,7 @@ ServerLobbyThread::GetNextGameId() void ServerLobbyThread::Main() { - GetSender().Run(); + GetSender().Start(); try { @@ -379,9 +379,8 @@ ServerLobbyThread::Main() TerminateGames(); - GetSender().SignalTermination(); - - GetSender().Join(SENDER_THREAD_TERMINATE_TIMEOUT); + GetSender().SignalStop(); + GetSender().WaitStop(); CleanupConnectQueue(); } @@ -1291,7 +1290,7 @@ ServerLobbyThread::GetCallback() return m_gui; } -SenderThread & +SenderInterface & ServerLobbyThread::GetSender() { assert(m_sender.get()); diff --git a/src/net/common/sessionmanager.cpp b/src/net/common/sessionmanager.cpp index 77a30a8b..75daa77d 100644 --- a/src/net/common/sessionmanager.cpp +++ b/src/net/common/sessionmanager.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2007 by Lothar May * + * Copyright (C) 2007-2009 by Lothar May * * * * 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 * @@ -18,7 +18,7 @@ ***************************************************************************/ #include -#include +#include #include #include @@ -357,7 +357,7 @@ SessionManager::GetRawSessionCount() } void -SessionManager::SendToAllSessions(SenderThread &sender, boost::shared_ptr packet, SessionData::State state) +SessionManager::SendToAllSessions(SenderInterface &sender, boost::shared_ptr packet, SessionData::State state) { boost::recursive_mutex::scoped_lock lock(m_sessionMapMutex); @@ -377,7 +377,7 @@ SessionManager::SendToAllSessions(SenderThread &sender, boost::shared_ptr packet, SessionData::State state) +SessionManager::SendLobbyMsgToAllSessions(SenderInterface &sender, boost::shared_ptr packet, SessionData::State state) { boost::recursive_mutex::scoped_lock lock(m_sessionMapMutex); @@ -397,7 +397,7 @@ SessionManager::SendLobbyMsgToAllSessions(SenderThread &sender, boost::shared_pt } void -SessionManager::SendToAllButOneSessions(SenderThread &sender, boost::shared_ptr packet, SessionId except, SessionData::State state) +SessionManager::SendToAllButOneSessions(SenderInterface &sender, boost::shared_ptr packet, SessionId except, SessionData::State state) { boost::recursive_mutex::scoped_lock lock(m_sessionMapMutex); diff --git a/src/net/senderinterface.h b/src/net/senderinterface.h new file mode 100644 index 00000000..38609c55 --- /dev/null +++ b/src/net/senderinterface.h @@ -0,0 +1,42 @@ +/*************************************************************************** + * Copyright (C) 2009 by Lothar May * + * * + * 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. * + ***************************************************************************/ +/* Interface for network sender functions. */ + +#ifndef _SENDERINTERFACE_H_ +#define _SENDERINTERFACE_H_ + +#include +#include +#include + +class SenderInterface +{ +public: + virtual ~SenderInterface(); + + virtual void Start() = 0; + virtual void SignalStop() = 0; + virtual void WaitStop() = 0; + + virtual void Send(boost::shared_ptr session, boost::shared_ptr packet) = 0; + virtual void Send(boost::shared_ptr session, const NetPacketList &packetList) = 0; +}; + +#endif + diff --git a/src/net/senderthread.h b/src/net/senderthread.h index 70e08ea3..caab1e50 100644 --- a/src/net/senderthread.h +++ b/src/net/senderthread.h @@ -22,6 +22,7 @@ #define _SENDERTHREAD_H_ #include +#include #include #include #include @@ -32,14 +33,18 @@ #define SENDER_THREAD_TERMINATE_TIMEOUT THREAD_WAIT_INFINITE -class SenderThread : public Thread +class SenderThread : public Thread, public SenderInterface { public: SenderThread(SenderCallback &cb); virtual ~SenderThread(); - void Send(boost::shared_ptr session, boost::shared_ptr packet); - void Send(boost::shared_ptr session, const NetPacketList &packetList); + virtual void Start(); + virtual void SignalStop(); + virtual void WaitStop(); + + virtual void Send(boost::shared_ptr session, boost::shared_ptr packet); + virtual void Send(boost::shared_ptr session, const NetPacketList &packetList); unsigned GetNumPacketsInQueue() const; bool operator<(const SenderThread &other) const; diff --git a/src/net/servergamethread.h b/src/net/servergamethread.h index 0a688a3c..ca536eab 100644 --- a/src/net/servergamethread.h +++ b/src/net/servergamethread.h @@ -121,7 +121,7 @@ protected: unsigned GetStateTimerFlag() const; void SetStateTimerFlag(unsigned flag); - SenderThread &GetSender(); + SenderInterface &GetSender(); ReceiverHelper &GetReceiver(); const StartData &GetStartData() const; diff --git a/src/net/serverlobbythread.h b/src/net/serverlobbythread.h index 2f307857..dd9f922f 100644 --- a/src/net/serverlobbythread.h +++ b/src/net/serverlobbythread.h @@ -35,7 +35,7 @@ #define NET_ADMIN_IRC_TERMINATE_TIMEOUT_MSEC 4000 -class SenderThread; +class SenderInterface; class ReceiverHelper; class ServerSenderCallback; class ServerGameThread; @@ -87,7 +87,7 @@ public: ServerStats GetStats() const; boost::posix_time::ptime GetStartTime() const; - SenderThread &GetSender(); + SenderInterface &GetSender(); protected: @@ -99,7 +99,6 @@ protected: typedef std::map > GameMap; typedef std::map TimerClientAddressMap; typedef std::list RemoveGameList; - typedef std::list > SenderThreadList; // Main function of the thread. virtual void Main(); @@ -191,7 +190,7 @@ private: GameMap m_gameMap; boost::shared_ptr m_receiver; - boost::shared_ptr m_sender; + boost::shared_ptr m_sender; boost::shared_ptr m_senderCallback; GuiInterface &m_gui; AvatarManager &m_avatarManager; diff --git a/src/net/sessionmanager.h b/src/net/sessionmanager.h index d829fa9f..13572b9d 100644 --- a/src/net/sessionmanager.h +++ b/src/net/sessionmanager.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2007 by Lothar May * + * Copyright (C) 2007-2009 by Lothar May * * * * 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 * @@ -29,7 +29,7 @@ #include #include -class SenderThread; +class SenderInterface; class NetPacket; struct SessionWrapper @@ -74,9 +74,9 @@ public: void Clear(); unsigned GetRawSessionCount(); - void SendToAllSessions(SenderThread &sender, boost::shared_ptr packet, SessionData::State state); - void SendLobbyMsgToAllSessions(SenderThread &sender, boost::shared_ptr packet, SessionData::State state); - void SendToAllButOneSessions(SenderThread &sender, boost::shared_ptr packet, SessionId except, SessionData::State state); + void SendToAllSessions(SenderInterface &sender, boost::shared_ptr packet, SessionData::State state); + void SendLobbyMsgToAllSessions(SenderInterface &sender, boost::shared_ptr packet, SessionData::State state); + void SendToAllButOneSessions(SenderInterface &sender, boost::shared_ptr packet, SessionId except, SessionData::State state); protected: