package Ġcn . t urs om . core . coroutine Ċ Ċ import Ġcn . t urs om . core . cast Ċ import Ġkotlinx . coroutines . Executor Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . Main Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . as Coroutine Dispatcher Ċ import Ġjava . io . Closeable Ċ import Ġjava . lang . reflect . Field Ċ import Ġjava . lang . reflect . Modifier Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ import Ġkotlin . concurrent . thread Ċ import Ġkotlin . coroutines . Coroutine Context Ċ Ċ object ĠMain Dispatcher Ġ: ĠMain Coroutine Dispatcher (), ĠClose able Ġ{ ĊĠ Ġprivate Ġval Ġloaded Ġ= ĠAtomic Boolean ( false ) ĊĠ Ġprivate Ġval Ġdispatcher : ĠExecutor Coroutine Dispatcher Ġ= ĠExec utors . new Single Thread Executor Ġ{ ĊĠĠĠ Ġthread ( start Ġ= Ġfalse , Ġblock Ġ= Ġit :: run , Ġname Ġ= Ġ" Main Dispatcher ", Ġis Daemon Ġ= Ġfalse ) ĊĠ Ġ}. as Coroutine Dispatcher () ĊĠ Ġprivate Ġvar Ġold Dispatcher : ĠMain Coroutine Dispatcher ? Ġ= Ġnull ĊĠ Ġprivate Ġval Ġmain Dispatcher Loader : ĠClass < *> Ġ= ĠClass . forName (" kotlin x . coroutines . internal . Main Dispatcher Loader ") ĊĠ Ġprivate Ġval Ġdispatcher Field : ĠField Ġ= Ġmain Dispatcher Loader . getDeclared Field (" dispatcher "). also Ġ{ Ġdispatcher Ġ-> ĊĠĠĠ Ġdispatcher . is Accessible Ġ= Ġtrue ĊĠĠĠ Ġval Ġmf : ĠField Ġ= ĠField :: class . java . getDeclared Field (" modifiers ") ĊĠĠĠ Ġmf . is Accessible Ġ= Ġtrue ĊĠĠĠ Ġmf . setInt ( dispatcher , Ġdispatcher . modifiers Ġand ĠModifier . FINAL . inv ()) ĊĠ Ġ} ĊĊĠ Ġfun Ġinit () Ġ{ ĊĠĠĠ Ġif Ġ( loaded . compare AndSet ( false , Ġtrue )) Ġ{ ĊĠĠĠĠĠ Ġold Dispatcher Ġ= Ġdispatcher Field . get ( null ). cast () ĊĠĠĠĠĠ Ġdispatcher Field . set ( null , Ġthis ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġresume () Ġ{ ĊĠĠĠ Ġif Ġ( loaded . compare AndSet ( true , Ġfalse ) Ġ&& Ġold Dispatcher Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġdispatcher Field . set ( null , Ġold Dispatcher ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġval Ġimmediate : ĠMain Coroutine Dispatcher Ġget () Ġ= Ġthis ĊĊĠ Ġoverride Ġfun Ġdispatch ( context : ĠCor outine Context , Ġblock : ĠRunnable ) Ġ{ ĊĠĠĠ Ġdispatcher . dispatch ( context , Ġblock ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠ Ġdispatcher . close () ĊĠ Ġ} Ċ }