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