From bf5bcbf09faf75ab7c5a797a2426275677562cf2 Mon Sep 17 00:00:00 2001 From: Thunderblade73 Date: Thu, 30 Nov 2023 17:07:59 +0100 Subject: [PATCH 1/4] Backend: DelayedRun sync --- .../at/hannibal2/skyhanni/utils/DelayedRun.kt | 26 ++++++------------- 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/utils/DelayedRun.kt b/src/main/java/at/hannibal2/skyhanni/utils/DelayedRun.kt index f90237588b7b..0b9353e0db22 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/DelayedRun.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/DelayedRun.kt @@ -1,34 +1,24 @@ package at.hannibal2.skyhanni.utils -import at.hannibal2.skyhanni.utils.LorenzUtils.editCopy +import java.util.concurrent.LinkedBlockingQueue import kotlin.time.Duration -// TODO find better sync bug fix than creating a new map for each use object DelayedRun { - var map = mapOf<() -> Any, SimpleTimeMark>() + val map = mutableListOf Any, SimpleTimeMark>>() + private val inMap = LinkedBlockingQueue Any, SimpleTimeMark>>() fun runDelayed(duration: Duration, run: () -> Unit) { - map = map.editCopy { - this[run] = SimpleTimeMark.now() + duration - } + inMap.put(Pair(run, SimpleTimeMark.now() + duration)) } fun runNextTick(run: () -> Unit) { - map = map.editCopy { - this[run] = SimpleTimeMark.now() - } + inMap.put(Pair(run, SimpleTimeMark.farPast())) } fun checkRuns() { - if (map.isEmpty()) return - map = map.editCopy { - entries.removeIf { (runnable, time) -> - val inPast = time.isInPast() - if (inPast) { - runnable() - } - inPast - } + inMap.drainTo(map) + map.removeIf { (runnable, time) -> + time.isInPast().also { if (it) runnable() } } } } From be98283e102215c5a3efcb57fbbb92586a415dfa Mon Sep 17 00:00:00 2001 From: Thunderblade73 Date: Thu, 30 Nov 2023 23:45:28 +0100 Subject: [PATCH 2/4] Implemented suggestion from nea --- .../at/hannibal2/skyhanni/utils/DelayedRun.kt | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/utils/DelayedRun.kt b/src/main/java/at/hannibal2/skyhanni/utils/DelayedRun.kt index 0b9353e0db22..d87007090fc9 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/DelayedRun.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/DelayedRun.kt @@ -1,24 +1,29 @@ package at.hannibal2.skyhanni.utils -import java.util.concurrent.LinkedBlockingQueue +import java.util.concurrent.ConcurrentLinkedQueue import kotlin.time.Duration object DelayedRun { - val map = mutableListOf Any, SimpleTimeMark>>() - private val inMap = LinkedBlockingQueue Any, SimpleTimeMark>>() + private val tasks = mutableListOf Any, SimpleTimeMark>>() + private val futureTasks = ConcurrentLinkedQueue Any, SimpleTimeMark>>() fun runDelayed(duration: Duration, run: () -> Unit) { - inMap.put(Pair(run, SimpleTimeMark.now() + duration)) + futureTasks.add(Pair(run, SimpleTimeMark.now() + duration)) } fun runNextTick(run: () -> Unit) { - inMap.put(Pair(run, SimpleTimeMark.farPast())) + futureTasks.add(Pair(run, SimpleTimeMark.farPast())) } fun checkRuns() { - inMap.drainTo(map) - map.removeIf { (runnable, time) -> - time.isInPast().also { if (it) runnable() } + tasks.removeIf { (runnable, time) -> + val inPast = time.isInPast() + if (inPast) { + runnable() + } + inPast } + while (true) + tasks.add(futureTasks.poll() ?: break) } } From 2baba8a5792d6b6b45807e9ac3ba85836b551da4 Mon Sep 17 00:00:00 2001 From: Thunderblade73 Date: Fri, 8 Dec 2023 16:45:33 +0100 Subject: [PATCH 3/4] added drainTo method --- .../java/at/hannibal2/skyhanni/utils/DelayedRun.kt | 4 ++-- .../java/at/hannibal2/skyhanni/utils/LorenzUtils.kt | 12 +++++++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/utils/DelayedRun.kt b/src/main/java/at/hannibal2/skyhanni/utils/DelayedRun.kt index d87007090fc9..d8b6bcc3e5ee 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/DelayedRun.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/DelayedRun.kt @@ -1,5 +1,6 @@ package at.hannibal2.skyhanni.utils +import at.hannibal2.skyhanni.utils.LorenzUtils.drainTo import java.util.concurrent.ConcurrentLinkedQueue import kotlin.time.Duration @@ -23,7 +24,6 @@ object DelayedRun { } inPast } - while (true) - tasks.add(futureTasks.poll() ?: break) + futureTasks.drainTo(tasks) } } diff --git a/src/main/java/at/hannibal2/skyhanni/utils/LorenzUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/LorenzUtils.kt index 8ed5de686be1..c85b45fec375 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/LorenzUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/LorenzUtils.kt @@ -34,6 +34,7 @@ import java.text.SimpleDateFormat import java.util.Collections import java.util.Timer import java.util.TimerTask +import java.util.concurrent.ConcurrentLinkedQueue import kotlin.properties.ReadWriteProperty import kotlin.reflect.KMutableProperty1 import kotlin.reflect.KProperty @@ -329,7 +330,7 @@ object LorenzUtils { hover: List, command: String? = null, prefix: Boolean = true, - prefixColor: String = "§e" + prefixColor: String = "§e", ) { val msgPrefix = if (prefix) prefixColor + CHAT_PREFIX else "" val text = ChatComponentText(msgPrefix + message) @@ -419,7 +420,7 @@ object LorenzUtils { prefix: String, getName: (T) -> String, isCurrent: (T) -> Boolean, - crossinline onChange: (T) -> Unit + crossinline onChange: (T) -> Unit, ) = buildList { add(prefix) for (entry in enumValues()) { @@ -490,7 +491,7 @@ object LorenzUtils { } } - fun List.nextAfter(after: String, skip: Int = 1) = nextAfter({ it == after}, skip) + fun List.nextAfter(after: String, skip: Int = 1) = nextAfter({ it == after }, skip) fun List.nextAfter(after: (String) -> Boolean, skip: Int = 1): String? { var missing = -1 @@ -628,4 +629,9 @@ object LorenzUtils { ?: kotlin.error("Unknown enum constant for ${enumValues().first().name.javaClass.simpleName}: '$name'") fun isInDevEnviromen() = Launch.blackboard.get("fml.deobfuscatedEnvironment") as Boolean + + fun ConcurrentLinkedQueue.drainTo(list: MutableCollection) { + while (true) + list.add(this.poll() ?: break) + } } From 555a3337e24d808b5631f4013dc5f42a352db0a0 Mon Sep 17 00:00:00 2001 From: Thunderblade73 Date: Sat, 20 Jan 2024 13:00:39 +0100 Subject: [PATCH 4/4] added comment --- src/main/java/at/hannibal2/skyhanni/utils/DelayedRun.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/at/hannibal2/skyhanni/utils/DelayedRun.kt b/src/main/java/at/hannibal2/skyhanni/utils/DelayedRun.kt index d8b6bcc3e5ee..284946072b11 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/DelayedRun.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/DelayedRun.kt @@ -12,6 +12,7 @@ object DelayedRun { futureTasks.add(Pair(run, SimpleTimeMark.now() + duration)) } + /** Runs in the next full Tick so the delay is between 50ms to 100ms**/ fun runNextTick(run: () -> Unit) { futureTasks.add(Pair(run, SimpleTimeMark.farPast())) }