/* Ċ Ġ* Ġ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 . tools . profil ers . performance Ċ Ċ import Ġcom . android . tools . datastore . Fake Log Service Ċ import Ġcom . android . tools . datastore . database . Memory Live Allocation Table Ċ import Ġcom . android . tools . profiler . proto . Memory Ċ Ċ import Ġjava . sql . Connection Ċ Ċ class ĠMemory Live Allocation Generator ( connection : ĠConnection ) Ġ: ĠData Generator ( connection ) Ġ{ ĊĊĠ Ġprivate Ġval Ġmy Table Ġ= ĠMemory Live Allocation Table ( Fake Log Service ()) ĊĠ Ġprivate Ġval Ġstack Ids Ġ= Ġmutable ListOf < Int >() ĊĠ Ġprivate Ġval Ġthread Ids Ġ= Ġmutable ListOf < Int >() ĊĠ Ġprivate Ġval Ġmethod Ids Ġ= Ġmutable ListOf < Long >() ĊĠ Ġprivate Ġvar Ġhas Generated Info Ġ= Ġfalse ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġmy Table . initialize ( connection ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġgenerate ( timestamp : ĠLong , Ġproperties : ĠGenerator Properties ) Ġ{ ĊĠĠĠ Ġif Ġ(! has Generated Info Ġ|| Ġis Within Probability (. 0 5 )) Ġ{ ĊĠĠĠĠĠ Ġgenerate Allocation Contexts ( properties ) ĊĠĠĠĠĠ Ġhas Generated Info Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠGenerate Ġnew Ġallocations Ġrough y Ġa Ġthird Ġof Ġthe Ġtime ĊĠĠĠ Ġif Ġ( is Within Probability (. 5 )) Ġ{ ĊĠĠĠĠĠ Ġ// ĠUses Ġdata Ġgenerated Ġfrom Ġthe Ġthread Ġ/ Ġstack Ġinfo . ĊĠĠĠĠĠ Ġgenerate Allocation Data ( properties ) ĊĠĠĠĠĠ Ġgenerate J ni Ref Data ( properties ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġgenerate Allocation Data ( properties : ĠGenerator Properties ) Ġ{ ĊĠĠĠ Ġval Ġevent Count Ġ= Ġrandom . nextInt ( 1 0 0 ) ĊĠĠĠ Ġval Ġevents Ġ= Ġmutable ListOf < Memory . Allocation Event >() ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. event Count ) Ġ{ ĊĠĠĠĠĠ Ġevents . add ( Memory . Allocation Event . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Alloc Data ( Memory . Allocation Event . Allocation . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Location Ids ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Method Ids ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Class Tag ( random . nextInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Heap Id ( random . nextInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Length ( random . nextInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setSize ( random . next Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Stack Id ( stack Ids [ random . nextInt ( stack Ids . size )]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTag ( random . nextInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Thread Id ( thread Ids [ random . nextInt ( thread Ids . size )])) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġsample Ġ= ĠMemory . Batch Allocation Events . newBuilder () ĊĠĠĠĠĠ Ġ. addAll Events ( events ) ĊĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġmy Table . insert Allocation Events ( properties . session , Ġsample ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġgenerate J ni Ref Data ( properties : ĠGenerator Properties ) Ġ{ ĊĠĠĠ Ġval Ġsample Ġ= ĠMemory . Batch JN IG lobal Ref Event . newBuilder () ĊĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġmy Table . insert J ni Reference Data ( properties . session , Ġsample ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġgenerate Allocation Contexts ( properties : ĠGenerator Properties ) Ġ{ ĊĠĠĠ Ġval Ġmethod Ġ= Ġmutable ListOf < Memory . Allocation Stack . Stack Frame >() ĊĠĠĠ Ġval Ġmethod Count Ġ= Ġrandom . nextInt ( 1 2 8 ) ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. method Count ) Ġ{ ĊĠĠĠĠĠ Ġmethod Ids . add ( random . next Long ()) ĊĠĠĠĠĠ Ġmethod . add ( Memory . Allocation Stack . Stack Frame . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ClassName (" Test ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set FileName (" Some File " Ġ+ Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set LineNumber ( random . nextInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Method Id ( method Ids [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set MethodName (" Some ĠName " Ġ+ Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġstacks Ġ= Ġmutable ListOf < Memory . Allocation Stack >() ĊĠĠĠ Ġval Ġstack Count Ġ= Ġrandom . nextInt ( 1 2 8 ) ĊĠĠĠ Ġval Ġframe Count Ġ= Ġrandom . nextInt ( method Ids . size ) ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. stack Count ) Ġ{ ĊĠĠĠĠĠ Ġval Ġframe Ġ= ĠMemory . Allocation Stack . Encoded Frame Wrapper . newBuilder () ĊĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 .. frame Count ) Ġ{ ĊĠĠĠĠĠĠĠ Ġframe . add Frames ( Memory . Allocation Stack . Encoded Frame . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Method Id ( method Ids [ j ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set LineNumber ( random . nextInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġstack Ids . add ( random . nextInt ()) ĊĠĠĠĠĠ Ġstacks . add ( Memory . Allocation Stack . newBuilder (). set Encoded Stack ( frame ). build ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġinfo Ġ= Ġmutable ListOf < Memory . Thread Info >() ĊĠĠĠ Ġval Ġthreads Ġ= Ġrandom . nextInt ( 5 0 ) ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. threads ) Ġ{ ĊĠĠĠĠĠ Ġthread Ids . add ( random . nextInt ()) ĊĠĠĠĠĠ Ġinfo . add ( Memory . Thread Info . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Thread Id ( thread Ids [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Thread Name (" Some ĠName Ġ" Ġ+ Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġbatch Contexts Ġ= ĠMemory . Batch Allocation Contexts . newBuilder () ĊĠĠĠĠĠ Ġ. addAll Methods ( method ) ĊĠĠĠĠĠ Ġ. addAll Encoded Stack s ( stacks ) ĊĠĠĠĠĠ Ġ. addAll Thread Infos ( info ) ĊĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġmy Table . insert Allocation Contexts ( properties . session , Ġbatch Contexts ) ĊĠ Ġ} Ċ } Ċ