about summary refs log tree commit diff
path: root/library/stdarch/examples/wasm.rs
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2018-03-09 09:21:08 -0600
committerGitHub <noreply@github.com>2018-03-09 09:21:08 -0600
commitcb4a957efd24f1a6cccb44afbec92d3111051bc4 (patch)
treebead5f9165ae9fbf7151f7e089d2da696fd60341 /library/stdarch/examples/wasm.rs
parent2b1ee5288f6efe56adae8fbb3e47ccbdd7a471ae (diff)
downloadrust-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.rs47
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
+}