1
0

Fixed a possible crash in ChunkSender - a client would be reported as removed but still would be in the internal queue.

git-svn-id: http://mc-server.googlecode.com/svn/trunk@438 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
madmaxoft@gmail.com 2012-03-27 19:23:44 +00:00
parent ce053d1b9b
commit fcb9b281e0
2 changed files with 16 additions and 2 deletions

View File

@ -105,6 +105,7 @@ void cChunkSender::RemoveClient(cClientHandle * a_Client)
}
++itr;
} // for itr - m_SendChunks[]
m_RemoveCount++;
}
m_evtQueue.Set();
m_evtRemoved.Wait(); // Wait for removal confirmation
@ -121,8 +122,13 @@ void cChunkSender::Execute(void)
cCSLock Lock(m_CS);
while (m_ChunksReady.empty() && m_SendChunks.empty())
{
int RemoveCount = m_RemoveCount;
m_RemoveCount = 0;
cCSUnlock Unlock(Lock);
m_evtRemoved.Set(); // Notify that the removed clients are safe to be deleted
for (int i = 0; i < RemoveCount; i++)
{
m_evtRemoved.Set(); // Notify that the removed clients are safe to be deleted
}
m_evtQueue.Wait();
if (m_ShouldTerminate)
{
@ -148,7 +154,14 @@ void cChunkSender::Execute(void)
SendChunk(Chunk.m_ChunkX, Chunk.m_ChunkY, Chunk.m_ChunkZ, Chunk.m_Client);
}
m_evtRemoved.Set(); // Notify that the removed clients are safe to be deleted
Lock.Lock();
int RemoveCount = m_RemoveCount;
m_RemoveCount = 0;
Lock.Unlock();
for (int i = 0; i < RemoveCount; i++)
{
m_evtRemoved.Set(); // Notify that the removed clients are safe to be deleted
}
} // while (!mShouldTerminate)
}

View File

@ -99,6 +99,7 @@ protected:
sSendChunkList m_SendChunks;
cEvent m_evtQueue; // Set when anything is added to m_ChunksReady
cEvent m_evtRemoved; // Set when removed clients are safe to be deleted
int m_RemoveCount; // Number of threads waiting for a client removal (m_evtRemoved needs to be set this many times)
// Data about the chunk that is being sent:
// NOTE that m_BlockData[] is inherited from the cChunkDataCollector