summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--source/ChunkSender.cpp17
-rw-r--r--source/ChunkSender.h1
2 files changed, 16 insertions, 2 deletions
diff --git a/source/ChunkSender.cpp b/source/ChunkSender.cpp
index da134eb8f..517150d1d 100644
--- a/source/ChunkSender.cpp
+++ b/source/ChunkSender.cpp
@@ -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)
}
diff --git a/source/ChunkSender.h b/source/ChunkSender.h
index 59fab5b6c..ae9a8b5c5 100644
--- a/source/ChunkSender.h
+++ b/source/ChunkSender.h
@@ -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