1 use crate::{handle_result, wasm_memorytype_t, wasmtime_error_t};
2 use std::cell::UnsafeCell;
3 use wasmtime::SharedMemory;
4 
5 type wasmtime_sharedmemory_t = SharedMemory;
6 
7 wasmtime_c_api_macros::declare_own!(wasmtime_sharedmemory_t);
8 
9 #[unsafe(no_mangle)]
10 #[cfg(feature = "threads")]
11 pub extern "C" fn wasmtime_sharedmemory_new(
12     engine: &crate::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 #[unsafe(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 #[unsafe(no_mangle)]
30 pub extern "C" fn wasmtime_sharedmemory_type(
31     mem: &wasmtime_sharedmemory_t,
32 ) -> Box<wasm_memorytype_t> {
33     Box::new(wasm_memorytype_t::new(mem.ty()))
34 }
35 
36 #[unsafe(no_mangle)]
37 pub extern "C" fn wasmtime_sharedmemory_data(
38     mem: &wasmtime_sharedmemory_t,
39 ) -> *const UnsafeCell<u8> {
40     mem.data().as_ptr()
41 }
42 
43 #[unsafe(no_mangle)]
44 pub extern "C" fn wasmtime_sharedmemory_data_size(mem: &wasmtime_sharedmemory_t) -> usize {
45     mem.data().len()
46 }
47 
48 #[unsafe(no_mangle)]
49 pub extern "C" fn wasmtime_sharedmemory_size(mem: &wasmtime_sharedmemory_t) -> u64 {
50     mem.size()
51 }
52 
53 #[unsafe(no_mangle)]
54 pub extern "C" fn wasmtime_sharedmemory_grow(
55     mem: &wasmtime_sharedmemory_t,
56     delta: u64,
57     prev_size: &mut u64,
58 ) -> Option<Box<wasmtime_error_t>> {
59     handle_result(mem.grow(delta), |prev| *prev_size = prev)
60 }
61