package Ġcom . bk ahl ert . k ustom ize . os Ċ Ċ import Ġcom . bk ahl ert . kom mon s . runtime . thread Ċ import Ġcom . bk ahl ert . kom mon s . text . ANSI . Text . Companion . ansi Ċ import Ġcom . bk ahl ert . kom mon s . time . Now Ċ import Ġcom . bk ahl ert . kom mon s . tracing . Span Scope Ċ import Ġcom . bk ahl ert . k ustom ize . os . Watch dog . Command . RESET Ċ import Ġcom . bk ahl ert . k ustom ize . os . Watch dog . Command . STOP Ċ import Ġjava . util . concurrent . Linked BlockingQueue Ċ import Ġjava . util . concurrent . TimeUnit . MILLISECONDS Ċ import Ġkotlin . time . Duration Ċ Ċ /** Ċ Ġ* ĠWatch dog Ġimplementation Ġthat Ġworks Ġlike Ġa Ġdead Ġman 's Ġswitch . Ċ Ġ* Ġ[ timed Out ] Ġis Ġ** not ** Ġtriggered Ġas Ġlong Ġas Ġ[ reset ] Ġwas Ġcalled Ġin Ġtime . Ċ Ġ* ĠShould Ġthe Ġtime Ġbetween Ġthe Ġstart Ġof Ġthis Ġwatch dog Ġor Ġthe Ġlast Ġ[ reset ] Ġcall Ġsur pass Ġthe Ġ[ timeout ] Ċ Ġ* Ġthe Ġwatch dog Ġcalls Ġ[ timed Out ]. Ċ Ġ*/ Ċ open Ġclass ĠWatch dog ( ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDuration Ġthat Ġneeds Ġto Ġpass Ġuntil Ġ[ timeout ] Ġis Ġcalled . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġtimeout : ĠDuration , ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIf Ġset Ġto Ġ` true ` Ġthis Ġwatch dog Ġdoes Ġnot Ġstop Ġworking Ġafter Ġhaving Ġbeen Ġtriggered . ĊĠĠĠĠ Ġ* ĠInstead Ġthe Ġwatch Ġperiod Ġstarts Ġagain Ġafter Ġ[ timed Out ] Ġfinished . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġrepe ating : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLogger Ġthat Ġcan Ġbe Ġaccessed Ġin Ġ[ timed Out ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġspan : ĠSpan Scope ? Ġ= Ġnull , ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġcalled Ġafter Ġmore Ġtime Ġhas Ġpassed Ġbetween Ġthe Ġstart Ġof Ġthis Ġwatch dog Ġand / or Ġtwo Ġconsecutive Ġ[ reset ] Ġcalls . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġtimed Out : ĠSpan Scope . () Ġ-> ĠAny , Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġtimeout Start : ĠLong Ġ= Ġ- 1 L ĊĠĠĠ Ġprivate Ġval Ġblocking Queue Ġ= ĠLinked BlockingQueue < Command >() ĊĠĠĠ Ġprivate Ġval Ġthread Ġ= Ġthread Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġlast Event : ĠCommand ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( blocking Queue . poll ( timeout . to Long ( MILLISECONDS ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimeout Start Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Event Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspan ?. log (" Watch dog Ġstarted . ĠT iming Ġout Ġin Ġ$ remaining .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Event Ġ= ĠRESET ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĠMIL LI SECONDS )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRESET Ġ-> Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger ?. log Line Ġ{ ĠIO . Type . META Ġtyped Ġ" Watch dog Ġreset . ĠT iming Ġout Ġin Ġ$ timeout ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Event Ġ= ĠRESET ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTOP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspan ?. log (" Watch dog Ġstopped .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Event Ġ= ĠSTOP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Event Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspan ?. log (" Watch dog Ġtimed Ġout . ĠInv oking Ġ$ timed Out .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspan ?. timed Out () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Event Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! repe ating ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Watch dog Ġwas Ġinterrupted Ġ( last Ġevent : Ġ$ last Event ). ĠSto pping .". ansi . red ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġremaining : ĠDuration Ġget () Ġ= Ġtimeout Ġ- ĠNow . passed Since ( timeout Start ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġcall Ġto Ġ[ reset ] Ġresets Ġthe Ġtimer Ġthat Ġticks Ġagainst Ġ[ timeout ]. ĊĠĠĠĠ Ġ* ĠE . g . Ġif Ġ[ timeout ] Ġwas Ġ 1 5 s Ġand Ġthe Ġwatch dog Ġis Ġrunning Ġsince Ġ 1 0 s Ġthe Ġ[ timed Out ] Ġwould Ġbe Ġcalled Ġin Ġ 5 s . ĊĠĠĠĠ Ġ* ĠAfter Ġhaving Ġcalled Ġ[ reset ] Ġthe Ġtime Ġit Ġtakes Ġuntil Ġ[ timed Out ] Ġis Ġcalled , Ġis Ġagain Ġ 1 5 s . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( thread . is Alive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblocking Queue . put ( RESET ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSto ps Ġthis Ġwatch dog . ĠAny Ġcall Ġto Ġfurther Ġcall Ġto Ġ[ reset ] Ġor Ġ[ stop ] Ġis Ġignored . ĠA Ġcall Ġto Ġ[ timed Out ] Ġwill ĊĠĠĠĠ Ġ* Ġnever Ġoccur . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( thread . is Alive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblocking Queue . put ( STOP ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġenum Ġclass ĠCommand Ġ{ ĊĠĠĠĠĠĠĠ ĠRESET , ĠSTOP ĊĠĠĠ Ġ} Ċ } Ċ