From e0ff6db98ea87a713ff53c10dbadbe27bfdf6bf8 Mon Sep 17 00:00:00 2001 From: lotodore Date: Mon, 26 Jan 2009 20:57:39 +0000 Subject: [PATCH] Create I/O service object in sender thread. --- src/net/clientcontext.h | 2 +- src/net/common/clientcontext.cpp | 5 +++-- src/net/common/senderthread.cpp | 16 +++++++++++++--- src/net/common/serverlobbythread.cpp | 5 +++-- src/net/senderthread.h | 8 ++++++-- src/net/serverlobbythread.h | 2 +- 6 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/net/clientcontext.h b/src/net/clientcontext.h index 012ce59f..328e66e8 100644 --- a/src/net/clientcontext.h +++ b/src/net/clientcontext.h @@ -111,7 +111,7 @@ private: ReceiveBuffer m_receiveBuffer; boost::shared_ptr m_senderCallback; boost::shared_ptr m_senderThread; - boost::asio::io_service m_ioService; + boost::shared_ptr m_ioService; }; #endif diff --git a/src/net/common/clientcontext.cpp b/src/net/common/clientcontext.cpp index 2fdcbd70..427c18ee 100644 --- a/src/net/common/clientcontext.cpp +++ b/src/net/common/clientcontext.cpp @@ -44,8 +44,9 @@ ClientContext::ClientContext() { bzero(&m_clientSockaddr, sizeof(m_clientSockaddr)); m_senderCallback.reset(new ClientSenderCallback()); - m_senderThread.reset(new SenderThread(*m_senderCallback, m_ioService)); + m_senderThread.reset(new SenderThread(*m_senderCallback)); m_senderThread->Start(); + m_ioService = dynamic_cast(m_senderThread.get())->GetIOService(); } ClientContext::~ClientContext() @@ -65,7 +66,7 @@ ClientContext::GetSocket() const void ClientContext::SetSocket(SOCKET sockfd) { - m_sessionData.reset(new SessionData(sockfd, SESSION_ID_GENERIC, m_senderThread, *m_senderCallback, m_ioService)); + m_sessionData.reset(new SessionData(sockfd, SESSION_ID_GENERIC, m_senderThread, *m_senderCallback, *m_ioService)); } boost::shared_ptr diff --git a/src/net/common/senderthread.cpp b/src/net/common/senderthread.cpp index 62e22eac..4b18c217 100644 --- a/src/net/common/senderthread.cpp +++ b/src/net/common/senderthread.cpp @@ -45,8 +45,8 @@ SenderThread::SendDataManager::HandleWrite(const boost::system::error_code& erro SetCompleted(true); } -SenderThread::SenderThread(SenderCallback &cb, boost::asio::io_service& ioService) -: m_callback(cb), m_ioService(ioService) +SenderThread::SenderThread(SenderCallback &cb) +: m_callback(cb) { } @@ -57,7 +57,9 @@ SenderThread::~SenderThread() void SenderThread::Start() { + m_ioServiceBarrier.reset(new boost::barrier(2)); Run(); + m_ioServiceBarrier->wait(); } void @@ -108,9 +110,17 @@ SenderThread::Send(boost::shared_ptr session, const NetPacketList & } } +boost::shared_ptr +SenderThread::GetIOService() +{ + return m_ioService; +} + void SenderThread::Main() { + m_ioService.reset(new boost::asio::io_service()); + m_ioServiceBarrier->wait(); while (!ShouldTerminate()) { { @@ -149,7 +159,7 @@ SenderThread::Main() i = next; } } - m_ioService.poll(); + m_ioService->poll(); Msleep(SEND_TIMEOUT_MSEC); } } diff --git a/src/net/common/serverlobbythread.cpp b/src/net/common/serverlobbythread.cpp index 3b9540b0..9907343c 100644 --- a/src/net/common/serverlobbythread.cpp +++ b/src/net/common/serverlobbythread.cpp @@ -84,7 +84,7 @@ ServerLobbyThread::ServerLobbyThread(GuiInterface &gui, ConfigFile *playerConfig m_statDataChanged(false), m_startTime(boost::posix_time::second_clock::local_time()) { m_senderCallback.reset(new ServerSenderCallback(*this)); - m_sender.reset(new SenderThread(*m_senderCallback, m_ioService)); + m_sender.reset(new SenderThread(*m_senderCallback)); m_receiver.reset(new ReceiverHelper); } @@ -350,6 +350,7 @@ ServerLobbyThread::Main() try { m_sender->Start(); + m_ioService = dynamic_cast(m_sender.get())->GetIOService(); while (!ShouldTerminate()) { @@ -1055,7 +1056,7 @@ ServerLobbyThread::HandleNewConnection(boost::shared_ptr connData) //} // Create a new session. - boost::shared_ptr sessionData(new SessionData(connData->ReleaseSocket(), m_curSessionId++, m_sender, *m_senderCallback, m_ioService)); + boost::shared_ptr sessionData(new SessionData(connData->ReleaseSocket(), m_curSessionId++, m_sender, *m_senderCallback, *m_ioService)); m_sessionManager.AddSession(sessionData); LOG_VERBOSE("Accepted connection - session #" << sessionData->GetId() << "."); diff --git a/src/net/senderthread.h b/src/net/senderthread.h index a1ff0c43..eda11038 100644 --- a/src/net/senderthread.h +++ b/src/net/senderthread.h @@ -35,7 +35,7 @@ class SessionData; class SenderThread : public Thread, public SenderInterface { public: - SenderThread(SenderCallback &cb, boost::asio::io_service& ioService); + SenderThread(SenderCallback &cb); virtual ~SenderThread(); virtual void Start(); @@ -45,6 +45,8 @@ public: virtual void Send(boost::shared_ptr session, boost::shared_ptr packet); virtual void Send(boost::shared_ptr session, const NetPacketList &packetList); + boost::shared_ptr GetIOService(); + protected: typedef std::list > SendDataList; @@ -101,7 +103,9 @@ private: mutable boost::mutex m_sendQueueMapMutex; SenderCallback &m_callback; - boost::asio::io_service &m_ioService; + boost::shared_ptr m_ioService; + + mutable boost::shared_ptr m_ioServiceBarrier; }; #endif diff --git a/src/net/serverlobbythread.h b/src/net/serverlobbythread.h index c8d45fbd..2b4c5140 100644 --- a/src/net/serverlobbythread.h +++ b/src/net/serverlobbythread.h @@ -212,7 +212,7 @@ private: const boost::posix_time::ptime m_startTime; - boost::asio::io_service m_ioService; + boost::shared_ptr m_ioService; }; #endif