#[cfg(not(feature = "std"))]
pub struct SingleThreaded<T>(core::cell::UnsafeCell<T>);
#[cfg(not(feature = "std"))]
unsafe impl<T> Sync for SingleThreaded<T> {}
#[cfg(not(feature = "std"))]
impl<T> SingleThreaded<T> {
pub const fn new(v: T) -> Self {
SingleThreaded(core::cell::UnsafeCell::new(v))
}
pub fn with<R>(&self, f: impl FnOnce(&T) -> R) -> R {
f(unsafe { &*self.0.get() })
}
}
macro_rules! rt_global {
($(#[$m:meta])* static $name:ident: $t:ty = $init:expr;) => {
#[cfg(feature = "std")]
std::thread_local! {
$(#[$m])*
static $name: $t = const { $init };
}
$(#[$m])*
#[cfg(not(feature = "std"))]
static $name: $crate::tls::SingleThreaded<$t> =
$crate::tls::SingleThreaded::new($init);
};
}