rustix_dlmalloc/
global.rs1use crate::Dlmalloc;
2use core::alloc::{GlobalAlloc, Layout};
3use core::ptr;
4
5pub 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}