1 use crate::{handle_result, wasm_engine_t, wasm_memorytype_t, wasmtime_error_t, wasmtime_extern_t};
2 use std::cell::UnsafeCell;
3 use std::mem::MaybeUninit;
4 use wasmtime::{Extern, SharedMemory};
5 
6 type wasmtime_sharedmemory_t = SharedMemory;
7 
8 wasmtime_c_api_macros::declare_own!(wasmtime_sharedmemory_t);
9 
10 #[no_mangle]
11 pub extern "C" fn wasmtime_sharedmemory_new(
12     engine: &wasm_engine_t,
13     ty: &wasm_memorytype_t,
14     ret: &mut *mut wasmtime_sharedmemory_t,
15 ) -> Option<Box<wasmtime_error_t>> {
16     handle_result(
17         SharedMemory::new(&engine.engine, ty.ty().ty.clone()),
18         |mem| *ret = Box::<wasmtime_sharedmemory_t>::into_raw(Box::new(mem)),
19     )
20 }
21 
22 #[no_mangle]
23 pub extern "C" fn wasmtime_sharedmemory_clone(
24     mem: &wasmtime_sharedmemory_t,
25 ) -> Box<wasmtime_sharedmemory_t> {
26     Box::new(mem.clone())
27 }
28 
29 #[no_mangle]
30 pub extern "C" fn wasmtime_sharedmemory_into_extern(
31     mem: Box<wasmtime_sharedmemory_t>,
32     ext: &mut MaybeUninit<wasmtime_extern_t>,
33 ) {
34     crate::initialize(ext, Extern::from(*mem).into());
35 }
36 
37 #[no_mangle]
38 pub extern "C" fn wasmtime_sharedmemory_type(
39     mem: &wasmtime_sharedmemory_t,
40 ) -> Box<wasm_memorytype_t> {
41     Box::new(wasm_memorytype_t::new(mem.ty()))
42 }
43 
44 #[no_mangle]
45 pub extern "C" fn wasmtime_sharedmemory_data(
46     mem: &wasmtime_sharedmemory_t,
47 ) -> *const UnsafeCell<u8> {
48     mem.data().as_ptr()
49 }
50 
51 #[no_mangle]
52 pub extern "C" fn wasmtime_sharedmemory_data_size(mem: &wasmtime_sharedmemory_t) -> usize {
53     mem.data().len()
54 }
55 
56 #[no_mangle]
57 pub extern "C" fn wasmtime_sharedmemory_size(mem: &wasmtime_sharedmemory_t) -> u64 {
58     mem.size()
59 }
60 
61 #[no_mangle]
62 pub extern "C" fn wasmtime_sharedmemory_grow(
63     mem: &wasmtime_sharedmemory_t,
64     delta: u64,
65     prev_size: &mut u64,
66 ) -> Option<Box<wasmtime_error_t>> {
67     handle_result(mem.grow(delta), |prev| *prev_size = prev)
68 }
69