diff options
Diffstat (limited to 'library/stdarch/examples/wasm.rs')
-rw-r--r-- | library/stdarch/examples/wasm.rs | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/library/stdarch/examples/wasm.rs b/library/stdarch/examples/wasm.rs new file mode 100644 index 000000000..6b92ae9b8 --- /dev/null +++ b/library/stdarch/examples/wasm.rs @@ -0,0 +1,45 @@ +//! A simple slab allocator for pages in wasm + +#![feature(stdsimd)] +#![cfg(target_arch = "wasm32")] + +use std::ptr; + +use core_arch::arch::wasm32::*; + +static mut HEAD: *mut *mut u8 = 0 as _; + +#[no_mangle] +pub unsafe extern "C" fn page_alloc() -> *mut u8 { + if !HEAD.is_null() { + let next = *HEAD; + let ret = HEAD; + HEAD = next as *mut _; + return ret as *mut u8; + } + + let ret = memory_grow(0, 1); + + // if we failed to allocate a page then return null + if ret == usize::MAX { + return ptr::null_mut(); + } + + ((ret as u32) * page_size()) as *mut u8 +} + +#[no_mangle] +pub unsafe extern "C" fn page_free(page: *mut u8) { + let page = page as *mut *mut u8; + *page = HEAD as *mut u8; + HEAD = page; +} + +#[no_mangle] +pub unsafe extern "C" fn memory_used() -> usize { + (page_size() * (memory_size(0) as u32)) as usize +} + +fn page_size() -> u32 { + 64 * 1024 +} |