/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 ĠSquare , ĠInc . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġokhttp 3 . internal . concurrent Ċ Ċ import Ġokhttp 3 . internal . assert Thread Does nt Hold Lock Ċ import Ġjava . util . concurrent . Count DownLatch Ċ import Ġjava . util . concurrent . Rejected ExecutionException Ċ Ċ /** Ċ Ġ* ĠA Ġset Ġof Ġtasks Ġthat Ġare Ġexecuted Ġin Ġsequential Ġorder . Ċ Ġ* Ċ Ġ* ĠWork Ġwithin Ġqueues Ġis Ġnot Ġconcurrent . ĠThis Ġis Ġequivalent Ġto Ġeach Ġqueue Ġhaving Ġa Ġdedicated Ġthread Ċ Ġ* Ġfor Ġits Ġwork ; Ġin Ġpractice Ġa Ġset Ġof Ġqueues Ġmay Ġshare Ġa Ġset Ġof Ġthreads Ġto Ġsave Ġresources . Ċ Ġ*/ Ċ class ĠTask Queue Ġinternal Ġconstructor ( ĊĠ Ġinternal Ġval Ġtask Runner : ĠTask Runner , ĊĠ Ġinternal Ġval Ġname : ĠString Ċ ) Ġ{ ĊĠ Ġinternal Ġvar Ġshutdown Ġ= Ġfalse ĊĊĠ Ġ/** ĠThis Ġqueue 's Ġcurrently - exec uting Ġtask , Ġor Ġnull Ġif Ġnone Ġis Ġcurrently Ġexecuting . Ġ*/ ĊĠ Ġinternal Ġvar Ġactive Task : ĠTask ? Ġ= Ġnull ĊĊĠ Ġ/** ĠScheduled Ġtasks Ġordered Ġby Ġ[ Task . next Execute Nano Time ]. Ġ*/ ĊĠ Ġinternal Ġval Ġfuture Tasks Ġ= Ġmutable ListOf < Task >() ĊĊĠ Ġ/** ĠTrue Ġif Ġthe Ġ[ active Task ] Ġshould Ġbe Ġcanceled Ġwhen Ġit Ġcompletes . Ġ*/ ĊĠ Ġinternal Ġvar Ġcancel Active Task Ġ= Ġfalse ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠReturns Ġa Ġsnapshot Ġof Ġtasks Ġcurrently Ġscheduled Ġfor Ġexecution . ĠDoes Ġnot Ġinclude Ġthe ĊĠĠ Ġ* Ġcurrently - exec uting Ġtask Ġunless Ġit Ġis Ġalso Ġscheduled Ġfor Ġfuture Ġexecution . ĊĠĠ Ġ*/ ĊĠ Ġval Ġscheduled Tasks : ĠList < Task > ĊĠĠĠ Ġget () Ġ= Ġsynchronized ( task Runner ) Ġ{ Ġfuture Tasks . toList () Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠS chedules Ġ[ task ] Ġfor Ġexecution Ġin Ġ[ delay Nan os ]. ĠA Ġtask Ġmay Ġonly Ġhave Ġone Ġfuture Ġexecution ĊĠĠ Ġ* Ġscheduled . ĠIf Ġthe Ġtask Ġis Ġalready Ġin Ġthe Ġqueue , Ġthe Ġear liest Ġexecution Ġtime Ġis Ġused . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠThe Ġtarget Ġexecution Ġtime Ġis Ġimplemented Ġon Ġa Ġbest - eff ort Ġbasis . ĠIf Ġanother Ġtask Ġin Ġthis Ġqueue ĊĠĠ Ġ* Ġis Ġrunning Ġwhen Ġthat Ġtime Ġis Ġreached , Ġthat Ġtask Ġis Ġallowed Ġto Ġcomplete Ġbefore Ġthis Ġtask Ġis ĊĠĠ Ġ* Ġstarted . ĠSimilar ly Ġthe Ġtask Ġwill Ġbe Ġdelayed Ġif Ġthe Ġhost Ġlack s Ġcompute Ġresources . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ throws ĠReject ed ExecutionException Ġif Ġthe Ġqueue Ġis Ġshut Ġdown Ġand Ġthe Ġtask Ġis Ġnot Ġcancel able . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġschedule ( task : ĠTask , Ġdelay Nan os : ĠLong Ġ= Ġ 0 L ) Ġ{ ĊĠĠĠ Ġsynchronized ( task Runner ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( shutdown ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( task . cancel able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtask Log ( task , Ġthis ) Ġ{ Ġ" schedule Ġcanceled Ġ( queue Ġis Ġshutdown )" Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtask Log ( task , Ġthis ) Ġ{ Ġ" schedule Ġfailed Ġ( queue Ġis Ġshutdown )" Ġ} ĊĠĠĠĠĠĠĠ Ġthrow ĠReject ed ExecutionException () ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġif Ġ( schedule And Dec ide ( task , Ġdelay Nan os , Ġrec urrence Ġ= Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠ Ġtask Runner . kick Coordinator ( this ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĠOver load Ġof Ġ[ schedule ] Ġthat Ġuses Ġa Ġlambda Ġfor Ġa Ġrepe ating Ġtask . Ġ*/ ĊĠ Ġinline Ġfun Ġschedule ( ĊĠĠĠ Ġname : ĠString , ĊĠĠĠ Ġdelay Nan os : ĠLong Ġ= Ġ 0 L , ĊĠĠĠ Ġcross inline Ġblock : Ġ() Ġ-> ĠLong ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġschedule ( object Ġ: ĠTask ( name ) Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġrun Once () Ġ= Ġblock () ĊĠĠĠ Ġ}, Ġdelay Nan os ) ĊĠ Ġ} ĊĊĠ Ġ/** ĠExec utes Ġ[ block ] Ġonce Ġon Ġa Ġtask Ġrunner Ġthread . Ġ*/ ĊĠ Ġinline Ġfun Ġexecute ( ĊĠĠĠ Ġname : ĠString , ĊĠĠĠ Ġdelay Nan os : ĠLong Ġ= Ġ 0 L , ĊĠĠĠ Ġcancel able : ĠBoolean Ġ= Ġtrue , ĊĠĠĠ Ġcross inline Ġblock : Ġ() Ġ-> ĠUnit ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġschedule ( object Ġ: ĠTask ( name , Ġcancel able ) Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġrun Once (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠ Ġreturn Ġ- 1 L ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}, Ġdelay Nan os ) ĊĠ Ġ} ĊĊĠ Ġ/** ĠReturns Ġa Ġl atch Ġthat Ġreaches Ġ 0 Ġwhen Ġthe Ġqueue Ġis Ġnext Ġidle . Ġ*/ ĊĠ Ġfun Ġidle Latch (): ĠCount DownLatch Ġ{ ĊĠĠĠ Ġsynchronized ( task Runner ) Ġ{ ĊĠĠĠĠĠ Ġ// ĠIf Ġthe Ġqueue Ġis Ġalready Ġidle , Ġthat 's Ġeasy . ĊĠĠĠĠĠ Ġif Ġ( active Task Ġ== Ġnull Ġ&& Ġfuture Tasks . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCount DownLatch ( 0 ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ// ĠIf Ġthere 's Ġan Ġexisting ĠAwait Idle Task , Ġuse Ġit . ĠThis Ġis Ġnecessary Ġwhen Ġthe Ġexecutor Ġis ĊĠĠĠĠĠ Ġ// Ġshutdown Ġbut Ġstill Ġbusy Ġas Ġwe Ġcan 't Ġenqueue Ġin Ġthat Ġcase . ĊĠĠĠĠĠ Ġval Ġexisting Task Ġ= Ġactive Task ĊĠĠĠĠĠ Ġif Ġ( existing Task Ġis ĠAwait Idle Task ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġexisting Task . latch ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġfor Ġ( future Task Ġin Ġfuture Tasks ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( future Task Ġis ĠAwait Idle Task ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġreturn Ġfuture Task . latch ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ// ĠDon 't Ġdelegate Ġto Ġschedule () Ġbecause Ġthat Ġen forces Ġshutdown Ġrules . ĊĠĠĠĠĠ Ġval Ġnew Task Ġ= ĠAwait Idle Task () ĊĠĠĠĠĠ Ġif Ġ( schedule And Dec ide ( new Task , Ġ 0 L , Ġrec urrence Ġ= Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠ Ġtask Runner . kick Coordinator ( this ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġnew Task . latch ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġclass ĠAwait Idle Task Ġ: ĠTask (" Ok Http Ġawait Idle ", Ġcancel able Ġ= Ġfalse ) Ġ{ ĊĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĊĠĠĠ Ġoverride Ġfun Ġrun Once (): ĠLong Ġ{ ĊĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠ Ġreturn Ġ- 1 L ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĠAdds Ġ[ task ] Ġto Ġrun Ġin Ġ[ delay Nan os ]. ĠReturns Ġtrue Ġif Ġthe Ġcoord inator Ġis Ġimpact ed . Ġ*/ ĊĠ Ġinternal Ġfun Ġschedule And Dec ide ( task : ĠTask , Ġdelay Nan os : ĠLong , Ġrec urrence : ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠ Ġtask . init Queue ( this ) ĊĊĠĠĠ Ġval Ġnow Ġ= Ġtask Runner . backend . nano Time () ĊĠĠĠ Ġval Ġexecute Nano Time Ġ= Ġnow Ġ+ Ġdelay Nan os ĊĊĠĠĠ Ġ// ĠIf Ġthe Ġtask Ġis Ġalready Ġscheduled , Ġtake Ġthe Ġearlier Ġof Ġthe Ġtwo Ġtimes . ĊĠĠĠ Ġval Ġexisting Index Ġ= Ġfuture Tasks . indexOf ( task ) ĊĠĠĠ Ġif Ġ( existing Index Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( task . next Execute Nano Time Ġ<= Ġexecute Nano Time ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtask Log ( task , Ġthis ) Ġ{ Ġ" already Ġscheduled " Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġfuture Tasks . remove At ( existing Index ) Ġ// ĠAlready Ġscheduled Ġlater : Ġre schedule Ġbelow ! ĊĠĠĠ Ġ} ĊĠĠĠ Ġtask . next Execute Nano Time Ġ= Ġexecute Nano Time ĊĠĠĠ Ġtask Log ( task , Ġthis ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( rec urrence ) Ġ" run Ġagain Ġafter Ġ${ format Duration ( execute Nano Time Ġ- Ġnow )}" ĊĠĠĠĠĠ Ġelse Ġ" scheduled Ġafter Ġ${ format Duration ( execute Nano Time Ġ- Ġnow )}" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠInsert Ġin Ġchrono logical Ġorder . ĠAlways Ġcompare Ġdelt as Ġbecause Ġnano Time () Ġis Ġpermitted Ġto Ġwrap . ĊĠĠĠ Ġvar Ġinsert At Ġ= Ġfuture Tasks . indexOf First Ġ{ Ġit . next Execute Nano Time Ġ- Ġnow Ġ> Ġdelay Nan os Ġ} ĊĠĠĠ Ġif Ġ( insert At Ġ== Ġ- 1 ) Ġinsert At Ġ= Ġfuture Tasks . size ĊĠĠĠ Ġfuture Tasks . add ( insert At , Ġtask ) ĊĊĠĠĠ Ġ// ĠImp act Ġthe Ġcoord inator Ġif Ġwe Ġinserted Ġat Ġthe Ġfront . ĊĠĠĠ Ġreturn Ġinsert At Ġ== Ġ 0 ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠS chedules Ġimmediate Ġexecution Ġof Ġ[ Task . try Cancel ] Ġon Ġall Ġcurrently - en queued Ġtasks . ĠThese Ġcalls ĊĠĠ Ġ* Ġwill Ġnot Ġbe Ġmade Ġuntil Ġany Ġcurrently - exec uting Ġtask Ġhas Ġcompleted . ĠTasks Ġthat Ġreturn Ġtrue Ġwill ĊĠĠ Ġ* Ġbe Ġremoved Ġfrom Ġthe Ġexecution Ġschedule . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġcancel All () Ġ{ ĊĠĠĠ Ġthis . assert Thread Does nt Hold Lock () ĊĊĠĠĠ Ġsynchronized ( task Runner ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( cancel All And Dec ide ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġtask Runner . kick Coordinator ( this ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġshutdown () Ġ{ ĊĠĠĠ Ġthis . assert Thread Does nt Hold Lock () ĊĊĠĠĠ Ġsynchronized ( task Runner ) Ġ{ ĊĠĠĠĠĠ Ġshutdown Ġ= Ġtrue ĊĠĠĠĠĠ Ġif Ġ( cancel All And Dec ide ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġtask Runner . kick Coordinator ( this ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĠReturns Ġtrue Ġif Ġthe Ġcoord inator Ġis Ġimpact ed . Ġ*/ ĊĠ Ġinternal Ġfun Ġcancel All And Dec ide (): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( active Task Ġ!= Ġnull Ġ&& Ġactive Task !!. cancel able ) Ġ{ ĊĠĠĠĠĠ Ġcancel Active Task Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġtasks Canceled Ġ= Ġfalse ĊĠĠĠ Ġfor Ġ( i Ġin Ġfuture Tasks . size Ġ- Ġ 1 Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( future Tasks [ i ]. cancel able ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtask Log ( future Tasks [ i ], Ġthis ) Ġ{ Ġ" c anceled " Ġ} ĊĠĠĠĠĠĠĠ Ġtasks Canceled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġfuture Tasks . remove At ( i ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtasks Canceled ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠtoString () Ġ= Ġname Ċ } Ċ