pub struct Memory { /* private fields */ }
Expand description
A shared or unshared wasm linear memory.
A Memory
represents the memory used by a wasm instance.
Implementations§
Source§impl Memory
impl Memory
Sourcepub fn new(desc: MemoryDescriptor) -> Result<Self, CreationError>
pub fn new(desc: MemoryDescriptor) -> Result<Self, CreationError>
Create a new Memory
from a MemoryDescriptor
Usage:
fn create_memory() -> Result<()> {
let descriptor = MemoryDescriptor::new(Pages(10), None, false).unwrap();
let memory = Memory::new(descriptor)?;
Ok(())
}
Sourcepub fn descriptor(&self) -> MemoryDescriptor
pub fn descriptor(&self) -> MemoryDescriptor
Return the MemoryDescriptor
that this memory
was created with.
Sourcepub fn grow(&self, delta: Pages) -> Result<Pages, GrowError>
pub fn grow(&self, delta: Pages) -> Result<Pages, GrowError>
Grow this memory by the specified number of pages.
Sourcepub fn view<T: ValueType>(&self) -> MemoryView<'_, T>
pub fn view<T: ValueType>(&self) -> MemoryView<'_, T>
Return a “view” of the currently accessible memory. By
default, the view is unsynchronized, using regular memory
accesses. You can force a memory view to use atomic accesses
by calling the atomically
method.
§Notes:
This method is safe (as in, it won’t cause the host to crash or have UB), but it doesn’t obey rust’s rules involving data races, especially concurrent ones. Therefore, if this memory is shared between multiple threads, a single memory location can be mutated concurrently without synchronization.
§Usage:
// Without synchronization.
let view: MemoryView<u8> = memory.view();
for byte in view[0x1000 .. 0x1010].iter().map(Cell::get) {
println!("byte: {}", byte);
}
// With synchronization.
let atomic_view = view.atomically();
for byte in atomic_view[0x1000 .. 0x1010].iter().map(|atom| atom.load(Ordering::SeqCst)) {
println!("byte: {}", byte);
}