@@ -7,33 +7,41 @@ use std::thread::JoinHandle;
77use std:: time:: Duration ;
88use tracing:: warn;
99
10+ const MONITOR_SCHEDULE : Duration = Duration :: from_millis ( 500 ) ;
11+
1012#[ derive( Default ) ]
1113struct AtomicTps {
12- tps : AtomicU32 ,
13- unlimited : AtomicBool ,
14+ tps_bits : AtomicU32 ,
1415}
1516
1617impl AtomicTps {
1718 fn from_tps ( tps : Tps ) -> Self {
18- match tps {
19- Tps :: Limited ( tps) => AtomicTps {
20- tps : AtomicU32 :: new ( tps) ,
21- unlimited : AtomicBool :: new ( false ) ,
22- } ,
23- Tps :: Unlimited => AtomicTps {
24- tps : AtomicU32 :: new ( 0 ) ,
25- unlimited : AtomicBool :: new ( true ) ,
26- } ,
19+ AtomicTps {
20+ tps_bits : AtomicU32 :: new ( Self :: tps_to_bits ( tps) ) ,
2721 }
2822 }
2923
3024 fn update ( & self , tps : Tps ) {
25+ self . tps_bits
26+ . store ( Self :: tps_to_bits ( tps) , Ordering :: Relaxed ) ;
27+ }
28+
29+ fn tps_to_bits ( tps : Tps ) -> u32 {
3130 match tps {
32- Tps :: Limited ( tps) => {
33- self . tps . store ( tps, Ordering :: Relaxed ) ;
34- self . unlimited . store ( false , Ordering :: Relaxed ) ;
31+ Tps :: Limited ( tps) if tps. is_nan ( ) => {
32+ panic ! ( "Tps should never be NaN under any circumstance" )
3533 }
36- Tps :: Unlimited => self . unlimited . store ( true , Ordering :: Relaxed ) ,
34+ Tps :: Limited ( tps) => tps. to_bits ( ) ,
35+ Tps :: Unlimited => f32:: NAN . to_bits ( ) ,
36+ }
37+ }
38+
39+ fn get ( & self ) -> Tps {
40+ let tps = f32:: from_bits ( self . tps_bits . load ( Ordering :: Relaxed ) ) ;
41+ if tps. is_nan ( ) {
42+ Tps :: Unlimited
43+ } else {
44+ Tps :: Limited ( tps)
3745 }
3846 }
3947}
@@ -148,13 +156,13 @@ impl TimingsMonitor {
148156
149157 fn run_thread ( data : Arc < MonitorData > ) -> JoinHandle < ( ) > {
150158 thread:: spawn ( move || {
151- let mut last_tps = data. tps . tps . load ( Ordering :: Relaxed ) ;
159+ let mut last_tps = data. tps . get ( ) ;
152160 let mut last_ticks_count = data. ticks_passed . load ( Ordering :: Relaxed ) ;
153161 let mut was_ticking_before = data. ticking . load ( Ordering :: Relaxed ) ;
154162
155163 let mut behind_for = 0 ;
156164 loop {
157- thread:: sleep ( Duration :: from_millis ( 500 ) ) ;
165+ thread:: sleep ( MONITOR_SCHEDULE ) ;
158166 if !data. running . load ( Ordering :: Relaxed ) {
159167 return ;
160168 }
@@ -166,7 +174,7 @@ impl TimingsMonitor {
166174 let ticks_passed = ( ticks_count - last_ticks_count) as u32 ;
167175 last_ticks_count = ticks_count;
168176
169- let tps = data. tps . tps . load ( Ordering :: Relaxed ) ;
177+ let tps = data. tps . get ( ) ;
170178 let ticking = data. ticking . load ( Ordering :: Relaxed ) ;
171179 if !( ticking && was_ticking_before)
172180 || tps != last_tps
@@ -179,8 +187,14 @@ impl TimingsMonitor {
179187 }
180188
181189 // 5% threshold
182- if data. tps . unlimited . load ( Ordering :: Relaxed ) || ticks_passed < ( tps / 2 ) * 95 / 100
183- {
190+ let is_behind = match tps {
191+ Tps :: Unlimited => false ,
192+ Tps :: Limited ( tps_val) => {
193+ ( ticks_passed as f32 ) < tps_val * MONITOR_SCHEDULE . as_secs_f32 ( ) * 0.95
194+ }
195+ } ;
196+
197+ if is_behind {
184198 behind_for += 1 ;
185199 } else {
186200 behind_for = 0 ;
@@ -190,8 +204,8 @@ impl TimingsMonitor {
190204 if behind_for >= 3 {
191205 data. too_slow . store ( true , Ordering :: Relaxed ) ;
192206 // warn!(
193- // "running behind by {} ticks",
194- // (( tps / 2 ) * 95 / 100 ) - ticks_passed
207+ // "running behind by {:.1 } ticks",
208+ // (tps * MONITOR_SCHEDULE.as_secs_f32( ) * 0.95 ) - ( ticks_passed as f32)
195209 // );
196210 }
197211
0 commit comments