11// Copyright 2019 TiKV Project Authors. Licensed under Apache-2.0.
22
3+ use std:: borrow:: Cow ;
34use std:: collections:: HashMap ;
45use std:: fmt:: { Debug , Formatter } ;
56
67use parking_lot:: RwLock ;
8+ use symbolic_demangle:: demangle;
79
810use crate :: frames:: { Frames , UnresolvedFrames } ;
911use crate :: profiler:: Profiler ;
@@ -32,6 +34,8 @@ pub struct UnresolvedReport {
3234/// A builder of `Report` and `UnresolvedReport`. It builds report from a running `Profiler`.
3335pub struct ReportBuilder < ' a > {
3436 frames_post_processor : Option < Box < dyn Fn ( & mut Frames ) > > ,
37+ demangle : Box < dyn Fn ( & str ) ->Cow < str > > ,
38+
3539 profiler : & ' a RwLock < Result < Profiler > > ,
3640 timing : ReportTiming ,
3741}
@@ -40,6 +44,8 @@ impl<'a> ReportBuilder<'a> {
4044 pub ( crate ) fn new ( profiler : & ' a RwLock < Result < Profiler > > , timing : ReportTiming ) -> Self {
4145 Self {
4246 frames_post_processor : None ,
47+ demangle : Box :: new ( demangle) ,
48+
4349 profiler,
4450 timing,
4551 }
@@ -57,6 +63,15 @@ impl<'a> ReportBuilder<'a> {
5763 self
5864 }
5965
66+ pub fn demangler < T , S > ( & mut self , demangler : T ) -> & mut Self
67+ where
68+ T : Fn ( & str ) -> Cow < str > + ' static ,
69+ {
70+ self . demangle = Box :: new ( demangler) ;
71+
72+ self
73+ }
74+
6075 /// Build an `UnresolvedReport`
6176 pub fn build_unresolved ( & self ) -> Result < UnresolvedReport > {
6277 let mut hash_map = HashMap :: new ( ) ;
@@ -232,7 +247,7 @@ mod protobuf {
232247 dedup_str. insert ( key. thread_name_or_id ( ) ) ;
233248 for frame in key. frames . iter ( ) {
234249 for symbol in frame {
235- dedup_str. insert ( symbol. name ( ) ) ;
250+ dedup_str. insert ( symbol. name_with_demangle ( & self . demangle ) ) ;
236251 dedup_str. insert ( symbol. sys_name ( ) . into_owned ( ) ) ;
237252 dedup_str. insert ( symbol. filename ( ) . into_owned ( ) ) ;
238253 }
@@ -260,7 +275,7 @@ mod protobuf {
260275 let mut locs = vec ! [ ] ;
261276 for frame in key. frames . iter ( ) {
262277 for symbol in frame {
263- let name = symbol. name ( ) ;
278+ let name = symbol. name_with_demangle ( & self . demangle ) ;
264279 if let Some ( loc_idx) = functions. get ( & name) {
265280 locs. push ( * loc_idx) ;
266281 continue ;
0 commit comments