use std::sync::Once; use android_system_properties::AndroidSystemProperties; use crate::ffi_utils::android_timezone_property_name; pub(crate) fn get_timezone_inner() -> Result { let key = android_timezone_property_name(); get_properties() .and_then(|properties| properties.get_from_cstr(key)) .ok_or(crate::GetTimezoneError::OsError) } fn get_properties() -> Option<&'static AndroidSystemProperties> { static INITIALIZED: Once = Once::new(); static mut PROPERTIES: Option = None; INITIALIZED.call_once(|| { let properties = AndroidSystemProperties::new(); // SAFETY: `INITIALIZED` is synchronizing. The variable is only assigned to once. unsafe { PROPERTIES = Some(properties) }; }); // SAFETY: `INITIALIZED` is synchronizing. The variable is only assigned to once. unsafe { PROPERTIES.as_ref() } }