#![no_std]
use core::ffi::c_void;
#[cfg(feature = "extended")]
mod extended;
#[cfg(feature = "extended")]
pub use extended::*;
extern "C" {
pub fn mi_zalloc(size: usize) -> *mut c_void;
pub fn mi_malloc(size: usize) -> *mut c_void;
pub fn mi_realloc(p: *mut c_void, newsize: usize) -> *mut c_void;
pub fn mi_zalloc_aligned(size: usize, alignment: usize) -> *mut c_void;
pub fn mi_malloc_aligned(size: usize, alignment: usize) -> *mut c_void;
pub fn mi_realloc_aligned(p: *mut c_void, newsize: usize, alignment: usize) -> *mut c_void;
pub fn mi_free(p: *mut c_void);
}
#[cfg(feature = "override")]
mod set_up_statics {
use super::*;
#[used] static USED: unsafe extern "C" fn(usize) -> *mut c_void = mi_malloc;
}
#[cfg(test)]
mod tests {
extern crate libc;
use super::*;
#[test]
fn it_frees_memory_malloc() {
let ptr = unsafe { mi_malloc_aligned(8, 8) } as *mut u8;
unsafe { mi_free(ptr as *mut c_void) };
}
#[test]
fn it_frees_memory_zalloc() {
let ptr = unsafe { mi_zalloc_aligned(8, 8) } as *mut u8;
unsafe { mi_free(ptr as *mut c_void) };
}
#[test]
fn it_frees_memory_realloc() {
let ptr = unsafe { mi_malloc_aligned(8, 8) } as *mut u8;
let ptr = unsafe { mi_realloc_aligned(ptr as *mut c_void, 8, 8) } as *mut u8;
unsafe { mi_free(ptr as *mut c_void) };
}
#[cfg(all(feature = "override", target_vendor = "apple"))]
#[test]
fn mimalloc_and_libc_are_interoperable_when_overridden() {
let ptr = unsafe { mi_malloc(42) };
unsafe { libc::free(ptr) };
}
}