
# Objective - Contributes to #11478 ## Solution - Made `bevy_utils::tracing` `doc(hidden)` - Re-exported `tracing` from `bevy_log` for end-users - Added `tracing` directly to crates that need it. ## Testing - CI --- ## Migration Guide If you were importing `tracing` via `bevy::utils::tracing`, instead use `bevy::log::tracing`. Note that many items within `tracing` are also directly re-exported from `bevy::log` as well, so you may only need `bevy::log` for the most common items (e.g., `warn!`, `trace!`, etc.). This also applies to the `log_once!` family of macros. ## Notes - While this doesn't reduce the line-count in `bevy_utils`, it further decouples the internal crates from `bevy_utils`, making its eventual removal more feasible in the future. - I have just imported `tracing` as we do for all dependencies. However, a workspace dependency may be more appropriate for version management.
40 lines
983 B
Rust
40 lines
983 B
Rust
#[cfg(feature = "portable-atomic")]
|
|
use portable_atomic::{AtomicBool, Ordering};
|
|
|
|
#[cfg(not(feature = "portable-atomic"))]
|
|
use core::sync::atomic::{AtomicBool, Ordering};
|
|
|
|
/// Wrapper around an [`AtomicBool`], abstracting the backing implementation and
|
|
/// ordering considerations.
|
|
#[doc(hidden)]
|
|
pub struct OnceFlag(AtomicBool);
|
|
|
|
impl OnceFlag {
|
|
/// Create a new flag in the unset state.
|
|
pub const fn new() -> Self {
|
|
Self(AtomicBool::new(true))
|
|
}
|
|
|
|
/// Sets this flag. Will return `true` if this flag hasn't been set before.
|
|
pub fn set(&self) -> bool {
|
|
self.0.swap(false, Ordering::Relaxed)
|
|
}
|
|
}
|
|
|
|
impl Default for OnceFlag {
|
|
fn default() -> Self {
|
|
Self::new()
|
|
}
|
|
}
|
|
|
|
/// Call some expression only once per call site.
|
|
#[macro_export]
|
|
macro_rules! once {
|
|
($expression:expr) => {{
|
|
static SHOULD_FIRE: $crate::OnceFlag = $crate::OnceFlag::new();
|
|
if SHOULD_FIRE.set() {
|
|
$expression;
|
|
}
|
|
}};
|
|
}
|