]>
Commit | Line | Data |
---|---|---|
532ac7d7 XL |
1 | use crate::alloc::{GlobalAlloc, Layout, System}; |
2 | use crate::ptr; | |
60c5eb7d | 3 | use crate::sys_common::alloc::{realloc_fallback, MIN_ALIGN}; |
532ac7d7 XL |
4 | use libc; |
5 | ||
6 | #[stable(feature = "alloc_system_type", since = "1.28.0")] | |
7 | unsafe impl GlobalAlloc for System { | |
8 | #[inline] | |
9 | unsafe fn alloc(&self, layout: Layout) -> *mut u8 { | |
10 | if layout.align() <= MIN_ALIGN && layout.align() <= layout.size() { | |
11 | libc::malloc(layout.size()) as *mut u8 | |
12 | } else { | |
13 | libc::aligned_alloc(layout.size(), layout.align()) as *mut u8 | |
14 | } | |
15 | } | |
16 | ||
17 | #[inline] | |
18 | unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8 { | |
19 | if layout.align() <= MIN_ALIGN && layout.align() <= layout.size() { | |
20 | libc::calloc(layout.size(), 1) as *mut u8 | |
21 | } else { | |
22 | let ptr = self.alloc(layout.clone()); | |
23 | if !ptr.is_null() { | |
24 | ptr::write_bytes(ptr, 0, layout.size()); | |
25 | } | |
26 | ptr | |
27 | } | |
28 | } | |
29 | ||
30 | #[inline] | |
31 | unsafe fn dealloc(&self, ptr: *mut u8, _layout: Layout) { | |
32 | libc::free(ptr as *mut libc::c_void) | |
33 | } | |
34 | ||
35 | #[inline] | |
36 | unsafe fn realloc(&self, ptr: *mut u8, layout: Layout, new_size: usize) -> *mut u8 { | |
37 | if layout.align() <= MIN_ALIGN && layout.align() <= new_size { | |
38 | libc::realloc(ptr as *mut libc::c_void, new_size) as *mut u8 | |
39 | } else { | |
40 | realloc_fallback(self, ptr, layout, new_size) | |
41 | } | |
42 | } | |
43 | } |