@@ -243,50 +243,61 @@ impl SelfProfiler {
243
243
244
244
let mut results = CalculatedResults :: new ( ) ;
245
245
246
+ //(event, child time to subtract)
246
247
let mut query_stack = Vec :: new ( ) ;
247
248
248
249
for event in events {
249
250
match event {
250
251
QueryStart { .. } | GenericActivityStart { .. } => {
251
- query_stack. push ( event) ;
252
+ query_stack. push ( ( event, 0 ) ) ;
252
253
} ,
253
254
QueryEnd { query_name, category, time : end_time } => {
254
255
let previous_query = query_stack. pop ( ) ;
255
- if let Some ( QueryStart {
256
+ if let Some ( ( QueryStart {
256
257
query_name : p_query_name,
257
258
time : start_time,
258
- category : _ } ) = previous_query {
259
+ category : _ } , child_time_to_subtract ) ) = previous_query {
259
260
assert_eq ! (
260
261
p_query_name,
261
262
query_name,
262
263
"Saw a query end but the previous query wasn't the corresponding start"
263
264
) ;
264
265
265
266
let time_ns = time_between_ns ( * start_time, * end_time) ;
267
+ let self_time_ns = time_ns - child_time_to_subtract;
266
268
let result_data = results. categories . entry ( * category) . or_default ( ) ;
267
269
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
+ }
269
275
} else {
270
276
bug ! ( "Saw a query end but the previous event wasn't a query start" ) ;
271
277
}
272
278
}
273
279
GenericActivityEnd { category, time : end_time } => {
274
280
let previous_event = query_stack. pop ( ) ;
275
- if let Some ( GenericActivityStart {
281
+ if let Some ( ( GenericActivityStart {
276
282
category : previous_category,
277
- time : start_time } ) = previous_event {
283
+ time : start_time } , child_time_to_subtract ) ) = previous_event {
278
284
assert_eq ! (
279
285
previous_category,
280
286
category,
281
287
"Saw an end but the previous event wasn't the corresponding start"
282
288
) ;
283
289
284
290
let time_ns = time_between_ns ( * start_time, * end_time) ;
291
+ let self_time_ns = time_ns - child_time_to_subtract;
285
292
let result_data = results. categories . entry ( * category) . or_default ( ) ;
286
293
287
294
* result_data. query_times
288
295
. 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
+ }
290
301
} else {
291
302
bug ! ( "Saw an activity end but the previous event wasn't an activity start" ) ;
292
303
}
0 commit comments