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 u813pub 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)32pub 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() -> usize39pub unsafe extern "C" fn memory_used() -> usize { 40 (page_size() * (memory_size(0) as u32)) as usize 41 } 42 page_size() -> u3243fn page_size() -> u32 { 44 64 * 1024 45 } 46