Skip to content

Commit 8568346

Browse files
committed
add signalCpuWork()
1 parent c702d2a commit 8568346

File tree

1 file changed

+8
-3
lines changed

1 file changed

+8
-3
lines changed

kotlinx-coroutines-core/jvm/src/scheduling/CoroutineScheduler.kt

+8-3
Original file line numberDiff line numberDiff line change
@@ -713,7 +713,8 @@ internal class CoroutineScheduler(
713713
// this code runs in a different worker thread that holds a CPU token
714714
val cpuHolder = currentThread() as Worker
715715
assert { cpuHolder.state == WorkerState.CPU_ACQUIRED }
716-
cpuHolder.giveAwayLocalTasks() // TODO probably we can move CPU tasks straight into acquiring worker's local queue
716+
val releasedTasks = cpuHolder.giveAwayLocalTasks()
717+
if (releasedTasks) signalCpuWork()
717718
cpuHolder.state = WorkerState.BLOCKING
718719
}, taskContext = NonBlockingContext)
719720
permitTransfer.acquire(
@@ -724,14 +725,18 @@ internal class CoroutineScheduler(
724725
decrementBlockingTasks()
725726
}
726727

727-
fun giveAwayLocalTasks() {
728+
fun giveAwayLocalTasks(): Boolean {
729+
// probably the right way would be to signalCpuWork() on each task, but it should be fine without it
730+
var givenAwayAny: Boolean = false
728731
stolenTask.element?.let { task ->
729732
addToGlobalQueue(task)
730733
stolenTask.element = null
734+
givenAwayAny = true
731735
}
732736
while (true) {
733-
val task = localQueue.poll() ?: return
737+
val task = localQueue.poll() ?: return givenAwayAny
734738
addToGlobalQueue(task)
739+
givenAwayAny = true
735740
}
736741
}
737742

0 commit comments

Comments
 (0)