#[global_allocator]
static ALLOC: Allocator = Allocator;
pub use crate::platform::*;
#[cfg(not(any(windows, feature = "use-system-allocator", target_env = "ohos")))]
mod platform {
use std::os::raw::c_void;
pub use tikv_jemallocator::Jemalloc as Allocator;
pub unsafe extern "C" fn usable_size(ptr: *const c_void) -> usize {
tikv_jemallocator::usable_size(ptr)
}
pub mod libc_compat {
pub use tikv_jemalloc_sys::{free, malloc, realloc};
}
}
#[cfg(all(
not(windows),
any(feature = "use-system-allocator", target_env = "ohos")
))]
mod platform {
pub use std::alloc::System as Allocator;
use std::os::raw::c_void;
pub unsafe extern "C" fn usable_size(ptr: *const c_void) -> usize {
#[cfg(target_vendor = "apple")]
return libc::malloc_size(ptr);
#[cfg(not(target_vendor = "apple"))]
return libc::malloc_usable_size(ptr as *mut _);
}
pub mod libc_compat {
pub use libc::{free, malloc, realloc};
}
}
#[cfg(windows)]
mod platform {
pub use std::alloc::System as Allocator;
use std::os::raw::c_void;
use windows_sys::Win32::Foundation::FALSE;
use windows_sys::Win32::System::Memory::{GetProcessHeap, HeapSize, HeapValidate};
pub unsafe extern "C" fn usable_size(mut ptr: *const c_void) -> usize {
let heap = GetProcessHeap();
if HeapValidate(heap, 0, ptr) == FALSE {
ptr = *(ptr as *const *const c_void).offset(-1)
}
HeapSize(heap, 0, ptr) as usize
}
}