@@ -14,13 +14,30 @@ use core::str::FromStr;
1414use libc:: { c_char, c_int} ;
1515use libdd_common:: tag:: { parse_tags, Tag } ;
1616pub use libdd_profiling:: exporter:: Uri ;
17- use log:: { warn, LevelFilter } ;
17+ use log:: { debug , warn, LevelFilter } ;
1818use std:: borrow:: Cow ;
1919use std:: ffi:: CString ;
2020use std:: path:: { Path , PathBuf } ;
2121
22+ #[ derive( Copy , Clone , Debug ) ]
23+ pub enum SystemSettingsState {
24+ /// Indicates the system settings are not aware of the configuration at
25+ /// the moment.
26+ #[ default]
27+ ConfigUnaware ,
28+
29+ /// Indicates the system settings _are_ aware of configuration at the
30+ /// moment.
31+ ConfigAware ,
32+
33+ /// Expressly disabled, such as a child process post-fork (forks are not
34+ /// currently profiled, except certain forks made by SAPIs).
35+ Disabled ,
36+ }
37+
2238#[ derive( Clone , Debug ) ]
2339pub struct SystemSettings {
40+ pub state : SystemSettingsState ,
2441 pub profiling_enabled : bool ,
2542 pub profiling_experimental_features_enabled : bool ,
2643 pub profiling_endpoint_collection_enabled : bool ,
@@ -44,6 +61,7 @@ impl SystemSettings {
4461 /// Provides "initial" settings, which are all "off"-like values.
4562 pub const fn initial ( ) -> SystemSettings {
4663 SystemSettings {
64+ state : SystemSettingsState :: ConfigUnaware ,
4765 profiling_enabled : false ,
4866 profiling_experimental_features_enabled : false ,
4967 profiling_endpoint_collection_enabled : false ,
@@ -73,6 +91,7 @@ impl SystemSettings {
7391 let trace_agent_url = trace_agent_url ( ) ;
7492 let uri = detect_uri_from_config ( trace_agent_url, agent_host, trace_agent_port) ;
7593 Self {
94+ state : SystemSettingsState :: ConfigAware ,
7695 profiling_enabled : profiling_enabled ( ) ,
7796 profiling_experimental_features_enabled : profiling_experimental_features_enabled ( ) ,
7897 profiling_endpoint_collection_enabled : profiling_endpoint_collection_enabled ( ) ,
@@ -130,20 +149,47 @@ impl SystemSettings {
130149 system_settings. profiling_allocation_enabled = false ;
131150 }
132151
152+ SystemSettings :: log_state (
153+ ( * ptr:: addr_of!( SYSTEM_SETTINGS ) ) . state ,
154+ system_settings. state ,
155+ "the first request was received" ,
156+ ) ;
133157 ptr:: addr_of_mut!( SYSTEM_SETTINGS ) . swap ( & mut system_settings) ;
134158 }
135159
160+ fn log_state ( from : SystemSettingsState , to : SystemSettingsState , reason : & str ) {
161+ debug ! ( "SystemSettings state transitioned from {from:?} to {to:?} because {reason}." ) ;
162+ }
163+
136164 /// # Safety
137165 /// Must be called exactly once per shutdown in either mshutdown or
138166 /// shutdown, before zai config is shutdown.
139167 unsafe fn on_shutdown ( ) {
140168 let system_settings = & mut * ptr:: addr_of_mut!( SYSTEM_SETTINGS ) ;
141- * system_settings = SystemSettings :: initial ( ) ;
169+ let state = SystemSettingsState :: ConfigUnaware ;
170+ SystemSettings :: log_state (
171+ system_settings. state ,
172+ state,
173+ "a shutdown command was received" ,
174+ ) ;
175+ * system_settings = SystemSettings {
176+ state,
177+ ..SystemSettings :: initial ( )
178+ } ;
142179 }
143180
144181 unsafe fn on_fork_in_child ( ) {
145182 let system_settings = & mut * ptr:: addr_of_mut!( SYSTEM_SETTINGS ) ;
146- * system_settings = SystemSettings :: initial ( ) ;
183+ let state = SystemSettingsState :: Disabled ;
184+ SystemSettings :: log_state (
185+ system_settings. state ,
186+ state,
187+ "the processed forked, and child processes are not profiled" ,
188+ ) ;
189+ * system_settings = SystemSettings {
190+ state,
191+ ..SystemSettings :: initial ( )
192+ } ;
147193 }
148194}
149195
0 commit comments