]> git.proxmox.com Git - rustc.git/blame - src/stdarch/examples/wasm.rs
New upstream version 1.44.1+dfsg1
[rustc.git] / src / stdarch / examples / wasm.rs
CommitLineData
0531ce1d
XL
1//! A simple slab allocator for pages in wasm
2
3#![feature(stdsimd)]
4#![cfg(target_arch = "wasm32")]
5
9fa01778 6extern crate core_arch;
0531ce1d
XL
7
8use std::ptr;
9
9fa01778 10use core_arch::wasm32::*;
0531ce1d
XL
11
12static mut HEAD: *mut *mut u8 = 0 as _;
13
14#[no_mangle]
15pub unsafe extern "C" fn page_alloc() -> *mut u8 {
16 if !HEAD.is_null() {
17 let next = *HEAD;
18 let ret = HEAD;
19 HEAD = next as *mut _;
20 return ret as *mut u8;
21 }
22
0731742a 23 let ret = memory_grow(0, 1);
0531ce1d
XL
24
25 // if we failed to allocate a page then return null
ba9703b0 26 if ret == usize::MAX {
0531ce1d
XL
27 return ptr::null_mut();
28 }
29
30 ((ret as u32) * page_size()) as *mut u8
31}
32
33#[no_mangle]
34pub unsafe extern "C" fn page_free(page: *mut u8) {
35 let page = page as *mut *mut u8;
36 *page = HEAD as *mut u8;
37 HEAD = page;
38}
39
40#[no_mangle]
41pub unsafe extern "C" fn memory_used() -> usize {
0731742a 42 (page_size() * (memory_size(0) as u32)) as usize
0531ce1d
XL
43}
44
45fn page_size() -> u32 {
46 64 * 1024
47}