From 6a5e9ab7997f8af1709e36858e6945701fc3bb72 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Fri, 23 Dec 2022 16:35:29 +0100 Subject: [PATCH] world renderer: fix some locking crashes --- .../de/bixilon/minosoft/gui/rendering/world/LoadedMeshes.kt | 4 ++++ .../bixilon/minosoft/gui/rendering/world/queue/CulledQueue.kt | 2 ++ .../gui/rendering/world/queue/meshing/ChunkMeshingQueue.kt | 1 + 3 files changed, 7 insertions(+) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/world/LoadedMeshes.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/world/LoadedMeshes.kt index f74d77cd9..8a998a79d 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/world/LoadedMeshes.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/world/LoadedMeshes.kt @@ -88,14 +88,17 @@ class LoadedMeshes( operator fun contains(position: ChunkPosition): Boolean { + renderer.lock.acquire() lock.acquire() val contains = position in this.meshes lock.release() + renderer.lock.release() return contains } fun collect(visible: VisibleMeshes) { + renderer.lock.acquire() lock.acquire() for ((chunkPosition, meshes) in this.meshes) { if (!renderer.visibilityGraph.isChunkVisible(chunkPosition)) { @@ -111,6 +114,7 @@ class LoadedMeshes( } } lock.release() + renderer.lock.release() } fun lock() { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/world/queue/CulledQueue.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/world/queue/CulledQueue.kt index d7aee9c96..22709829c 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/world/queue/CulledQueue.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/world/queue/CulledQueue.kt @@ -81,6 +81,7 @@ class CulledQueue( fun collect(): MutableList> { + renderer.lock.acquire() lock.acquire() // The queue method needs the full lock of the culledQueue val world = renderer.world @@ -112,6 +113,7 @@ class CulledQueue( world.chunks.lock.release() lock.release() + renderer.lock.release() return list diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/world/queue/meshing/ChunkMeshingQueue.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/world/queue/meshing/ChunkMeshingQueue.kt index 2b5c24fdd..e4fd8e840 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/world/queue/meshing/ChunkMeshingQueue.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/world/queue/meshing/ChunkMeshingQueue.kt @@ -144,6 +144,7 @@ class ChunkMeshingQueue( fun queue(item: WorldQueueItem) { lock() + // TODO: don't remove and readd if (set.remove(item)) { queue -= item }