• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
3  */
4 
5 package kotlinx.coroutines
6 
7 import kotlinx.coroutines.internal.*
8 import kotlin.coroutines.*
9 
10 
11 public actual object Dispatchers {
12     public actual val Default: CoroutineDispatcher = createDefaultDispatcher()
13     public actual val Main: MainCoroutineDispatcher
14         get() = injectedMainDispatcher ?: mainDispatcher
15     public actual val Unconfined: CoroutineDispatcher get() = kotlinx.coroutines.Unconfined // Avoid freezing
16 
17     private val mainDispatcher = createMainDispatcher(Default)
18 
19     private var injectedMainDispatcher: MainCoroutineDispatcher? = null
20 
21     @PublishedApi
injectMainnull22     internal fun injectMain(dispatcher: MainCoroutineDispatcher) {
23         injectedMainDispatcher = dispatcher
24     }
25 
26     internal val IO: CoroutineDispatcher = DefaultIoScheduler
27 }
28 
29 internal object DefaultIoScheduler : CoroutineDispatcher() {
30     // 2048 is an arbitrary KMP-friendly constant
31     private val unlimitedPool = newFixedThreadPoolContext(2048, "Dispatchers.IO")
32     private val io = unlimitedPool.limitedParallelism(64) // Default JVM size
33 
34     @ExperimentalCoroutinesApi
limitedParallelismnull35     override fun limitedParallelism(parallelism: Int): CoroutineDispatcher {
36         // See documentation to Dispatchers.IO for the rationale
37         return unlimitedPool.limitedParallelism(parallelism)
38     }
39 
dispatchnull40     override fun dispatch(context: CoroutineContext, block: Runnable) {
41         io.dispatch(context, block)
42     }
43 
44     @InternalCoroutinesApi
dispatchYieldnull45     override fun dispatchYield(context: CoroutineContext, block: Runnable) {
46         io.dispatchYield(context, block)
47     }
48 
toStringnull49     override fun toString(): String = "Dispatchers.IO"
50 }
51 
52 
53 @Suppress("EXTENSION_SHADOWED_BY_MEMBER")
54 public actual val Dispatchers.IO: CoroutineDispatcher get() = IO
55 
56 internal expect fun createMainDispatcher(default: CoroutineDispatcher): MainCoroutineDispatcher
57