77 lines
1.7 KiB
Rust
77 lines
1.7 KiB
Rust
use crate::Allocator;
|
|
#[cfg(target_arch = "wasm32")]
|
|
use core::arch::wasm32 as wasm;
|
|
#[cfg(target_arch = "wasm64")]
|
|
use core::arch::wasm64 as wasm;
|
|
use core::ptr;
|
|
|
|
/// System setting for Wasm
|
|
pub struct System {
|
|
_priv: (),
|
|
}
|
|
|
|
impl System {
|
|
pub const fn new() -> System {
|
|
System { _priv: () }
|
|
}
|
|
}
|
|
|
|
unsafe impl Allocator for System {
|
|
fn alloc(&self, size: usize) -> (*mut u8, usize, u32) {
|
|
let pages = size / self.page_size();
|
|
let prev = wasm::memory_grow(0, pages);
|
|
if prev == usize::max_value() {
|
|
return (ptr::null_mut(), 0, 0);
|
|
}
|
|
(
|
|
(prev * self.page_size()) as *mut u8,
|
|
pages * self.page_size(),
|
|
0,
|
|
)
|
|
}
|
|
|
|
fn remap(&self, _ptr: *mut u8, _oldsize: usize, _newsize: usize, _can_move: bool) -> *mut u8 {
|
|
// TODO: I think this can be implemented near the end?
|
|
ptr::null_mut()
|
|
}
|
|
|
|
fn free_part(&self, _ptr: *mut u8, _oldsize: usize, _newsize: usize) -> bool {
|
|
false
|
|
}
|
|
|
|
fn free(&self, _ptr: *mut u8, _size: usize) -> bool {
|
|
false
|
|
}
|
|
|
|
fn can_release_part(&self, _flags: u32) -> bool {
|
|
false
|
|
}
|
|
|
|
fn allocates_zeros(&self) -> bool {
|
|
true
|
|
}
|
|
|
|
fn page_size(&self) -> usize {
|
|
64 * 1024
|
|
}
|
|
}
|
|
|
|
#[cfg(feature = "global")]
|
|
pub fn acquire_global_lock() {
|
|
// single threaded, no need!
|
|
assert!(!cfg!(target_feature = "atomics"));
|
|
}
|
|
|
|
#[cfg(feature = "global")]
|
|
pub fn release_global_lock() {
|
|
// single threaded, no need!
|
|
assert!(!cfg!(target_feature = "atomics"));
|
|
}
|
|
|
|
#[allow(missing_docs)]
|
|
#[cfg(feature = "global")]
|
|
pub unsafe fn enable_alloc_after_fork() {
|
|
// single threaded, no need!
|
|
assert!(!cfg!(target_feature = "atomics"));
|
|
}
|