fix deadlock bugs when DefaultThreadPool is running low on threads

This commit is contained in:
Bixilon 2023-02-06 12:05:13 +01:00
parent e54064046b
commit 02bd482b46
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
3 changed files with 15 additions and 14 deletions

View File

@ -1,6 +1,6 @@
/* /*
* Minosoft * Minosoft
* Copyright (C) 2020-2022 Moritz Zwerger * Copyright (C) 2020-2023 Moritz Zwerger
* *
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
* *
@ -14,7 +14,7 @@
package de.bixilon.minosoft.gui.eros.util package de.bixilon.minosoft.gui.eros.util
import afester.javafx.svg.SvgLoader import afester.javafx.svg.SvgLoader
import de.bixilon.kutil.concurrent.pool.DefaultThreadPool import de.bixilon.kutil.concurrent.worker.unconditional.UnconditionalWorker
import de.bixilon.kutil.exception.ExceptionUtil.catchAll import de.bixilon.kutil.exception.ExceptionUtil.catchAll
import de.bixilon.kutil.latch.CountUpAndDownLatch import de.bixilon.kutil.latch.CountUpAndDownLatch
import de.bixilon.kutil.shutdown.ShutdownManager import de.bixilon.kutil.shutdown.ShutdownManager
@ -36,8 +36,10 @@ class JavaFXInitializer internal constructor() : Application() {
JavaFXUtil.JAVA_FX_THREAD = Thread.currentThread() JavaFXUtil.JAVA_FX_THREAD = Thread.currentThread()
JavaFXUtil.HOST_SERVICES = hostServices JavaFXUtil.HOST_SERVICES = hostServices
LATCH.inc(); DefaultThreadPool += { JavaFXUtil.MINOSOFT_LOGO = Image(Minosoft.MINOSOFT_ASSETS_MANAGER["minosoft:textures/icons/window_icon.png".toResourceLocation()]);LATCH.dec() } val worker = UnconditionalWorker()
LATCH.inc(); DefaultThreadPool += { catchAll { JavaFXUtil.BIXILON_LOGO = SvgLoader().loadSvg(Minosoft.MINOSOFT_ASSETS_MANAGER["minosoft:textures/icons/bixilon_logo.svg".toResourceLocation()]) }; LATCH.dec() } worker += { JavaFXUtil.MINOSOFT_LOGO = Image(Minosoft.MINOSOFT_ASSETS_MANAGER["minosoft:textures/icons/window_icon.png".toResourceLocation()]) }
worker += { catchAll { JavaFXUtil.BIXILON_LOGO = SvgLoader().loadSvg(Minosoft.MINOSOFT_ASSETS_MANAGER["minosoft:textures/icons/bixilon_logo.svg".toResourceLocation()]) } }
worker.work(LATCH)
Log.log(LogMessageType.JAVAFX, LogLevels.VERBOSE) { "Initialized JavaFX Toolkit!" } Log.log(LogMessageType.JAVAFX, LogLevels.VERBOSE) { "Initialized JavaFX Toolkit!" }

View File

@ -1,6 +1,6 @@
/* /*
* Minosoft * Minosoft
* Copyright (C) 2020-2022 Moritz Zwerger * Copyright (C) 2020-2023 Moritz Zwerger
* *
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
* *
@ -18,7 +18,7 @@ import de.bixilon.kutil.cast.CastUtil.nullCast
import de.bixilon.kutil.cast.CastUtil.unsafeCast import de.bixilon.kutil.cast.CastUtil.unsafeCast
import de.bixilon.kutil.collections.CollectionUtil.synchronizedMapOf import de.bixilon.kutil.collections.CollectionUtil.synchronizedMapOf
import de.bixilon.kutil.collections.map.SynchronizedMap import de.bixilon.kutil.collections.map.SynchronizedMap
import de.bixilon.kutil.concurrent.pool.DefaultThreadPool import de.bixilon.kutil.concurrent.worker.unconditional.UnconditionalWorker
import de.bixilon.kutil.latch.CountUpAndDownLatch import de.bixilon.kutil.latch.CountUpAndDownLatch
import de.bixilon.kutil.reflection.KotlinReflection.kClass import de.bixilon.kutil.reflection.KotlinReflection.kClass
import de.bixilon.kutil.reflection.ReflectionUtil.realName import de.bixilon.kutil.reflection.ReflectionUtil.realName
@ -87,13 +87,11 @@ object PacketTypeRegistry {
val c2sClassMap: SynchronizedMap<Class<out C2SPacket>, C2SPacketType> = synchronizedMapOf() val c2sClassMap: SynchronizedMap<Class<out C2SPacket>, C2SPacketType> = synchronizedMapOf()
val c2sStateMap: SynchronizedMap<ProtocolStates, MutableMap<String, C2SPacketType>> = synchronizedMapOf() val c2sStateMap: SynchronizedMap<ProtocolStates, MutableMap<String, C2SPacketType>> = synchronizedMapOf()
val innerLatch = CountUpAndDownLatch(1, latch) val worker = UnconditionalWorker()
for (info in ClassPath.from(classLoader).getTopLevelClassesRecursive(PacketsRoot::class.java.packageName)) { for (info in ClassPath.from(classLoader).getTopLevelClassesRecursive(PacketsRoot::class.java.packageName)) {
innerLatch.inc() worker += { loadClass(s2cClassMap, s2cStateMap, c2sClassMap, c2sStateMap, info) }
DefaultThreadPool += { loadClass(s2cClassMap, s2cStateMap, c2sClassMap, c2sStateMap, info); innerLatch.dec() }
} }
innerLatch.dec() worker.work(latch)
innerLatch.await()
this.S2C_CLASS_MAP = s2cClassMap this.S2C_CLASS_MAP = s2cClassMap
this.S2C_STATE_MAP = s2cStateMap this.S2C_STATE_MAP = s2cStateMap
this.C2S_CLASS_MAP = c2sClassMap this.C2S_CLASS_MAP = c2sClassMap

View File

@ -15,7 +15,7 @@ package de.bixilon.minosoft.util
import de.bixilon.kutil.cast.CastUtil.unsafeCast import de.bixilon.kutil.cast.CastUtil.unsafeCast
import de.bixilon.kutil.collections.primitive.Clearable import de.bixilon.kutil.collections.primitive.Clearable
import de.bixilon.kutil.concurrent.pool.DefaultThreadPool import de.bixilon.kutil.concurrent.worker.unconditional.UnconditionalWorker
import de.bixilon.kutil.latch.CountUpAndDownLatch import de.bixilon.kutil.latch.CountUpAndDownLatch
import de.bixilon.kutil.reflection.generic.GenericUtil import de.bixilon.kutil.reflection.generic.GenericUtil
import de.bixilon.minosoft.data.registries.registries.Registries import de.bixilon.minosoft.data.registries.registries.Registries
@ -74,10 +74,11 @@ object RegistriesUtil {
} }
fun Registries.postInit(latch: CountUpAndDownLatch) { fun Registries.postInit(latch: CountUpAndDownLatch) {
val worker = UnconditionalWorker()
for (field in types.values) { for (field in types.values) {
latch.inc() worker += { field.get(this).unsafeCast<Registry<*>>().postInit(this) }
DefaultThreadPool += { field.get(this).unsafeCast<Registry<*>>().postInit(this); latch.dec() }
} }
worker.work(latch)
} }