/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 8 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . android . build . gradle . internal . tasks Ċ Ċ import Ġcom . android . build . gradle . internal . profile . Analytics Service Ċ import Ġcom . android . build . gradle . internal . profile . Profile Aware Work Action Ċ import Ġcom . android . ide . common . workers . ExecutorService Adapter Ċ import Ġcom . android . ide . common . workers . Worker Executor Exception Ċ import Ġcom . android . ide . common . workers . Worker Executor Facade Ċ import Ġcom . google . wire less . android . sdk . stats . Gradle Build Profile Span Ċ import Ġorg . gradle . api . provider . Property Ċ import Ġorg . gradle . api . provider . Provider Ċ import Ġorg . gradle . workers . Worker ExecutionException Ċ import Ġorg . gradle . workers . Worker Executor Ċ import Ġjava . util . concurrent . ExecutorService Ċ import Ġjava . util . concurrent . Fork Join Pool Ċ Ċ /** Ċ Ġ* ĠSingleton Ġobject Ġresponsible Ġfor Ġproviding Ġinstances Ġof Ġ[ Worker Executor Facade ] Ċ Ġ* Ġthat Ġrelies Ġon ĠGradle 's Ġ[ Worker Executor ]. Ċ Ġ*/ Ċ object ĠWork ers Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPo ss ibly , Ġin Ġthe Ġfuture , Ġconsider Ġusing Ġa Ġpool Ġwith Ġa Ġdedicated Ġsize Ġusing Ġthe Ġgradle ĊĠĠĠĠ Ġ* Ġparallel ism Ġsettings . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġdefault ExecutorService : ĠExecutor Service Ġ= ĠFork Join Pool . common Pool () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġ[ Worker Executor Facade ] Ġusing Ġthe Ġpassed Ġ[ Worker Executor ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠprojectName Ġname Ġof Ġthe Ġproject Ġow ning Ġthe Ġtask ĊĠĠĠĠ Ġ* Ġ@ param Ġowner Ġthe Ġtask Ġpath Ġiss uing Ġthe Ġrequest Ġand Ġow ning Ġthe Ġ[ Worker Executor ] Ġinstance . ĊĠĠĠĠ Ġ* Ġ@ param Ġworker Ġ[ Worker Executor ] Ġto Ġuse Ġif ĠGradle 's Ġworker Ġexecutor Ġare Ġenabled . ĊĠĠĠĠ Ġ* Ġ@ param Ġanalytics Service Ġthe Ġbuild Ġservice Ġto Ġrecord Ġworker Ġexecution Ġspans ĊĠĠĠĠ Ġ* Ġ@ return Ġan Ġinstance Ġof Ġ[ Worker Executor Facade ] Ġusing Ġthe Ġpassed Ġworker ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġwith Gradle Workers ( ĊĠĠĠĠĠĠĠ ĠprojectName : ĠString , ĊĠĠĠĠĠĠĠ Ġowner : ĠString , ĊĠĠĠĠĠĠĠ Ġworker : ĠWorker Executor , ĊĠĠĠĠĠĠĠ Ġanalytics Service : ĠProvider < Analytics Service > ĊĠĠĠ Ġ): ĠWorker Executor Facade Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠWorker Executor Adapter ( projectName , Ġowner , Ġworker , Ġanalytics Service ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġ[ Worker Executor Facade ] Ġusing Ġthe Ġdefault Ġ[ ExecutorService ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠCall ers Ġcannot Ġuse Ġa Ġ[ Worker Executor ] Ġprobably Ġdue Ġto ĠSerialization Ġrequirement Ġof Ġparameters ĊĠĠĠĠ Ġ* Ġbeing Ġnot Ġpossible . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġowner Ġthe Ġtask Ġpath Ġiss uing Ġthe Ġrequest . ĊĠĠĠĠ Ġ* Ġ@ param Ġanalytics Service Ġthe Ġbuild Ġservice Ġto Ġrecord Ġworker Ġexecution Ġspans ĊĠĠĠĠ Ġ* Ġ@ return Ġan Ġinstance Ġof Ġ[ Worker Executor Facade ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġwith Threads ( owner : ĠString , Ġanalytics Service : ĠAnalytics Service ) Ġ= ĊĠĠĠĠĠĠĠ ĠProfile Aware ExecutorService Adapter ( owner , Ġdefault ExecutorService , Ġnull , Ġanalytics Service ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSimple Ġimplementation Ġof Ġ[ Worker Executor Facade ] Ġthat Ġuses Ġa ĠGradle Ġ[ Worker Executor ] ĊĠĠĠĠ Ġ* Ġto Ġsubmit Ġnew Ġwork Ġactions . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġclass ĠWorker Executor Adapter ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠprojectName : ĠString , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġowner : ĠString , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġworker Executor : ĠWorker Executor , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġanalytics Service : ĠProvider < Analytics Service > ĊĠĠĠ Ġ) Ġ: ĠWorker Executor Facade Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġtask Record Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠ Ġanalytics Service . get (). get Task Record ( owner ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsubmit ( action : ĠWorker Executor Facade . Work Action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġworker Key Ġ= Ġ"$ owner ${ action :: class . java . name }${ action . hashCode () }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask Record ?. add Worker ( worker Key , ĠGradle Build Profile Span . Execution Type . WORK ER _ EXEC UTION ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġworker Executor . no Isolation (). submit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRunnable Wrapper Work Action :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġparams : ĠRunnable Wrapper Params Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . projectName . set ( projectName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . task Owner . set ( owner ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . worker Key . set ( worker Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . run nable Action . set ( action ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . analytics Service . set ( analytics Service ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġawait () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask Record ?. set Task Waiting () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworker Executor . await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠWorker ExecutionException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠWorker Executor Exception ( e . cause s ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠIn Ġa Ġnormal Ġsituation Ġyou Ġwould Ġlike Ġto Ġcall Ġawait () Ġhere , Ġhowever : ĊĠĠĠĠĠĠĠĠ Ġ* Ġ 1 ) ĠGradle Ġcurrently Ġcan Ġonly Ġrun Ġa ĠS INGLE Ġ@ Task Action Ġfor Ġa Ġgiven Ġproject ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠ Ġ( and Ġthis Ġshould Ġbe Ġfixed !) ĊĠĠĠĠĠĠĠĠ Ġ* Ġ 2 ) ĠWorker Executor Ġpassed Ġto Ġa Ġtask Ġinstance Ġis Ġtied Ġto Ġthe Ġtask Ġand ĠGradle Ġis Ġable ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠ Ġto Ġcontrol Ġwhich Ġworker Ġitems Ġare Ġexecuted Ġby Ġwhich Ġtask ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠThus , Ġif Ġyou Ġput Ġawait () Ġhere , Ġonly Ġa Ġsingle Ġtask Ġcan Ġrun . ĊĠĠĠĠĠĠĠĠ Ġ* ĠIf Ġnot Ġ( as Ġit Ġis ), Ġgradle Ġwill Ġstart Ġanother Ġtask Ġright Ġafter Ġit Ġfinishes Ġexecuting Ġa ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ Task Action Ġ( which Ġide ally Ġshould Ġbe Ġjust Ġsome Ġpreparation Ġ+ Ġa Ġnumber Ġof Ġsubmit () Ġcalls ĊĠĠĠĠĠĠĠĠ Ġ* Ġto Ġa ĠWorker Executor Facade . ĠIn Ġcase Ġthe Ġtask ĠB Ġdepends Ġon Ġthe Ġtask ĠA Ġand Ġthe Ġwork Ġitems ĊĠĠĠĠĠĠĠĠ Ġ* Ġof Ġthe Ġtask ĠA Ġhasn 't Ġfinished Ġyet , Ġgradle Ġwill Ġcall Ġawait () Ġon Ġthe Ġdedicated ĊĠĠĠĠĠĠĠĠ Ġ* ĠWorker Executor Ġof Ġthe Ġtask ĠA Ġand Ġtherefore Ġwork Ġitems Ġwill Ġfinish Ġbefore Ġtask ĠB ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ Task Action Ġstarts Ġ( so , Ġwe Ġare Ġsafe ! ). ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdapter Ġto Ġrecord Ġtasks Ġusing Ġthe Ġ[ ExecutorService ] Ġthrough Ġa Ġ[ Worker Executor Facade ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġwill Ġallow Ġto Ġrecord Ġthread Ġexecution , Ġjust Ġlike ĠWorker Items . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠProfile Aware ExecutorService Adapter ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġowner : ĠString , ĊĠĠĠĠĠĠĠ Ġexecutor : ĠExecutor Service , ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ[ Worker Executor Facade ] Ġto Ġdelegate Ġsubmissions Ġthat Ġcannot Ġbe Ġhandled Ġby Ġthis Ġadapter Ġor ĊĠĠĠĠĠĠĠĠ Ġ* Ġnull Ġif Ġno Ġdeleg ation Ġexpected . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġdelegate : ĠWorker Executor Facade ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġanalytics Service : ĠAnalytics Service ĊĠĠĠ Ġ) Ġ: ĠExecutor Service Adapter ( executor ), ĠWorker Executor Facade Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtask Record Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanalytics Service . get Task Record ( owner ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġworker Submission ( worker Key : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . worker Submission ( worker Key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask Record ?. add Worker ( worker Key , ĠGradle Build Profile Span . Execution Type . THREAD _ EXEC UTION ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsubmit ( action : ĠWorker Executor Facade . Work Action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġ"$ owner ${ action :: class . java . name }${ action . hashCode () }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġworker Submission ( key ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubmission Ġ= Ġexecutor . submit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanalytics Service . worker Started ( owner , Ġkey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction . run () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanalytics Service . worker Finished ( owner , Ġkey ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfutures . add ( submission ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġclass ĠRunnable Wrapper Params Ġ: ĠProfile Aware Work Action . Parameters () Ġ{ ĊĠĠĠĠĠĠĠ Ġabstract Ġval Ġrunnable Action : ĠProperty < Runnable > ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĠUsed Ġas Ġa Ġwrapper Ġaround Ġrun n ables Ġsubmitted Ġusing Ġ[ Worker Executor Adapter ]. Ġ*/ ĊĠĠĠ Ġabstract Ġclass ĠRunnable Wrapper Work Action Ġ: ĠProfile Aware Work Action < Runnable Wrapper Params >() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . run nable Action . get (). run () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ