mirror of
https://github.com/tokio-rs/tracing.git
synced 2026-03-13 17:47:59 +00:00
core: Use const initializers instead of once_cell
This commit is contained in:
parent
9feb241133
commit
0c32367cf9
@ -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 }
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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"))]
|
||||
|
||||
@ -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())
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user