/* Ċ Ġ* ĠUnless Ġexplicitly Ġstated Ġotherwise Ġall Ġfiles Ġin Ġthis Ġrepository Ġare Ġlicensed Ġunder Ġthe ĠApache ĠLicense ĠVersion Ġ 2 . 0 . Ċ Ġ* ĠThis Ġproduct Ġincludes Ġsoftware Ġdeveloped Ġat ĠDat adog Ġ( https :// www . datadog hq . com /). Ċ Ġ* ĠCopyright Ġ 2 0 1 6 - Present ĠDat adog , ĠInc . Ċ Ġ*/ Ċ Ċ package Ġcom . datadog . android . k tx . coroutine Ċ Ċ import Ġcom . datadog . android . k tx . tracing . within Span Ċ import Ġio . op entr acing . Span Ċ import Ġio . op entr acing . util . Global Tracer Ċ import Ġkotlin . coroutines . Coroutine Context Ċ import Ġkotlin . coroutines . Empty Coroutine Context Ċ import Ġkotlinx . coroutines . Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Coroutine Start Ċ import Ġkotlinx . coroutines . Deferred Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . async Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġkotlinx . coroutines . with Context Ċ Ċ private Ġconst Ġval ĠTAG _ DISPATCH ER : ĠString Ġ= Ġ" coroutine . dispatcher " Ċ Ċ /** Ċ Ġ* ĠLa unches Ġa Ġnew Ġcoroutine Ġwithout Ġblocking Ġthe Ġcurrent Ġthread Ġand Ġreturns Ġa Ġreference Ġto Ġthe Ċ Ġ* Ġcoroutine Ġas Ġa Ġ[ Job ]. ĠA Ġspan Ġwill Ġbe Ġcreated Ġaround Ġthe Ġcoroutine Ġcode Ġand Ġsent Ġto ĠDat adog . Ċ Ġ* Ċ Ġ* ĠSee Ġ[ launch ] Ġto Ġlearn Ġmore Ġabout Ġlaunch ing Ġa Ġnew Ġcoroutine . Ċ Ġ* Ċ Ġ* Ġ@ param Ġoperation Name Ġthe Ġname Ġof Ġthe Ġ[ Span ] Ġcreated Ġaround Ġthe Ġcoroutine Ġcode . Ċ Ġ* Ġ@ param Ġcontext Ġadditional Ġto Ġ[ Coroutine Scope . coroutine Context ] Ġcontext Ġof Ġthe Ġcoroutine . Ċ Ġ* Ġ@ param Ġstart Ġcoroutine Ġstart Ġoption . ĠThe Ġdefault Ġvalue Ġis Ġ[ Coroutine Start . DEFAULT ]. Ċ Ġ* Ġ@ param Ġblock Ġthe Ġcoroutine Ġcode Ġwhich Ġwill Ġbe Ġinvoked Ġin Ġthe Ġcontext Ġof Ġthe Ġprovided Ġscope . Ċ Ġ**/ Ċ fun ĠCor outine Scope . launch Tr aced ( ĊĠĠĠ Ġoperation Name : ĠString , ĊĠĠĠ Ġcontext : ĠCor outine Context Ġ= ĠEmpty Coroutine Context , ĊĠĠĠ Ġstart : ĠCor outine Start Ġ= ĠCor outine Start . DEFAULT , ĊĠĠĠ Ġblock : Ġsuspend ĠCor outine Scope Span . () Ġ-> ĠUnit Ċ ): ĠJob Ġ{ ĊĠĠĠ Ġval Ġparent Span Ġ= ĠGlobal Tracer . get (). active Span () ĊĠĠĠ Ġreturn Ġlaunch ( context , Ġstart ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwithin Coroutine Span ( operation Name , Ġparent Span , Ġcontext , Ġblock ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠRuns Ġa Ġnew Ġcoroutine Ġand Ġ** blocks ** Ġthe Ġcurrent Ġthread Ġ_ interrupt ibly _ Ġuntil Ġits Ġcompletion . Ċ Ġ* ĠA Ġspan Ġwill Ġbe Ġcreated Ġaround Ġthe Ġcoroutine Ġcode Ġand Ġsent Ġto ĠDat adog . Ċ Ġ* Ċ Ġ* ĠThis Ġfunction Ġshould Ġnot Ġbe Ġused Ġfrom Ġa Ġcoroutine . ĠIt Ġis Ġdesigned Ġto Ġbridge Ġregular Ġblocking Ġcode Ċ Ġ* Ġto Ġlibraries Ġthat Ġare Ġwritten Ġin Ġsus pending Ġstyle , Ġto Ġbe Ġused Ġin Ġ` main ` Ġfunctions Ġand Ġin Ġtests . Ċ Ġ* Ċ Ġ* ĠSee Ġ[ run Blocking ] Ġto Ġlearn Ġmore Ġabout Ġrunning Ġa Ġcoroutine Ġwaiting Ġfor Ġcompletion . Ċ Ġ* Ċ Ġ* Ġ@ param Ġoperation Name Ġthe Ġname Ġof Ġthe Ġ[ Span ] Ġcreated Ġaround Ġthe Ġcoroutine Ġcode . Ċ Ġ* Ġ@ param Ġcontext Ġthe Ġcontext Ġof Ġthe Ġcoroutine . ĠThe Ġdefault Ġvalue Ġis Ġan Ġevent Ġloop Ġon Ġthe Ġcurrent Ċ Ġ* Ġthread . Ċ Ġ* Ġ@ param Ġblock Ġthe Ġcoroutine Ġcode . Ċ Ġ*/ Ċ fun Ġ< T > Ġrun Blocking Tr aced ( ĊĠĠĠ Ġoperation Name : ĠString , ĊĠĠĠ Ġcontext : ĠCor outine Context Ġ= ĠEmpty Coroutine Context , ĊĠĠĠ Ġblock : Ġsuspend ĠCor outine Scope . () Ġ-> ĠT Ċ ): ĠT Ġ{ ĊĠĠĠ Ġval Ġparent Span Ġ= ĠGlobal Tracer . get (). active Span () ĊĠĠĠ Ġreturn Ġrun Blocking ( context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwithin Coroutine Span ( operation Name , Ġparent Span , Ġcontext , Ġblock ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCreates Ġa Ġcoroutine Ġand Ġreturns Ġits Ġfuture Ġresult Ġas Ġan Ġimplementation Ġof Ġ[ Deferred ]. Ċ Ġ* ĠA Ġspan Ġwill Ġbe Ġcreated Ġaround Ġthe Ġcoroutine Ġcode Ġand Ġsent Ġto ĠDat adog . Ċ Ġ* Ċ Ġ* ĠSee Ġ[ async ] Ġto Ġlearn Ġmore Ġabout Ġusing Ġdeferred Ġcoroutine Ġresults . Ċ Ġ* Ċ Ġ* Ġ@ param Ġoperation Name Ġthe Ġname Ġof Ġthe Ġ[ Span ] Ġcreated Ġaround Ġthe Ġcoroutine Ġcode . Ċ Ġ* Ġ@ param Ġblock Ġthe Ġcoroutine Ġcode . Ċ Ġ*/ Ċ @ Suppress (" Deferred Is Result ") Ċ fun Ġ< T Ġ: ĠAny ?> ĠCor outine Scope . async Tr aced ( ĊĠĠĠ Ġoperation Name : ĠString , ĊĠĠĠ Ġcontext : ĠCor outine Context Ġ= ĠEmpty Coroutine Context , ĊĠĠĠ Ġstart : ĠCor outine Start Ġ= ĠCor outine Start . DEFAULT , ĊĠĠĠ Ġblock : Ġsuspend ĠCor outine Scope Span . () Ġ-> ĠT Ċ ): ĠDeferred < T > Ġ{ ĊĠĠĠ Ġval Ġparent Span Ġ= ĠGlobal Tracer . get (). active Span () ĊĠĠĠ Ġreturn Ġasync ( context , Ġstart ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwithin Coroutine Span ( operation Name , Ġparent Span , Ġcontext , Ġblock ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠAwait s Ġfor Ġcompletion Ġof Ġthis Ġvalue Ġwithout Ġblocking Ġa Ġthread Ġand Ġresume s Ġwhen Ġdeferred Ċ Ġ* Ġcomputation Ġis Ġcomplete , Ġreturning Ġthe Ġresulting Ġvalue Ġor Ġthrowing Ġthe Ġcorresponding Ġexception Ġif Ċ Ġ* Ġthe Ġdeferred Ġwas Ġcancelled . Ċ Ġ* ĠA Ġspan Ġwill Ġbe Ġcreated Ġaround Ġthe Ġcompletion Ġand Ġsent Ġto ĠDat adog . Ċ Ġ* Ċ Ġ* ĠSee Ġ[ Deferred . await ] Ġto Ġlearn Ġmore Ġabout Ġawait ing Ġcompletion Ġon Ġa ĠDeferred Ġresult . Ċ Ġ* Ċ Ġ* Ġ@ param Ġoperation Name Ġthe Ġname Ġof Ġthe Ġ[ Span ] Ġcreated Ġaround Ġthe Ġcoroutine Ġcode . Ċ Ġ*/ Ċ suspend Ġfun Ġ< T Ġ: ĠAny ?> ĠDeferred < T >. await Tr aced ( operation Name : ĠString ): ĠT Ġ{ ĊĠĠĠ Ġval Ġparent Span Ġ= ĠGlobal Tracer . get (). active Span () ĊĠĠĠ Ġreturn Ġwithin Span ( operation Name , Ġparent Span , Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis @ await Tr aced . await () ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCalls Ġthe Ġspecified Ġsus pending Ġblock Ġwith Ġa Ġgiven Ġcoroutine Ġcontext , Ġsus p ends Ġuntil Ġit Ġcompletes , Ċ Ġ* Ġand Ġreturns Ġthe Ġresult . Ċ Ġ* ĠA Ġspan Ġwill Ġbe Ġcreated Ġaround Ġthe Ġcoroutine Ġcode Ġand Ġsent Ġto ĠDat adog . Ċ Ġ* Ċ Ġ* ĠSee Ġ[ with Context ] Ġto Ġlearn Ġmore Ġabout Ġrunning Ġa Ġcoroutine Ġwithin Ġa Ġspecific Ġ[ Coroutine Context ]. Ċ Ġ* Ċ Ġ* Ġ@ param Ġoperation Name Ġthe Ġname Ġof Ġthe Ġ[ Span ] Ġcreated Ġaround Ġthe Ġcoroutine Ġcode . Ċ Ġ* Ġ@ param Ġcontext Ġthe Ġcontext Ġof Ġthe Ġcoroutine . Ċ Ġ* Ġ@ param Ġblock Ġthe Ġcoroutine Ġcode . Ċ Ġ*/ Ċ suspend Ġfun Ġ< T Ġ: ĠAny ?> Ġwith Context Tr aced ( ĊĠĠĠ Ġoperation Name : ĠString , ĊĠĠĠ Ġcontext : ĠCor outine Context , ĊĠĠĠ Ġblock : Ġsuspend ĠCor outine Scope Span . () Ġ-> ĠT Ċ ): ĠT Ġ{ ĊĠĠĠ Ġval Ġparent Span Ġ= ĠGlobal Tracer . get (). active Span () ĊĠĠĠ Ġreturn Ġwith Context ( context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwithin Coroutine Span ( operation Name , Ġparent Span , Ġcontext , Ġblock ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġsuspend Ġfun Ġ< T Ġ: ĠAny ?> ĠCor outine Scope . within Coroutine Span ( ĊĠĠĠ Ġoperation Name : ĠString , ĊĠĠĠ Ġparent Span : ĠSpan ? Ġ= Ġnull , ĊĠĠĠ Ġcontext : ĠCor outine Context , ĊĠĠĠ Ġblock : Ġsuspend ĠCor outine Scope Span . () Ġ-> ĠT Ċ ): ĠT Ġ{ ĊĠĠĠ Ġreturn Ġwithin Span ( operation Name , Ġparent Span , Ġcontext Ġ!= ĠDispatch ers . Un conf ined ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( context Ġis ĠCor outine Dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Tag ( TAG _ DISPATCH ER , Ġcontext . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġblock ( Coroutine Scope Span Impl ( this @ within Coroutine Span , Ġthis )) ĊĠĠĠ Ġ} Ċ } Ċ