core: Use const initializers instead of once_cell

This commit is contained in:
Expyron 2025-06-14 16:13:31 +02:00 committed by Jonas Platte
parent 9feb241133
commit 0c32367cf9
5 changed files with 12 additions and 90 deletions

View File

@ -26,13 +26,15 @@ rust-version = "1.65.0"
[features]
default = ["std", "valuable?/std"]
std = ["once_cell"]
std = []
# used to be an implicit feature from an optional dependency
# FIXME: remove with the next breaking-change release
once_cell = []
[badges]
maintenance = { status = "actively-developed" }
[dependencies]
once_cell = { version = "1.13.0", optional = true }
[target.'cfg(tracing_unstable)'.dependencies]
valuable = { version = "0.1.0", optional = true, default-features = false }

View File

@ -109,7 +109,6 @@ use core::{
use self::dispatchers::Dispatchers;
use crate::{
dispatcher::Dispatch,
lazy::Lazy,
metadata::{LevelFilter, Metadata},
subscriber::Interest,
sync::Mutex,
@ -259,7 +258,7 @@ static CALLSITES: Callsites = Callsites {
static DISPATCHERS: Dispatchers = Dispatchers::new();
static LOCKED_CALLSITES: Lazy<Mutex<Vec<&'static dyn Callsite>>> = Lazy::new(Default::default);
static LOCKED_CALLSITES: Mutex<Vec<&'static dyn Callsite>> = Mutex::new(Vec::new());
struct Callsites {
list_head: AtomicPtr<DefaultCallsite>,
@ -514,7 +513,7 @@ mod private {
#[cfg(feature = "std")]
mod dispatchers {
use crate::{dispatcher, lazy::Lazy};
use crate::dispatcher;
use alloc::vec::Vec;
use std::sync::{
atomic::{AtomicBool, Ordering},
@ -525,8 +524,7 @@ mod dispatchers {
has_just_one: AtomicBool,
}
static LOCKED_DISPATCHERS: Lazy<RwLock<Vec<dispatcher::Registrar>>> =
Lazy::new(Default::default);
static LOCKED_DISPATCHERS: RwLock<Vec<dispatcher::Registrar>> = RwLock::new(Vec::new());
pub(super) enum Rebuilder<'a> {
JustOne,

View File

@ -1,76 +0,0 @@
#[cfg(feature = "std")]
pub(crate) use once_cell::sync::Lazy;
#[cfg(not(feature = "std"))]
pub(crate) use self::spin::Lazy;
#[cfg(not(feature = "std"))]
mod spin {
//! This is the `once_cell::sync::Lazy` type, but modified to use our
//! `spin::Once` type rather than `OnceCell`. This is used to replace
//! `once_cell::sync::Lazy` on `no-std` builds.
use crate::spin::Once;
use core::{cell::Cell, fmt, ops::Deref};
/// Re-implementation of `once_cell::sync::Lazy` on top of `spin::Once`
/// rather than `OnceCell`.
///
/// This is used when the standard library is disabled.
pub(crate) struct Lazy<T, F = fn() -> T> {
cell: Once<T>,
init: Cell<Option<F>>,
}
impl<T: fmt::Debug, F> fmt::Debug for Lazy<T, F> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Lazy")
.field("cell", &self.cell)
.field("init", &"..")
.finish()
}
}
// We never create a `&F` from a `&Lazy<T, F>` so it is fine to not impl
// `Sync` for `F`. We do create a `&mut Option<F>` in `force`, but this is
// properly synchronized, so it only happens once so it also does not
// contribute to this impl.
unsafe impl<T, F: Send> Sync for Lazy<T, F> where Once<T>: Sync {}
// auto-derived `Send` impl is OK.
impl<T, F> Lazy<T, F> {
/// Creates a new lazy value with the given initializing function.
pub(crate) const fn new(init: F) -> Lazy<T, F> {
Lazy {
cell: Once::new(),
init: Cell::new(Some(init)),
}
}
}
impl<T, F: FnOnce() -> T> Lazy<T, F> {
/// Forces the evaluation of this lazy value and returns a reference to
/// the result.
///
/// This is equivalent to the `Deref` impl, but is explicit.
pub(crate) fn force(this: &Lazy<T, F>) -> &T {
this.cell.call_once(|| match this.init.take() {
Some(f) => f(),
None => panic!("Lazy instance has previously been poisoned"),
})
}
}
impl<T, F: FnOnce() -> T> Deref for Lazy<T, F> {
type Target = T;
fn deref(&self) -> &T {
Lazy::force(self)
}
}
impl<T: Default> Default for Lazy<T> {
/// Creates a new lazy value using `Default` as the initializing function.
fn default() -> Lazy<T> {
Lazy::new(T::default)
}
}
}

View File

@ -266,8 +266,6 @@ macro_rules! metadata {
};
}
pub(crate) mod lazy;
// Trimmed-down vendored version of spin 0.5.2 (0387621)
// Dependency of no_std lazy_static, not required in a std build
#[cfg(not(feature = "std"))]

View File

@ -11,11 +11,11 @@ pub(crate) struct Mutex<T> {
}
impl<T> Mutex<T> {
// pub(crate) fn new(data: T) -> Self {
// Self {
// inner: crate::spin::Mutex::new(data),
// }
// }
pub(crate) fn new(data: T) -> Self {
Self {
inner: crate::spin::Mutex::new(data),
}
}
pub(crate) fn lock(&self) -> Result<MutexGuard<'_, T>, ()> {
Ok(self.inner.lock())