From 01ae67c212e95c1503402f4d4fdeb029caa3be18 Mon Sep 17 00:00:00 2001 From: Andrew Golovashevich Date: Sun, 7 Sep 2025 00:42:19 +0300 Subject: [PATCH] Event loop and continuations interfaces --- build.gradle.kts | 8 ++++--- .../multitasking_0/CancellationHandler.kt | 5 ++++ .../multitasking_0/Continuation.kt | 24 +++++++++++++++++++ .../multitasking_0/ContinuationHandler.kt | 5 ++++ .../multitasking_0/SingleThreadEventLoop.kt | 11 +++++++++ .../multitasking_0/TaskCancelledException.kt | 10 ++++++++ 6 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/multitasking_0/CancellationHandler.kt create mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/multitasking_0/Continuation.kt create mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/multitasking_0/ContinuationHandler.kt create mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/multitasking_0/SingleThreadEventLoop.kt create mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/multitasking_0/TaskCancelledException.kt diff --git a/build.gradle.kts b/build.gradle.kts index a93a69e..c7d5729 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -54,7 +54,11 @@ kotlin { } sourceSets { - val commonMain by getting + val commonMain by getting { + dependencies { + implementation("org.jetbrains.kotlin:kotlin-stdlib:${this@kotlin.coreLibrariesVersion}") + } + } val commonTest by getting val notJvmMain by creating { dependsOn(commonMain) } @@ -88,8 +92,6 @@ kotlin { } - - } publishing { diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/multitasking_0/CancellationHandler.kt b/src/commonMain/kotlin/ru/landgrafhomyak/multitasking_0/CancellationHandler.kt new file mode 100644 index 0000000..7dafb21 --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/multitasking_0/CancellationHandler.kt @@ -0,0 +1,5 @@ +package ru.landgrafhomyak.multitasking_0 + +public fun interface CancellationHandler { + public fun onCancellation(): Throwable +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/multitasking_0/Continuation.kt b/src/commonMain/kotlin/ru/landgrafhomyak/multitasking_0/Continuation.kt new file mode 100644 index 0000000..d99ab14 --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/multitasking_0/Continuation.kt @@ -0,0 +1,24 @@ +package ru.landgrafhomyak.multitasking_0 + +/** + * Callback that resumes execution of a corresponding task [at suspension point][SingleThreadEventLoop.yield]. + */ +public interface Continuation { + /** + * Resumes task with result that will be returned from [yield()][SingleThreadEventLoop.yield]. + */ + public fun resumeWithSuccess(result: T) + + /** + * Resumes task with error that will be thrown from [yield()][SingleThreadEventLoop.yield]. + */ + public fun resumeWithError(result: Throwable) + + + public interface Cancellable : Continuation { + /** + * Set's callback called when task is canceled, but not earlier than [linkContinuation()][ContinuationHandler.linkContinuation] returns. + */ + public fun setCancellationHandler(handler: CancellationHandler) + } +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/multitasking_0/ContinuationHandler.kt b/src/commonMain/kotlin/ru/landgrafhomyak/multitasking_0/ContinuationHandler.kt new file mode 100644 index 0000000..e98bc1b --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/multitasking_0/ContinuationHandler.kt @@ -0,0 +1,5 @@ +package ru.landgrafhomyak.multitasking_0 + +public fun interface ContinuationHandler> { + public fun linkContinuation(continuation: C) +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/multitasking_0/SingleThreadEventLoop.kt b/src/commonMain/kotlin/ru/landgrafhomyak/multitasking_0/SingleThreadEventLoop.kt new file mode 100644 index 0000000..90149b1 --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/multitasking_0/SingleThreadEventLoop.kt @@ -0,0 +1,11 @@ +package ru.landgrafhomyak.multitasking_0 + +public interface SingleThreadEventLoop { + public fun callAfter(delayMillis: Long, continuation: Continuation) + + public fun yield(handler: ContinuationHandler>): R + public fun yieldCancellable(handler: ContinuationHandler>): R + + public fun runUntilSuspended() + public fun suspendEventLoop() +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/multitasking_0/TaskCancelledException.kt b/src/commonMain/kotlin/ru/landgrafhomyak/multitasking_0/TaskCancelledException.kt new file mode 100644 index 0000000..5317d76 --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/multitasking_0/TaskCancelledException.kt @@ -0,0 +1,10 @@ +package ru.landgrafhomyak.multitasking_0 + +import kotlin.RuntimeException + +public class TaskCancelledException : RuntimeException { + public constructor() : super() + public constructor(message: String?) : super(message) + public constructor(message: String?, cause: Throwable?) : super(message, cause) + public constructor(cause: Throwable?) : super(cause) +} \ No newline at end of file