1use std::alloc::{AllocError, Allocator};
21use std::alloc::{GlobalAlloc, Layout};
22
23use crate::mem::cast_to_nonnull;
24use std::ptr::NonNull;
25
26#[cfg(feature = "fast_allocator")]
27use mimalloc::MiMalloc;
28
29#[cfg(feature = "fast_allocator")]
30static mut SAND: MiMalloc = MiMalloc;
31
32#[cfg(not(feature = "fast_allocator"))]
33use std::alloc::System;
34
35#[cfg(not(feature = "fast_allocator"))]
36static mut SAND: System = System;
37
38pub unsafe fn direct_alloc(len: usize) -> *mut u8 {
39 SAND.alloc(Layout::from_size_align_unchecked(len, size_of::<u8>()))
40}
41
42pub unsafe fn direct_dealloc(ptr: *mut u8, len: usize) {
43 SAND.dealloc(ptr, Layout::from_size_align_unchecked(len, size_of::<u8>()))
44}
45
46pub struct DirectAllocator;
47
48unsafe impl Allocator for DirectAllocator {
49 fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError> {
50 let size = layout.size();
51 let ptr = unsafe { direct_alloc(size) };
52 let slice = unsafe { std::slice::from_raw_parts_mut(ptr, size) };
53 Ok(cast_to_nonnull::<[u8]>(slice))
54 }
55 unsafe fn deallocate(&self, ptr: NonNull<u8>, layout: Layout) {
56 direct_dealloc(ptr.as_ptr(), layout.size());
57 }
58}
59
60pub static DIRECT_ALLOCATOR: DirectAllocator = DirectAllocator;
61