@@ -243,50 +243,61 @@ impl SelfProfiler {
243243
244244 let mut results = CalculatedResults :: new ( ) ;
245245
246+ //(event, child time to subtract)
246247 let mut query_stack = Vec :: new ( ) ;
247248
248249 for event in events {
249250 match event {
250251 QueryStart { .. } | GenericActivityStart { .. } => {
251- query_stack. push ( event) ;
252+ query_stack. push ( ( event, 0 ) ) ;
252253 } ,
253254 QueryEnd { query_name, category, time : end_time } => {
254255 let previous_query = query_stack. pop ( ) ;
255- if let Some ( QueryStart {
256+ if let Some ( ( QueryStart {
256257 query_name : p_query_name,
257258 time : start_time,
258- category : _ } ) = previous_query {
259+ category : _ } , child_time_to_subtract ) ) = previous_query {
259260 assert_eq ! (
260261 p_query_name,
261262 query_name,
262263 "Saw a query end but the previous query wasn't the corresponding start"
263264 ) ;
264265
265266 let time_ns = time_between_ns ( * start_time, * end_time) ;
267+ let self_time_ns = time_ns - child_time_to_subtract;
266268 let result_data = results. categories . entry ( * category) . or_default ( ) ;
267269
268- * result_data. query_times . entry ( query_name) . or_default ( ) += time_ns;
270+ * result_data. query_times . entry ( query_name) . or_default ( ) += self_time_ns;
271+
272+ if let Some ( ( _, child_time_to_subtract) ) = query_stack. last_mut ( ) {
273+ * child_time_to_subtract += time_ns;
274+ }
269275 } else {
270276 bug ! ( "Saw a query end but the previous event wasn't a query start" ) ;
271277 }
272278 }
273279 GenericActivityEnd { category, time : end_time } => {
274280 let previous_event = query_stack. pop ( ) ;
275- if let Some ( GenericActivityStart {
281+ if let Some ( ( GenericActivityStart {
276282 category : previous_category,
277- time : start_time } ) = previous_event {
283+ time : start_time } , child_time_to_subtract ) ) = previous_event {
278284 assert_eq ! (
279285 previous_category,
280286 category,
281287 "Saw an end but the previous event wasn't the corresponding start"
282288 ) ;
283289
284290 let time_ns = time_between_ns ( * start_time, * end_time) ;
291+ let self_time_ns = time_ns - child_time_to_subtract;
285292 let result_data = results. categories . entry ( * category) . or_default ( ) ;
286293
287294 * result_data. query_times
288295 . entry ( "{time spent not running queries}" )
289- . or_default ( ) += time_ns;
296+ . or_default ( ) += self_time_ns;
297+
298+ if let Some ( ( _, child_time_to_subtract) ) = query_stack. last_mut ( ) {
299+ * child_time_to_subtract += time_ns;
300+ }
290301 } else {
291302 bug ! ( "Saw an activity end but the previous event wasn't an activity start" ) ;
292303 }
0 commit comments