use core::ptr::NonNull;
macro_rules! feature {
(
#![$meta:meta]
$($item:item)*
) => {
$(
#[cfg($meta)]
#[cfg_attr(docsrs, doc(cfg($meta)))]
$item
)*
}
}
macro_rules! loom_const_fn {
(
$(#[$meta:meta])*
$vis:vis unsafe fn $name:ident($($arg:ident: $T:ty),*) -> $Ret:ty $body:block
) => {
$(#[$meta])*
#[cfg(not(loom))]
$vis const unsafe fn $name($($arg: $T),*) -> $Ret $body
$(#[$meta])*
#[cfg(loom)]
$vis unsafe fn $name($($arg: $T),*) -> $Ret $body
};
(
$(#[$meta:meta])*
$vis:vis fn $name:ident($($arg:ident: $T:ty),*) -> $Ret:ty $body:block
) => {
$(#[$meta])*
#[cfg(not(loom))]
$vis const fn $name($($arg: $T),*) -> $Ret $body
$(#[$meta])*
#[cfg(loom)]
$vis fn $name($($arg: $T),*) -> $Ret $body
}
}
#[cfg(debug_assertions)]
#[track_caller]
#[inline(always)]
pub(crate) unsafe fn non_null<T>(ptr: *mut T) -> NonNull<T> {
NonNull::new(ptr).expect(
"/!\\ constructed a `NonNull` from a null pointer! /!\\ \n\
in release mode, this would have called `NonNull::new_unchecked`, \
violating the `NonNull` invariant! this is a bug in `cordyceps!`.",
)
}
#[cfg(not(debug_assertions))]
#[inline(always)]
pub(crate) unsafe fn non_null<T>(ptr: *mut T) -> NonNull<T> {
NonNull::new_unchecked(ptr)
}
#[cfg(test)]
pub(crate) use self::test::trace_init;
pub(crate) fn expect_display<T, E: core::fmt::Display>(result: Result<T, E>, msg: &str) -> T {
match result {
Ok(t) => t,
Err(error) => panic!("{msg}: {error}"),
}
}
#[cfg(test)]
pub(crate) mod test {
#[must_use]
pub struct TestGuard {
#[cfg(not(loom))]
_x2: tracing_02::collect::DefaultGuard,
#[cfg(loom)]
_x1: tracing_01::subscriber::DefaultGuard,
}
pub(crate) fn trace_init() -> TestGuard {
trace_init_with_default("maitake=debug,cordyceps=debug")
}
#[cfg(not(loom))]
pub(crate) fn trace_init_with_default(default: &str) -> TestGuard {
use tracing_subscriber::filter::{EnvFilter, LevelFilter};
let env = std::env::var("RUST_LOG").unwrap_or_default();
let builder = EnvFilter::builder().with_default_directive(LevelFilter::INFO.into());
let filter = if env.is_empty() {
builder.parse(default).unwrap()
} else {
builder.parse_lossy(env)
};
let filter = filter.add_directive("maitake::alloc=trace".parse().unwrap());
let collector = tracing_subscriber::fmt()
.with_env_filter(filter)
.with_test_writer()
.without_time()
.finish();
TestGuard {
_x2: tracing_02::collect::set_default(collector),
}
}
#[cfg(loom)]
pub(crate) fn trace_init_with_default(default: &str) -> TestGuard {
use tracing_subscriber_03::filter::{EnvFilter, LevelFilter};
let env = std::env::var("LOOM_LOG").unwrap_or_default();
let builder = EnvFilter::builder().with_default_directive(LevelFilter::INFO.into());
let filter = if env.is_empty() {
builder
.parse(default)
.unwrap()
.add_directive("loom=info".parse().unwrap())
} else {
builder.parse_lossy(env)
};
let collector = tracing_subscriber_03::fmt()
.with_env_filter(filter)
.with_test_writer()
.without_time()
.finish();
use tracing_subscriber_03::util::SubscriberInitExt;
TestGuard {
_x1: collector.set_default(),
}
}
}