1use super::{MIN_ALIGN, realloc_fallback};
2use crate::alloc::Layout;
3use crate::ptr;
4
5#[cfg(not(test))]
9mod runtime_symbols {
10 use core::ffi::{c_size_t, c_void};
11
12 unsafe extern "C" {
13 #[lang = "malloc_fn"]
14 fn malloc(size: c_size_t) -> *mut c_void;
15
16 #[lang = "realloc_fn"]
17 fn realloc(ptr: *mut c_void, size: c_size_t) -> *mut c_void;
18
19 #[lang = "free_fn"]
20 fn free(ptr: *mut c_void);
21 }
22}
23
24#[inline]
25pub unsafe fn alloc(layout: Layout) -> *mut u8 {
26 if layout.align() <= MIN_ALIGN && layout.align() <= layout.size() {
31 unsafe { libc::malloc(layout.size()) as *mut u8 }
32 } else {
33 #[cfg(target_vendor = "apple")]
40 {
41 if layout.align() > (1 << 31) {
42 return ptr::null_mut();
43 }
44 }
45 unsafe { aligned_malloc(&layout) }
46 }
47}
48
49#[inline]
50pub unsafe fn alloc_zeroed(layout: Layout) -> *mut u8 {
51 if layout.align() <= MIN_ALIGN && layout.align() <= layout.size() {
53 unsafe { libc::calloc(layout.size(), 1) as *mut u8 }
54 } else {
55 let ptr = unsafe { alloc(layout) };
56 if !ptr.is_null() {
57 unsafe { ptr::write_bytes(ptr, 0, layout.size()) };
58 }
59 ptr
60 }
61}
62
63#[inline]
64pub unsafe fn dealloc(ptr: *mut u8, _layout: Layout) {
65 unsafe { libc::free(ptr as *mut libc::c_void) }
66}
67
68#[inline]
69pub unsafe fn realloc(ptr: *mut u8, layout: Layout, new_size: usize) -> *mut u8 {
70 if layout.align() <= MIN_ALIGN && layout.align() <= new_size {
71 unsafe { libc::realloc(ptr as *mut libc::c_void, new_size) as *mut u8 }
72 } else {
73 unsafe { realloc_fallback(ptr, layout, new_size) }
74 }
75}
76
77cfg_select! {
78 any(target_os = "horizon", target_os = "vita") => {
81 #[inline]
82 unsafe fn aligned_malloc(layout: &Layout) -> *mut u8 {
83 unsafe { libc::memalign(layout.align(), layout.size()) as *mut u8 }
84 }
85 }
86 _ => {
87 #[inline]
88 #[cfg_attr(target_os = "vxworks", allow(unused_unsafe))]
89 unsafe fn aligned_malloc(layout: &Layout) -> *mut u8 {
90 let mut out = ptr::null_mut();
91 let align = layout.align().max(size_of::<usize>());
99 let ret = unsafe { libc::posix_memalign(&mut out, align, layout.size()) };
100 if ret != 0 { ptr::null_mut() } else { out as *mut u8 }
101 }
102 }
103}