155bd797aSMilek7 /**
255bd797aSMilek7  * \file wasmtime/sharedmemory.h
355bd797aSMilek7  *
455bd797aSMilek7  * Wasmtime API for interacting with wasm shared memories.
555bd797aSMilek7  */
655bd797aSMilek7 
755bd797aSMilek7 #ifndef WASMTIME_SHAREDMEMORY_H
855bd797aSMilek7 #define WASMTIME_SHAREDMEMORY_H
955bd797aSMilek7 
1055bd797aSMilek7 #include <wasm.h>
11*566669eeSAlex Crichton #include <wasmtime/conf.h>
1255bd797aSMilek7 #include <wasmtime/error.h>
1355bd797aSMilek7 
1455bd797aSMilek7 #ifdef __cplusplus
1555bd797aSMilek7 extern "C" {
1655bd797aSMilek7 #endif
1755bd797aSMilek7 
1855bd797aSMilek7 /**
1955bd797aSMilek7  * \brief Interface for shared memories.
2055bd797aSMilek7  *
2155bd797aSMilek7  * For more information see the Rust documentation at:
2255bd797aSMilek7  * https://docs.wasmtime.dev/api/wasmtime/struct.SharedMemory.html
2355bd797aSMilek7  */
2455bd797aSMilek7 typedef struct wasmtime_sharedmemory wasmtime_sharedmemory_t;
2555bd797aSMilek7 
26*566669eeSAlex Crichton #ifdef WASMTIME_FEATURE_THREADS
27*566669eeSAlex Crichton 
2855bd797aSMilek7 /**
2955bd797aSMilek7  * \brief Creates a new WebAssembly shared linear memory
3055bd797aSMilek7  *
3155bd797aSMilek7  * \param engine engine that created shared memory is associated with
3255bd797aSMilek7  * \param ty the type of the memory to create
3355bd797aSMilek7  * \param ret where to store the returned memory
3455bd797aSMilek7  *
3555bd797aSMilek7  * If an error happens when creating the memory it's returned and owned by the
3655bd797aSMilek7  * caller. If an error happens then `ret` is not filled in.
3755bd797aSMilek7  */
3855bd797aSMilek7 WASM_API_EXTERN wasmtime_error_t *
3955bd797aSMilek7 wasmtime_sharedmemory_new(const wasm_engine_t *engine,
4055bd797aSMilek7                           const wasm_memorytype_t *ty,
4155bd797aSMilek7                           wasmtime_sharedmemory_t **ret);
4255bd797aSMilek7 
43*566669eeSAlex Crichton #endif // WASMTIME_FEATURE_THREADS
44*566669eeSAlex Crichton 
4555bd797aSMilek7 /**
4655bd797aSMilek7  * \brief Deletes shared linear memory
4755bd797aSMilek7  *
4855bd797aSMilek7  * \param memory memory to be deleted
4955bd797aSMilek7  */
5055bd797aSMilek7 WASM_API_EXTERN void
5155bd797aSMilek7 wasmtime_sharedmemory_delete(wasmtime_sharedmemory_t *memory);
5255bd797aSMilek7 
5355bd797aSMilek7 /**
5455bd797aSMilek7  * \brief Clones shared linear memory
5555bd797aSMilek7  *
5655bd797aSMilek7  * \param memory memory to be cloned
5755bd797aSMilek7  *
5855bd797aSMilek7  * This function makes shallow clone, ie. copy of reference counted
5955bd797aSMilek7  * memory handle.
6055bd797aSMilek7  */
6155bd797aSMilek7 WASM_API_EXTERN wasmtime_sharedmemory_t *
6255bd797aSMilek7 wasmtime_sharedmemory_clone(const wasmtime_sharedmemory_t *memory);
6355bd797aSMilek7 
6455bd797aSMilek7 /**
6555bd797aSMilek7  * \brief Returns the type of the shared memory specified
6655bd797aSMilek7  */
6755bd797aSMilek7 WASM_API_EXTERN wasm_memorytype_t *
6855bd797aSMilek7 wasmtime_sharedmemory_type(const wasmtime_sharedmemory_t *memory);
6955bd797aSMilek7 
7055bd797aSMilek7 /**
7155bd797aSMilek7  * \brief Returns the base pointer in memory where
7255bd797aSMilek7           the shared linear memory starts.
7355bd797aSMilek7  */
7455bd797aSMilek7 WASM_API_EXTERN uint8_t *
7555bd797aSMilek7 wasmtime_sharedmemory_data(const wasmtime_sharedmemory_t *memory);
7655bd797aSMilek7 
7755bd797aSMilek7 /**
7855bd797aSMilek7  * \brief Returns the byte length of this shared linear memory.
7955bd797aSMilek7  */
8055bd797aSMilek7 WASM_API_EXTERN size_t
8155bd797aSMilek7 wasmtime_sharedmemory_data_size(const wasmtime_sharedmemory_t *memory);
8255bd797aSMilek7 
8355bd797aSMilek7 /**
8455bd797aSMilek7  * \brief Returns the length, in WebAssembly pages, of this shared linear memory
8555bd797aSMilek7  */
8655bd797aSMilek7 WASM_API_EXTERN uint64_t
8755bd797aSMilek7 wasmtime_sharedmemory_size(const wasmtime_sharedmemory_t *memory);
8855bd797aSMilek7 
8955bd797aSMilek7 /**
9055bd797aSMilek7  * \brief Attempts to grow the specified shared memory by `delta` pages.
9155bd797aSMilek7  *
9255bd797aSMilek7  * \param memory the memory to grow
9355bd797aSMilek7  * \param delta the number of pages to grow by
9455bd797aSMilek7  * \param prev_size where to store the previous size of memory
9555bd797aSMilek7  *
9655bd797aSMilek7  * If memory cannot be grown then `prev_size` is left unchanged and an error is
9755bd797aSMilek7  * returned. Otherwise `prev_size` is set to the previous size of the memory, in
9855bd797aSMilek7  * WebAssembly pages, and `NULL` is returned.
9955bd797aSMilek7  */
10055bd797aSMilek7 WASM_API_EXTERN wasmtime_error_t *
10155bd797aSMilek7 wasmtime_sharedmemory_grow(const wasmtime_sharedmemory_t *memory,
10255bd797aSMilek7                            uint64_t delta, uint64_t *prev_size);
10355bd797aSMilek7 
10455bd797aSMilek7 #ifdef __cplusplus
10555bd797aSMilek7 } // extern "C"
10655bd797aSMilek7 #endif
10755bd797aSMilek7 
10855bd797aSMilek7 #endif // WASMTIME_SHAREDMEMORY_H
109