/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠGoogle ĠLLC Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// 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 . google . idea . perf . cv tracer Ċ Ċ import Ġcom . intellij . psi . util . Cached Value Profiler Ċ import Ġcom . intellij . psi . util . Cached Value Profiler . Event Place Ċ import Ġjava . util . concurrent . locks . Re entrant Lock Ċ import Ġkotlin . concurrent . with Lock Ċ Ċ // ĠThis Ġclass Ġdepends Ġon ĠCached Value Profiler , Ġwhich Ġis Ġan Ġ* unstable * ĠIntelliJ ĠAPI . Ċ // ĠIde ally Ġa ĠCached Value Ġtracer Ġshould Ġbe Ġimplemented Ġupstream Ġinstead , Ġand Ġthen Ġthis Ċ // Ġcode Ġcould Ġbe Ġremoved . ĠSee Ġhttps :// yout rack . jetbrains . com / issue / IDE A - 2 6 1 4 6 6 . Ċ @ Suppress (" Un stable Api Usage ") Ċ class ĠCached Value Event Consumer Ġ: ĠCached Value Profiler . Event Consumer Ġ{ ĊĠĠĠ Ġ// ĠTODO : ĠAudit Ġthe Ġoverhead Ġof Ġ( 1 ) Ġlock Ġcontent ion Ġand Ġ( 2 ) ĠEvent Place . stack Frame Ġcomputation . ĊĠĠĠ Ġprivate Ġval Ġlock Ġ= ĠRe entrant Lock () ĊĠĠĠ Ġprivate Ġval Ġdata Ġ= Ġmutable Map Of < StackTrace Element , ĠRaw Cached Value Stats >() ĊĊĠĠĠ Ġdata Ġclass ĠRaw Cached Value Stats ( ĊĠĠĠĠĠĠĠ Ġval Ġlocation : ĠStack Trace Element , ĊĠĠĠĠĠĠĠ Ġvar Ġcompute Time Ns : ĠLong Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġvar Ġcompute Count : ĠLong Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġvar Ġuse Count : ĠLong Ġ= Ġ 0 , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhits : ĠLong Ġget () Ġ= Ġmax Of ( 0 L , Ġuse Count Ġ- Ġcompute Count ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinstall () Ġ{ ĊĠĠĠĠĠĠĠ ĠCached Value Profiler . set Event Consumer ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġuninstall () Ġ{ ĊĠĠĠĠĠĠĠ ĠCached Value Profiler . set Event Consumer ( null ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Snapshot (): ĠList < Raw Cached Value Stats > Ġ{ ĊĠĠĠĠĠĠĠ Ġlock . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdata . values . map Ġ{ Ġit . copy () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġlock . with Lock ( data :: clear ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Value Computed ( frame Id : ĠLong , Ġplace : ĠEvent Place , Ġstart : ĠLong , Ġtime : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlocation Ġ= Ġplace . stack Frame Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġelapsed Ns Ġ= Ġtime Ġ- Ġstart ĊĠĠĠĠĠĠĠ Ġlock . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstats Ġ= Ġdata . get Or Put ( location ) Ġ{ ĠRaw Cached Value Stats ( location ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstats . compute Time Ns Ġ+= Ġelapsed Ns ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstats . compute Count ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Value Used ( frame Id : ĠLong , Ġplace : ĠEvent Place , Ġcomputed : ĠLong , Ġtime : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlocation Ġ= Ġplace . stack Frame Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġlock . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstats Ġ= Ġdata . get Or Put ( location ) Ġ{ ĠRaw Cached Value Stats ( location ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstats . use Count ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Frame Enter ( frame Id : ĠLong , Ġplace : ĠEvent Place , ĠparentId : ĠLong , Ġtime : ĠLong ) Ġ{} ĊĠĠĠ Ġoverride Ġfun Ġon Frame Exit ( frame Id : ĠLong , Ġstart : ĠLong , Ġcomputed : ĠLong , Ġtime : ĠLong ) Ġ{} ĊĠĠĠ Ġoverride Ġfun Ġon Value Invalid ated ( frame Id : ĠLong , Ġplace : ĠEvent Place , Ġused : ĠLong , Ġtime : ĠLong ) Ġ{} ĊĠĠĠ Ġoverride Ġfun Ġon Value Rejected ( frame Id : ĠLong , Ġplace : ĠEvent Place , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart : ĠLong , Ġcomputed : ĠLong , Ġtime : ĠLong ) Ġ{} Ċ }