package Ġcom . aut odesk . cor out in ew ork er Ċ Ċ import Ġkotlin . native . concurrent . Atomic Int Ċ import Ġkotlin . native . concurrent . Atomic Reference Ċ import Ġkotlin . native . concurrent . Shared Immutable Ċ import Ġkotlin . native . concurrent . Transfer Mode Ċ import Ġkotlin . native . concurrent . Worker Ċ import Ġkotlin . native . concurrent . ensure Never Frozen Ċ import Ġkotlin . native . concurrent . freeze Ċ import Ġkotlinx . c interop . Stable Ref Ċ import Ġkotlinx . coroutines . Cancellation Exception Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . async Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . run Blocking Ċ Ċ /** Ċ Ġ* ĠHold s Ġthe Ġhook Ġfor Ġhandling Ġbackground Ġun caught Ġexceptions Ċ Ġ*/ Ċ @ Shared Immutable Ċ private Ġval ĠUN HAND LED _ EXCEPTION _ HOOK Ġ= ĠAtomic Reference < (( Throwable ) Ġ-> ĠUnit )? >( null ) Ċ Ċ /** Ċ Ġ* ĠInterface Ġfor Ġa Ġwork Ġitem Ġthat Ġcan Ġbe Ġqueued Ġto Ġrun Ġin Ċ Ġ* Ġa ĠBackground Coroutine Work Queue Executor Ċ Ġ*/ Ċ internal Ġinterface ĠCor outine WorkItem Ġ{ ĊĠĠĠ Ġ/** ĠThe Ġblock Ġto Ġexecute Ġvia Ġa ĠWorker Ġ*/ ĊĠĠĠ Ġval Ġwork : Ġsuspend ĠCor outine Scope . () Ġ-> ĠUnit Ċ } Ċ Ċ /** Ċ Ġ* ĠAn Ġexecutor Ġthat Ġruns Ġblocks Ġin Ġa Ġ[ kotlin x . coroutines . Coroutine Scope ] Ġon Ġa Ġbackground Ċ Ġ* ĠWorker Ġin Ġa Ġpool Ġwith Ġ[ num Workers ] Ġworkers . Ċ Ġ*/ Ċ internal Ġclass ĠBackground Coroutine Work Queue Executor < WorkItem Ġ: ĠCor outine WorkItem >( private Ġval Ġnum Workers : ĠInt ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġpool , Ġon Ġwhich Ġblocks Ġare Ġexecuted ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġpool Ġ= ĠWorker Pool ( num Workers ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProt ect s Ġaccess Ġto Ġthe Ġqueue Ġon Ġa Ġsingle Ġthread ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġqueue Thread Ġ= ĠWorker . start () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġwrapped Ġ( allow Ġfree zing Ġand Ġmutable Ġaccess Ġon Ġsingle Ġthread ) Ġqueue Ġof ĠWork Items ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġwrapped Queue : ĠSt able Ref < Work Queue < WorkItem >> Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠSt able Ref . create ( Work Queue < WorkItem > ()). freeze () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġwrapped Ġqueue Ġof ĠWork Items ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġqueue : ĠWork Queue < WorkItem > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġwrapped Queue . get () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġnumber Ġof Ġworkers Ġactively Ġprocessing Ġblocks ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġ_ num Active Workers Ġ= ĠAtomic Int ( 0 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGetter Ġfor Ġ_ num Active Workers ; Ġuseful Ġfor Ġprevent ing Ġleak age Ġin Ġtests ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġnum Active Workers : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ num Active Workers . value ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġnext Ġwork Ġitem Ġto Ġprocess , Ġif Ġany ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġde queue Work (): ĠWork Item ? Ġ= Ġqueue Thread . execute ( Transfer Mode . SAFE , Ġ{ Ġthis Ġ}) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . de queue (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġworker Ġis Ġgoing Ġto Ġbecome Ġinactive ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ num Active Workers . decrement () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. result ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠQue ues Ġan Ġitem Ġto Ġbe Ġexecuted ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġenqueue Work ( item : ĠWork Item ) Ġ= Ġqueue Thread . execute After ( operation Ġ= Ġ{ ĊĠĠĠĠĠĠĠ Ġqueue . enqueue ( item ) ĊĠĠĠĠĠĠĠ Ġ// Ġstart Ġa Ġworker Ġif Ġwe Ġhave Ġmore Ġworkers Ġto Ġstart ĊĠĠĠĠĠĠĠ Ġval Ġactive Worker Count Ġ= Ġ_ num Active Workers . value ĊĠĠĠĠĠĠĠ Ġif Ġ( active Worker Count Ġ< Ġnum Workers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpool . perform Work Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġerror Ġif Ġwe Ġaccidentally Ġfreeze Ġcoroutine Ġinternals ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . ensure Never Frozen () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Work Items () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ num Active Workers . increment () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. freeze ()) ĊĊĠĠĠ Ġsuspend Ġfun ĠCor outine Scope . process Work Items () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwork Item Ġ= Ġde queue Work () Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġ// ĠExecute Ġthe Ġwork Ġin Ġa Ġjob Ġthat Ġcan Ġbe Ġcancelled ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwork Item . work ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. await () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠC ancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġignore Ġcancellation ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= ĠUN HAND LED _ EXCEPTION _ HOOK . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( handler Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġexecute Ġa Ġcoroutine Ġto Ġattempt Ġto Ġprocess Ġthe Ġnext Ġwork Ġitem , Ġif Ġpossible ĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ Ġprocess Work Items () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ Ġfreeze () Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSets Ġthe Ġhandler Ġfor Ġun caught Ġexceptions Ġencountered Ġin Ġwork Ġitems ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġset Unhandled Exception Hook ( handler : Ġ( Throwable ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUN HAND LED _ EXCEPTION _ HOOK . value Ġ= Ġhandler . freeze () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠSet Ġ[ handler ] Ġfor Ġexceptions Ġthat Ġwould Ċ Ġ* Ġbe Ġb ub b led Ġup Ġto Ġthe Ġunderlying ĠWorker Ċ Ġ*/ Ċ fun Ġset Unhandled Exception Hook ( handler : Ġ( Throwable ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ ĠBackground Coroutine Work Queue Executor . set Unhandled Exception Hook ( handler ) Ċ } Ċ Ċ /** Ċ Ġ* ĠQueue Ġof Ġwork Items Ċ Ġ*/ Ċ private Ġclass ĠWork Queue < WorkItem Ġ: ĠAny > Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNode Ġin Ġthe Ġqueue Ġof Ġwork Ġitems ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġclass ĠNode < WorkItem >( val Ġwork Item : ĠWork Item ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠPointer Ġto Ġthe Ġnext Ġnode ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġnext : ĠNode < WorkItem >? Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġhead Ġof Ġthe Ġqueue Ġof ĠWork Items Ġto Ġexecute ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġqueue Head : ĠNode < WorkItem >? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġtail Ġof Ġthe Ġqueue Ġof ĠWork Items Ġto Ġexecute ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġqueue Tail : ĠNode < WorkItem >? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEn queues Ġa ĠWork Item ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġenqueue ( item : ĠWork Item ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcur Tail Ġ= Ġqueue Tail ĊĠĠĠĠĠĠĠ Ġqueue Tail Ġ= ĠNode ( item ) ĊĠĠĠĠĠĠĠ Ġcur Tail ?. next Ġ= Ġqueue Tail ĊĠĠĠĠĠĠĠ Ġif Ġ( queue Head Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġqueue Head Ġ= Ġqueue Tail ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDe - queues Ġa ĠWork Item ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġde queue (): ĠWork Item ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcur Head Ġ= Ġqueue Head Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġqueue Head Ġ= Ġcur Head . next ĊĠĠĠĠĠĠĠ Ġif Ġ( queue Head Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġqueue Tail Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcur Head . work Item ĊĠĠĠ Ġ} Ċ } Ċ