diff --git a/tracing-core/Cargo.toml b/tracing-core/Cargo.toml index 56e146ff2..97590f6b9 100644 --- a/tracing-core/Cargo.toml +++ b/tracing-core/Cargo.toml @@ -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 } diff --git a/tracing-core/src/callsite.rs b/tracing-core/src/callsite.rs index f7f4833eb..977228871 100644 --- a/tracing-core/src/callsite.rs +++ b/tracing-core/src/callsite.rs @@ -109,7 +109,6 @@ use crate::stdlib::{ }; use crate::{ dispatcher::Dispatch, - lazy::Lazy, metadata::{LevelFilter, Metadata}, subscriber::Interest, }; @@ -260,7 +259,7 @@ static CALLSITES: Callsites = Callsites { static DISPATCHERS: Dispatchers = Dispatchers::new(); -static LOCKED_CALLSITES: Lazy>> = Lazy::new(Default::default); +static LOCKED_CALLSITES: Mutex> = Mutex::new(Vec::new()); struct Callsites { list_head: AtomicPtr, @@ -515,7 +514,7 @@ mod private { #[cfg(feature = "std")] mod dispatchers { - use crate::{dispatcher, lazy::Lazy}; + use crate::dispatcher; use std::sync::{ atomic::{AtomicBool, Ordering}, RwLock, RwLockReadGuard, RwLockWriteGuard, @@ -525,8 +524,7 @@ mod dispatchers { has_just_one: AtomicBool, } - static LOCKED_DISPATCHERS: Lazy>> = - Lazy::new(Default::default); + static LOCKED_DISPATCHERS: RwLock> = RwLock::new(Vec::new()); pub(super) enum Rebuilder<'a> { JustOne, diff --git a/tracing-core/src/lazy.rs b/tracing-core/src/lazy.rs deleted file mode 100644 index 4f004e636..000000000 --- a/tracing-core/src/lazy.rs +++ /dev/null @@ -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> { - cell: Once, - init: Cell>, - } - - impl fmt::Debug for Lazy { - 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` so it is fine to not impl - // `Sync` for `F`. We do create a `&mut Option` in `force`, but this is - // properly synchronized, so it only happens once so it also does not - // contribute to this impl. - unsafe impl Sync for Lazy where Once: Sync {} - // auto-derived `Send` impl is OK. - - impl Lazy { - /// Creates a new lazy value with the given initializing function. - pub(crate) const fn new(init: F) -> Lazy { - Lazy { - cell: Once::new(), - init: Cell::new(Some(init)), - } - } - } - - impl T> Lazy { - /// 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 { - this.cell.call_once(|| match this.init.take() { - Some(f) => f(), - None => panic!("Lazy instance has previously been poisoned"), - }) - } - } - - impl T> Deref for Lazy { - type Target = T; - fn deref(&self) -> &T { - Lazy::force(self) - } - } - - impl Default for Lazy { - /// Creates a new lazy value using `Default` as the initializing function. - fn default() -> Lazy { - Lazy::new(T::default) - } - } -} diff --git a/tracing-core/src/lib.rs b/tracing-core/src/lib.rs index e7588d436..a469ec6c2 100644 --- a/tracing-core/src/lib.rs +++ b/tracing-core/src/lib.rs @@ -261,8 +261,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"))] diff --git a/tracing-core/src/stdlib.rs b/tracing-core/src/stdlib.rs index 741549519..623d06977 100644 --- a/tracing-core/src/stdlib.rs +++ b/tracing-core/src/stdlib.rs @@ -64,11 +64,11 @@ mod no_std { } impl Mutex { - // pub(crate) fn new(data: T) -> Self { - // Self { - // inner: crate::spin::Mutex::new(data), - // } - // } + pub(crate) const fn new(data: T) -> Self { + Self { + inner: crate::spin::Mutex::new(data), + } + } pub(crate) fn lock(&self) -> Result, ()> { Ok(self.inner.lock())