use crate::libc;
use core::alloc::Layout;
use core::ffi::c_void;
#[cfg(feature = "print-allocations")]
use crate::common::utils::to_ascii;
pub struct LibcAlloc;
unsafe impl core::alloc::GlobalAlloc for LibcAlloc {
unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
#[cfg(feature = "print-allocations")]
{
let mut buf = [0u8; 16];
buf[0] = b'+';
let len = to_ascii(layout.size(), &mut buf[1..]);
unsafe { crate::libc::write(2, buf.as_ptr().cast(), len) };
}
unsafe { libc::malloc(layout.size().max(layout.align())) as *mut u8 }
}
unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8 {
#[cfg(feature = "print-allocations")]
{
let mut buf = [0u8; 16];
buf[0] = b'+';
let len = to_ascii(layout.size(), &mut buf[1..]);
unsafe { crate::libc::write(2, buf.as_ptr().cast(), len) };
}
unsafe { libc::calloc(1, layout.size().max(layout.align())) as *mut u8 }
}
#[allow(unused_variables)]
unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
#[cfg(feature = "print-allocations")]
{
let mut buf = [0u8; 16];
buf[0] = b'-';
let len = to_ascii(layout.size(), &mut buf[1..]);
unsafe { crate::libc::write(2, buf.as_ptr().cast(), len) };
}
unsafe { libc::free(ptr as *mut c_void) }
}
#[allow(unused_variables)]
unsafe fn realloc(&self, ptr: *mut u8, layout: Layout, new_size: usize) -> *mut u8 {
#[cfg(feature = "print-allocations")]
{
let mut buf = [0u8; 16];
buf[0] = b'-';
let len = to_ascii(layout.size(), &mut buf[1..]);
unsafe { crate::libc::write(2, buf.as_ptr().cast(), len) };
buf[0] = b'+';
let len = to_ascii(new_size, &mut buf[1..]);
unsafe { crate::libc::write(2, buf.as_ptr().cast(), len) };
}
unsafe { libc::realloc(ptr as *mut c_void, new_size) as *mut u8 }
}
}