summaryrefslogtreecommitdiff
path: root/opendc-common/src/main/kotlin/org/opendc/common/util/Pacer.kt
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2022-11-09 21:59:07 +0000
committerFabian Mastenbroek <mail.fabianm@gmail.com>2022-11-13 17:42:01 +0000
commitfb2672afb2d8236d5291cd028196c99d8e4d47f1 (patch)
tree508bbec117239b3d8490cd1bde8d12b6a8ab2155 /opendc-common/src/main/kotlin/org/opendc/common/util/Pacer.kt
parent00ac59e8e9d6a41c2eac55aa25420dce8fa9c6e0 (diff)
refactor: Replace use of CoroutineContext by Dispatcher
This change replaces the use of `CoroutineContext` for passing the `SimulationDispatcher` across the different modules of OpenDC by the lightweight `Dispatcher` interface of the OpenDC common module.
Diffstat (limited to 'opendc-common/src/main/kotlin/org/opendc/common/util/Pacer.kt')
-rw-r--r--opendc-common/src/main/kotlin/org/opendc/common/util/Pacer.kt94
1 files changed, 0 insertions, 94 deletions
diff --git a/opendc-common/src/main/kotlin/org/opendc/common/util/Pacer.kt b/opendc-common/src/main/kotlin/org/opendc/common/util/Pacer.kt
deleted file mode 100644
index b6141db1..00000000
--- a/opendc-common/src/main/kotlin/org/opendc/common/util/Pacer.kt
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (c) 2022 AtLarge Research
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package org.opendc.common.util
-
-import kotlinx.coroutines.Delay
-import kotlinx.coroutines.DisposableHandle
-import kotlinx.coroutines.InternalCoroutinesApi
-import java.lang.Runnable
-import java.time.InstantSource
-import kotlin.coroutines.ContinuationInterceptor
-import kotlin.coroutines.CoroutineContext
-
-/**
- * Helper class to pace the incoming scheduling requests.
- *
- * @param context The [CoroutineContext] in which the pacer runs.
- * @param clock The virtual simulation clock.
- * @param quantum The scheduling quantum.
- * @param process The process to invoke for the incoming requests.
- */
-public class Pacer(
- private val context: CoroutineContext,
- private val clock: InstantSource,
- private val quantum: Long,
- private val process: (Long) -> Unit
-) {
- /**
- * The [Delay] instance that provides scheduled execution of [Runnable]s.
- */
- @OptIn(InternalCoroutinesApi::class)
- private val delay =
- requireNotNull(context[ContinuationInterceptor] as? Delay) { "Invalid CoroutineDispatcher: no delay implementation" }
-
- /**
- * The current [DisposableHandle] representing the pending scheduling cycle.
- */
- private var handle: DisposableHandle? = null
-
- /**
- * Determine whether a scheduling cycle is pending.
- */
- public val isPending: Boolean get() = handle != null
-
- /**
- * Enqueue a new scheduling cycle.
- */
- public fun enqueue() {
- if (handle != null) {
- return
- }
-
- val quantum = quantum
- val now = clock.millis()
-
- // We assume that the scheduler runs at a fixed slot every time quantum (e.g t=0, t=60, t=120).
- // We calculate here the delay until the next scheduling slot.
- val timeUntilNextSlot = quantum - (now % quantum)
-
- @OptIn(InternalCoroutinesApi::class)
- handle = delay.invokeOnTimeout(timeUntilNextSlot, {
- process(now + timeUntilNextSlot)
- handle = null
- }, context)
- }
-
- /**
- * Cancel the currently pending scheduling cycle.
- */
- public fun cancel() {
- val handle = handle ?: return
- this.handle = null
- handle.dispose()
- }
-}