diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2018-03-09 09:21:08 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-03-09 09:21:08 -0600 |
| commit | cb4a957efd24f1a6cccb44afbec92d3111051bc4 (patch) | |
| tree | bead5f9165ae9fbf7151f7e089d2da696fd60341 /library/stdarch/examples/wasm.rs | |
| parent | 2b1ee5288f6efe56adae8fbb3e47ccbdd7a471ae (diff) | |
| download | rust-cb4a957efd24f1a6cccb44afbec92d3111051bc4.tar.gz rust-cb4a957efd24f1a6cccb44afbec92d3111051bc4.zip | |
Add initial wasm memory grow/current intrinsics (#361)
This exposes access to the `grow_memory` and `current_memory` instructions provided by wasm in what will hopefully be a stable interface (the stable part being x86 first in theory).
Diffstat (limited to 'library/stdarch/examples/wasm.rs')
| -rw-r--r-- | library/stdarch/examples/wasm.rs | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/library/stdarch/examples/wasm.rs b/library/stdarch/examples/wasm.rs new file mode 100644 index 00000000000..c181664c8ed --- /dev/null +++ b/library/stdarch/examples/wasm.rs @@ -0,0 +1,47 @@ +//! A simple slab allocator for pages in wasm + +#![feature(stdsimd)] +#![cfg(target_arch = "wasm32")] + +extern crate stdsimd; + +use std::ptr; + +use stdsimd::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 = grow_memory(1); + + // if we failed to allocate a page then return null + if ret == -1 { + 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() * (current_memory() as u32)) as usize +} + +fn page_size() -> u32 { + 64 * 1024 +} |
