@@ -235,27 +235,37 @@ macro_rules! options {
235
235
_ => panic!( "Invalid Options key: {}" , s)
236
236
}
237
237
}
238
- }
239
- impl Default for Options {
240
- fn default ( ) -> Self {
241
- let mut options = Options {
242
- $( $name: MMTKOption :: new( $default, $validator, $env_var, $command_line) ) ,*
243
- } ;
244
238
245
- // If we have env vars that start with MMTK_ and match any option (such as MMTK_STRESS_FACTOR),
246
- // we set the option to its value (if it is a valid value). Otherwise, use the default value.
239
+ /// Create an `Options` instance with built-in default settings.
240
+ fn new( ) -> Self {
241
+ Options {
242
+ $( $name: MMTKOption :: new( $default, $validator, $env_var, $command_line) ) ,*
243
+ }
244
+ }
245
+
246
+ /// Read options from environment variables, and apply those settings to self.
247
+ ///
248
+ /// If we have environment variables that start with `MMTK_` and match any option (such
249
+ /// as `MMTK_STRESS_FACTOR`), we set the option to its value (if it is a valid value).
250
+ pub fn read_env_var_settings( & mut self ) {
247
251
const PREFIX : & str = "MMTK_" ;
248
252
for ( key, val) in std:: env:: vars( ) {
249
253
// strip the prefix, and get the lower case string
250
254
if let Some ( rest_of_key) = key. strip_prefix( PREFIX ) {
251
255
let lowercase: & str = & rest_of_key. to_lowercase( ) ;
252
256
match lowercase {
253
- $( stringify!( $name) => { options . set_from_env_var( lowercase, & val) ; } , ) *
257
+ $( stringify!( $name) => { self . set_from_env_var( lowercase, & val) ; } , ) *
254
258
_ => { }
255
259
}
256
260
}
257
261
}
258
- return options;
262
+ }
263
+ }
264
+
265
+ impl Default for Options {
266
+ /// By default, `Options` instance is created with built-in default settings.
267
+ fn default ( ) -> Self {
268
+ Self :: new( )
259
269
}
260
270
}
261
271
]
@@ -747,7 +757,8 @@ mod tests {
747
757
#[ test]
748
758
fn no_env_var ( ) {
749
759
serial_test ( || {
750
- let options = Options :: default ( ) ;
760
+ let mut options = Options :: default ( ) ;
761
+ options. read_env_var_settings ( ) ;
751
762
assert_eq ! ( * options. stress_factor, DEFAULT_STRESS_FACTOR ) ;
752
763
} )
753
764
}
@@ -759,7 +770,8 @@ mod tests {
759
770
|| {
760
771
std:: env:: set_var ( "MMTK_STRESS_FACTOR" , "4096" ) ;
761
772
762
- let options = Options :: default ( ) ;
773
+ let mut options = Options :: default ( ) ;
774
+ options. read_env_var_settings ( ) ;
763
775
assert_eq ! ( * options. stress_factor, 4096 ) ;
764
776
} ,
765
777
|| {
@@ -777,7 +789,8 @@ mod tests {
777
789
std:: env:: set_var ( "MMTK_STRESS_FACTOR" , "4096" ) ;
778
790
std:: env:: set_var ( "MMTK_NO_FINALIZER" , "true" ) ;
779
791
780
- let options = Options :: default ( ) ;
792
+ let mut options = Options :: default ( ) ;
793
+ options. read_env_var_settings ( ) ;
781
794
assert_eq ! ( * options. stress_factor, 4096 ) ;
782
795
assert ! ( * options. no_finalizer) ;
783
796
} ,
@@ -797,7 +810,8 @@ mod tests {
797
810
// invalid value, we cannot parse the value, so use the default value
798
811
std:: env:: set_var ( "MMTK_STRESS_FACTOR" , "abc" ) ;
799
812
800
- let options = Options :: default ( ) ;
813
+ let mut options = Options :: default ( ) ;
814
+ options. read_env_var_settings ( ) ;
801
815
assert_eq ! ( * options. stress_factor, DEFAULT_STRESS_FACTOR ) ;
802
816
} ,
803
817
|| {
@@ -815,7 +829,8 @@ mod tests {
815
829
// invalid value, we cannot parse the value, so use the default value
816
830
std:: env:: set_var ( "MMTK_ABC" , "42" ) ;
817
831
818
- let options = Options :: default ( ) ;
832
+ let mut options = Options :: default ( ) ;
833
+ options. read_env_var_settings ( ) ;
819
834
assert_eq ! ( * options. stress_factor, DEFAULT_STRESS_FACTOR ) ;
820
835
} ,
821
836
|| {
@@ -825,6 +840,24 @@ mod tests {
825
840
} )
826
841
}
827
842
843
+ #[ test]
844
+ fn ignore_env_var ( ) {
845
+ serial_test ( || {
846
+ with_cleanup (
847
+ || {
848
+ std:: env:: set_var ( "MMTK_STRESS_FACTOR" , "42" ) ;
849
+
850
+ let options = Options :: default ( ) ;
851
+ // Not calling read_env_var_settings here.
852
+ assert_eq ! ( * options. stress_factor, DEFAULT_STRESS_FACTOR ) ;
853
+ } ,
854
+ || {
855
+ std:: env:: remove_var ( "MMTK_STRESS_FACTOR" ) ;
856
+ } ,
857
+ )
858
+ } )
859
+ }
860
+
828
861
#[ test]
829
862
fn test_str_option_default ( ) {
830
863
serial_test ( || {
@@ -844,7 +877,8 @@ mod tests {
844
877
|| {
845
878
std:: env:: set_var ( "MMTK_WORK_PERF_EVENTS" , "PERF_COUNT_HW_CPU_CYCLES,0,-1" ) ;
846
879
847
- let options = Options :: default ( ) ;
880
+ let mut options = Options :: default ( ) ;
881
+ options. read_env_var_settings ( ) ;
848
882
assert_eq ! (
849
883
* options. work_perf_events,
850
884
PerfEventOptions {
@@ -868,7 +902,8 @@ mod tests {
868
902
// The option needs to start with "hello", otherwise it is invalid.
869
903
std:: env:: set_var ( "MMTK_WORK_PERF_EVENTS" , "PERF_COUNT_HW_CPU_CYCLES" ) ;
870
904
871
- let options = Options :: default ( ) ;
905
+ let mut options = Options :: default ( ) ;
906
+ options. read_env_var_settings ( ) ;
872
907
// invalid value from env var, use default.
873
908
assert_eq ! (
874
909
* options. work_perf_events,
@@ -891,7 +926,8 @@ mod tests {
891
926
// We did not enable the perf_counter feature. The option will be invalid anyway, and will be set to empty.
892
927
std:: env:: set_var ( "MMTK_PHASE_PERF_EVENTS" , "PERF_COUNT_HW_CPU_CYCLES,0,-1" ) ;
893
928
894
- let options = Options :: default ( ) ;
929
+ let mut options = Options :: default ( ) ;
930
+ options. read_env_var_settings ( ) ;
895
931
// invalid value from env var, use default.
896
932
assert_eq ! (
897
933
* options. work_perf_events,
@@ -912,7 +948,8 @@ mod tests {
912
948
|| {
913
949
std:: env:: set_var ( "MMTK_THREAD_AFFINITY" , "0-" ) ;
914
950
915
- let options = Options :: default ( ) ;
951
+ let mut options = Options :: default ( ) ;
952
+ options. read_env_var_settings ( ) ;
916
953
// invalid value from env var, use default.
917
954
assert_eq ! ( * options. thread_affinity, AffinityKind :: OsDefault ) ;
918
955
} ,
@@ -931,7 +968,8 @@ mod tests {
931
968
|| {
932
969
std:: env:: set_var ( "MMTK_THREAD_AFFINITY" , "0" ) ;
933
970
934
- let options = Options :: default ( ) ;
971
+ let mut options = Options :: default ( ) ;
972
+ options. read_env_var_settings ( ) ;
935
973
assert_eq ! (
936
974
* options. thread_affinity,
937
975
AffinityKind :: RoundRobin ( vec![ 0_u16 ] )
@@ -961,7 +999,8 @@ mod tests {
961
999
}
962
1000
963
1001
std:: env:: set_var ( "MMTK_THREAD_AFFINITY" , cpu_list) ;
964
- let options = Options :: default ( ) ;
1002
+ let mut options = Options :: default ( ) ;
1003
+ options. read_env_var_settings ( ) ;
965
1004
assert_eq ! ( * options. thread_affinity, AffinityKind :: RoundRobin ( vec) ) ;
966
1005
} ,
967
1006
|| {
0 commit comments