@@ -27,26 +27,42 @@ pub enum ProfileCategory {
2727    Other , 
2828} 
2929
30- #[ derive( Clone ,  Debug ,  Eq ,  PartialEq ) ]  
31- pub  enum  ProfilerEvent  { 
32-     QueryStart  {  query_name :  & ' static  str ,  category :  ProfileCategory ,  time :  u64  } , 
33-     QueryEnd  {  query_name :  & ' static  str ,  category :  ProfileCategory ,  time :  u64  } , 
34-     GenericActivityStart  {  category :  ProfileCategory ,  label :  Cow < ' static ,  str > ,  time :  u64  } , 
35-     GenericActivityEnd  {  category :  ProfileCategory ,  label :  Cow < ' static ,  str > ,  time :  u64  } , 
36-     IncrementalLoadResultStart  {  query_name :  & ' static  str ,  time :  u64  } , 
37-     IncrementalLoadResultEnd  {  query_name :  & ' static  str ,  time :  u64  } , 
38-     QueryCacheHit  {  query_name :  & ' static  str ,  category :  ProfileCategory ,  time :  u64  } , 
39-     QueryCount  {  query_name :  & ' static  str ,  category :  ProfileCategory ,  count :  usize ,  time :  u64  } , 
40-     QueryBlockedStart  {  query_name :  & ' static  str ,  category :  ProfileCategory ,  time :  u64  } , 
41-     QueryBlockedEnd  {  query_name :  & ' static  str ,  category :  ProfileCategory ,  time :  u64  } , 
30+ bitflags !  { 
31+     struct  EventFilter :  u32  { 
32+         const  GENERIC_ACTIVITIES  = 1  << 0 ; 
33+         const  QUERY_PROVIDERS     = 1  << 1 ; 
34+         const  QUERY_CACHE_HITS    = 1  << 2 ; 
35+         const  QUERY_BLOCKED       = 1  << 3 ; 
36+         const  INCR_CACHE_LOADS    = 1  << 4 ; 
37+ 
38+         const  DEFAULT  = Self :: GENERIC_ACTIVITIES . bits |
39+                         Self :: QUERY_PROVIDERS . bits |
40+                         Self :: QUERY_BLOCKED . bits |
41+                         Self :: INCR_CACHE_LOADS . bits; 
42+ 
43+         // empty() and none() aren't const-fns unfortunately 
44+         const  NONE  = 0 ; 
45+         const  ALL   = !Self :: NONE . bits; 
46+     } 
4247} 
4348
49+ const  EVENT_FILTERS_BY_NAME :  & [ ( & str ,  EventFilter ) ]  = & [ 
50+     ( "none" ,  EventFilter :: NONE ) , 
51+     ( "all" ,  EventFilter :: ALL ) , 
52+     ( "generic-activity" ,  EventFilter :: GENERIC_ACTIVITIES ) , 
53+     ( "query-provider" ,  EventFilter :: QUERY_PROVIDERS ) , 
54+     ( "query-cache-hit" ,  EventFilter :: QUERY_CACHE_HITS ) , 
55+     ( "query-blocked"  ,  EventFilter :: QUERY_BLOCKED ) , 
56+     ( "incr-cache-load" ,  EventFilter :: INCR_CACHE_LOADS ) , 
57+ ] ; 
58+ 
4459fn  thread_id_to_u64 ( tid :  ThreadId )  -> u64  { 
4560    unsafe  {  mem:: transmute :: < ThreadId ,  u64 > ( tid)  } 
4661} 
4762
4863pub  struct  SelfProfiler  { 
4964    profiler :  Profiler , 
65+     event_filter_mask :  EventFilter , 
5066    query_event_kind :  StringId , 
5167    generic_activity_event_kind :  StringId , 
5268    incremental_load_result_event_kind :  StringId , 
@@ -55,7 +71,7 @@ pub struct SelfProfiler {
5571} 
5672
5773impl  SelfProfiler  { 
58-     pub  fn  new ( )  -> Result < SelfProfiler ,  Box < dyn  Error > >  { 
74+     pub  fn  new ( event_filters :   & Option < Vec < String > > )  -> Result < SelfProfiler ,  Box < dyn  Error > >  { 
5975        let  filename = format ! ( "pid-{}.rustc_profile" ,  process:: id( ) ) ; 
6076        let  path = std:: path:: Path :: new ( & filename) ; 
6177        let  profiler = Profiler :: new ( path) ?; 
@@ -66,8 +82,38 @@ impl SelfProfiler {
6682        let  query_blocked_event_kind = profiler. alloc_string ( "QueryBlocked" ) ; 
6783        let  query_cache_hit_event_kind = profiler. alloc_string ( "QueryCacheHit" ) ; 
6884
85+         let  mut  event_filter_mask = EventFilter :: empty ( ) ; 
86+ 
87+         if  let  Some ( ref  event_filters)  = * event_filters { 
88+             let  mut  unknown_events = vec ! [ ] ; 
89+             for  item in  event_filters { 
90+                 if  let  Some ( & ( _,  mask) )  = EVENT_FILTERS_BY_NAME . iter ( ) 
91+                                                                . find ( |& ( name,  _) | name == item)  { 
92+                     event_filter_mask |= mask; 
93+                 }  else  { 
94+                     unknown_events. push ( item. clone ( ) ) ; 
95+                 } 
96+             } 
97+ 
98+             // Warn about any unknown event names 
99+             if  unknown_events. len ( )  > 0  { 
100+                 unknown_events. sort ( ) ; 
101+                 unknown_events. dedup ( ) ; 
102+ 
103+                 warn ! ( "Unknown self-profiler events specified: {}. Available options are: {}." , 
104+                     unknown_events. join( ", " ) , 
105+                     EVENT_FILTERS_BY_NAME . iter( ) 
106+                                          . map( |& ( name,  _) | name. to_string( ) ) 
107+                                          . collect:: <Vec <_>>( ) 
108+                                          . join( ", " ) ) ; 
109+             } 
110+         }  else  { 
111+             event_filter_mask = EventFilter :: DEFAULT ; 
112+         } 
113+ 
69114        Ok ( SelfProfiler  { 
70115            profiler, 
116+             event_filter_mask, 
71117            query_event_kind, 
72118            generic_activity_event_kind, 
73119            incremental_load_result_event_kind, 
@@ -86,7 +132,6 @@ impl SelfProfiler {
86132
87133    pub  fn  register_query_name ( & self ,  query_name :  QueryName )  { 
88134        let  id = SelfProfiler :: get_query_name_string_id ( query_name) ; 
89- 
90135        self . profiler . alloc_string_with_reserved_id ( id,  query_name. as_str ( ) ) ; 
91136    } 
92137
@@ -95,54 +140,76 @@ impl SelfProfiler {
95140        & self , 
96141        label :  impl  Into < Cow < ' static ,  str > > , 
97142    )  { 
98-         self . record ( & label. into ( ) ,  self . generic_activity_event_kind ,  TimestampKind :: Start ) ; 
143+         if  self . event_filter_mask . contains ( EventFilter :: GENERIC_ACTIVITIES )  { 
144+             self . record ( & label. into ( ) ,  self . generic_activity_event_kind ,  TimestampKind :: Start ) ; 
145+         } 
99146    } 
100147
101148    #[ inline]  
102149    pub  fn  end_activity ( 
103150        & self , 
104151        label :  impl  Into < Cow < ' static ,  str > > , 
105152    )  { 
106-         self . record ( & label. into ( ) ,  self . generic_activity_event_kind ,  TimestampKind :: End ) ; 
153+         if  self . event_filter_mask . contains ( EventFilter :: GENERIC_ACTIVITIES )  { 
154+             self . record ( & label. into ( ) ,  self . generic_activity_event_kind ,  TimestampKind :: End ) ; 
155+         } 
107156    } 
108157
109158    #[ inline]  
110159    pub  fn  record_query_hit ( & self ,  query_name :  QueryName )  { 
111-         self . record_query ( query_name,  self . query_cache_hit_event_kind ,  TimestampKind :: Instant ) ; 
160+         if  self . event_filter_mask . contains ( EventFilter :: QUERY_CACHE_HITS )  { 
161+             self . record_query ( query_name,  self . query_cache_hit_event_kind ,  TimestampKind :: Instant ) ; 
162+         } 
112163    } 
113164
114165    #[ inline]  
115166    pub  fn  start_query ( & self ,  query_name :  QueryName )  { 
116-         self . record_query ( query_name,  self . query_event_kind ,  TimestampKind :: Start ) ; 
167+         if  self . event_filter_mask . contains ( EventFilter :: QUERY_PROVIDERS )  { 
168+             self . record_query ( query_name,  self . query_event_kind ,  TimestampKind :: Start ) ; 
169+         } 
117170    } 
118171
119172    #[ inline]  
120173    pub  fn  end_query ( & self ,  query_name :  QueryName )  { 
121-         self . record_query ( query_name,  self . query_event_kind ,  TimestampKind :: End ) ; 
174+         if  self . event_filter_mask . contains ( EventFilter :: QUERY_PROVIDERS )  { 
175+             self . record_query ( query_name,  self . query_event_kind ,  TimestampKind :: End ) ; 
176+         } 
122177    } 
123178
124179    #[ inline]  
125180    pub  fn  incremental_load_result_start ( & self ,  query_name :  QueryName )  { 
126-         self . record_query ( 
127-             query_name, 
128-             self . incremental_load_result_event_kind , 
129-             TimestampKind :: Start 
130-         ) ; 
181+         if  self . event_filter_mask . contains ( EventFilter :: INCR_CACHE_LOADS )  { 
182+             self . record_query ( 
183+                 query_name, 
184+                 self . incremental_load_result_event_kind , 
185+                 TimestampKind :: Start 
186+             ) ; 
187+         } 
131188    } 
132189
133190    #[ inline]  
134191    pub  fn  incremental_load_result_end ( & self ,  query_name :  QueryName )  { 
135-         self . record_query ( query_name,  self . incremental_load_result_event_kind ,  TimestampKind :: End ) ; 
192+         if  self . event_filter_mask . contains ( EventFilter :: INCR_CACHE_LOADS )  { 
193+             self . record_query ( 
194+                 query_name, 
195+                 self . incremental_load_result_event_kind , 
196+                 TimestampKind :: End 
197+             ) ; 
198+         } 
136199    } 
137200
138201    #[ inline]  
139202    pub  fn  query_blocked_start ( & self ,  query_name :  QueryName )  { 
140-         self . record_query ( query_name,  self . query_blocked_event_kind ,  TimestampKind :: Start ) ; 
203+         if  self . event_filter_mask . contains ( EventFilter :: QUERY_BLOCKED )  { 
204+             self . record_query ( query_name,  self . query_blocked_event_kind ,  TimestampKind :: Start ) ; 
205+         } 
141206    } 
142207
143208    #[ inline]  
144209    pub  fn  query_blocked_end ( & self ,  query_name :  QueryName )  { 
145-         self . record_query ( query_name,  self . query_blocked_event_kind ,  TimestampKind :: End ) ; 
210+         if  self . event_filter_mask . contains ( EventFilter :: QUERY_BLOCKED )  { 
211+             self . record_query ( query_name,  self . query_blocked_event_kind ,  TimestampKind :: End ) ; 
212+         } 
146213    } 
147214
148215    #[ inline]  
0 commit comments