@@ -870,9 +870,12 @@ where
870870 let span = ctx. span ( id) . expect ( "Span not found, this is a bug" ) ;
871871 let mut extensions = span. extensions_mut ( ) ;
872872 if let Some ( timings) = extensions. get_mut :: < Timings > ( ) {
873- let now = Instant :: now ( ) ;
874- timings. idle += ( now - timings. last ) . as_nanos ( ) as u64 ;
875- timings. last = now;
873+ if timings. entered_count == 0 {
874+ let now = Instant :: now ( ) ;
875+ timings. idle += ( now - timings. last ) . as_nanos ( ) as u64 ;
876+ timings. last = now;
877+ }
878+ timings. entered_count += 1 ;
876879 }
877880
878881 if self . fmt_span . trace_enter ( ) {
@@ -890,9 +893,12 @@ where
890893 let span = ctx. span ( id) . expect ( "Span not found, this is a bug" ) ;
891894 let mut extensions = span. extensions_mut ( ) ;
892895 if let Some ( timings) = extensions. get_mut :: < Timings > ( ) {
893- let now = Instant :: now ( ) ;
894- timings. busy += ( now - timings. last ) . as_nanos ( ) as u64 ;
895- timings. last = now;
896+ timings. entered_count -= 1 ;
897+ if timings. entered_count == 0 {
898+ let now = Instant :: now ( ) ;
899+ timings. busy += ( now - timings. last ) . as_nanos ( ) as u64 ;
900+ timings. last = now;
901+ }
896902 }
897903
898904 if self . fmt_span . trace_exit ( ) {
@@ -914,7 +920,9 @@ where
914920 busy,
915921 mut idle,
916922 last,
923+ entered_count,
917924 } = * timing;
925+ debug_assert_eq ! ( entered_count, 0 ) ;
918926 idle += ( Instant :: now ( ) - last) . as_nanos ( ) as u64 ;
919927
920928 let t_idle = field:: display ( TimingDisplay ( idle) ) ;
@@ -1204,6 +1212,7 @@ struct Timings {
12041212 idle : u64 ,
12051213 busy : u64 ,
12061214 last : Instant ,
1215+ entered_count : u64 ,
12071216}
12081217
12091218impl Timings {
@@ -1212,6 +1221,7 @@ impl Timings {
12121221 idle : 0 ,
12131222 busy : 0 ,
12141223 last : Instant :: now ( ) ,
1224+ entered_count : 0 ,
12151225 }
12161226 }
12171227}
0 commit comments