From dafd78c578ffe8ec67ea32582d2588e8d9aeb32e Mon Sep 17 00:00:00 2001 From: lotodore Date: Sun, 13 Feb 2011 17:24:40 +0000 Subject: [PATCH] Fixing player counter - only count sessions which are established (after login). Send number of players in announce message. (Bug found through test case.) --- src/net/common/serverlobbythread.cpp | 7 ++++++- src/net/common/sessionmanager.cpp | 17 +++++++++++++++++ src/net/sessionmanager.h | 1 + 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/net/common/serverlobbythread.cpp b/src/net/common/serverlobbythread.cpp index 22cb2656..0d34f1ed 100644 --- a/src/net/common/serverlobbythread.cpp +++ b/src/net/common/serverlobbythread.cpp @@ -272,6 +272,10 @@ ServerLobbyThread::AddConnection(boost::shared_ptr sock) netAnnounce->serverType = serverType_serverTypeInternetAuth; break; } + { + boost::mutex::scoped_lock lock(m_statMutex); + netAnnounce->numPlayersOnServer = m_statData.numberOfPlayersOnServer; + } GetSender().Send(sessionData, packet); sock->async_read_some( @@ -1984,7 +1988,8 @@ void ServerLobbyThread::UpdateStatisticsNumberOfPlayers() { ServerStats stats; - unsigned curNumberOfPlayersOnServer = m_sessionManager.GetRawSessionCount() + m_gameSessionManager.GetRawSessionCount(); + // Get all logged-in sessions and all sessions within a game. + unsigned curNumberOfPlayersOnServer = m_sessionManager.GetEstablishedSessionCount() + m_gameSessionManager.GetRawSessionCount(); { boost::mutex::scoped_lock lock(m_statMutex); if (curNumberOfPlayersOnServer != m_statData.numberOfPlayersOnServer) { diff --git a/src/net/common/sessionmanager.cpp b/src/net/common/sessionmanager.cpp index c4117a59..e9894f6c 100644 --- a/src/net/common/sessionmanager.cpp +++ b/src/net/common/sessionmanager.cpp @@ -295,6 +295,23 @@ SessionManager::GetRawSessionCount() return m_sessionMap.size(); } +unsigned +SessionManager::GetEstablishedSessionCount() +{ + unsigned counter = 0; + boost::recursive_mutex::scoped_lock lock(m_sessionMapMutex); + + SessionMap::const_iterator i = m_sessionMap.begin(); + SessionMap::const_iterator end = m_sessionMap.end(); + + while (i != end) { + if ((*i).second.sessionData->GetState() >= SessionData::Established) + ++counter; + ++i; + } + return counter; +} + void SessionManager::SendToAllSessions(SenderHelper &sender, boost::shared_ptr packet, SessionData::State state) { diff --git a/src/net/sessionmanager.h b/src/net/sessionmanager.h index 6d73de91..6fca94e3 100644 --- a/src/net/sessionmanager.h +++ b/src/net/sessionmanager.h @@ -69,6 +69,7 @@ public: void Clear(); unsigned GetRawSessionCount(); + unsigned GetEstablishedSessionCount(); void SendToAllSessions(SenderHelper &sender, boost::shared_ptr packet, SessionData::State state); void SendLobbyMsgToAllSessions(SenderHelper &sender, boost::shared_ptr packet, SessionData::State state);