mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-07-16 17:28:31 +00:00

Propose two enhancements: - Shared heap created from preallocated memory buffer: The user can create a shared heap from a pre-allocated buffer and see that memory region as one large chunk; there's no need to dynamically manage it(malloc/free). The user needs to make sure the native address and size of that memory region are valid. - Introduce shared heap chain: The user can create a shared heap chain, from the wasm app point of view, it's still a continuous memory region in wasm app's point of view while in the native it can consist of multiple shared heaps (each of which is a continuous memory region). For example, one 500MB shared heap 1 and one 500 MB shared heap 2 form a chain, in Wasm's point of view, it's one 1GB shared heap. After these enhancements, the data sharing between wasm apps, and between hosts can be more efficient and flexible. Admittedly shared heap management can be more complex for users, but it's similar to the zero-overhead principle. No overhead will be imposed for the users who don't use the shared heap enhancement or don't use the shared heap at all.
155 lines
4.8 KiB
C
155 lines
4.8 KiB
C
/*
|
|
* Copyright (C) 2019 Intel Corporation. All rights reserved.
|
|
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
*/
|
|
|
|
#ifndef _WASM_MEMORY_H
|
|
#define _WASM_MEMORY_H
|
|
|
|
#include "bh_common.h"
|
|
#include "../include/wasm_export.h"
|
|
#include "../interpreter/wasm_runtime.h"
|
|
#include "../common/wasm_shared_memory.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#if WASM_ENABLE_SHARED_MEMORY != 0 && BH_ATOMIC_64_IS_ATOMIC != 0
|
|
#define GET_LINEAR_MEMORY_SIZE(memory) \
|
|
BH_ATOMIC_64_LOAD(memory->memory_data_size)
|
|
#define SET_LINEAR_MEMORY_SIZE(memory, size) \
|
|
BH_ATOMIC_64_STORE(memory->memory_data_size, size)
|
|
#elif WASM_ENABLE_SHARED_MEMORY != 0
|
|
static inline uint64
|
|
GET_LINEAR_MEMORY_SIZE(const WASMMemoryInstance *memory)
|
|
{
|
|
SHARED_MEMORY_LOCK(memory);
|
|
uint64 memory_data_size = BH_ATOMIC_64_LOAD(memory->memory_data_size);
|
|
SHARED_MEMORY_UNLOCK(memory);
|
|
return memory_data_size;
|
|
}
|
|
static inline void
|
|
SET_LINEAR_MEMORY_SIZE(WASMMemoryInstance *memory, uint64 size)
|
|
{
|
|
SHARED_MEMORY_LOCK(memory);
|
|
BH_ATOMIC_64_STORE(memory->memory_data_size, size);
|
|
SHARED_MEMORY_UNLOCK(memory);
|
|
}
|
|
#else
|
|
#define GET_LINEAR_MEMORY_SIZE(memory) memory->memory_data_size
|
|
#define SET_LINEAR_MEMORY_SIZE(memory, size) memory->memory_data_size = size
|
|
#endif
|
|
|
|
#if WASM_ENABLE_INTERP != 0
|
|
#if WASM_ENABLE_SHARED_HEAP != 0
|
|
|
|
#if WASM_ENABLE_MULTI_MEMORY != 0
|
|
/* Only enable shared heap for the default memory */
|
|
#define is_default_memory (memidx == 0)
|
|
#else
|
|
#define is_default_memory true
|
|
#endif
|
|
|
|
#if UINTPTR_MAX == UINT64_MAX
|
|
#define get_shared_heap_end_off() module->e->shared_heap_end_off.u64
|
|
#else
|
|
#define get_shared_heap_end_off() \
|
|
(uint64)(module->e->shared_heap_end_off.u32[0])
|
|
#endif
|
|
|
|
#if WASM_ENABLE_MEMORY64 != 0
|
|
#define shared_heap_is_memory64 is_memory64
|
|
#else
|
|
#define shared_heap_is_memory64 false
|
|
#endif
|
|
|
|
#define app_addr_in_shared_heap(app_addr, bytes) \
|
|
(is_default_memory \
|
|
&& is_app_addr_in_shared_heap((WASMModuleInstanceCommon *)module, \
|
|
shared_heap_is_memory64, (uint64)app_addr, \
|
|
bytes))
|
|
#define shared_heap_addr_app_to_native(app_addr, native_addr) \
|
|
native_addr = module->e->shared_heap_base_addr_adj + app_addr
|
|
#define CHECK_SHARED_HEAP_OVERFLOW(app_addr, bytes, native_addr) \
|
|
if (app_addr_in_shared_heap(app_addr, bytes)) \
|
|
shared_heap_addr_app_to_native(app_addr, native_addr); \
|
|
else
|
|
|
|
#else /* else of WASM_ENABLE_SHARED_HEAP != 0 */
|
|
#define CHECK_SHARED_HEAP_OVERFLOW(app_addr, bytes, native_addr)
|
|
#endif /* end of WASM_ENABLE_SHARED_HEAP != 0 */
|
|
#endif /* end of WASM_ENABLE_INTERP != 0 */
|
|
|
|
#if WASM_ENABLE_SHARED_HEAP != 0
|
|
bool
|
|
is_app_addr_in_shared_heap(WASMModuleInstanceCommon *module_inst,
|
|
bool is_memory64, uint64 app_offset, uint32 bytes);
|
|
|
|
WASMSharedHeap *
|
|
wasm_runtime_create_shared_heap(SharedHeapInitArgs *init_args);
|
|
|
|
WASMSharedHeap *
|
|
wasm_runtime_chain_shared_heaps(WASMSharedHeap *head, WASMSharedHeap *body);
|
|
|
|
WASMSharedHeap *
|
|
wasm_runtime_unchain_shared_heaps(WASMSharedHeap *head, bool entire_chain);
|
|
|
|
bool
|
|
wasm_runtime_attach_shared_heap(WASMModuleInstanceCommon *module_inst,
|
|
WASMSharedHeap *shared_heap);
|
|
bool
|
|
wasm_runtime_attach_shared_heap_internal(WASMModuleInstanceCommon *module_inst,
|
|
WASMSharedHeap *shared_heap);
|
|
|
|
void
|
|
wasm_runtime_detach_shared_heap(WASMModuleInstanceCommon *module_inst);
|
|
|
|
void
|
|
wasm_runtime_detach_shared_heap_internal(WASMModuleInstanceCommon *module_inst);
|
|
|
|
WASMSharedHeap *
|
|
wasm_runtime_get_shared_heap(WASMModuleInstanceCommon *module_inst_comm);
|
|
|
|
uint64
|
|
wasm_runtime_shared_heap_malloc(WASMModuleInstanceCommon *module_inst,
|
|
uint64 size, void **p_native_addr);
|
|
|
|
void
|
|
wasm_runtime_shared_heap_free(WASMModuleInstanceCommon *module_inst,
|
|
uint64 ptr);
|
|
#endif /* end of WASM_ENABLE_SHARED_HEAP != 0 */
|
|
|
|
bool
|
|
wasm_runtime_memory_init(mem_alloc_type_t mem_alloc_type,
|
|
const MemAllocOption *alloc_option);
|
|
|
|
void
|
|
wasm_runtime_memory_destroy(void);
|
|
|
|
unsigned
|
|
wasm_runtime_memory_pool_size(void);
|
|
|
|
void
|
|
wasm_runtime_set_mem_bound_check_bytes(WASMMemoryInstance *memory,
|
|
uint64 memory_data_size);
|
|
|
|
void
|
|
wasm_runtime_set_enlarge_mem_error_callback(
|
|
const enlarge_memory_error_callback_t callback, void *user_data);
|
|
|
|
void
|
|
wasm_deallocate_linear_memory(WASMMemoryInstance *memory_inst);
|
|
|
|
int
|
|
wasm_allocate_linear_memory(uint8 **data, bool is_shared_memory,
|
|
bool is_memory64, uint64 num_bytes_per_page,
|
|
uint64 init_page_count, uint64 max_page_count,
|
|
uint64 *memory_data_size);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* end of _WASM_MEMORY_H */
|