1
0

cWorld: Add entities without holding of m_CSEntitiesToAdd

* Fixes deadlock when cWorld::AddEntity is called while holding chunk map CS.
This commit is contained in:
peterbell10 2017-08-29 13:08:18 +01:00 committed by Lukas Pioch
parent a5869b3c09
commit 1779db1201

View File

@ -995,18 +995,21 @@ void cWorld::Tick(std::chrono::milliseconds a_Dt, std::chrono::milliseconds a_La
}
// Add entities waiting in the queue to be added:
cEntityList EntitiesToAdd;
{
// Don't access chunkmap while holding lock
cCSLock Lock(m_CSEntitiesToAdd);
for (auto & Entity : m_EntitiesToAdd)
{
Entity->SetWorld(this);
auto EntityPtr = Entity.get();
m_ChunkMap->AddEntity(std::move(Entity));
ASSERT(!EntityPtr->IsTicking());
EntityPtr->SetIsTicking(true);
}
m_EntitiesToAdd.clear();
std::swap(EntitiesToAdd, m_EntitiesToAdd);
}
for (auto & Entity : EntitiesToAdd)
{
Entity->SetWorld(this);
auto EntityPtr = Entity.get();
m_ChunkMap->AddEntity(std::move(Entity));
ASSERT(!EntityPtr->IsTicking());
EntityPtr->SetIsTicking(true);
}
EntitiesToAdd.clear();
// Add players waiting in the queue to be added:
AddQueuedPlayers();