package Ġjust 4 fun . mod ularity . core Ċ Ċ import Ġjust 4 fun . kot link it . Result Ċ import Ġjust 4 fun . kot link it . S af ely Ċ import Ġjust 4 fun . kot link it . async .* Ċ import Ġjust 4 fun . mod ularity . core . Module . State Bit .* Ċ import Ġjust 4 fun . mod ularity . core . Module . Set Option .* Ċ import Ġjust 4 fun . mod ularity . core . multis ync . Sync Ċ import Ġjust 4 fun . mod ularity . core . utils . Easy List Ċ import Ġjust 4 fun . mod ularity . core . utils . Easy List Element Ċ import Ġjust 4 fun . mod ularity . core . utils . Rest Calc Ċ import Ġjust 4 fun . mod ularity . core . utils . Rest Calculator Ċ import Ġjava . util . concurrent . Cancellation Exception Ċ import Ġkotlin . coroutines . experimental . Continuation Ċ import Ġkotlin . coroutines . experimental . suspend Coroutine Ċ import Ġjava . lang . Integer . MIN _ VALUE Ġas ĠUN H OLD Ċ import Ġjava . lang . System . currentTimeMillis Ġas Ġnow Ċ import Ġjava . util . concurrent . TimeUnit . MILLISECONDS Ġas Ġms Ċ Ċ /* ĠIMP LEMENT Ġ*/ Ċ Ċ /** ĠThe Ġplace Ġwhere Ġan Ġimplementation Ġof Ġthe Ġhost Ġ[ Module ] Ġfunctionality Ġis Ġres ided . Ċ Ġ* Ċ Ġ* ĠAn Ġinstance Ġof Ġthis Ġclass Ġis Ġrequested Ġin Ġthe Ġhost Ġ[ Module . onCreate Implement ] Ġcallback . ĠIt 's Ġwhere Ġthe Ġmodule Ġcan Ġcreate Ġa Ġnew Ġinstance Ġand Ġpass Ġall Ġthe Ġrequired Ġdata Ġto Ġit . Ċ Ġ* ĠThis Ġclass Ġsupports Ġlong Ġrunning Ġactivation Ġ/ Ġde activation Ġthat Ġlast s Ġas Ġlong Ġas Ġthe Ġcorresponding Ġcallback . Ċ Ġ* ĠThis Ġclass Ġis Ġisolated Ġfrom Ġdirect Ġaccess Ġfrom Ġthe Ġmodule . Ġ ĠThe Ġonly Ġvalid Ġway Ġto Ġaccess Ġit Ġis Ġvia Ġthe Ġ[ Module . implement ]. Ċ Ġ* ĠThe Ġmodule Ġrespect s Ġthe Ġcontract Ġwith Ġthis Ġclass : ĠThe Ġfirst Ġcalled Ġafter Ġthe Ġconstructor Ġis Ġthe Ġ[ on Activate ] Ġcallback . ĠNo Ġother Ġcalls Ġwill Ġbe Ġmade Ġuntil Ġ[ on Activate ] Ġis Ġreturned . ĠAfter Ġits Ġreturn Ġthe Ġmodule Ġmay Ġcall Ġany Ġimplementation Ġcode . Ġ ĠThe Ġlast Ġcalled Ġis Ġthe Ġ[ on De activate ] Ġcallback . ĠAfter Ġits Ġreturn Ġthis Ġobject Ġis Ġre cyc led . Ċ Ġ* ĠDep ending Ġon Ġwhether Ġthe Ġhost Ġ[ Module . is Rest ful ], Ġan Ġinstance Ġof Ġthis Ġclass Ġcan Ġbe Ġcreated Ġmany Ġtimes Ġor Ġjust Ġonce Ġper Ġthe Ġmodule 's Ġlifecycle . Ċ Ġ* Ġsee Ġthe Ġguide Ġfor Ġdetails . Ċ Ġ*/ Ċ interface ĠModule Implement : ĠS us pension Executor Ġ{ Ċ ĉ /** ĠThe Ġfirst Ġthing Ġcalled Ġafter Ġconstructor . ĠActiv ates Ġthis Ġinstance Ġas Ġlong Ġas Ġthis Ġmethod Ġlast s . ĠOther Ġmethods Ġwon 't Ġbe Ġcalled Ġuntil Ġthis Ġcall Ġreturns . ĠIt Ġruns Ġin Ġthe Ġthread Ġof Ġthe Ġcaller Ġunless Ġit 's Ġchanged Ġby Ġthe Ġ[ Suspend Utils ] Ġor Ġin Ġsome Ġother Ġway . ĠThe Ġ[ first ] Ġis Ġ` true ` Ġindicates Ġthe Ġhost Ġmodule Ġhas Ġcreated Ġthis Ġinstance Ġfor Ġthe Ġfirst Ġtime Ġin Ġits Ġlifecycle . ĠC onse quent ly Ġthis Ġmethod Ġis Ġcalled Ġfirst Ġtime Ġin Ġthe Ġmodule 's Ġlifecycle . ĠIf Ġthe Ġhost Ġ[ Module . is Rest ful ], Ġand Ġthis Ġis Ġnot Ġthe Ġfirst Ġinstance Ġcreated , Ġthe Ġ[ first ] Ġis Ġ` false `. Ċĉ Ġ* Ġ@ receiver Ġ[ Suspend Utils ]] ĠThe Ġutility Ġto Ġhelp Ġwith Ġ` suspend ` Ġexecution . Ċĉ Ġ*/ Ċ ĉ suspend Ġfun ĠS uspend Utils . on Activate ( first : ĠBoolean ): ĠUnit ĊĉĊ ĉ /** Ġ ĠThe Ġlast Ġthing Ġcalled Ġon Ġthis Ġinstance . ĠDe activ ates Ġthis Ġinstance Ġas Ġlong Ġas Ġthis Ġmethod Ġlast s . Ġ ĠIt Ġruns Ġin Ġthe Ġthread Ġof Ġthe Ġcaller Ġunless Ġit 's Ġchanged Ġby Ġthe Ġ[ Suspend Utils ] Ġor Ġin Ġsome Ġother Ġway . ĠThe Ġ[ last ] Ġis Ġ` true ` Ġindicates Ġthe Ġhost Ġmodule Ġhas Ġcreated Ġthis Ġinstance Ġfor Ġthe Ġlast Ġtime Ġin Ġits Ġlifecycle . ĠC onse quent ly Ġthis Ġmethod Ġis Ġcalled Ġlast Ġtime Ġin Ġthe Ġmodule 's Ġlifecycle . ĠIf Ġthe Ġhost Ġ[ Module . is Rest ful ], Ġand Ġthis Ġis Ġnot Ġthe Ġlast Ġinstance Ġcreated , Ġthe Ġ[ last ] Ġis Ġ` false `. ĠThe Ġmodule Ġguarantees Ġthis Ġmethod Ġto Ġbe Ġcalled Ġwith Ġthe Ġ[ last ] Ġ= Ġ` true `, Ġbut Ġonly Ġif Ġthis Ġis Ġimportant . ĠImport ance Ġis Ġexpressed Ġby Ġrequesting Ġthe Ġ[ last ] Ġfrom Ġcode . Ċĉ Ġ* Ġ@ receiver Ġ[ Suspend Utils ]] ĠThe Ġutility Ġto Ġhelp Ġwith Ġ` suspend ` Ġexecution . Ċĉ Ġ*/ Ċ ĉ suspend Ġfun ĠS uspend Utils . on De activate ( last : Ġ() Ġ-> ĠBoolean ): ĠUnit Ċ } ĊĊĊĊĊ Ċ /* ĠMODULE Ġ*/ Ċ Ċ /** ĠA Ġ[ Module ] Ġis Ġa Ġbuilding Ġblock Ġof Ġthe Ġapplication Ġthat Ġperforms Ġspecific Ġpart Ġof Ġthe Ġapplication âĢĻ s Ġfunctionality . Ċ Ġ* ĠThe Ġmodule Ġsepar ates Ġits Ġinterface Ġfrom Ġimplementation . ĠThe Ġimplementation Ġres ides Ġin Ġthe Ġ[ IMPLEMENT ] Ġclass , Ġwhile Ġthe Ġmodule Ġitself Ġis Ġthe Ġinterface . Ċ Ġ* ĠThe Ġmodule Ġalso Ġis ol ates Ġthe Ġimplementation , Ġallowing Ġto Ġaccess Ġit Ġvia Ġthe Ġ[ implement ] Ġaccessor Ġproperty Ġthat Ġmakes Ġcommunication Ġstate - transparent . Ċ Ġ* ĠThe Ġmodule Ġis Ġcreated Ġwhen Ġfirst Ġbound Ġand Ġdestroyed Ġwhen Ġnothing Ġbind s Ġit . Ċ Ġ* ĠThe Ġmodule Ġcan Ġbe Ġbound Ġby Ġother Ġmodule Ġor Ġ[ Module Container . Module Reference ] Ġfor Ġthe Ġpurpose Ġof Ġits Ġuse . ĠThe Ġmodule Ġguarantees Ġits Ġusers Ġto Ġserve Ġtheir Ġrequests Ġuntil Ġthey Ġun bind Ġit . Ċ Ġ* ĠWarning : ĠThe Ġ" manual " Ġmodule Ġcreation Ġis Ġnot Ġpermitted Ġand Ġthrows Ġan Ġexception . Ċ Ġ* Ġ@ param Ġ[ IMPLEMENT ] Ġspecifies Ġthe Ġtype Ġof Ġthe Ġimplement . Ċ Ġ* Ġ[ see Ġthe Ġguide Ġfor Ġdetails .]( https :// github . com / just - 4 - fun / mod ularity ) Ċ Ġ* Ġ@ see Ġ[ Module Implement ] Ċ Ġ*/ Ċ abstract Ġclass ĠModule < IMPLEMENT : ĠModule Implement >: ĠBase Module () Ġ{ Ċ ĉ /** ĠThe Ġmethods Ġof Ġthis Ġaccessor Ġare Ġthe Ġonly Ġvalid Ġway Ġto Ġaccess Ġthe Ġactual Ġ[ IMPLEMENT ] Ġinstance . Ġ*/ Ċ ĉ protected Ġval Ġimplement Ġ= ĠImplement Accessor () Ċ ĉ override Ġval Ġdebug Info : ĠDebug Info ? Ġ= Ġnull Ċ ĉ // ĠState Ċ ĉ /** ĠIndicates Ġwhether Ġthe Ġmodule Ġis Ġrest ful . Ġ@ see Ġ[ set Rest ful ] Ġ[ set Rest less ] */ Ċ ĉ val Ġis Rest ful Ġget () Ġ= ĠNOT ( Rest less ) Ċ ĉ /** ĠIndicates Ġwhether Ġthe Ġmodule Ġis Ġenabled . Ġ@ see Ġ[ enable ] Ġ[ disable ] */ Ċ ĉ val Ġis Enabled : ĠBoolean Ġget () Ġ= ĠIS ( Enabled ) Ċ ĉ /** ĠIndicates Ġwhether Ġthe Ġmodule Ġis Ġenabled Ġand Ġimplement Ġis Ġin Ġ[ READY ] Ġstate . Ġ*/ Ċ ĉ val Ġis Ready : ĠBoolean Ġget () Ġ= ĠIS ( READY ) Ġ&& ĠIS ( Enabled ) Ċ ĉ override Ġfinal Ġval Ġis Alive : ĠBoolean Ġget () Ġ= ĠNOT ( Last De activation ) Ġ&& ĠNOT ( DESTROY ED ) ĊĉĊ ĉ /* Ġbounds ĠK R Ġ*/ Ċ ĉ private Ġvar Ġkr Servers : ĠMutable List < Module <* >> ? Ġ= Ġnull Ċ ĉ private Ġvar Ġkr Users : ĠMutable List < Base Module >? Ġ= Ġnull Ċ ĉ /* Ġrequests Ġ Ġ*/ Ċ ĉ private Ġval Ġrequests : ĠEasy List < Request <* >> Ġ= ĠEasy List () Ċ ĉ private Ġval Ġr q Lock Ġ= Ġrequests Ċ ĉ private Ġvar Ġr q Balance Ġ= Ġ- 1 Ċ ĉ /* Ġstate Ġ*/ Ċ ĉ private Ġvar Ġstate Ġ= Ġ( 1 Ġshl ĠEnabled . ordinal ) Ġor Ġ( 1 Ġshl ĠRest less . ordinal ) Ġor Ġ( 1 Ġshl ĠServer s Have KR . ordinal ) Ġor Ġ( 1 Ġshl ĠLast De activation Needed . ordinal ) Ċ ĉ private Ġval Ġsync Ġ= ĠSync () Ċ ĉ private Ġvar Ġimpl : ĠIMP LEMENT ? Ġ= Ġnull Ċ ĉ private Ġvar Ġready Keeper : ĠReady Keeper ? Ġ= Ġnull Ċ ĉ private Ġvar Ġrest Calc : ĠRest Calculator ? Ġ= Ġnull Ċ ĉ private Ġvar Ġrest Delay Ġ= Ġ 0 Ċ ĉ private Ġvar Ġdisable Count Ġ= Ġ 0 Ċ ĉ private Ġvar Ġcontext : ĠThread Context ? Ġ= Ġnull Ċ ĉ private Ġval Ġlive Context Ġget () Ġ= Ġcontext Ġ?: Ġsys . Thread Contexts . CONTAINER ĊĉĊ ĉ /* Ġcallbacks Ġ*/ ĊĉĊ ĉ /** ĠThe Ġcallback Ġis Ġinvoked Ġwhen Ġthe Ġmodule Ġrequires Ġa Ġnew Ġinstance Ġof Ġthe Ġ[ IMPLEMENT ]. ĠIn Ġfact Ġit Ġas Ġwell Ġmay Ġbe Ġthe Ġmodule Ġitself Ġif Ġit Ġimplements Ġ[ IMPLEMENT ], Ġor Ġdifferent Ġsubclasses Ġof Ġthe Ġ[ IMPLEMENT ] Ġdepending Ġon Ġthe Ġsituation . Ġ*/ Ċ ĉ protected Ġabstract Ġfun ĠonCreate Implement (): ĠIMP LEMENT ĊĉĊ ĉ /** ĠThe Ġcallback Ġis Ġinvoked Ġright Ġafter Ġthe Ġ[ onCreate Implement ]. ĠA Ġreturned Ġobject Ġis Ġassigned Ġas Ġthe Ġimplement 's Ġthread Ġcontext . ĠThat Ġcan Ġbe Ġnull Ġ( the Ġdefault ) Ġor Ġone Ġof Ġthe Ġ[ Module Container . Thread Contexts ]. ĠSee Ġthe Ġguide Ġfor Ġdetails . Ġ Ġ*/ Ċ ĉ protected Ġopen Ġfun ĠonCreate Thread Context (): ĠThread Context ? Ġ= Ġnull ĊĉĊ ĉ /* Ġcontrols Ġ*/ ĊĉĊ ĉ /** ĠPut s Ġthe Ġmodule Ġin Ġthe ĠRest less Ġmode . ĠThe Ġmodule Ġstays Ġin Ġthe Ġ[ READY ] Ġstate Ġno Ġmatter Ġhas Ġit Ġsome Ġjob Ġto Ġdo Ġor Ġnot . Ċĉ Ġ* Ċĉ Ġ* Ġ@ see Ġ[ is Rest ful ] Ġ[ set Rest ful ] Ċĉ Ġ*/ Ċ ĉ protected Ġfun Ġset Rest less () Ġ= Ġsync . locked Or De fer Ġ{ Ċĉ ĉ rest Calc Ġ= Ġnull Ċĉ ĉ SET ( Rest less , Ġtrue ) Ċ ĉ } ĊĉĊ ĉ /** ĠPut s Ġthe Ġmodule Ġin Ġthe ĠRest ful Ġmode . ĠThe Ġmodule Ġstays Ġin Ġthe Ġ[ READY ] Ġstate Ġwhile Ġit Ġhas Ġsome Ġwork Ġto Ġdo . Ġ[ rest Delay ] Ġmilliseconds Ġsince Ġthe Ġlast Ġrequest Ġthe Ġmodule Ġpro ceeds Ġto Ġthe Ġ[ REST ING ] Ġstate . Ċĉ Ġ* Ċĉ Ġ* Ġ@ param [ least Rest Duration ] ĠIf Ġspecified Ġstarts Ġrest Ġdelay Ġoptimization Ġre calcul ating Ġit Ġaccording Ġto Ġthe Ġactual Ġrequest Ġintensity . ĠThe Ġsupplied Ġvalue Ġis Ġthe Ġstarting Ġdelay Ġin Ġmilliseconds . Ċĉ Ġ* Ġ@ see Ġ[ is Rest ful ] Ġ[ set Rest less ] Ċĉ Ġ*/ Ċ ĉ protected Ġfun Ġset Rest ful ( rest Delay : ĠInt Ġ= Ġ 6 0 0 0 0 , Ġleast Rest Duration : ĠInt Ġ= Ġ 0 ) Ġ= Ġsync . locked Or De fer Ġ{ Ċĉ ĉ if Ġ( IS ( Rest less )) Ġ{ Ċĉĉ ĉ if Ġ( least Rest Duration Ġ> Ġ 0 ) Ġrest Calc Ġ= ĠRest Calc ( rest Delay , Ġleast Rest Duration ) Ċĉĉ ĉ this . rest Delay Ġ= Ġif Ġ( rest Delay Ġ> Ġ 0 ) Ġrest Delay Ġelse Ġ 0 Ċĉĉ ĉ SET ( Rest less , Ġfalse ) Ċĉ ĉ } Ġelse Ġif Ġ( IS ( READY ) Ġ&& Ġthis . rest Delay Ġ!= Ġrest Delay ) Ġ{// ĠTODO Ġcheck Ġlogic Ċĉĉ ĉ this . rest Delay Ġ= Ġrest Delay Ċĉĉ ĉ calc Ready Keeper () Ċĉ ĉ } Ġelse ĠUnit Ċ ĉ } ĊĉĊ ĉ /** ĠEnables Ġthe Ġmodule Ġafter Ġit Ġhas Ġbeen Ġdisabled . ĠStarts Ġto Ġaccept Ġrequests Ġto Ġthe Ġ[ implement ]. ĠIn forms Ġusers Ġby Ġcalling Ġtheir Ġ[ on Bound Module Dis ability ] Ġcallback . Ċĉ Ġ* Ċĉ Ġ* Ġ@ see Ġ[ isEnabled ] Ġ[ disable ] Ċĉ Ġ*/ Ċ ĉ protected Ġfun Ġenable () Ġ{ Ċĉ ĉ sync . locked Or De fer Ġ{ Ċĉĉ ĉ disable Count ++ Ċĉĉ ĉ if Ġ( NOT ( Last De activation )) ĠSET ( Enabled , Ġtrue ) Ċĉ ĉ } Ċĉ ĉ users . forEach Ġ{ ĠS af ely Ġ{ Ġit . server Disabled ( this , ĠNOT ( Enabled )) Ġ} Ġ} Ċ ĉ } ĊĉĊ ĉ /** ĠDis ables Ġthe Ġmodule Ġso Ġthat Ġit Ġimmediately Ġpro ceeds Ġto Ġthe Ġ[ REST ING ] Ġstate . ĠAnd Ġstays Ġthere Ġreject ing Ġrequests Ġto Ġthe Ġ[ implement ]. ĠIn forms Ġusers Ġby Ġcalling Ġtheir Ġ[ on Bound Module Dis ability ] Ġcallback . Ċĉ Ġ* Ċĉ Ġ* Ġ@ param Ġ[ cancel Requests ] Ġif Ġ` true ` Ġand Ġthe Ġmodule Ġis Ġin Ġthe Ġ[ READY ] Ġstate , Ġall Ġcurrent Ġrequests Ġwill Ġbe Ġcancelled . Ċĉ Ġ* Ġ@ see Ġ[ isEnabled ] Ġ[ enable ] Ċĉ Ġ*/ Ċ ĉ protected Ġfun Ġdisable ( cancel Requests : ĠBoolean Ġ= Ġfalse ) Ġ{ Ċĉ ĉ val Ġcount Ġ= Ġ++ disable Count Ċĉ ĉ SET ( Enabled , Ġfalse , ĠSil ent ) Ċĉ ĉ sync . locked Or De fer Ġ{ Ċĉĉ ĉ if Ġ( disable Count Ġ!= Ġcount ) Ġreturn @ locked Or De fer Ġnull Ċĉĉ ĉ val Ġcancelled Ġ= Ġif Ġ( cancel Requests Ġ|| ĠNOT ( READY )) Ġ{ Ċĉĉĉ ĉ SET ( Requested , Ġfalse , ĠSil ent ) Ċĉĉĉ ĉ requests . purge () Ċĉĉ ĉ } Ġelse Ġnull Ċĉĉ ĉ SET ( Enabled , Ġfalse , ĠFor ced ) Ċĉĉ ĉ cancelled Ċĉ ĉ }. onComplete Ġ{ Ċĉĉ ĉ val Ġcancelled Ġ= Ġit . value OrThrow Ċĉĉ ĉ if Ġ( cancelled Ġ!= Ġnull Ġ&& Ġcancelled . isNotEmpty ()) Ġ{ Ċĉĉĉ ĉ val Ġx Ġ= ĠC ancellation Exception (" Module Ġ$ moduleName Ġhas Ġjust Ġbeen Ġdisabled ") Ċĉĉĉ ĉ cancelled . forEach Ġ{ Ġit . cancel ( x , Ġtrue ) Ġ} Ċĉĉ ĉ } Ċĉĉ ĉ users . forEach Ġ{ ĠS af ely Ġ{ Ġit . server Disabled ( this , ĠNOT ( Enabled )) Ġ} Ġ} Ċĉ ĉ } Ċ ĉ } ĊĉĊ ĉ private Ġfun Ġdisable ( cause : ĠThrowable ) Ġ{ Ċĉ ĉ disable ( true ) Ċĉ ĉ debug Info ?. on Unhandled Error ( cause ) Ċ ĉ } ĊĉĊĉĊ ĉ /* Ġrequests Ġapi Ġ*/ ĊĉĊ ĉ /** ĠThe Ġ[ implement ] Ġproperty Ġis Ġof Ġthis Ġtype . ĠIt 's Ġdesigned Ġas Ġthe Ġonly Ġvalid Ġway Ġfor Ġacc ss ing Ġthe Ġactual Ġ[ IMPLEMENT ] Ġinstance . Ġ*/ Ċ ĉ inner Ġclass ĠImplement Accessor Ġinternal Ġconstructor () Ġ{ Ċĉ ĉ /** ĠThe Ġcurrent Ġthread Ġcontext Ġin Ġwhich Ġthe Ġ[ IMPLEMENT ] Ġinstance Ġexecutes Ġrequests Ġmade Ġvia Ġthis Ġobject 's Ġmethods . Ġ*/ Ċĉ ĉ val Ġthread Context : ĠThread Context ? Ġget () Ġ= Ġcontext ĊĉĉĊĉ ĉ @ Published Api Ġinternal Ġval Ġinstance Ġget () Ġ= Ġthis @ Module . impl ĊĉĉĊĉ ĉ /** ĠIf Ġthe Ġmodule Ġ[ is Ready ], Ġreturns Ġa Ġsuccess full Ġ[ Result ] Ġof Ġ[ code ] Ġexecution . ĠOtherwise Ġreturns Ġfailed Ġ[ Result ] Ġwith Ġa Ġ[ Module Exception ]. ĠNote Ġthat Ġthe Ġmethod Ġdoesn 't Ġcatch Ġan Ġexception Ġthat Ġcan Ġbe Ġthrown Ġby Ġthe Ġ[ code ]. Ċĉĉ Ġ*/ Ċĉ ĉ inline Ġfun Ġ< T > Ġrun If Ready ( code : ĠIMP LEMENT . () Ġ-> ĠT ): ĠResult < T > Ġ= Ġif Ġ( can Inst Request ()) Ġ{ Ċĉĉ ĉ try Ġ{ Ċĉĉĉ ĉ instance ?. let Ġ{ ĠResult ( code ( it )) Ġ} Ġ?: ĠResult ( calc Exception ()) Ċĉĉ ĉ } Ġcatch Ġ( x : ĠThrowable ) Ġ{ Ċĉĉĉ ĉ Result < T >( x ) Ċĉĉ ĉ } Ġfinally Ġ{ Ċĉĉĉ ĉ done Inst Request () Ċĉĉ ĉ } Ċĉ ĉ } Ġelse ĠResult ( calc Exception ()) ĊĉĉĊĉ ĉ /** ĠThe Ġ[ code ] Ġwill Ġbe Ġexecuted Ġas Ġsoon Ġas Ġthe Ġmodule Ġbe c ames Ġ[ READY ]. ĠReturns Ġ[ AsyncResult ] Ġwhich Ġ[ Result ] Ġof Ġ[ T ] Ġwill Ġbe Ġaccessible Ġvia Ġ[ AsyncResult . onComplete ] Ġas Ġsoon Ġas Ġthe Ġ[ code ] Ġreturns . Ċĉĉ Ġ* ĠThe Ġ[ code ] Ġwill Ġrun Ġin Ġ[ thread Context ] Ġthread . ĠOr Ġin Ġthe Ġcaller Ġthread Ġif Ġthe Ġ[ thread Context ] Ġis Ġnull Ġand Ġthe Ġmodule Ġ[ is Ready ]. Ċĉĉ Ġ* ĠIf Ġthe Ġmodule Ġis Ġdisabled , Ġreturns Ġfailed Ġ[ AsyncResult ] Ġimmediately . Ċĉĉ Ġ*/ Ċĉ ĉ fun Ġ< T > Ġrun Async ( code : Ġsuspend ĠIMP LEMENT . () Ġ-> ĠT ): ĠAsync Result < T > Ġ= ĠRequest ( code ). also Ġ{ Ġinit Request ( it ) Ġ} ĊĉĉĊĉ ĉ /** ĠThe Ġ[ code ] Ġwill Ġbe Ġexecuted Ġas Ġsoon Ġas Ġthe Ġmodule Ġbe c ames Ġ[ READY ]. ĠReturns Ġ[ Result ] Ġas Ġsoon Ġas Ġthe Ġ[ code ] Ġreturns . Ċĉĉ Ġ* ĠIf Ġthe Ġmodule Ġis Ġdisabled , Ġreturns Ġfailed Ġ[ Result ] Ġimmediately . Ċĉĉ Ġ* ĠThe Ġ[ code ] Ġwill Ġrun Ġin Ġ[ thread Context ] Ġthread . ĠOr Ġin Ġthe Ġcaller Ġthread Ġif Ġthe Ġ[ thread Context ] Ġis Ġnull Ġand Ġthe Ġmodule Ġ[ is Ready ]. Ċĉĉ Ġ*/ Ċĉ ĉ suspend Ġfun Ġ< T > Ġrun Suspend ( code : Ġsuspend ĠIMP LEMENT . () Ġ-> ĠT ): ĠResult < T > Ġ= ĠRequest ( code ). pre Start Ġ{ Ġinit Request ( it ) Ġ} ĊĉĉĊĉĉĊĉ ĉ private Ġfun Ġ< T > Ġinit Request ( request : ĠRequest < T >) Ġ{ Ċĉĉ ĉ sync . locked Or De fer Ġ{ Ċĉĉĉ ĉ if Ġ( NOT ( Enabled )) Ġnull Ġelse Ġinit ed Request ( request )// ĠCan Ġbe Ġdisabled Ġhere Ċĉĉ ĉ }. onComplete Ġ{ Ċĉĉĉ ĉ val Ġr q Ġ= Ġit . value Ċĉĉĉ ĉ if Ġ( rq Ġ== Ġnull ) Ġrequest . cancel ( calc Exception (), Ġtrue ) Ċĉĉĉ ĉ else Ġif Ġ( IS ( READY )) Ġr q . start ( this @ Module . impl !! ) Ċĉĉ ĉ } Ċĉ ĉ } ĊĉĉĊĉ ĉ private Ġfun Ġ< T > Ġinit ed Request ( request : ĠRequest < T >): ĠRequest < T >? Ġ{ Ċĉĉ ĉ rest Calc ?. next Duration () Ċĉĉ ĉ if Ġ( requests . isEmpty ()) ĠSET ( Requested , Ġtrue )// ĠCan ĠCan Ġbe Ġdisabled Ġhere Ċĉĉ ĉ val Ġinit ed Ġ= ĠIS ( Enabled ) Ċĉĉ ĉ if Ġ( init ed ) Ġrequests . add ( request ) Ċĉĉ ĉ else Ġif Ġ( requests . isEmpty ()) ĠSET ( Requested , Ġfalse , ĠSil ent ) Ċĉĉ ĉ rest Calc ?. let Ġ{ Ċĉĉĉ ĉ if Ġ( rest Delay Ġ!= Ġit . rest Delay ) Ġ{ Ċĉĉĉĉ ĉ rest Delay Ġ= Ġit . rest Delay Ċĉĉĉĉ ĉ if Ġ( init ed Ġ&& ĠIS ( READY )) Ġcalc Ready Keeper () Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ return Ġif Ġ( init ed ) Ġrequest Ġelse Ġnull Ċĉ ĉ } ĊĉĉĊĉ ĉ @ Published Api Ġinternal Ġfun Ġcalc Exception (): ĠModule Exception Ġ= Ġwhen Ġ{ Ċĉĉ ĉ IS ( DESTROY ED ) Ġ-> ĠModule Destroyed Exception ( moduleName ) Ċĉĉ ĉ IS ( Enabled ) Ġ-> ĠModule Not Ready Exception ( moduleName ) Ċĉĉ ĉ else Ġ-> ĠModule Dis ability Exception ( moduleName ) Ċĉ ĉ } ĊĉĉĊĉ ĉ @ Published Api Ġinternal Ġfun Ġcan Inst Request () Ġ= Ġsynchronized ( rq Lock ) Ġ{ Ġif Ġ( rq Balance Ġ< Ġ 0 Ġ|| ĠNOT ( READY )) Ġfalse Ġelse Ġrun Ġ{ Ġr q Balance ++; Ġtrue Ġ} Ġ} Ċĉ ĉ @ Published Api Ġinternal Ġfun Ġdone Inst Request () Ġ= Ġsynchronized ( rq Lock ) Ġ{ Ġif Ġ( rq Balance Ġ> Ġ 0 ) Ġr q Balance -- Ġ} Ċ ĉ } ĊĉĊ ĉ private Ġfun Ġlet Inst Request () Ġ= Ġsynchronized ( rq Lock ) Ġ{ Ġr q Balance Ġ= Ġ 0 Ġ} Ċ ĉ private Ġfun Ġstop Inst Request ( wait : ĠBoolean ) Ġ{ Ċĉ ĉ if Ġ( wait Ġ&& Ġr q Balance Ġ> Ġ 0 ) Ġwhile Ġ( rq Balance Ġ> Ġ 0 Ġ&& Ġsync . isEmpty ()) ĠThread . sleep ( 1 0 ) Ċĉ ĉ synchronized ( rq Lock ) Ġ{ Ġr q Balance Ġ= Ġ- 1 Ġ} Ċ ĉ } ĊĉĊ ĉ private Ġfun Ġon Executed ( request : ĠRequest <* >) Ġ{ Ċĉ ĉ sync . locked Or De fer Ġ{ Ċĉĉ ĉ requests . remove ( request ) Ċĉĉ ĉ if Ġ( requests . isEmpty ()) ĠSET ( Requested , Ġfalse ) Ċĉ ĉ } Ċ ĉ } ĊĉĊ ĉ /* ĠBind ings Ġapi Ġ*/ ĊĉĊ ĉ override Ġfinal Ġfun Ġadd User ( user : ĠBase Module , Ġkeep Ready : ĠBoolean , Ġwarn Cyc lic : ĠBoolean ): ĠBoolean Ġ= Ġsync . locked Or T amper ( 1 ) Ġ{ Ċĉ ĉ if Ġ( IS ( Last De activation )) Ġreturn @ locked Or T amper Ġfalse // Ġa Ġway Ġto Ġavoid Ġsynchronization Ġdead lock Ċĉ ĉ if Ġ(! users . contains ( user )) Ġ{ Ċĉĉ ĉ // Ġcan Ġbecome Ġdisabled Ġhere Ċĉĉ ĉ if Ġ( users . isEmpty ()) ĠSET ( Bound , Ġtrue ) Ċĉĉ ĉ users . add ( user ) Ċĉĉ ĉ val Ġcl as Ġ= Ġuser . klass . java Ċĉĉ ĉ channels ?. forEach Ġ{ Ġit . suggest Listener ( user , Ġcl as ) Ġ} Ċĉĉ ĉ if Ġ( warn Cyc lic Ġ&& Ġuser . is Cyc lic Binding ( this , ĠArrayList ())) Ġwarn Cyc lic Binding ( user ) Ċĉĉ ĉ // Ġshould Ġbe Ġscheduled Ġto Ġavoid Ġactions Ġon Ġnot Ġassigned Ġref Ċĉĉ ĉ if Ġ( NOT ( Enabled )) ĠAsync Task ( 0 , Ġlive Context ) Ġ{ Ġif Ġ( NOT ( Enabled )) ĠS af ely Ġ{ Ġuser . server Disabled ( this @ Module , Ġtrue ) Ġ} Ġ} Ċĉ ĉ } Ċĉ ĉ if Ġ( keep Ready ) Ġadd User KR ( user ) Ġelse Ġremove User KR ( user ) Ċĉ ĉ true Ċ ĉ }. value OrThrow ĊĉĊĉĊ ĉ private Ġfun Ġadd User KR ( user : ĠBase Module ) Ġ{ Ċĉ ĉ kr Users Ġ= Ġkr Users Ġ?: ĠArrayList () Ċĉ ĉ if Ġ(! kr Users !!. contains ( user )) Ġ{ Ċĉĉ ĉ kr Users !!. add ( user ) Ċĉĉ ĉ if Ġ( user Ġis ĠModule <* >) Ġuser . add Server KR ( this ) Ċĉĉ ĉ on User Needs KR ( user ) Ċĉ ĉ } Ċ ĉ } ĊĉĊ ĉ private Ġfun Ġadd Server KR ( server : ĠModule <* >) Ġ{ Ċĉ ĉ kr Servers Ġ= Ġkr Servers Ġ?: ĠArrayList () Ċĉ ĉ if Ġ(! kr Servers !!. contains ( server )) Ġ{ Ċĉĉ ĉ kr Servers !!. add ( server ) Ċĉĉ ĉ on Server Has KR ( server ) Ċĉ ĉ } Ċ ĉ } ĊĉĊ ĉ override Ġfinal Ġfun Ġremove User ( user : ĠBase Module ) Ġ{ Ċĉ ĉ sync . locked Or De fer Ġ{ Ċĉĉ ĉ if Ġ( users . remove ( user )) Ġ{ Ċĉĉĉ ĉ val Ġcl as Ġ= Ġuser . klass . java Ċĉĉĉ ĉ channels ?. forEach Ġ{ Ġ Ġit . remove Listener ( user , Ġcl as ) Ġ} Ċĉĉĉ ĉ remove User KR ( user ) Ċĉĉĉ ĉ if Ġ( users . isEmpty ()) ĠSET ( Bound , Ġfalse ) Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĉĊ ĉ private Ġfun Ġremove User KR ( user : ĠBase Module ) Ġ{ Ċĉ ĉ if Ġ( kr Users Ġ!= Ġnull Ġ&& Ġkr Users !!. remove ( user )) Ġ{ Ċĉĉ ĉ if Ġ( kr Users !!. isEmpty ()) Ġkr Users Ġ= Ġnull Ċĉĉ ĉ if Ġ( user Ġis ĠModule <* >) Ġuser . remove Server KR ( this ) Ċĉĉ ĉ on User Needs KR ( null ) Ċĉ ĉ } Ċ ĉ } ĊĉĊ ĉ private Ġfun Ġremove Server KR ( server : ĠModule <* >) Ġ{ Ċĉ ĉ if Ġ( kr Servers Ġ!= Ġnull Ġ&& Ġkr Servers !!. remove ( server )) Ġ{ Ċĉĉ ĉ if Ġ( kr Servers !!. isEmpty ()) Ġkr Servers Ġ= Ġnull Ċĉĉ ĉ on Server Has KR ( null ) Ċĉ ĉ } Ċ ĉ } ĊĉĊ ĉ private Ġfun Ġhas KR (): ĠBoolean Ġ= Ġsync . locked Or T amper Ġ{ ĠIS ( Has KR ) Ġ}. value OrThrow // TODO Ġdead locks Ġocc ure Ġhere Ċ ĉ private Ġfun Ġon Server Has KR ( server : ĠModule < *> ?) Ġ= Ġsync . locked Or De fer Ġ{ Ċĉ ĉ // ĠWARN : Ġsome Ġdead locks Ġfrom Ġhere Ċĉ ĉ if Ġ( server Ġ!= Ġnull Ġ&& Ġ! server . has KR ()) ĠSET ( Servers Have KR , Ġfalse ) Ċĉ ĉ else Ġif Ġ( kr Servers Ġ== Ġnull Ġ|| Ġkr Servers !!. all Ġ{ Ġit . has KR () Ġ}) ĠSET ( Servers Have KR , Ġtrue ) Ċĉ ĉ else ĠUnit Ċ ĉ } ĊĉĊ ĉ private Ġfun Ġneeds KR (): ĠBoolean Ġ= ĠIS ( Needs KR ) Ċ ĉ private Ġfun Ġon User Needs KR ( user : ĠBase Module ?): ĠBoolean Ġ= Ġsync . locked Or T amper Ġ{ Ċĉ ĉ // ĠWARN : Ġmost Ġdead locks Ġfrom Ġhere Ċĉ ĉ if Ġ( user Ġ!= Ġnull Ġ&& Ġ( user Ġ! is ĠModule < *> Ġ|| Ġuser . needs KR ())) ĠSET ( User Needs KR , Ġtrue ) Ċĉ ĉ else Ġif Ġ( kr Users Ġ== Ġnull Ġ|| Ġkr Users !!. all Ġ{ Ġit Ġis ĠModule < *> Ġ&& Ġ! it . needs KR () Ġ}) ĠSET ( User Needs KR , Ġfalse ) Ċĉ ĉ IS ( Has KR ) Ċ ĉ }. value OrThrow ĊĉĊ ĉ /* Ġother Ġ*/ ĊĉĊ ĉ private Ġfun Ġnew Implement (): ĠIMP LEMENT ? Ġ= Ġtry Ġ{ Ċĉ ĉ onCreate Implement () Ċ ĉ } Ġcatch Ġ( x : ĠThrowable ) Ġ{ Ċĉ ĉ disable ( Module Implement Exception ( moduleName , Ġx )) Ċĉ ĉ null Ċ ĉ } ĊĉĊ ĉ override Ġfinal Ġfun Ġset Created ( error : ĠThrowable ?) Ġ{ Ċĉ ĉ sync . locked Or De fer Ġ{ Ċĉĉ ĉ SET ( CREATED , Ġtrue ) Ċĉĉ ĉ if Ġ( error Ġ!= Ġnull ) Ġdisable ( error ) Ċĉ ĉ } Ċ ĉ } ĊĉĊ ĉ override Ġfinal Ġfun Ġset In Charge () Ġ{ Ċĉ ĉ sync . locked Or De fer Ġ{ Ċĉĉ ĉ if Ġ( IS ( CREATED )) ĠSET ( First Activation , Ġtrue ) Ċĉ ĉ } Ċ ĉ } ĊĉĊĉ ĊĉĊĉ ĊĉĊ ĉ /* Ġprivate Ġapi Ġ ĠWARN : Ġshould Ġbe Ġcalled Ġinside Ġsync Ġ*/ ĊĉĊ ĉ private Ġfun ĠIS ( bit : ĠState Bit ): ĠBoolean Ġ= Ġ( state Ġand Ġ( 1 Ġshl Ġbit . ordinal )) Ġ!= Ġ 0 Ċ ĉ private Ġfun ĠNOT ( bit : ĠState Bit ): ĠBoolean Ġ= Ġ( state Ġand Ġ( 1 Ġshl Ġbit . ordinal )) Ġ== Ġ 0 Ċ ĉ private Ġfun ĠSET ( bit : ĠState Bit , Ġvalue : ĠBoolean , Ġoption : ĠSet Option Ġ= ĠNormal ): ĠBoolean Ġ{ Ċĉ ĉ // ĠFUN s Ċĉ ĉ @ Synchron ized Ġfun Ġapply ( bit : ĠState Bit , Ġvalue : ĠBoolean ): ĠBoolean Ġ{ Ċĉĉ ĉ val ĠoldValue Ġ= Ġ( state Ġand Ġ( 1 Ġshl Ġbit . ordinal )) Ġ!= Ġ 0 Ċĉĉ ĉ return Ġif Ġ( oldValue Ġ== Ġvalue ) Ġfalse Ċĉĉ ĉ else Ġ{ Ċĉĉĉ ĉ state Ġ= Ġif Ġ( value ) Ġstate Ġor Ġ( 1 Ġshl Ġbit . ordinal ) Ġelse Ġstate Ġand Ġ(( 1 Ġshl Ġbit . ordinal ). inv ()) Ċĉĉĉ ĉ true Ċĉĉ ĉ } Ċĉ ĉ } ĊĉĉĊĉ ĉ fun Ġneed Destroy () Ġ= ĠNOT ( Bound ) Ġ&& ĠNOT ( Requested ) Ġ&& Ġ( NOT ( Enabled ) Ġ|| ĠNOT ( Last De activation Needed ) Ġ|| ĠIS ( First Activation ) Ġ|| ĠIS ( CREATED )) Ċĉ ĉ fun Ġneed Init () Ġ= ĠIS ( Enabled ) Ġ&& Ġ( NOT ( Bound ) Ġ|| ĠIS ( Rest less ) Ġ|| ĠIS ( Requested ) Ġ|| ĠIS ( User Needs KR )) ĊĉĉĊĉ ĉ // Ċĉ ĉ val Ġchanged Ġ= Ġapply ( bit , Ġvalue ) Ċĉ ĉ val Ġexecute Ġ= Ġ( changed Ġ&& Ġoption Ġ!= ĠSil ent ) Ġ|| Ġoption Ġ== ĠFor ced Ċĉ ĉ debug Info ?. debug State ( bit , Ġvalue , Ġoption , Ġexecute , Ġchanged ) Ċĉ ĉ if Ġ(! execute ) Ġreturn Ġchanged Ċĉ ĉ // Ċĉ ĉ when Ġ( bit ) Ġ{ Ċĉĉ ĉ Requested Ġ-> Ġwhen Ġ{ Ċĉĉĉ ĉ IS ( READY ) Ġ&& Ġ! value Ġ-> ĠIS ( Enabled ). let Ġ{ Ġready Keeper ?. no Requests ( it ); Ġif Ġ(! it ) ĠSET ( READY , Ġfalse ) Ġ} Ċĉĉĉ ĉ IS ( REST ING ) Ġ-> Ġif Ġ( need Destroy ()) ĠSET ( DESTROY ED , Ġtrue ) Ġelse ĠSET ( Needs KR , Ġneed Init ()) Ċĉĉĉ ĉ IS ( CREATED ) Ġ-> Ġif Ġ( need Destroy ()) ĠSET ( DESTROY ED , Ġtrue ) Ċĉĉ ĉ } Ċĉĉ ĉ Bound Ġ-> Ġwhen Ġ{ Ċĉĉĉ ĉ IS ( READY ) Ġ-> Ġcalc Ready Keeper () Ċĉĉĉ ĉ IS ( REST ING ) Ġ-> Ġif Ġ( need Destroy ()) ĠSET ( DESTROY ED , Ġtrue ) Ġelse ĠSET ( Needs KR , Ġneed Init ()) Ċĉĉĉ ĉ IS ( CREATED ) Ġ-> Ġif Ġ( need Destroy ()) ĠSET ( DESTROY ED , Ġtrue ) Ċĉĉ ĉ } Ċĉĉ ĉ Enabled Ġ-> Ġ{ Ċĉĉĉ ĉ when Ġ{ Ċĉĉĉĉ ĉ IS ( READY ) Ġ-> Ġif Ġ(! value Ġ&& Ġrequests . isEmpty ()) ĠSET ( READY , Ġfalse ) Ġelse Ġcalc Ready Keeper () Ċĉĉĉĉ ĉ IS ( REST ING ) Ġ-> Ġif Ġ( need Destroy ()) ĠSET ( DESTROY ED , Ġtrue ) Ġelse ĠSET ( Needs KR , Ġneed Init ()) Ċĉĉĉĉ ĉ IS ( CREATED ) Ġ-> Ġif Ġ( need Destroy ()) ĠSET ( DESTROY ED , Ġtrue ) Ċĉĉĉ ĉ } Ċĉĉĉ ĉ if Ġ( NOT ( DESTROY ED ) Ġ&& Ġvalue Ġ== ĠIS ( Enabled )) Ġ{ Ċĉĉĉĉ ĉ if Ġ( NOT ( READY )) ĠSET ( Has KR , Ġ! value ) Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ Rest less Ġ-> Ġwhen Ġ{ Ċĉĉĉ ĉ IS ( READY ) Ġ-> Ġcalc Ready Keeper () Ċĉĉĉ ĉ IS ( REST ING ) Ġ-> ĠSET ( Needs KR , Ġneed Init ()) Ċĉĉ ĉ } Ċĉĉ ĉ User Needs KR Ġ-> Ġwhen Ġ{ Ċĉĉĉ ĉ IS ( READY ) Ġ-> Ġcalc Ready Keeper () Ċĉĉĉ ĉ IS ( REST ING ) Ġ-> ĠSET ( Needs KR , Ġneed Init ()) Ċĉĉ ĉ } Ċĉĉ ĉ Needs KR Ġ-> Ġwhen Ġ( value ) Ġ{ Ċĉĉĉ ĉ true Ġ-> Ġ{ Ċĉĉĉĉ ĉ val Ġall Servers Have KR Ġ= Ġkr Servers ?. let Ġ{ Ġit . fold ( true ) Ġ{ Ġres , Ġserver Ġ-> Ġserver . on User Needs KR ( this ) Ġ&& Ġres Ġ} Ġ} Ġ?: Ġtrue Ċĉĉĉĉ ĉ SET ( Servers Have KR , Ġall Servers Have KR , ĠSil ent ) Ċĉĉĉĉ ĉ if Ġ( IS ( Servers Have KR )) ĠSET ( REST ING , Ġfalse ) Ċĉĉĉ ĉ } Ċĉĉĉ ĉ false Ġ-> Ġkr Servers ?. forEach Ġ{ Ġit . on User Needs KR ( this ) Ġ} Ċĉĉ ĉ } Ċĉĉ ĉ Servers Have KR Ġ-> Ġ{ Ċĉĉĉ ĉ if Ġ( value Ġ&& ĠIS ( REST ING ) Ġ&& ĠIS ( Needs KR )) ĠSET ( REST ING , Ġfalse ) Ċĉĉ ĉ } Ċĉĉ ĉ Has KR Ġ-> Ġif Ġ( value ) ĠAsync Task ( 0 , Ġlive Context ) Ġ{ Ċĉĉĉ ĉ kr Users ?. forEach Ġ{ Ġif Ġ( it Ġis ĠModule <* >) Ġit . on Server Has KR ( this @ Module ) Ġ} Ċĉĉ ĉ } Ċĉĉ ĉ REST ING Ġ-> Ġwhen Ġ( value ) Ġ{ Ċĉĉĉ ĉ true Ġ-> Ġ{ Ċĉĉĉĉ ĉ impl Ġ= Ġnull Ċĉĉĉĉ ĉ if Ġ( need Destroy ()) ĠSET ( DESTROY ED , Ġtrue ) Ċĉĉĉĉ ĉ else Ġ{ Ċĉĉĉĉĉ ĉ SET ( Needs KR , Ġneed Init (), ĠFor ced ) Ċĉĉĉĉĉ ĉ if Ġ( NOT ( Needs KR )) Ġcontext ?. run Ġ{ Ċĉĉĉĉĉĉ ĉ request Shutdown ( this @ Module , Ġ 1 0 0 ); Ġcontext Ġ= Ġnull Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉĉ ĉ false Ġ-> ĠSET ( ACTIV ATING , Ġtrue ) Ċĉĉ ĉ } Ċĉĉ ĉ ACTIV ATING Ġ-> Ġwhen Ġ( value ) Ġ{ Ċĉĉĉ ĉ true Ġ-> Ġ{ Ċĉĉĉĉ ĉ context Ġ= ĠonCreate Thread Context () Ċĉĉĉĉ ĉ impl Ġ= Ġnew Implement () Ċĉĉĉĉ ĉ if Ġ( impl Ġ== Ġnull ) ĠSET ( ACTIV ATING , Ġfalse ) Ċĉĉĉĉ ĉ else ĠProgress ( true , Ġimpl !! ) Ċĉĉĉ ĉ } Ċĉĉĉ ĉ false Ġ-> Ġwhen Ġ{ Ċĉĉĉĉ ĉ impl Ġ== Ġnull Ġ-> ĠSET ( REST ING , Ġtrue ) Ċĉĉĉĉ ĉ IS ( Enabled ) Ġ-> ĠSET ( READY , Ġtrue ) Ċĉĉĉĉ ĉ else Ġ-> ĠSET ( DE ACTIV ATING , Ġtrue ) Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ READY Ġ-> Ġwhen Ġ( value ) Ġ{ Ċĉĉĉ ĉ true Ġ-> Ġ{ Ċĉĉĉĉ ĉ let Inst Request () Ċĉĉĉĉ ĉ if Ġ( requests . isNotEmpty ()) Ġ{ Ċĉĉĉĉĉ ĉ val Ġr qs Ġ= Ġrequests . toList () Ċĉĉĉĉĉ ĉ AsyncTask ( 0 , Ġlive Context ) Ġ{ Ġr qs . forEach Ġ{ Ġimpl ?. run Ġ{ Ġit . start ( this ) Ġ} Ġ} Ġ} Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ SET ( Has KR , Ġtrue ) Ċĉĉĉĉ ĉ rest Calc ?. let Ġ{ Ġrest Delay Ġ= Ġit . calc Rest Delay () Ġ} Ċĉĉĉĉ ĉ calc Ready Keeper () Ċĉĉĉ ĉ } Ċĉĉĉ ĉ false Ġ-> ĠSET ( DE ACTIV ATING , Ġtrue ) Ċĉĉ ĉ } Ċĉĉ ĉ DE ACTIV ATING Ġ-> Ġwhen Ġ( value ) Ġ{ Ċĉĉĉ ĉ true Ġ-> Ġ{ Ċĉĉĉĉ ĉ SET ( First Activation , Ġfalse , ĠSil ent ) Ċĉĉĉĉ ĉ stop Inst Request ( IS ( Enabled )) Ċĉĉĉĉ ĉ if Ġ( NOT ( Bound )) ĠSET ( Last De activation , Ġtrue ) Ċĉĉĉĉ ĉ if Ġ( IS ( Enabled )) ĠSET ( Has KR , Ġfalse ) Ċĉĉĉĉ ĉ ready Keeper ?. cancel () Ċĉĉĉĉ ĉ ready Keeper Ġ= Ġnull Ċĉĉĉĉ ĉ Progress ( false , Ġimpl !! ) Ċĉĉĉ ĉ } Ċĉĉĉ ĉ false Ġ-> ĠSET ( REST ING , Ġtrue ) Ċĉĉ ĉ } Ċĉĉ ĉ CREATED Ġ-> ĠUnit Ċĉĉ ĉ DESTROY ED Ġ-> Ġ{ Ċĉĉĉ ĉ SET ( REST ING , Ġfalse , ĠSil ent ) Ċĉĉĉ ĉ S af ely Ġ{ Ġon Destroyed () Ġ} Ċĉĉĉ ĉ SET ( Last De activation , Ġtrue ) Ċĉĉĉ ĉ sys . module Destroy ( this ) Ċĉĉ ĉ } Ċĉĉ ĉ Last De activation Ġ-> Ġif Ġ( value ) Ġ{ Ċĉĉĉ ĉ SET ( Enabled , Ġfalse , ĠSil ent ) Ċĉĉĉ ĉ sys . module Unregister ( this ) Ċĉĉ ĉ } Ċĉĉ ĉ Last De activation Needed Ġ-> ĠUnit Ċĉĉ ĉ First Activation Ġ-> Ġif Ġ( value ) Ġ{ Ċĉĉĉ ĉ SET ( CREATED , Ġfalse , ĠSil ent ) Ċĉĉĉ ĉ SET ( REST ING , Ġtrue ) Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ return Ġchanged Ċ ĉ } ĊĉĊ ĉ private Ġfun Ġcalc Ready Keeper () Ġ{ Ċĉ ĉ val Ġexpect Ġ= Ġwhen Ġ{ Ċĉĉ ĉ NOT ( Bound ) Ġ-> Ġ 0 Ċĉĉ ĉ NOT ( Enabled ) Ġ-> Ġrest Delay Ċĉĉ ĉ IS ( Rest less ) Ġ|| ĠIS ( User Needs KR ) Ġ-> ĠUN H OLD Ċĉĉ ĉ else Ġ-> Ġrest Delay Ċĉ ĉ } Ċĉ ĉ val Ġcurrent Ġ= Ġready Keeper ?. delay Ġ?: ĠUN H OLD Ċĉ ĉ if Ġ( current Ġ== Ġexpect ) Ġreturn Ċĉ ĉ ready Keeper ?. cancel () Ċĉ ĉ ready Keeper Ġ= Ġif Ġ( expect Ġ== ĠUN H OLD ) Ġnull Ġelse ĠReady Keeper ( expect ) Ċ ĉ } ĊĉĊĉ ĊĉĊĉ ĊĉĊĉĊ ĉ /* ĠRequest Ġ*/ ĊĉĊ ĉ private Ġinner Ġclass ĠRequest < T >( private Ġval Ġcode : Ġsuspend ĠIMP LEMENT . () Ġ-> ĠT ): ĠS uspend Task < T >(), ĠEasy List Element < Request <* >> Ġ{ Ċĉ ĉ override Ġvar Ġnext : ĠRequest < *> ? Ġ= Ġnull Ċĉ ĉ override Ġvar Ġprev : ĠRequest < *> ? Ġ= Ġnull ĊĉĉĊĉ ĉ suspend Ġ/* inline */ Ġfun Ġpre Start (/* cross inline */ Ġconfig : Ġ( Request < T >) Ġ-> ĠUnit ) Ġ= Ġpre Start Sus pended ( this @ Module . context , Ġconfig ) Ċĉ ĉ fun Ġstart ( impl : ĠIMP LEMENT ) Ġ= Ġstart ( impl , Ġthis @ Module . context , Ġcode ) Ċĉ ĉ override Ġfun ĠonComplete ( result : ĠResult < T >) Ġ= Ġon Executed ( this ) Ċ ĉ } ĊĉĊĉ ĊĉĊ ĉ /* ĠProgress */ ĊĉĊ ĉ private Ġinner Ġclass ĠProgress ( private Ġval Ġinit : ĠBoolean , Ġprivate Ġval Ġimpl : ĠIMP LEMENT ): ĠS uspend Task < Unit >(), ĠS uspend Utils Ġ{ Ċĉ ĉ init Ġ{ Ċĉĉ ĉ start ( this , Ġnull ) Ġ{ Ċĉĉĉ ĉ if Ġ( init ) Ġimpl . run Ġ{ Ġthis @ Progress . on Activate ( IS ( First Activation )) Ġ} Ċĉĉĉ ĉ else Ġ{ Ċĉĉĉĉ ĉ SET ( Last De activation Needed , Ġfalse , ĠSil ent ) Ċĉĉĉĉ ĉ impl . run Ġ{ Ġthis @ Progress . on De activate ({ ĠSET ( Last De activation Needed , Ġtrue , ĠSil ent ); ĠIS ( Last De activation ) Ġ}) Ġ} Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } ĊĉĉĊĉ ĉ override Ġfun ĠonComplete ( result : ĠResult < Unit >) Ġ{ Ċĉĉ ĉ result . on Failure Ġ{ Ċĉĉĉ ĉ disable ( if Ġ( init ) ĠModule Activation Exception ( moduleName , Ġit ) Ġelse ĠModule De activation Exception ( moduleName , Ġit )) Ċĉĉ ĉ } Ċĉĉ ĉ sync . locked Or De fer Ġ{ Ġif Ġ( init ) ĠSET ( ACTIV ATING , Ġfalse ) Ġelse ĠSET ( DE ACTIV ATING , Ġfalse ) Ġ} Ċĉ ĉ } ĊĉĉĊĉ ĉ // ĠUtils Ċĉ ĉ private Ġvar Ġstarted Ġ= Ġ 0 L Ċĉ ĉ private Ġlateinit Ġvar Ġcurrent Backoff : Ġ( Long ) Ġ-> ĠInt Ċĉ ĉ private Ġval Ġdefault Backoff : Ġ( Long ) Ġ-> ĠInt Ċĉĉ ĉ get () Ġ= Ġ{ Ġduration Ms Ġ-> Ċĉĉĉ ĉ if Ġ( duration Ms Ġ< Ġ 2 0 0 ) Ġ 4 0 Ċĉĉĉ ĉ else Ġif Ġ( duration Ms Ġ< Ġ 2 0 0 0 ) Ġ 2 0 0 Ċĉĉĉ ĉ else Ġif Ġ( duration Ms Ġ< Ġ 1 0 0 0 0 ) Ġ 1 0 0 0 Ċĉĉĉ ĉ else Ġif Ġ( duration Ms Ġ< Ġ 6 0 0 0 0 ) Ġ 5 0 0 0 Ċĉĉĉ ĉ else Ġ 1 0 0 0 0 Ċĉĉ ĉ } ĊĉĉĊĉ ĉ suspend Ġoverride Ġfun Ġswitch Thread Context ( context : ĠThread Context ?) Ġ= Ġsuspend Coroutine < Unit > Ġ{ Ċĉĉ ĉ val Ġc Ġ= Ġcontext Ġ?: Ġlive Context Ċĉĉ ĉ AsyncTask ( 0 , Ġc ) Ġ{ Ġit . resume ( Unit ) Ġ} Ċĉ ĉ } ĊĉĉĊĉ ĉ suspend Ġoverride Ġfun Ġwait While ( context : ĠThread Context ?, Ġbackoff : Ġ(( time : ĠLong ) Ġ-> ĠInt )? , Ġwait Condition : Ġ() Ġ-> ĠBoolean ) Ġ{ Ċĉĉ ĉ if Ġ( wait Condition ()) Ġ{ Ċĉĉĉ ĉ started Ġ= Ġnow () Ċĉĉĉ ĉ current Backoff Ġ= Ġbackoff Ġ?: Ġdefault Backoff Ċĉĉĉ ĉ val Ġc Ġ= Ġcontext Ġ?: Ġlive Context Ċĉĉĉ ĉ suspend Coroutine < Unit > Ġ{ Ġpost Complete ( c , Ġwait Condition , Ġfalse , Ġit ) Ġ} Ċĉĉ ĉ } Ċĉ ĉ } ĊĉĉĊĉ ĉ suspend Ġoverride Ġfun Ġwait Unless ( context : ĠThread Context ?, Ġbackoff : Ġ(( time : ĠLong ) Ġ-> ĠInt )? , Ġproceed Condition : Ġ() Ġ-> ĠBoolean ) Ġ{ Ċĉĉ ĉ if Ġ(! proceed Condition ()) Ġ{ Ċĉĉĉ ĉ started Ġ= Ġnow () Ċĉĉĉ ĉ current Backoff Ġ= Ġbackoff Ġ?: Ġdefault Backoff Ċĉĉĉ ĉ val Ġc Ġ= Ġcontext Ġ?: Ġlive Context Ċĉĉĉ ĉ suspend Coroutine < Unit > Ġ{ Ġpost Complete ( c , Ġproceed Condition , Ġtrue , Ġit ) Ġ} Ċĉĉ ĉ } Ċĉ ĉ } ĊĉĉĊĉ ĉ private Ġfun Ġpost Complete ( context : ĠThread Context ?, Ġcondition : Ġ() Ġ-> ĠBoolean , Ġexpect : ĠBoolean , Ġcompl : ĠContinu ation < Unit >) Ġ{ Ċĉĉ ĉ AsyncTask ( current Backoff ( now () Ġ- Ġstarted ), Ġcontext ) Ġ{ Ċĉĉĉ ĉ try Complete ( context , Ġcondition , Ġexpect , Ġcompl ) Ċĉĉ ĉ }. onComplete Ġ{ Ċĉĉĉ ĉ it . on Failure Ġ{ Ġcompl . resume With Exception ( it ) Ġ} Ċĉĉ ĉ } Ċĉ ĉ } ĊĉĉĊĉ ĉ private Ġfun Ġtry Complete ( context : ĠThread Context ?, Ġcondition : Ġ() Ġ-> ĠBoolean , Ġexpect : ĠBoolean , Ġcompl : ĠContinu ation < Unit >) Ġ{ Ċĉĉ ĉ try Ġ{ Ċĉĉĉ ĉ if Ġ( condition () Ġ== Ġexpect ) Ġcompl . resume ( Unit ) Ċĉĉĉ ĉ else Ġpost Complete ( context , Ġcondition , Ġexpect , Ġcompl ) Ċĉĉ ĉ } Ġcatch Ġ( x : ĠThrowable ) Ġ{ Ċĉĉĉ ĉ compl . resume With Exception ( x ) Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĉĊĉ ĊĉĊ ĉ /* ĠReady ĠK eeper Ġ*/ ĊĉĊ ĉ private Ġinner Ġclass ĠReady Keeper ( val Ġdelay : ĠInt ) Ġ{ Ċĉ ĉ var Ġdeadline Ġ= Ġnow () Ġ+ Ġdelay Ċĉ ĉ private Ġvar Ġcanceled Ġ= Ġfalse Ċĉ ĉ private Ġvar Ġposting Ġ= Ġfalse Ċĉ ĉ private Ġvar Ġtask : ĠAsync Result < *> ? Ġ= Ġnull ĊĉĉĊĉ ĉ // Ġcalled Ġinside Ġsynchronized Ġcode Ċĉ ĉ init Ġ{ Ċĉĉ ĉ if Ġ( requests . isEmpty ()) Ġpost () Ċĉ ĉ } ĊĉĉĊĉ ĉ fun Ġhas Time (): ĠBoolean Ġ= Ġnow () Ġ< Ġdeadline ĊĉĉĊĉ ĉ // Ġcalled Ġinside Ġsynchronized Ġcode Ċĉ ĉ fun Ġcancel () Ġ{ Ċĉĉ ĉ c anceled Ġ= Ġtrue Ċĉĉ ĉ task ?. cancel ( interrupt Ġ= Ġfalse ) Ċĉ ĉ } ĊĉĉĊĉ ĉ // Ġcalled Ġinside Ġsynchronized Ġcode Ċĉ ĉ fun Ġno Requests ( pro long : ĠBoolean ) Ġ{ Ċĉĉ ĉ if Ġ( pro long ) Ġ{ Ċĉĉĉ ĉ deadline Ġ= Ġnow () Ġ+ Ġdelay Ċĉĉĉ ĉ if Ġ(! post ing ) Ġpost () Ċĉĉ ĉ } Ġelse Ġcancel () Ċĉ ĉ } ĊĉĉĊĉ ĉ // Ġcalled Ġinside Ġsynchronized Ġcode Ċĉ ĉ private Ġfun Ġpost (): ĠUnit Ġ{ Ċĉĉ ĉ post ing Ġ= Ġtrue Ċĉĉ ĉ task Ġ= ĠAsync Task (( deadline Ġ- Ġnow ()). toInt (), Ġlive Context ) Ġ{ Ġrelease () Ġ} ĊĉĉĉĠ Ġ. onComplete Ġ{ ĊĉĉĉĉĠ Ġit . on Failure Ġ{ ĊĉĉĉĉĉĠ Ġif Ġ( it Ġ! is ĠC ancellation Exception ) Ġ{ ĊĉĉĉĉĉĉĠ ĠSystem . err . println ( it . printStackTrace ()) ĊĉĉĉĉĉĉĠ Ġrelease () ĊĉĉĉĉĉĠ Ġ} ĊĉĉĉĉĠ Ġ} ĊĉĉĉĠ Ġ} Ċĉ ĉ } ĊĉĉĊĉ ĉ fun Ġrelease () Ġ= Ġsync . locked Or De fer Ġ{ Ċĉĉ ĉ post ing Ġ= Ġfalse Ċĉĉ ĉ if Ġ( c anceled Ġ|| Ġrequests . isNotEmpty ()) ĠUnit Ċĉĉ ĉ else Ġif Ġ( has Time ()) Ġpost () Ċĉĉ ĉ else ĠSET ( READY , Ġfalse ) Ċĉ ĉ } Ċ ĉ } ĊĉĊĉ ĊĉĊ ĉ /* ĠDebug Info Ġ*/ ĊĉĊ ĉ inner Ġopen Ġclass ĠDebug Info : ĠBase Debug Info () Ġ{ Ċĉ ĉ val Ġstate Bits Ċĉĉ ĉ get (): ĠString Ġ= Ġrun Ġ{ Ċĉĉĉ ĉ fun Ġget ( bit : ĠInt ) Ġ= Ġ( this @ Module . state Ġand Ġ( 1 Ġshl Ġbit )) Ġ!= Ġ 0 Ċĉĉĉ ĉ return Ġ( 0 .. State Bit . values (). size ). map Ġ{ Ġbit Ġ-> Ġ( if Ġ( get ( bit )) Ġ" 1 " Ġelse Ġ" 0 ") Ġ+ Ġif Ġ( bit Ġ> Ġ 0 Ġ&& Ġ( bit Ġ+ Ġ 1 ) Ġ% Ġ 4 Ġ== Ġ 0 ) Ġ" Ġ" Ġelse Ġ"" Ġ}. join ToString ("") Ċĉĉ ĉ } ĊĉĉĊĉ ĉ val Ġstate Ċĉĉ ĉ get () Ġ= Ġwhen Ġ{ Ċĉĉĉ ĉ IS ( READY ) Ġ-> Ġ" READY " Ċĉĉĉ ĉ IS ( REST ING ) Ġ-> Ġ" REST ING " Ċĉĉĉ ĉ IS ( ACTIV ATING ) Ġ-> Ġ" ACTIV ATING " Ċĉĉĉ ĉ IS ( DE ACTIV ATING ) Ġ-> Ġ" DE ACTIV ATING " Ċĉĉĉ ĉ IS ( CREATED ) Ġ-> Ġ" CREATED " Ċĉĉĉ ĉ IS ( DESTROY ED ) Ġ-> Ġ" DESTROY ED " Ċĉĉĉ ĉ else Ġ-> Ġ" INVALID " Ċĉĉ ĉ } ĊĉĉĊĉ ĉ val Ġasync Request Count Ġget () Ġ= Ġsync . locked Or Discard Ġ{ Ġvar Ġcount Ġ= Ġ 0 ; Ġrequests . forEach Ġ{ Ġcount ++ Ġ}; Ġcount Ġ}. value Or (- 1 ) Ċĉ ĉ val Ġsync Request Count Ġget () Ġ= Ġr q Balance Ċĉ ĉ val Ġuser Modules Ċĉĉ ĉ get () Ġ= Ġsync . locked Or Discard Ġ{ Ċĉĉĉ ĉ users . map Ġ{ Ġit . moduleName Ġ}. join ToString () Ċĉĉ ĉ }. value Ċĉ ĉ val Ġkeeping Ready Modules Ċĉĉ ĉ get () Ġ= Ġsync . locked Or Discard Ġ{ Ċĉĉĉ ĉ kr Users ?. map Ġ{ Ġit . moduleName Ġ} ?. join ToString () Ċĉĉ ĉ }. value Ċĉ ĉ val Ġkept Ready Modules Ċĉĉ ĉ get () Ġ= Ġsync . locked Or Discard Ġ{ Ċĉĉĉ ĉ kr Servers ?. map Ġ{ Ġit . moduleName Ġ} ?. join ToString () Ċĉĉ ĉ }. value ĊĉĉĊĉ ĉ open Ġfun Ġon Unhandled Error ( cause : ĠThrowable ): ĠUnit Ġ= Ġcause . printStackTrace () ĊĉĉĊĉ ĉ internal Ġopen Ġfun Ġdebug State ( bit : ĠState Bit , Ġvalue : ĠBoolean , Ġoption : ĠSet Option , Ġexecute : ĠBoolean , Ġchanged : ĠBoolean ) Ġ= ĠUnit ĊĉĉĊĉ ĉ override Ġfun ĠtoString () Ġ= Ġ" state Ġbits : Ġ[$ state Bits ]: ĠĠ Ġuser Modules : Ġ$ user Modules ; ĠĠ Ġkeeping Ready Modules : Ġ$ keep ing Ready Modules ; ĠĠ Ġkept Ready Modules : Ġ$ ke pt Ready Modules ; ĠĠ Ġasync Request Count : Ġ Ġ$ async Request Count ; ĠĠ Ġsync Request Count = Ġ$ sync Request Count " Ċ ĉ } ĊĉĊĉ ĊĉĊĉĊ ĉ /* ĠState ĠBits Ġ*/ Ċ ĉ internal Ġenum Ġclass ĠState Bit Ġ{ Ċĉ ĉ /* Ġcontrols Ġ*/ ĠBound , ĠRequest ed , ĠRest less , ĠEnabled , Ċĉ ĉ /* Ġkeep ĠREAD Y Ġ( KR ) Ġaggreg ates Ġ*/ ĠNeeds KR , ĠUser Needs KR , ĠHas KR , ĠServer s Have KR , Ċĉ ĉ /* Ġstate Ġ*/ Ċĉ ĉ /** ĠThe Ġmodule Ġis Ġconstructed , Ġbut Ġnot Ġyet Ġchecked Ġfor Ġnot Ġhaving Ġa Ġpre decessor Ġalive . Ġ*/ Ċĉ ĉ CREATED , Ċĉ ĉ /** ĠThe Ġmodule Ġhas Ġjust Ġcreated Ġor Ġput Ġin Ġrest . ĠIt Ġwaits Ġthe Ġconditions Ġto Ġinitialize Ġor Ġbe Ġdestroyed . ĠAn Ġ[ IMPLEMENT ] Ġinstance Ġis Ġnull . Ġ Ġ*/ Ċĉ ĉ REST ING , Ċĉ ĉ /** ĠAn Ġ[ IMPLEMENT ] Ġinstance Ġis Ġcreated Ġand Ġactiv ating . Ġ*/ Ċĉ ĉ ACTIV ATING , Ċĉ ĉ /** ĠAn Ġ[ IMPLEMENT ] Ġinstance Ġis Ġready Ġto Ġserve Ġrequests . Ġ*/ Ċĉ ĉ READY , Ċĉ ĉ /** ĠAn Ġ[ IMPLEMENT ] Ġinstance Ġis Ġde activ ating . ĠThe Ġmodule Ġis Ġgoing Ġto Ġrest Ġor Ġto Ġbe Ġdestroyed . Ġ*/ Ċĉ ĉ DE ACTIV ATING , Ċĉ ĉ /** ĠThe Ġmodule Ġis Ġremoved Ġfrom Ġthe Ġ[ container ] Ġand Ġno Ġmore Ġalive . Ġ*/ Ċĉ ĉ DESTROY ED , Ċĉ ĉ stub 7 , Ġstub 8 , Ċĉ ĉ /* Ġmisc Ġ*/ ĠFirst Activation , ĠLast De activation , ĠLast De activation Needed ; ĊĉĉĊĉ ĉ internal Ġcompanion Ġobject Ġ{ Ċĉĉ ĉ fun Ġstates () Ġ= ĠarrayOf ( CREATED , ĠREST ING , ĠACT IV ATING , ĠREAD Y , ĠDE ACTIV ATING , ĠDEST ROY ED ) Ċĉ ĉ } Ċ ĉ } ĊĉĊ ĉ /** ĠDefines Ġa Ġreaction Ġon Ġsetting Ġa Ġ[ State Bit ] Ġin Ġ[ Module . SET ] Ġ Ġ*/ Ċ ĉ internal Ġenum Ġclass ĠSet Option Ġ{ ĠNormal , ĠSil ent , ĠFor ced Ġ} Ċĉ Ċ } ĊĊĊĊĊ