Skip to content

Commit 1566ff1

Browse files
committed
first draft of shared heap enhancement in interpreter and runtime: update interpreter
1 parent 5c22e61 commit 1566ff1

4 files changed

Lines changed: 48 additions & 22 deletions

File tree

core/iwasm/common/wasm_memory.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -504,7 +504,7 @@ is_app_addr_in_shared_heap(WASMModuleInstanceCommon *module_inst,
504504

505505
for (cur = heap; cur; cur = cur->chain_next) {
506506
shared_heap_start =
507-
cur->start_off_mem64 ? is_memory64 : cur->start_off_mem32;
507+
is_memory64 ? cur->start_off_mem64 : cur->start_off_mem32;
508508
shared_heap_end = shared_heap_start + cur->size;
509509
if (app_offset >= shared_heap_start && app_offset <= shared_heap_end) {
510510
if (target_heap)

core/iwasm/interpreter/wasm_interp_classic.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,18 @@ typedef float64 CellType_F64;
5353
#else
5454
#define is_default_memory true
5555
#endif
56-
#if WASM_ENABLE_MEMORY64
56+
#if WASM_ENABLE_MEMORY64 != 0
5757
#define get_shared_heap_start_off(shared_heap) \
5858
(is_memory64 ? shared_heap->start_off_mem64 : shared_heap->start_off_mem32)
5959
#else
6060
#define get_shared_heap_start_off(shared_heap) (shared_heap->start_off_mem32)
6161
#endif
62+
/* Check whether the app addr in the last visited shared heap, if not, check the
63+
* shared heap chain to find which(if any) shared heap the app addr in, and
64+
* update the last visited shared heap info if found. */
6265
#define app_addr_in_shared_heap(app_addr, bytes) \
6366
(shared_heap && is_default_memory && (app_addr) >= shared_heap_start_off \
64-
&& (app_addr) <= shared_heap_end_off - bytes + 0) \
67+
&& (app_addr) <= shared_heap_end_off - bytes + 1) \
6568
|| ({ \
6669
bool in_chain = false; \
6770
WASMSharedHeap *cur; \
@@ -71,7 +74,7 @@ typedef float64 CellType_F64;
7174
cur_shared_heap_end_off = \
7275
cur_shared_heap_start_off + cur->size - 1; \
7376
if ((app_addr) >= cur_shared_heap_start_off \
74-
&& (app_addr) <= cur_shared_heap_end_off - bytes + 0) { \
77+
&& (app_addr) <= cur_shared_heap_end_off - bytes + 1) { \
7578
shared_heap_start_off = cur_shared_heap_start_off; \
7679
shared_heap_end_off = cur_shared_heap_end_off; \
7780
shared_heap_base_addr = cur->base_addr; \
@@ -1716,10 +1719,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
17161719
goto got_exception;
17171720
}
17181721

1719-
HANDLE_OP(WASM_OP_NOP)
1720-
{
1721-
HANDLE_OP_END();
1722-
}
1722+
HANDLE_OP(WASM_OP_NOP) { HANDLE_OP_END(); }
17231723

17241724
#if WASM_ENABLE_EXCE_HANDLING != 0
17251725
HANDLE_OP(WASM_OP_RETHROW)

core/iwasm/interpreter/wasm_interp_fast.c

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,33 @@ typedef float64 CellType_F64;
3838
#endif
3939

4040
#if WASM_ENABLE_SHARED_HEAP != 0
41-
#define app_addr_in_shared_heap(app_addr, bytes) \
42-
(shared_heap && (app_addr) >= shared_heap_start_off \
43-
&& (app_addr) <= shared_heap_end_off - bytes + 1)
41+
/* TODO: add code for 64 bit version when memory64 is enabled for fast-interp */
42+
#define get_shared_heap_start_off(shared_heap) (shared_heap->start_off_mem32)
43+
/* Check whether the app addr in the last visited shared heap, if not, check the
44+
* shared heap chain to find which(if any) shared heap the app addr in, and
45+
* update the last visited shared heap info if found. */
46+
#define app_addr_in_shared_heap(app_addr, bytes) \
47+
(shared_heap && (app_addr) >= shared_heap_start_off \
48+
&& (app_addr) <= shared_heap_end_off - bytes + 1) \
49+
|| ({ \
50+
bool in_chain = false; \
51+
WASMSharedHeap *cur; \
52+
uint64 cur_shared_heap_start_off, cur_shared_heap_end_off; \
53+
for (cur = shared_heap; cur; cur = cur->chain_next) { \
54+
cur_shared_heap_start_off = get_shared_heap_start_off(cur); \
55+
cur_shared_heap_end_off = \
56+
cur_shared_heap_start_off + cur->size - 1; \
57+
if ((app_addr) >= cur_shared_heap_start_off \
58+
&& (app_addr) <= cur_shared_heap_end_off - bytes + 1) { \
59+
shared_heap_start_off = cur_shared_heap_start_off; \
60+
shared_heap_end_off = cur_shared_heap_end_off; \
61+
shared_heap_base_addr = cur->base_addr; \
62+
in_chain = true; \
63+
break; \
64+
} \
65+
} \
66+
in_chain; \
67+
})
4468

4569
#define shared_heap_addr_app_to_native(app_addr, native_addr) \
4670
native_addr = shared_heap_base_addr + ((app_addr)-shared_heap_start_off)
@@ -1540,19 +1564,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
15401564
#if WASM_ENABLE_SHARED_HEAP != 0
15411565
WASMSharedHeap *shared_heap = module->e ? module->e->shared_heap : NULL;
15421566
uint8 *shared_heap_base_addr = shared_heap ? shared_heap->base_addr : NULL;
1543-
/*
1544-
#if WASM_ENABLE_MEMORY64 != 0
15451567
uint64 shared_heap_start_off =
1546-
shared_heap ? (is_memory64 ? shared_heap->start_off_mem64
1547-
: shared_heap->start_off_mem32)
1548-
: 0;
1568+
shared_heap ? get_shared_heap_start_off(shared_heap) : 0;
15491569
uint64 shared_heap_end_off =
1550-
shared_heap ? (is_memory64 ? UINT64_MAX : UINT32_MAX) : 0;
1551-
#else
1552-
*/ /* TODO: uncomment the code when memory64 is enabled for fast-interp */
1553-
uint64 shared_heap_start_off =
1554-
shared_heap ? shared_heap->start_off_mem32 : 0;
1555-
uint64 shared_heap_end_off = shared_heap ? UINT32_MAX : 0;
1570+
shared_heap
1571+
? (get_shared_heap_start_off(shared_heap) + shared_heap->size - 1)
1572+
: 0;
15561573
/* #endif */
15571574
#endif /* end of WASM_ENABLE_SHARED_HEAP != 0 */
15581575

core/iwasm/interpreter/wasm_runtime.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,12 +93,21 @@ typedef union {
9393
} MemBound;
9494

9595
typedef struct WASMSharedHeap {
96+
/* The global shared heap list maintained in runtime, used for runtime
97+
* destroy */
9698
struct WASMSharedHeap *next;
99+
/* The logical shared heap chain the shared heap in */
100+
struct WASMSharedHeap *chain_next;
101+
/* Will be null if shared heap is created from pre allocated memory chunk
102+
* and don't need to dynamic malloc and free */
97103
void *heap_handle;
98104
uint8 *base_addr;
99105
uint64 size;
100106
uint64 start_off_mem64;
101107
uint64 start_off_mem32;
108+
/* The number of wasm apps it attached to, for a shared heap chain, only the
109+
* list head need to maintain the valid attached_count */
110+
uint8 attached_count;
102111
} WASMSharedHeap;
103112

104113
struct WASMMemoryInstance {

0 commit comments

Comments
 (0)