From 17a3de38bcef4c1e75a41927e195374de57df0f4 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Mon, 22 Apr 2024 16:39:38 +0700 Subject: [PATCH] Improvements to scheduling inside blockable event loop --- .../kstarbound/util/BlockableEventLoop.kt | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/util/BlockableEventLoop.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/util/BlockableEventLoop.kt index 177a476f..171c816b 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/util/BlockableEventLoop.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/util/BlockableEventLoop.kt @@ -107,9 +107,9 @@ open class BlockableEventLoop(name: String) : Thread(name), ScheduledExecutorSer private fun eventLoopIteration(): Boolean { var executedAnything = false - val next = eventQueue.poll() + var next = eventQueue.poll() - if (next != null) { + while (next != null) { executedAnything = true try { @@ -127,24 +127,25 @@ open class BlockableEventLoop(name: String) : Thread(name), ScheduledExecutorSer LOGGER.error("Caught an exception while propagating CompletableFuture to completeExceptionally stage", err) } } + + // keep executing queued tasks until we hit scheduled task deadline + if (scheduledQueue.isEmpty() || scheduledQueue.peek()!!.executeAt > System.nanoTime()) + next = eventQueue.poll() + else + next = null } if (scheduledQueue.isNotEmpty()) { val executed = ObjectArrayList>(4) - var lastSize: Int - do { - lastSize = executed.size + while (scheduledQueue.isNotEmpty() && (isShutdown || scheduledQueue.peek()!!.executeAt <= System.nanoTime())) { + executedAnything = true + val poll = scheduledQueue.poll()!! - while (scheduledQueue.isNotEmpty() && (isShutdown || scheduledQueue.peek()!!.executeAt <= System.nanoTime())) { - executedAnything = true - val poll = scheduledQueue.poll()!! - - if (poll.perform(isShutdown)) { - executed.add(poll) - } + if (poll.perform(isShutdown)) { + executed.add(poll) } - } while (lastSize != executed.size) + } scheduledQueue.addAll(executed) }