use crate::Span;
use std::cell::RefCell;
thread_local! {
static CURRENT_SPAN: RefCell<Option<Span>> = RefCell::new(None);
}
pub fn start_threadlocal_span() {
set_threadlocal_span(super::global().start_span());
}
pub fn set_threadlocal_span(span: Span) {
CURRENT_SPAN.with(|s| {
*s.borrow_mut() = Some(span);
});
}
pub fn get_threadlocal_span() -> &'static mut Span {
CURRENT_SPAN.with(|s| {
let mut span_ref = s.borrow_mut();
if span_ref.is_none() {
*span_ref = Some(super::global().start_span());
}
unsafe { std::mem::transmute(span_ref.as_mut().unwrap()) }
})
}
pub fn take_threadlocal_span() -> Option<Span> {
CURRENT_SPAN.with(|s| s.borrow_mut().take())
}
pub fn end_threadlocal_span() {
CURRENT_SPAN.with(|s| s.borrow_mut().take());
}