From 27cc5adbcf27605ca26fdfa01dcc13dfc18b9f67 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Mon, 29 Nov 2021 09:00:31 +0100 Subject: [PATCH] fix deadlock in particle renderer --- .../rendering/particle/ParticleRenderer.kt | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/ParticleRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/ParticleRenderer.kt index d51f0249a..d70945173 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/ParticleRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/ParticleRenderer.kt @@ -56,6 +56,8 @@ class ParticleRenderer( private val particlesLock = ReadWriteLock() private var particles: MutableSet = mutableSetOf() + private var particleQueueLock = ReadWriteLock() + private var particleQueue: MutableSet = mutableSetOf() private lateinit var particleTask: TimeWorkerTask @@ -107,14 +109,17 @@ class ParticleRenderer( particleTask = TimeWorker.addTask(TimeWorkerTask(ProtocolDefinition.TICK_TIME, maxDelayTime = ProtocolDefinition.TICK_TIME / 2) { val cameraLength = connection.player.position.length() particlesLock.acquire() - val time = KUtil.time - for (particle in particles) { - if (particle.position.length() - cameraLength >= Minosoft.config.config.game.camera.viewDistance * ProtocolDefinition.SECTION_WIDTH_X) { - particle.dead = true + try { + val time = KUtil.time + for (particle in particles) { + if (particle.position.length() - cameraLength >= Minosoft.config.config.game.camera.viewDistance * ProtocolDefinition.SECTION_WIDTH_X) { + particle.dead = true + } + particle.tryTick(time) } - particle.tryTick(time) + } finally { + particlesLock.release() } - particlesLock.release() }) connection.registerEvent(CallbackEventInvoker.of { @@ -138,9 +143,9 @@ class ParticleRenderer( return } - particlesLock.lock() - particles += particle - particlesLock.unlock() + particleQueueLock.lock() + particleQueue += particle + particleQueueLock.unlock() } operator fun plusAssign(particle: Particle) = add(particle) @@ -158,6 +163,9 @@ class ParticleRenderer( particlesLock.acquire() + particleQueueLock.acquire() + particles += particleQueue + particleQueueLock.release() val time = KUtil.time for (particle in particles) { @@ -167,6 +175,7 @@ class ParticleRenderer( } particle.addVertex(transparentMesh, translucentMesh, time) } + particlesLock.release() if (toRemove.isNotEmpty()) {