From 389062a1ed8063d82ddd611f3426c9b2b088e0fc Mon Sep 17 00:00:00 2001 From: "madmaxoft@gmail.com" Date: Thu, 22 Mar 2012 15:53:40 +0000 Subject: Fixed a deadlock by removing clients from all chunks upon their exit, not using the clients chunklists. git-svn-id: http://mc-server.googlecode.com/svn/trunk@426 0a769ca7-a7f5-676a-18bf-c427514a06d6 --- source/cChunk.cpp | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) (limited to 'source/cChunk.cpp') diff --git a/source/cChunk.cpp b/source/cChunk.cpp index 2dde0cc0d..e48ababd0 100644 --- a/source/cChunk.cpp +++ b/source/cChunk.cpp @@ -1196,17 +1196,26 @@ bool cChunk::AddClient(cClientHandle* a_Client) void cChunk::RemoveClient( cClientHandle* a_Client ) { - m_LoadedByClient.remove( a_Client ); - - if ( !a_Client->IsDestroyed() ) + for (cClientHandleList::iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr) { - for (cEntityList::iterator itr = m_Entities.begin(); itr != m_Entities.end(); ++itr ) + if (*itr != a_Client) { - LOG("chunk [%i, %i] destroying entity #%i for player \"%s\"", m_PosX, m_PosZ, (*itr)->GetUniqueID(), a_Client->GetUsername().c_str() ); - cPacket_DestroyEntity DestroyEntity( *itr ); - a_Client->Send( DestroyEntity ); + continue; } - } + + m_LoadedByClient.erase(itr); + + if ( !a_Client->IsDestroyed() ) + { + for (cEntityList::iterator itr = m_Entities.begin(); itr != m_Entities.end(); ++itr ) + { + LOGD("chunk [%i, %i] destroying entity #%i for player \"%s\"", m_PosX, m_PosZ, (*itr)->GetUniqueID(), a_Client->GetUsername().c_str() ); + cPacket_DestroyEntity DestroyEntity( *itr ); + a_Client->Send( DestroyEntity ); + } + } + return; + } // for itr - m_LoadedByClient[] } -- cgit v1.2.3