@@ -9,6 +9,7 @@ pub struct PerfettoConverter<W: Write> {
99 process_tracks : HashMap < i32 , u64 > ,
1010 thread_tracks : HashMap < ( i32 , i32 ) , u64 > ,
1111 counter_tracks : HashMap < String , u64 > ,
12+ track_map : HashMap < protocol:: TrackId , u64 > ,
1213}
1314
1415impl < W : Write > PerfettoConverter < W > {
@@ -18,6 +19,7 @@ impl<W: Write> PerfettoConverter<W> {
1819 process_tracks : HashMap :: new ( ) ,
1920 thread_tracks : HashMap :: new ( ) ,
2021 counter_tracks : HashMap :: new ( ) ,
22+ track_map : HashMap :: new ( ) ,
2123 }
2224 }
2325
@@ -185,6 +187,58 @@ impl<W: Write> PerfettoConverter<W> {
185187 Ok ( ( ) )
186188 }
187189
190+ fn convert_track ( & mut self , track : & protocol:: Track ) -> eyre:: Result < ( ) > {
191+ use protocol:: TrackType ;
192+
193+ let track_id = track. track_type . to_id ( ) ;
194+ if self . track_map . contains_key ( & track_id) {
195+ return Ok ( ( ) ) ;
196+ }
197+
198+ let parent_uuid = if let Some ( parent) = & track. parent {
199+ let parent_id = parent. to_id ( ) ;
200+ if !self . track_map . contains_key ( & parent_id) {
201+ match parent {
202+ TrackType :: Thread { tid, pid } => {
203+ let uuid = self . ensure_thread_track ( * pid, * tid, None ) ?;
204+ self . track_map . insert ( parent_id, uuid) ;
205+ uuid
206+ }
207+ TrackType :: Process { pid } => {
208+ let uuid = self . ensure_process_track ( * pid, None ) ?;
209+ self . track_map . insert ( parent_id, uuid) ;
210+ uuid
211+ }
212+ TrackType :: Cpu { .. }
213+ | TrackType :: Custom { .. }
214+ | TrackType :: Counter { .. } => * self . track_map . get ( & parent_id) . unwrap_or ( & 0 ) ,
215+ }
216+ } else {
217+ * self . track_map . get ( & parent_id) . unwrap ( )
218+ }
219+ } else {
220+ 0
221+ } ;
222+
223+ let track_uuid = match & track. track_type {
224+ TrackType :: Cpu { .. } | TrackType :: Custom { .. } => self
225+ . writer
226+ . write_generic_track ( track. name . to_string ( ) , parent_uuid) ?,
227+ TrackType :: Counter { unit, .. } => self . writer . write_counter_track (
228+ track. name . to_string ( ) ,
229+ unit. map ( |u| u. to_string ( ) ) ,
230+ parent_uuid,
231+ ) ?,
232+ TrackType :: Thread { tid, pid } => {
233+ self . ensure_thread_track ( * pid, * tid, Some ( track. name ) ) ?
234+ }
235+ TrackType :: Process { pid } => self . ensure_process_track ( * pid, Some ( track. name ) ) ?,
236+ } ;
237+
238+ self . track_map . insert ( track_id, track_uuid) ;
239+ Ok ( ( ) )
240+ }
241+
188242 pub fn convert_message ( & mut self , message : & protocol:: Message ) -> eyre:: Result < ( ) > {
189243 let ( event, stream_id) = match message {
190244 protocol:: Message :: Event ( e) => ( e, None ) ,
@@ -239,6 +293,7 @@ impl<W: Write> PerfettoConverter<W> {
239293 Event :: ProcessName ( process_name) => {
240294 self . convert_process_name ( process_name. pid , process_name. name ) ?
241295 }
296+ Event :: Track ( track) => self . convert_track ( track) ?,
242297 }
243298 Ok ( ( ) )
244299 }
@@ -304,6 +359,63 @@ impl<W: Write> PerfettoConverter<W> {
304359 ArchivedEvent :: ProcessName ( process_name) => {
305360 self . convert_process_name ( process_name. pid . to_native ( ) , process_name. name . as_ref ( ) ) ?
306361 }
362+ ArchivedEvent :: Track ( track) => {
363+ let track_type = match & track. track_type {
364+ protocol:: ArchivedTrackType :: Cpu { cpu } => protocol:: TrackType :: Cpu {
365+ cpu : cpu. to_native ( ) ,
366+ } ,
367+ protocol:: ArchivedTrackType :: Thread { tid, pid } => {
368+ protocol:: TrackType :: Thread {
369+ tid : tid. to_native ( ) ,
370+ pid : pid. to_native ( ) ,
371+ }
372+ }
373+ protocol:: ArchivedTrackType :: Process { pid } => protocol:: TrackType :: Process {
374+ pid : pid. to_native ( ) ,
375+ } ,
376+ protocol:: ArchivedTrackType :: Custom { id } => {
377+ protocol:: TrackType :: Custom { id : id. to_native ( ) }
378+ }
379+ protocol:: ArchivedTrackType :: Counter { id, unit } => {
380+ protocol:: TrackType :: Counter {
381+ id : id. to_native ( ) ,
382+ unit : unit. as_ref ( ) . map ( |u| u. as_ref ( ) ) ,
383+ }
384+ }
385+ } ;
386+
387+ let parent = track. parent . as_ref ( ) . map ( |p| match p {
388+ protocol:: ArchivedTrackType :: Cpu { cpu } => protocol:: TrackType :: Cpu {
389+ cpu : cpu. to_native ( ) ,
390+ } ,
391+ protocol:: ArchivedTrackType :: Thread { tid, pid } => {
392+ protocol:: TrackType :: Thread {
393+ tid : tid. to_native ( ) ,
394+ pid : pid. to_native ( ) ,
395+ }
396+ }
397+ protocol:: ArchivedTrackType :: Process { pid } => protocol:: TrackType :: Process {
398+ pid : pid. to_native ( ) ,
399+ } ,
400+ protocol:: ArchivedTrackType :: Custom { id } => {
401+ protocol:: TrackType :: Custom { id : id. to_native ( ) }
402+ }
403+ protocol:: ArchivedTrackType :: Counter { id, unit } => {
404+ protocol:: TrackType :: Counter {
405+ id : id. to_native ( ) ,
406+ unit : unit. as_ref ( ) . map ( |u| u. as_ref ( ) ) ,
407+ }
408+ }
409+ } ) ;
410+
411+ let owned_track = protocol:: Track {
412+ name : track. name . as_ref ( ) ,
413+ track_type,
414+ parent,
415+ } ;
416+
417+ self . convert_track ( & owned_track) ?
418+ }
307419 }
308420 Ok ( ( ) )
309421 }
0 commit comments