]>
Commit | Line | Data |
---|---|---|
0531ce1d XL |
1 | //! A simple slab allocator for pages in wasm |
2 | ||
3 | #![feature(stdsimd)] | |
4 | #![cfg(target_arch = "wasm32")] | |
5 | ||
9fa01778 | 6 | extern crate core_arch; |
0531ce1d XL |
7 | |
8 | use std::ptr; | |
9 | ||
9fa01778 | 10 | use core_arch::wasm32::*; |
0531ce1d XL |
11 | |
12 | static mut HEAD: *mut *mut u8 = 0 as _; | |
13 | ||
14 | #[no_mangle] | |
15 | pub unsafe extern "C" fn page_alloc() -> *mut u8 { | |
16 | if !HEAD.is_null() { | |
17 | let next = *HEAD; | |
18 | let ret = HEAD; | |
19 | HEAD = next as *mut _; | |
20 | return ret as *mut u8; | |
21 | } | |
22 | ||
0731742a | 23 | let ret = memory_grow(0, 1); |
0531ce1d XL |
24 | |
25 | // if we failed to allocate a page then return null | |
ba9703b0 | 26 | if ret == usize::MAX { |
0531ce1d XL |
27 | return ptr::null_mut(); |
28 | } | |
29 | ||
30 | ((ret as u32) * page_size()) as *mut u8 | |
31 | } | |
32 | ||
33 | #[no_mangle] | |
34 | pub unsafe extern "C" fn page_free(page: *mut u8) { | |
35 | let page = page as *mut *mut u8; | |
36 | *page = HEAD as *mut u8; | |
37 | HEAD = page; | |
38 | } | |
39 | ||
40 | #[no_mangle] | |
41 | pub unsafe extern "C" fn memory_used() -> usize { | |
0731742a | 42 | (page_size() * (memory_size(0) as u32)) as usize |
0531ce1d XL |
43 | } |
44 | ||
45 | fn page_size() -> u32 { | |
46 | 64 * 1024 | |
47 | } |