| //! Allows access to the Rayon's thread local value | |
| //! which is preserved when moving jobs across threads | |
| use std::cell::Cell; | |
| use std::ptr; | |
| thread_local!(pub static TLV: Cell<*const ()> = const { Cell::new(ptr::null()) }); | |
| #[derive(Copy, Clone)] | |
| pub(crate) struct Tlv(pub(crate) *const ()); | |
| impl Tlv { | |
| #[inline] | |
| pub(crate) fn null() -> Self { | |
| Self(ptr::null()) | |
| } | |
| } | |
| unsafe impl Sync for Tlv {} | |
| unsafe impl Send for Tlv {} | |
| /// Sets the current thread-local value | |
| #[inline] | |
| pub(crate) fn set(value: Tlv) { | |
| TLV.with(|tlv| tlv.set(value.0)); | |
| } | |
| /// Returns the current thread-local value | |
| #[inline] | |
| pub(crate) fn get() -> Tlv { | |
| TLV.with(|tlv| Tlv(tlv.get())) | |
| } |