Skip to content

Commit 0fbd45e

Browse files
committed
Planet: Add missing locks
1 parent 0419439 commit 0fbd45e

3 files changed

Lines changed: 12 additions & 2 deletions

File tree

include/CommonLib/Planet.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ namespace tsom
8484
std::mutex m_chunkLayerAddedSignalMutex;
8585
std::mutex m_chunkLayerRemovedSignalMutex;
8686
std::mutex m_chunkUpdatedSignalMutex;
87+
std::mutex m_chunkMutex;
8788
tsl::hopscotch_map<ChunkIndices, ChunkData> m_chunks;
8889
Nz::ThreadLocalData<ScriptingContext> m_scriptingContexts;
8990
Nz::ApplicationBase& m_app;

src/CommonLib/Planet.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ namespace tsom
4949
chunkData.onReset.Connect(chunkData.chunk->OnReset, [this, &blockLibrary](Chunk* chunk)
5050
{
5151
// Build direction blockers
52+
std::unique_lock chunkLock(m_chunkMutex);
5253
auto chunkIt = m_chunks.find(chunk->GetIndices());
5354
NazaraAssert(chunkIt != m_chunks.end());
5455
ChunkData& chunkData = chunkIt.value();
@@ -198,6 +199,8 @@ namespace tsom
198199

199200
if (previousBlockData.isTransparent != newBlockData.isTransparent)
200201
{
202+
std::unique_lock chunkLock(m_chunkMutex);
203+
201204
auto chunkIt = m_chunks.find(chunk->GetIndices());
202205
NazaraAssert(chunkIt != m_chunks.end());
203206
ChunkData& chunkData = chunkIt.value();
@@ -239,8 +242,12 @@ namespace tsom
239242
OnChunkUpdated(this, chunk, neighborMask, layerMask);
240243
});
241244

245+
std::unique_lock chunkLock(m_chunkMutex);
246+
242247
auto it = m_chunks.insert_or_assign(indices, std::move(chunkData)).first;
243248

249+
chunkLock.unlock();
250+
244251
if (initCallback)
245252
it->second.chunk->Reset(initCallback);
246253

src/ServerLib/ServerPlanetEnvironment.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ namespace tsom
6565
GetPlanet().OnChunkVisibilityMaskUpdated.Connect([chunkLoadingData = m_chunkLoadingData](Planet* /*planet*/, Chunk* chunk, DirectionMask oldVisibilityMask, DirectionMask newVisibilityMask)
6666
{
6767
DirectionMask newDirectionMask = newVisibilityMask & ~oldVisibilityMask;
68+
69+
std::unique_lock lock(chunkLoadingData->mutex);
6870
chunkLoadingData->visitedChunks[chunk->GetIndices()] = true;
6971
chunkLoadingData->HandleChunkLoaded(chunk->GetIndices(), newDirectionMask);
7072
});
@@ -275,6 +277,8 @@ namespace tsom
275277
chunkLoadingData->planet->GenerateChunk(*chunk, seed, chunkCount, generatorName);
276278

277279
DirectionMask visibilityMask = chunkLoadingData->planet->GetChunkVisibilityMask(chunk->GetIndices());
280+
281+
std::unique_lock lock(chunkLoadingData->mutex);
278282
chunkLoadingData->HandleChunkLoaded(chunk->GetIndices(), visibilityMask);
279283

280284
if (--chunkLoadingData->chunkLoadingCount == 0 && chunkLoadingData->remainingChunks.empty())
@@ -360,8 +364,6 @@ namespace tsom
360364
ChunkIndices minIndices(-int(chunkCount.x / 2), -int(chunkCount.y / 2), -int(chunkCount.z / 2));
361365
ChunkIndices maxIndices = minIndices + ChunkIndices(chunkCount) - ChunkIndices(1);
362366

363-
std::unique_lock lock(mutex);
364-
365367
// Direct neighbor can trigger indirect neighbor
366368
bool isPrimaryChunk = Nz::Retrieve(visitedChunks, chunkIndices);
367369

0 commit comments

Comments
 (0)