Skip to main content

rumtk_arena/mem/
alloc.rs

1/*
2 *     rumtk attempts to implement HL7 and medical protocols for interoperability in medicine.
3 *     This toolkit aims to be reliable, simple, performant, and standards compliant.
4 *     Copyright (C) 2026  Luis M. Santos, M.D. <lsantos@medicalmasses.com>
5 *     Copyright (C) 2026  MedicalMasses L.L.C. <contact@medicalmasses.com>
6 *
7 *     This program is free software: you can redistribute it and/or modify
8 *     it under the terms of the GNU General Public License as published by
9 *     the Free Software Foundation, either version 3 of the License, or
10 *     (at your option) any later version.
11 *
12 *     This program is distributed in the hope that it will be useful,
13 *     but WITHOUT ANY WARRANTY; without even the implied warranty of
14 *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 *     GNU General Public License for more details.
16 *
17 *     You should have received a copy of the GNU General Public License
18 *     along with this program.  If not, see <https://www.gnu.org/licenses/>.
19 */
20use 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