• 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 kotlin.coroutines.*
8 
9 public actual object Dispatchers {
10     public actual val Default: CoroutineDispatcher = createDefaultDispatcher()
11     public actual val Main: MainCoroutineDispatcher
12         get() = injectedMainDispatcher ?: mainDispatcher
13     public actual val Unconfined: CoroutineDispatcher = kotlinx.coroutines.Unconfined
14 
15     private val mainDispatcher = JsMainDispatcher(Default, false)
16     private var injectedMainDispatcher: MainCoroutineDispatcher? = null
17 
18     @PublishedApi
injectMainnull19     internal fun injectMain(dispatcher: MainCoroutineDispatcher) {
20         injectedMainDispatcher = dispatcher
21     }
22 
23     @PublishedApi
resetInjectedMainnull24     internal fun resetInjectedMain() {
25         injectedMainDispatcher = null
26     }
27 }
28 
29 private class JsMainDispatcher(
30     val delegate: CoroutineDispatcher,
31     private val invokeImmediately: Boolean
32 ) : MainCoroutineDispatcher() {
33     override val immediate: MainCoroutineDispatcher =
34         if (invokeImmediately) this else JsMainDispatcher(delegate, true)
isDispatchNeedednull35     override fun isDispatchNeeded(context: CoroutineContext): Boolean = !invokeImmediately
36     override fun dispatch(context: CoroutineContext, block: Runnable) = delegate.dispatch(context, block)
37     override fun dispatchYield(context: CoroutineContext, block: Runnable) = delegate.dispatchYield(context, block)
38     override fun toString(): String = toStringInternalImpl() ?: delegate.toString()
39 }
40