From eb4432bb6260eaadb41495149739244308e9e125 Mon Sep 17 00:00:00 2001 From: Tiger Wang Date: Fri, 28 Jul 2017 17:54:40 +0100 Subject: Tentative fix for player-limit race condition (#3862) * Attempts to fix #2257 Derived from d233e9843148313c71fbaba96ccff660e47b07b1 * Changed player count type to int * Clarified certain actions --- src/Server.h | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) (limited to 'src/Server.h') diff --git a/src/Server.h b/src/Server.h index 68741b144..88f91120c 100644 --- a/src/Server.h +++ b/src/Server.h @@ -67,9 +67,9 @@ public: const AString & GetShutdownMessage(void) const { return m_ShutdownMessage; } // Player counts: - int GetMaxPlayers(void) const { return m_MaxPlayers; } - int GetNumPlayers(void) const; - void SetMaxPlayers(int a_MaxPlayers) { m_MaxPlayers = a_MaxPlayers; } + size_t GetMaxPlayers(void) const { return m_MaxPlayers; } + size_t GetNumPlayers(void) const { return m_PlayerCount; } + void SetMaxPlayers(size_t a_MaxPlayers) { m_MaxPlayers = a_MaxPlayers; } /** Check if the player is queued to be transferred to a World. Returns true is Player is found in queue. */ @@ -106,17 +106,14 @@ public: const AString & GetServerID(void) const { return m_ServerID; } // tolua_export - /** Called by cClientHandle's destructor; stop m_SocketThreads from calling back into a_Client */ - void ClientDestroying(const cClientHandle * a_Client); - /** Don't tick a_Client anymore, it will be ticked from its cPlayer instead */ void ClientMovedToWorld(const cClientHandle * a_Client); /** Notifies the server that a player was created; the server uses this to adjust the number of players */ - void PlayerCreated(const cPlayer * a_Player); + void PlayerCreated(); /** Notifies the server that a player is being destroyed; the server uses this to adjust the number of players */ - void PlayerDestroying(const cPlayer * a_Player); + void PlayerDestroyed(); /** Returns base64 encoded favicon data (obtained from favicon.png) */ const AString & GetFaviconData(void) const { return m_FaviconData; } @@ -182,17 +179,8 @@ private: /** Clients that have just been moved into a world and are to be removed from m_Clients in the next Tick(). */ cClientHandles m_ClientsToRemove; - /** Protects m_PlayerCount against multithreaded access. */ - mutable cCriticalSection m_CSPlayerCount; - /** Number of players currently playing in the server. */ - int m_PlayerCount; - - /** Protects m_PlayerCountDiff against multithreaded access. */ - cCriticalSection m_CSPlayerCountDiff; - - /** Adjustment to m_PlayerCount to be applied in the Tick thread. */ - int m_PlayerCountDiff; + std::atomic_size_t m_PlayerCount; int m_ClientViewDistance; // The default view distance for clients; settable in Settings.ini @@ -211,7 +199,7 @@ private: AString m_Description; AString m_ShutdownMessage; AString m_FaviconData; - int m_MaxPlayers; + size_t m_MaxPlayers; bool m_bIsHardcore; /** True - allow same username to login more than once False - only once */ -- cgit v1.2.3