|
|
@@ -8,6 +8,7 @@
|
|
|
#include "wasm_runtime.h"
|
|
|
#include "wasm_opcode.h"
|
|
|
#include "wasm_loader.h"
|
|
|
+#include "wasm_memory.h"
|
|
|
#include "../common/wasm_exec_env.h"
|
|
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
|
|
#include "../common/wasm_shared_memory.h"
|
|
|
@@ -696,28 +697,28 @@ trunc_f64_to_int(WASMModuleInstance *module, uint32 *frame_sp, float64 src_min,
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 1, maddr); \
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS(); \
|
|
|
\
|
|
|
- os_mutex_lock(&module->e->mem_lock); \
|
|
|
+ os_mutex_lock(&node->shared_mem_lock); \
|
|
|
readv = (uint32)(*(uint8 *)maddr); \
|
|
|
*(uint8 *)maddr = (uint8)(readv op sval); \
|
|
|
- os_mutex_unlock(&module->e->mem_lock); \
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock); \
|
|
|
} \
|
|
|
else if (opcode == WASM_OP_ATOMIC_RMW_I32_##OP_NAME##16_U) { \
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 2, maddr); \
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS(); \
|
|
|
\
|
|
|
- os_mutex_lock(&module->e->mem_lock); \
|
|
|
+ os_mutex_lock(&node->shared_mem_lock); \
|
|
|
readv = (uint32)LOAD_U16(maddr); \
|
|
|
STORE_U16(maddr, (uint16)(readv op sval)); \
|
|
|
- os_mutex_unlock(&module->e->mem_lock); \
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock); \
|
|
|
} \
|
|
|
else { \
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 4, maddr); \
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS(); \
|
|
|
\
|
|
|
- os_mutex_lock(&module->e->mem_lock); \
|
|
|
+ os_mutex_lock(&node->shared_mem_lock); \
|
|
|
readv = LOAD_I32(maddr); \
|
|
|
STORE_U32(maddr, readv op sval); \
|
|
|
- os_mutex_unlock(&module->e->mem_lock); \
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock); \
|
|
|
} \
|
|
|
PUSH_I32(readv); \
|
|
|
break; \
|
|
|
@@ -736,39 +737,39 @@ trunc_f64_to_int(WASMModuleInstance *module, uint32 *frame_sp, float64 src_min,
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 1, maddr); \
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS(); \
|
|
|
\
|
|
|
- os_mutex_lock(&module->e->mem_lock); \
|
|
|
+ os_mutex_lock(&node->shared_mem_lock); \
|
|
|
readv = (uint64)(*(uint8 *)maddr); \
|
|
|
*(uint8 *)maddr = (uint8)(readv op sval); \
|
|
|
- os_mutex_unlock(&module->e->mem_lock); \
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock); \
|
|
|
} \
|
|
|
else if (opcode == WASM_OP_ATOMIC_RMW_I64_##OP_NAME##16_U) { \
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 2, maddr); \
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS(); \
|
|
|
\
|
|
|
- os_mutex_lock(&module->e->mem_lock); \
|
|
|
+ os_mutex_lock(&node->shared_mem_lock); \
|
|
|
readv = (uint64)LOAD_U16(maddr); \
|
|
|
STORE_U16(maddr, (uint16)(readv op sval)); \
|
|
|
- os_mutex_unlock(&module->e->mem_lock); \
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock); \
|
|
|
} \
|
|
|
else if (opcode == WASM_OP_ATOMIC_RMW_I64_##OP_NAME##32_U) { \
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 4, maddr); \
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS(); \
|
|
|
\
|
|
|
- os_mutex_lock(&module->e->mem_lock); \
|
|
|
+ os_mutex_lock(&node->shared_mem_lock); \
|
|
|
readv = (uint64)LOAD_U32(maddr); \
|
|
|
STORE_U32(maddr, (uint32)(readv op sval)); \
|
|
|
- os_mutex_unlock(&module->e->mem_lock); \
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock); \
|
|
|
} \
|
|
|
else { \
|
|
|
uint64 op_result; \
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 8, maddr); \
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS(); \
|
|
|
\
|
|
|
- os_mutex_lock(&module->e->mem_lock); \
|
|
|
+ os_mutex_lock(&node->shared_mem_lock); \
|
|
|
readv = (uint64)LOAD_I64(maddr); \
|
|
|
op_result = readv op sval; \
|
|
|
STORE_I64(maddr, op_result); \
|
|
|
- os_mutex_unlock(&module->e->mem_lock); \
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock); \
|
|
|
} \
|
|
|
PUSH_I64(readv); \
|
|
|
break; \
|
|
|
@@ -954,7 +955,7 @@ fast_jit_invoke_native(WASMExecEnv *exec_env, uint32 func_idx,
|
|
|
WASMFunctionInstance *cur_func = module_inst->e->functions + func_idx;
|
|
|
|
|
|
wasm_interp_call_func_native(module_inst, exec_env, cur_func, prev_frame);
|
|
|
- return wasm_get_exception(module_inst) ? false : true;
|
|
|
+ return wasm_copy_exception(module_inst, NULL) ? false : true;
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
@@ -1023,7 +1024,7 @@ wasm_interp_call_func_import(WASMModuleInstance *module_inst,
|
|
|
exec_env->module_inst = (WASMModuleInstanceCommon *)module_inst;
|
|
|
|
|
|
/* transfer exception if it is thrown */
|
|
|
- if (wasm_get_exception(sub_module_inst)) {
|
|
|
+ if (wasm_copy_exception(sub_module_inst, NULL)) {
|
|
|
bh_memcpy_s(module_inst->cur_exception,
|
|
|
sizeof(module_inst->cur_exception),
|
|
|
sub_module_inst->cur_exception,
|
|
|
@@ -1036,20 +1037,25 @@ wasm_interp_call_func_import(WASMModuleInstance *module_inst,
|
|
|
#if WASM_ENABLE_DEBUG_INTERP != 0
|
|
|
#define CHECK_SUSPEND_FLAGS() \
|
|
|
do { \
|
|
|
+ os_mutex_lock(&exec_env->wait_lock); \
|
|
|
if (IS_WAMR_TERM_SIG(exec_env->current_status->signal_flag)) { \
|
|
|
+ os_mutex_unlock(&exec_env->wait_lock); \
|
|
|
return; \
|
|
|
} \
|
|
|
if (IS_WAMR_STOP_SIG(exec_env->current_status->signal_flag)) { \
|
|
|
SYNC_ALL_TO_FRAME(); \
|
|
|
wasm_cluster_thread_waiting_run(exec_env); \
|
|
|
} \
|
|
|
+ os_mutex_unlock(&exec_env->wait_lock); \
|
|
|
} while (0)
|
|
|
#else
|
|
|
#define CHECK_SUSPEND_FLAGS() \
|
|
|
do { \
|
|
|
+ os_mutex_lock(&exec_env->wait_lock); \
|
|
|
if (exec_env->suspend_flags.flags != 0) { \
|
|
|
if (exec_env->suspend_flags.flags & 0x01) { \
|
|
|
/* terminate current thread */ \
|
|
|
+ os_mutex_unlock(&exec_env->wait_lock); \
|
|
|
return; \
|
|
|
} \
|
|
|
while (exec_env->suspend_flags.flags & 0x02) { \
|
|
|
@@ -1057,6 +1063,7 @@ wasm_interp_call_func_import(WASMModuleInstance *module_inst,
|
|
|
os_cond_wait(&exec_env->wait_cond, &exec_env->wait_lock); \
|
|
|
} \
|
|
|
} \
|
|
|
+ os_mutex_unlock(&exec_env->wait_lock); \
|
|
|
} while (0)
|
|
|
#endif /* WASM_ENABLE_DEBUG_INTERP */
|
|
|
#endif /* WASM_ENABLE_THREAD_MGR */
|
|
|
@@ -1120,14 +1127,22 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
|
|
WASMFunctionInstance *cur_func,
|
|
|
WASMInterpFrame *prev_frame)
|
|
|
{
|
|
|
+#if WASM_ENABLE_SHARED_MEMORY != 0
|
|
|
+ WASMSharedMemNode *node =
|
|
|
+ wasm_module_get_shared_memory((WASMModuleCommon *)module->module);
|
|
|
+#else
|
|
|
+ void *node = NULL;
|
|
|
+#endif
|
|
|
+
|
|
|
WASMMemoryInstance *memory = wasm_get_default_memory(module);
|
|
|
uint8 *global_data = module->global_data;
|
|
|
#if !defined(OS_ENABLE_HW_BOUND_CHECK) \
|
|
|
|| WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 \
|
|
|
|| WASM_ENABLE_BULK_MEMORY != 0
|
|
|
- uint32 num_bytes_per_page = memory ? memory->num_bytes_per_page : 0;
|
|
|
+ uint32 num_bytes_per_page =
|
|
|
+ memory ? wasm_get_num_bytes_per_page(memory, node) : 0;
|
|
|
uint32 linear_mem_size =
|
|
|
- memory ? num_bytes_per_page * memory->cur_page_count : 0;
|
|
|
+ memory ? wasm_get_linear_memory_size(memory, node) : 0;
|
|
|
#endif
|
|
|
WASMType **wasm_types = module->module->types;
|
|
|
WASMGlobalInstance *globals = module->e->globals, *global;
|
|
|
@@ -1362,7 +1377,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
|
|
|
|
|
HANDLE_OP(EXT_OP_BR_TABLE_CACHE)
|
|
|
{
|
|
|
- BrTableCache *node =
|
|
|
+ BrTableCache *node_cache =
|
|
|
bh_list_first_elem(module->module->br_table_cache_list);
|
|
|
BrTableCache *node_next;
|
|
|
|
|
|
@@ -1371,13 +1386,13 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
|
|
#endif
|
|
|
lidx = POP_I32();
|
|
|
|
|
|
- while (node) {
|
|
|
- node_next = bh_list_elem_next(node);
|
|
|
- if (node->br_table_op_addr == frame_ip - 1) {
|
|
|
- depth = node->br_depths[lidx];
|
|
|
+ while (node_cache) {
|
|
|
+ node_next = bh_list_elem_next(node_cache);
|
|
|
+ if (node_cache->br_table_op_addr == frame_ip - 1) {
|
|
|
+ depth = node_cache->br_depths[lidx];
|
|
|
goto label_pop_csp_n;
|
|
|
}
|
|
|
- node = node_next;
|
|
|
+ node_cache = node_next;
|
|
|
}
|
|
|
bh_assert(0);
|
|
|
HANDLE_OP_END();
|
|
|
@@ -3417,6 +3432,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
|
|
if (ret == (uint32)-1)
|
|
|
goto got_exception;
|
|
|
|
|
|
+#if WASM_ENABLE_THREAD_MGR != 0
|
|
|
+ CHECK_SUSPEND_FLAGS();
|
|
|
+#endif
|
|
|
+
|
|
|
PUSH_I32(ret);
|
|
|
break;
|
|
|
}
|
|
|
@@ -3437,6 +3456,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
|
|
if (ret == (uint32)-1)
|
|
|
goto got_exception;
|
|
|
|
|
|
+#if WASM_ENABLE_THREAD_MGR != 0
|
|
|
+ CHECK_SUSPEND_FLAGS();
|
|
|
+#endif
|
|
|
+
|
|
|
PUSH_I32(ret);
|
|
|
break;
|
|
|
}
|
|
|
@@ -3444,6 +3467,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
|
|
{
|
|
|
/* Skip the memory index */
|
|
|
frame_ip++;
|
|
|
+ os_atomic_thread_fence(os_memory_order_release);
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
@@ -3458,23 +3482,23 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
|
|
if (opcode == WASM_OP_ATOMIC_I32_LOAD8_U) {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 1, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
readv = (uint32)(*(uint8 *)maddr);
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
|
else if (opcode == WASM_OP_ATOMIC_I32_LOAD16_U) {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 2, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
readv = (uint32)LOAD_U16(maddr);
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
|
else {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 4, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
readv = LOAD_I32(maddr);
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
|
|
|
|
PUSH_I32(readv);
|
|
|
@@ -3493,30 +3517,30 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
|
|
if (opcode == WASM_OP_ATOMIC_I64_LOAD8_U) {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 1, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
readv = (uint64)(*(uint8 *)maddr);
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
|
else if (opcode == WASM_OP_ATOMIC_I64_LOAD16_U) {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 2, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
readv = (uint64)LOAD_U16(maddr);
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
|
else if (opcode == WASM_OP_ATOMIC_I64_LOAD32_U) {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 4, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
readv = (uint64)LOAD_U32(maddr);
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
|
else {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 8, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
readv = LOAD_I64(maddr);
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
|
|
|
|
PUSH_I64(readv);
|
|
|
@@ -3535,23 +3559,23 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
|
|
if (opcode == WASM_OP_ATOMIC_I32_STORE8) {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 1, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
*(uint8 *)maddr = (uint8)sval;
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
|
else if (opcode == WASM_OP_ATOMIC_I32_STORE16) {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 2, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
STORE_U16(maddr, (uint16)sval);
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
|
else {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 4, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
STORE_U32(maddr, frame_sp[1]);
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
@@ -3569,31 +3593,31 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
|
|
if (opcode == WASM_OP_ATOMIC_I64_STORE8) {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 1, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
*(uint8 *)maddr = (uint8)sval;
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
|
else if (opcode == WASM_OP_ATOMIC_I64_STORE16) {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 2, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
STORE_U16(maddr, (uint16)sval);
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
|
else if (opcode == WASM_OP_ATOMIC_I64_STORE32) {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 4, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
STORE_U32(maddr, (uint32)sval);
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
|
else {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 8, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
PUT_I64_TO_ADDR((uint32 *)maddr,
|
|
|
GET_I64_FROM_ADDR(frame_sp + 1));
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
@@ -3613,32 +3637,32 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
|
|
|
expect = (uint8)expect;
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
readv = (uint32)(*(uint8 *)maddr);
|
|
|
if (readv == expect)
|
|
|
*(uint8 *)maddr = (uint8)(sval);
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
|
else if (opcode == WASM_OP_ATOMIC_RMW_I32_CMPXCHG16_U) {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 2, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
|
|
|
expect = (uint16)expect;
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
readv = (uint32)LOAD_U16(maddr);
|
|
|
if (readv == expect)
|
|
|
STORE_U16(maddr, (uint16)(sval));
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
|
else {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 4, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
readv = LOAD_I32(maddr);
|
|
|
if (readv == expect)
|
|
|
STORE_U32(maddr, sval);
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
|
PUSH_I32(readv);
|
|
|
break;
|
|
|
@@ -3659,44 +3683,44 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
|
|
|
expect = (uint8)expect;
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
readv = (uint64)(*(uint8 *)maddr);
|
|
|
if (readv == expect)
|
|
|
*(uint8 *)maddr = (uint8)(sval);
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
|
else if (opcode == WASM_OP_ATOMIC_RMW_I64_CMPXCHG16_U) {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 2, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
|
|
|
expect = (uint16)expect;
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
readv = (uint64)LOAD_U16(maddr);
|
|
|
if (readv == expect)
|
|
|
STORE_U16(maddr, (uint16)(sval));
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
|
else if (opcode == WASM_OP_ATOMIC_RMW_I64_CMPXCHG32_U) {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 4, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
|
|
|
expect = (uint32)expect;
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
readv = (uint64)LOAD_U32(maddr);
|
|
|
if (readv == expect)
|
|
|
STORE_U32(maddr, (uint32)(sval));
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
|
else {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 8, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
readv = (uint64)LOAD_I64(maddr);
|
|
|
if (readv == expect) {
|
|
|
STORE_I64(maddr, sval);
|
|
|
}
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
|
PUSH_I64(readv);
|
|
|
break;
|
|
|
@@ -3840,7 +3864,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
|
|
if (memory)
|
|
|
linear_mem_size = num_bytes_per_page * memory->cur_page_count;
|
|
|
#endif
|
|
|
- if (wasm_get_exception(module))
|
|
|
+ if (wasm_copy_exception(module, NULL))
|
|
|
goto got_exception;
|
|
|
}
|
|
|
else {
|
|
|
@@ -3889,10 +3913,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
|
|
PUSH_CSP(LABEL_TYPE_FUNCTION, 0, cell_num, frame_ip_end - 1);
|
|
|
|
|
|
wasm_exec_env_set_cur_frame(exec_env, frame);
|
|
|
+ }
|
|
|
#if WASM_ENABLE_THREAD_MGR != 0
|
|
|
- CHECK_SUSPEND_FLAGS();
|
|
|
+ CHECK_SUSPEND_FLAGS();
|
|
|
#endif
|
|
|
- }
|
|
|
HANDLE_OP_END();
|
|
|
}
|
|
|
|
|
|
@@ -3983,7 +4007,8 @@ fast_jit_call_func_bytecode(WASMModuleInstance *module_inst,
|
|
|
module_inst->fast_jit_func_ptrs[func_idx_non_import]);
|
|
|
bh_assert(action == JIT_INTERP_ACTION_NORMAL
|
|
|
|| (action == JIT_INTERP_ACTION_THROWN
|
|
|
- && wasm_runtime_get_exception(exec_env->module_inst)));
|
|
|
+ && wasm_copy_exception(
|
|
|
+ (WASMModuleInstance *)exec_env->module_inst, NULL)));
|
|
|
|
|
|
/* Get the return values form info.out.ret */
|
|
|
if (func_type->result_count) {
|
|
|
@@ -4118,7 +4143,7 @@ llvm_jit_call_func_bytecode(WASMModuleInstance *module_inst,
|
|
|
exec_env, module_inst->func_ptrs[func_idx], func_type, NULL, NULL,
|
|
|
argv, argc, argv);
|
|
|
|
|
|
- return ret && !wasm_get_exception(module_inst) ? true : false;
|
|
|
+ return ret && !wasm_copy_exception(module_inst, NULL) ? true : false;
|
|
|
}
|
|
|
}
|
|
|
#endif /* end of WASM_ENABLE_JIT != 0 */
|
|
|
@@ -4138,6 +4163,7 @@ wasm_interp_call_wasm(WASMModuleInstance *module_inst, WASMExecEnv *exec_env,
|
|
|
unsigned frame_size = wasm_interp_interp_frame_size(all_cell_num);
|
|
|
unsigned i;
|
|
|
bool copy_argv_from_frame = true;
|
|
|
+ char exception[EXCEPTION_BUF_LEN];
|
|
|
|
|
|
if (argc < function->param_cell_num) {
|
|
|
char buf[128];
|
|
|
@@ -4248,7 +4274,7 @@ wasm_interp_call_wasm(WASMModuleInstance *module_inst, WASMExecEnv *exec_env,
|
|
|
}
|
|
|
|
|
|
/* Output the return value to the caller */
|
|
|
- if (!wasm_get_exception(module_inst)) {
|
|
|
+ if (!wasm_copy_exception(module_inst, NULL)) {
|
|
|
if (copy_argv_from_frame) {
|
|
|
for (i = 0; i < function->ret_cell_num; i++) {
|
|
|
argv[i] = *(frame->sp + i - function->ret_cell_num);
|
|
|
@@ -4261,7 +4287,8 @@ wasm_interp_call_wasm(WASMModuleInstance *module_inst, WASMExecEnv *exec_env,
|
|
|
wasm_interp_dump_call_stack(exec_env, true, NULL, 0);
|
|
|
}
|
|
|
#endif
|
|
|
- LOG_DEBUG("meet an exception %s", wasm_get_exception(module_inst));
|
|
|
+ wasm_copy_exception(module_inst, exception);
|
|
|
+ LOG_DEBUG("meet an exception %s", exception);
|
|
|
}
|
|
|
|
|
|
wasm_exec_env_set_cur_frame(exec_env, prev_frame);
|