| //! 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())) |
| } |