mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 04:57:19 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			49 lines
		
	
	
		
			984 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			49 lines
		
	
	
		
			984 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
| //! A simple slab allocator for pages in wasm
 | |
| 
 | |
| #![cfg(target_arch = "wasm32")]
 | |
| 
 | |
| use std::ptr;
 | |
| 
 | |
| use core_arch::arch::wasm32::*;
 | |
| 
 | |
| static mut HEAD: *mut *mut u8 = 0 as _;
 | |
| 
 | |
| #[unsafe(no_mangle)]
 | |
| pub unsafe extern "C" fn page_alloc() -> *mut u8 {
 | |
|     unsafe {
 | |
|         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
 | |
| }
 | |
| 
 | |
| #[unsafe(no_mangle)]
 | |
| pub unsafe extern "C" fn page_free(page: *mut u8) {
 | |
|     let page = page as *mut *mut u8;
 | |
|     unsafe {
 | |
|         *page = HEAD as *mut u8;
 | |
|         HEAD = page;
 | |
|     }
 | |
| }
 | |
| 
 | |
| #[unsafe(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
 | |
| }
 | 
