Skip to content

Commit

Permalink
Don't use once_cell
Browse files Browse the repository at this point in the history
`once_cell` upgraded the MSRV to 1.56. This breaks the use of
`iana-time-zone` transitively even though we only use it for Android
targets.

This PR replaces `once_cell` by using `static mut` + `std::sync::Once`.
`once_cell` is more or less only a safe wrapper around both, but not
actually needed. We already do the same in our Windows targets.

Cf. <matklad/once_cell#201>
  • Loading branch information
Kijewski committed Sep 22, 2022
1 parent 5c5badb commit d7e718f
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 7 deletions.
1 change: 0 additions & 1 deletion Cargo.toml
Expand Up @@ -16,7 +16,6 @@ fallback = []

[target.'cfg(target_os = "android")'.dependencies]
android_system_properties = "0.1.5"
once_cell = "1.13.1"

[target.'cfg(any(target_os = "macos", target_os = "ios"))'.dependencies]
core-foundation-sys = "0.8.3"
Expand Down
23 changes: 17 additions & 6 deletions src/tz_android.rs
@@ -1,16 +1,27 @@
use std::ffi::CStr;
use std::sync::Once;

use android_system_properties::AndroidSystemProperties;
use once_cell::sync::OnceCell;

static INITALIZED: Once = Once::new();
static mut PROPERTIES: Option<AndroidSystemProperties> = None;

// From https://android.googlesource.com/platform/ndk/+/android-4.2.2_r1.2/docs/system/libc/OVERVIEW.html
// The system property named 'persist.sys.timezone' contains the name of the current timezone.

static PROPERTIES: OnceCell<AndroidSystemProperties> = OnceCell::new();
// SAFETY: the key is NUL-terminated and there are no other NULs
const KEY: &CStr = unsafe { CStr::from_bytes_with_nul_unchecked(b"persist.sys.timezone\0") };

pub(crate) fn get_timezone_inner() -> Result<String, crate::GetTimezoneError> {
PROPERTIES
.get_or_init(AndroidSystemProperties::new)
.get_from_cstr(unsafe { CStr::from_bytes_with_nul_unchecked(b"persist.sys.timezone\0") })
INITALIZED.call_once(|| {
let properties = AndroidSystemProperties::new();
// SAFETY: `INITALIZED` is synchronizing. The variable is only assigned to once.
unsafe { PROPERTIES = Some(properties) };
});

// SAFETY: `INITALIZED` is synchronizing. The variable is only assigned to once.
let properties = unsafe { PROPERTIES.as_ref() };

properties
.and_then(|properties| properties.get_from_cstr(KEY))
.ok_or(crate::GetTimezoneError::OsError)
}

0 comments on commit d7e718f

Please sign in to comment.