Short-circuit limitedParallelism for K/N multi-worker dispatcher (#4118)
diff --git a/kotlinx-coroutines-core/native/src/MultithreadedDispatchers.kt b/kotlinx-coroutines-core/native/src/MultithreadedDispatchers.kt
index 919430c..cd40501 100644
--- a/kotlinx-coroutines-core/native/src/MultithreadedDispatchers.kt
+++ b/kotlinx-coroutines-core/native/src/MultithreadedDispatchers.kt
@@ -77,7 +77,7 @@
private class MultiWorkerDispatcher(
private val name: String,
- workersCount: Int
+ private val workersCount: Int
) : CloseableCoroutineDispatcher() {
private val tasksQueue = Channel<Runnable>(Channel.UNLIMITED)
private val availableWorkers = Channel<CancellableContinuation<Runnable>>(Channel.UNLIMITED)
@@ -140,6 +140,15 @@
}
}
+ @ExperimentalCoroutinesApi
+ override fun limitedParallelism(parallelism: Int, name: String?): CoroutineDispatcher {
+ parallelism.checkParallelism()
+ if (parallelism >= workersCount) {
+ return namedOrThis(name)
+ }
+ return super.limitedParallelism(parallelism, name)
+ }
+
override fun close() {
tasksAndWorkersCounter.getAndUpdate { if (it.isClosed()) it else it or 1L }
val workers = workerPool.close() // no new workers will be created