rustix_dlmalloc/
global.rs

1use crate::Dlmalloc;
2use core::alloc::{GlobalAlloc, Layout};
3use core::ptr;
4
5/// An instance of a "global allocator" backed by `Dlmalloc`
6///
7/// This API requires the `global` feature is activated, and this type
8/// implements the `GlobalAlloc` trait in the standard library.
9pub struct GlobalDlmalloc;
10
11static mut DLMALLOC: Dlmalloc = Dlmalloc::new();
12
13unsafe impl GlobalAlloc for GlobalDlmalloc {
14    #[inline]
15    unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
16        let _guard = lock();
17        let dlmalloc = ptr::addr_of_mut!(DLMALLOC);
18        (*dlmalloc).malloc(layout.size(), layout.align())
19    }
20
21    #[inline]
22    unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
23        let _guard = lock();
24        let dlmalloc = ptr::addr_of_mut!(DLMALLOC);
25        (*dlmalloc).free(ptr, layout.size(), layout.align())
26    }
27
28    #[inline]
29    unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8 {
30        let _guard = lock();
31        let dlmalloc = ptr::addr_of_mut!(DLMALLOC);
32        (*dlmalloc).calloc(layout.size(), layout.align())
33    }
34
35    #[inline]
36    unsafe fn realloc(&self, ptr: *mut u8, layout: Layout, new_size: usize) -> *mut u8 {
37        let _guard = lock();
38        let dlmalloc = ptr::addr_of_mut!(DLMALLOC);
39        (*dlmalloc).realloc(ptr, layout.size(), layout.align(), new_size)
40    }
41}
42
43unsafe fn lock() -> impl Drop {
44    crate::sys::acquire_global_lock();
45
46    struct Guard;
47    impl Drop for Guard {
48        fn drop(&mut self) {
49            crate::sys::release_global_lock()
50        }
51    }
52
53    Guard
54}