]> git.lizzy.rs Git - rust.git/blob - src/libstd/sys/wasi/alloc.rs
Rollup merge of #59529 - DevQps:improve-rem-docs, r=cuviper
[rust.git] / src / libstd / sys / wasi / alloc.rs
1 use crate::alloc::{GlobalAlloc, Layout, System};
2 use crate::ptr;
3 use crate::sys_common::alloc::{MIN_ALIGN, realloc_fallback};
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 }