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