use core::ffi::{c_uint, c_void};
use crate::default_alloc as raw;
pub extern "C" fn mi_malloc_items(_: *mut c_void, items: c_uint, size: c_uint) -> *mut c_void {
let p = raw::malloc((items * size) as usize);
if p.is_null() {
unreachable!();
}
p
}
pub unsafe extern "C" fn mi_free_opaque(_: *mut c_void, ptr: *mut c_void) {
unsafe { raw::free(ptr) };
}
pub use mi_free_opaque as mi_free_ctx;
pub unsafe extern "C" fn mi_free_bytes(bytes: *mut c_void, _ctx: *mut c_void) {
unsafe { raw::free(bytes) };
}
#[macro_export]
macro_rules! c_thunks_for_zone {
($name:literal) => {
pub extern "C" fn malloc_size(
_: *mut ::core::ffi::c_void,
len: usize,
) -> *mut ::core::ffi::c_void {
if $crate::heap_breakdown::ENABLED {
return match $crate::get_zone!($name).malloc_zone_malloc(len) {
Some(p) => p,
None => $crate::out_of_memory(),
};
}
let p = $crate::default_alloc::malloc(len);
if p.is_null() {
$crate::out_of_memory();
}
p
}
pub extern "C" fn calloc_items(
_: *mut ::core::ffi::c_void,
items: ::core::ffi::c_uint,
len: ::core::ffi::c_uint,
) -> *mut ::core::ffi::c_void {
if $crate::heap_breakdown::ENABLED {
return match $crate::get_zone!($name)
.malloc_zone_calloc(items as usize, len as usize)
{
Some(p) => p,
None => $crate::out_of_memory(),
};
}
let p = $crate::default_alloc::calloc(items as usize, len as usize);
if p.is_null() {
$crate::out_of_memory();
}
p
}
pub unsafe extern "C" fn free(_: *mut ::core::ffi::c_void, data: *mut ::core::ffi::c_void) {
if $crate::heap_breakdown::ENABLED {
unsafe { $crate::get_zone!($name).malloc_zone_free(data) };
return;
}
unsafe { $crate::default_alloc::free(data) };
}
};
}