@@ -11,9 +11,8 @@ use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
1111use std:: sync:: Arc ;
1212use std:: sync:: Mutex ;
1313
14- // TODO: Increasing this number would cause JikesRVM die at boot time. I don't really know why.
15- // E.g. using 1 << 14 will cause JikesRVM segfault at boot time.
16- pub const MAX_PHASES : usize = 1 << 12 ;
14+ /// The default number of phases for statistics.
15+ pub const DEFAULT_NUM_PHASES : usize = 1 << 12 ;
1716pub const MAX_COUNTERS : usize = 100 ;
1817
1918/// GC stats shared among counters
@@ -51,10 +50,8 @@ pub struct Stats {
5150 // Initialization of libpfm4 is required before we can use `PerfEvent` types
5251 #[ cfg( feature = "perf_counter" ) ]
5352 perfmon : Perfmon ,
54-
5553 pub shared : Arc < SharedStats > ,
5654 counters : Mutex < Vec < Arc < Mutex < dyn Counter + Send > > > > ,
57- exceeded_phase_limit : AtomicBool ,
5855}
5956
6057impl Stats {
@@ -99,10 +96,8 @@ impl Stats {
9996 total_time : t,
10097 #[ cfg( feature = "perf_counter" ) ]
10198 perfmon,
102-
10399 shared,
104100 counters : Mutex :: new ( counters) ,
105- exceeded_phase_limit : AtomicBool :: new ( false ) ,
106101 }
107102 }
108103
@@ -157,32 +152,22 @@ impl Stats {
157152 if !self . get_gathering_stats ( ) {
158153 return ;
159154 }
160- if self . get_phase ( ) < MAX_PHASES - 1 {
161- let counters = self . counters . lock ( ) . unwrap ( ) ;
162- for counter in & ( * counters) {
163- counter. lock ( ) . unwrap ( ) . phase_change ( self . get_phase ( ) ) ;
164- }
165- self . shared . increment_phase ( ) ;
166- } else if !self . exceeded_phase_limit . load ( Ordering :: SeqCst ) {
167- eprintln ! ( "Warning: number of GC phases exceeds MAX_PHASES" ) ;
168- self . exceeded_phase_limit . store ( true , Ordering :: SeqCst ) ;
155+ let counters = self . counters . lock ( ) . unwrap ( ) ;
156+ for counter in & ( * counters) {
157+ counter. lock ( ) . unwrap ( ) . phase_change ( self . get_phase ( ) ) ;
169158 }
159+ self . shared . increment_phase ( ) ;
170160 }
171161
172162 pub fn end_gc ( & self ) {
173163 if !self . get_gathering_stats ( ) {
174164 return ;
175165 }
176- if self . get_phase ( ) < MAX_PHASES - 1 {
177- let counters = self . counters . lock ( ) . unwrap ( ) ;
178- for counter in & ( * counters) {
179- counter. lock ( ) . unwrap ( ) . phase_change ( self . get_phase ( ) ) ;
180- }
181- self . shared . increment_phase ( ) ;
182- } else if !self . exceeded_phase_limit . load ( Ordering :: SeqCst ) {
183- eprintln ! ( "Warning: number of GC phases exceeds MAX_PHASES" ) ;
184- self . exceeded_phase_limit . store ( true , Ordering :: SeqCst ) ;
166+ let counters = self . counters . lock ( ) . unwrap ( ) ;
167+ for counter in & ( * counters) {
168+ counter. lock ( ) . unwrap ( ) . phase_change ( self . get_phase ( ) ) ;
185169 }
170+ self . shared . increment_phase ( ) ;
186171 }
187172
188173 pub fn print_stats < VM : VMBinding > ( & self , mmtk : & ' static MMTK < VM > ) {
0 commit comments