#![allow(unsafe_code)]
use core::mem::size_of;
use core::ptr::NonNull;
pub(crate) const NODE_SIZE: usize = size_of::<*mut u8>();
pub(crate) struct Node;
impl Node {
#[inline(always)]
pub(crate) fn write_next(block: NonNull<u8>, next: *mut u8) {
let ptr = block.as_ptr() as *mut *mut u8;
unsafe { ptr.write_unaligned(next) };
}
#[inline(always)]
pub(crate) fn read_next(block: NonNull<u8>) -> *mut u8 {
let ptr = block.as_ptr() as *mut *mut u8;
unsafe { ptr.read_unaligned() }
}
#[inline(always)]
pub(crate) fn deref(segment_base: *mut u8, offset: usize) -> *mut u8 {
unsafe { segment_base.add(offset) }
}
pub(crate) fn zero(ptr: *mut u8, len: usize) {
unsafe { core::ptr::write_bytes(ptr, 0, len) };
}
pub(crate) fn copy_nonoverlapping(src: *const u8, dst: *mut u8, count: usize) {
unsafe { core::ptr::copy_nonoverlapping(src, dst, count) };
}
#[inline(always)]
pub(crate) fn write_struct<T: Copy>(dst: *mut T, value: T) {
unsafe { dst.write(value) };
}
#[inline(always)]
pub(crate) fn write_u8(dst: *mut u8, value: u8) {
unsafe { dst.write(value) };
}
#[inline(always)]
pub(crate) fn write_u32_unaligned(dst: *mut u32, value: u32) {
unsafe { dst.write_unaligned(value) };
}
#[inline(always)]
pub(crate) fn read_u8(src: *const u8) -> u8 {
unsafe { src.read() }
}
#[inline(always)]
pub(crate) fn read_u32_unaligned(src: *const u32) -> u32 {
unsafe { src.read_unaligned() }
}
#[inline(always)]
pub(crate) fn read_struct<T: Copy>(src: *const T) -> T {
unsafe { src.read() }
}
#[inline(always)]
pub(crate) fn read_usize(src: *const usize) -> usize {
unsafe { src.read() }
}
#[inline(always)]
pub(crate) fn write_usize(dst: *mut usize, value: usize) {
unsafe { dst.write(value) };
}
#[allow(dead_code)]
#[inline(always)]
pub(crate) fn read_u32(src: *const u32) -> u32 {
unsafe { src.read() }
}
#[allow(dead_code)]
#[inline(always)]
pub(crate) fn read_ptr<T>(src: *const *const T) -> *const T {
unsafe { src.read() }
}
#[allow(dead_code)]
#[inline(always)]
pub(crate) fn write_ptr<T>(dst: *mut *const T, value: *const T) {
unsafe { dst.write(value) };
}
#[inline(always)]
pub(crate) fn offset(base: *mut u8, off: usize) -> *mut u8 {
unsafe { base.add(off) }
}
#[cfg_attr(not(feature = "alloc-xthread"), allow(dead_code))]
#[inline(always)]
pub(crate) fn atomic_u32_at(
base: *mut u8,
off: usize,
) -> &'static core::sync::atomic::AtomicU32 {
let ptr = Self::offset(base, off) as *mut core::sync::atomic::AtomicU32;
unsafe { &*ptr }
}
#[cfg_attr(not(feature = "alloc-xthread"), allow(dead_code))]
pub(crate) fn write_u32(dst: *mut u32, value: u32) {
unsafe { dst.write(value) };
}
#[cfg_attr(not(feature = "alloc-global"), allow(dead_code))]
#[inline(always)]
pub(crate) fn atomic_u64_at(
base: *mut u8,
off: usize,
) -> &'static core::sync::atomic::AtomicU64 {
let ptr = Self::offset(base, off) as *mut core::sync::atomic::AtomicU64;
unsafe { &*ptr }
}
}