Skip to content

Commit e64d9b7

Browse files
elizarovqwwdfsad
authored andcommitted
Scheduler: capture TaskContext for afterTask before running it
This is not strictly needed, since the reusable Task instances (DispatchedTask) should be always reused in the same context, but this makes the code more resilient to future changes.
1 parent 16e2034 commit e64d9b7

File tree

6 files changed

+28
-6
lines changed

6 files changed

+28
-6
lines changed

common/kotlinx-coroutines-core-common/src/Dispatched.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,7 @@ internal interface DispatchedTask<in T> : SchedulerTask {
218218
(state as? CompletedExceptionally)?.cause
219219

220220
public override fun run() {
221+
val taskContext = this.taskContext
221222
try {
222223
val delegate = delegate as DispatchedContinuation<T>
223224
val continuation = delegate.continuation
@@ -238,7 +239,7 @@ internal interface DispatchedTask<in T> : SchedulerTask {
238239
} catch (e: Throwable) {
239240
throw DispatchException("Unexpected exception running $this", e)
240241
} finally {
241-
afterTask()
242+
afterTask(taskContext)
242243
}
243244
}
244245
}

common/kotlinx-coroutines-core-common/src/SchedulerTask.common.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,8 @@ internal expect interface SchedulerTask : Runnable
88

99
internal expect abstract class SchedulerTaskBase() : SchedulerTask
1010

11-
internal expect inline fun SchedulerTask.afterTask()
11+
internal expect interface SchedulerTaskContext
12+
13+
internal expect val SchedulerTask.taskContext: SchedulerTaskContext
14+
15+
internal expect inline fun SchedulerTask.afterTask(taskContext: SchedulerTaskContext)

core/kotlinx-coroutines-core/src/SchedulerTask.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,11 @@ internal actual abstract class SchedulerTaskBase actual constructor() : Schedule
1313
override var taskContext: TaskContext = NonBlockingContext
1414
}
1515

16+
internal actual typealias SchedulerTaskContext = TaskContext
17+
18+
@Suppress("EXTENSION_SHADOWED_BY_MEMBER")
19+
internal actual val SchedulerTask.taskContext: SchedulerTaskContext get() = taskContext
20+
1621
@Suppress("NOTHING_TO_INLINE")
17-
internal actual inline fun SchedulerTask.afterTask() = taskContext.afterTask()
22+
internal actual inline fun SchedulerTask.afterTask(taskContext: SchedulerTaskContext) =
23+
taskContext.afterTask()

core/kotlinx-coroutines-core/src/scheduling/Tasks.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ internal interface Task : Runnable {
8888
val mode: TaskMode get() = taskContext.taskMode
8989
}
9090

91+
// Non-reusable Task implementation to wrap Runnable instances that do not otherwise implement task
9192
internal class TaskImpl(
9293
@JvmField val block: Runnable,
9394
override var submissionTime: Long,
@@ -97,7 +98,7 @@ internal class TaskImpl(
9798
try {
9899
block.run()
99100
} finally {
100-
afterTask()
101+
afterTask(taskContext)
101102
}
102103
}
103104

js/kotlinx-coroutines-core-js/src/SchedulerTask.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ internal actual typealias SchedulerTask = Runnable
99

1010
internal actual abstract class SchedulerTaskBase actual constructor() : SchedulerTask
1111

12+
@Suppress("ACTUAL_WITHOUT_EXPECT")
13+
internal actual typealias SchedulerTaskContext = Unit
14+
15+
internal actual val SchedulerTask.taskContext: SchedulerTaskContext get() = Unit
16+
1217
@Suppress("NOTHING_TO_INLINE")
13-
internal actual inline fun SchedulerTask.afterTask() {}
18+
internal actual inline fun SchedulerTask.afterTask(taskContext: SchedulerTaskContext) {}
1419

native/kotlinx-coroutines-core-native/src/SchedulerTask.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,10 @@ internal actual typealias SchedulerTask = Runnable
99

1010
internal actual abstract class SchedulerTaskBase actual constructor() : SchedulerTask
1111

12+
@Suppress("ACTUAL_WITHOUT_EXPECT")
13+
internal actual typealias SchedulerTaskContext = Unit
14+
15+
internal actual val SchedulerTask.taskContext: SchedulerTaskContext get() = kotlin.Unit
16+
1217
@Suppress("NOTHING_TO_INLINE")
13-
internal actual inline fun SchedulerTask.afterTask() {}
18+
internal actual inline fun SchedulerTask.afterTask(taskContext: SchedulerTaskContext) {}

0 commit comments

Comments
 (0)