• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package kotlinx.coroutines
2 
3 import kotlinx.coroutines.internal.*
4 import kotlin.coroutines.*
5 
6 
7 public actual object Dispatchers {
8     public actual val Default: CoroutineDispatcher = createDefaultDispatcher()
9     public actual val Main: MainCoroutineDispatcher
10         get() = injectedMainDispatcher ?: mainDispatcher
11     public actual val Unconfined: CoroutineDispatcher get() = kotlinx.coroutines.Unconfined // Avoid freezing
12 
13     private val mainDispatcher = createMainDispatcher(Default)
14 
15     private var injectedMainDispatcher: MainCoroutineDispatcher? = null
16 
17     @PublishedApi
injectMainnull18     internal fun injectMain(dispatcher: MainCoroutineDispatcher) {
19         injectedMainDispatcher = dispatcher
20     }
21 
22     internal val IO: CoroutineDispatcher = DefaultIoScheduler
23 }
24 
25 internal object DefaultIoScheduler : CoroutineDispatcher() {
26     // 2048 is an arbitrary KMP-friendly constant
27     private val unlimitedPool = newFixedThreadPoolContext(2048, "Dispatchers.IO")
28     private val io = unlimitedPool.limitedParallelism(64) // Default JVM size
29 
limitedParallelismnull30     override fun limitedParallelism(parallelism: Int, name: String?): CoroutineDispatcher {
31         // See documentation to Dispatchers.IO for the rationale
32         return unlimitedPool.limitedParallelism(parallelism, name)
33     }
34 
dispatchnull35     override fun dispatch(context: CoroutineContext, block: Runnable) {
36         io.dispatch(context, block)
37     }
38 
39     @InternalCoroutinesApi
dispatchYieldnull40     override fun dispatchYield(context: CoroutineContext, block: Runnable) {
41         io.dispatchYield(context, block)
42     }
43 
toStringnull44     override fun toString(): String = "Dispatchers.IO"
45 }
46 
47 
48 @Suppress("EXTENSION_SHADOWED_BY_MEMBER")
49 public actual val Dispatchers.IO: CoroutineDispatcher get() = IO
50 
51 internal expect fun createMainDispatcher(default: CoroutineDispatcher): MainCoroutineDispatcher
52