use super::{ErasedFnPtr, ErasedFnPtrPointee};
use core::sync::atomic::{AtomicPtr, Ordering::Relaxed};
#[repr(transparent)]
pub struct AtomicFnPtr {
inner: AtomicPtr<ErasedFnPtrPointee>,
}
impl AtomicFnPtr {
#[inline]
#[must_use]
pub(super) const fn new(f: ErasedFnPtr) -> Self {
Self { inner: AtomicPtr::new(f.raw()) }
}
#[inline]
pub(super) unsafe fn store_relaxed(&self, f: ErasedFnPtr) {
self.inner.store(f.raw(), Relaxed);
}
#[inline]
#[must_use]
pub(super) fn load_relaxed(&self) -> ErasedFnPtr {
let inner = self.inner.load(Relaxed);
unsafe { ErasedFnPtr::from_raw_never_null(inner) }
}
}