|
@@ -696,28 +696,28 @@ trunc_f64_to_int(WASMModuleInstance *module, uint32 *frame_sp, float64 src_min,
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 1, maddr); \
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 1, maddr); \
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS(); \
|
|
CHECK_ATOMIC_MEMORY_ACCESS(); \
|
|
|
\
|
|
\
|
|
|
- os_mutex_lock(&module->e->mem_lock); \
|
|
|
|
|
|
|
+ os_mutex_lock(&node->shared_mem_lock); \
|
|
|
readv = (uint32)(*(uint8 *)maddr); \
|
|
readv = (uint32)(*(uint8 *)maddr); \
|
|
|
*(uint8 *)maddr = (uint8)(readv op sval); \
|
|
*(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) { \
|
|
else if (opcode == WASM_OP_ATOMIC_RMW_I32_##OP_NAME##16_U) { \
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 2, maddr); \
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 2, maddr); \
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS(); \
|
|
CHECK_ATOMIC_MEMORY_ACCESS(); \
|
|
|
\
|
|
\
|
|
|
- os_mutex_lock(&module->e->mem_lock); \
|
|
|
|
|
|
|
+ os_mutex_lock(&node->shared_mem_lock); \
|
|
|
readv = (uint32)LOAD_U16(maddr); \
|
|
readv = (uint32)LOAD_U16(maddr); \
|
|
|
STORE_U16(maddr, (uint16)(readv op sval)); \
|
|
STORE_U16(maddr, (uint16)(readv op sval)); \
|
|
|
- os_mutex_unlock(&module->e->mem_lock); \
|
|
|
|
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock); \
|
|
|
} \
|
|
} \
|
|
|
else { \
|
|
else { \
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 4, maddr); \
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 4, maddr); \
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS(); \
|
|
CHECK_ATOMIC_MEMORY_ACCESS(); \
|
|
|
\
|
|
\
|
|
|
- os_mutex_lock(&module->e->mem_lock); \
|
|
|
|
|
|
|
+ os_mutex_lock(&node->shared_mem_lock); \
|
|
|
readv = LOAD_I32(maddr); \
|
|
readv = LOAD_I32(maddr); \
|
|
|
STORE_U32(maddr, readv op sval); \
|
|
STORE_U32(maddr, readv op sval); \
|
|
|
- os_mutex_unlock(&module->e->mem_lock); \
|
|
|
|
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock); \
|
|
|
} \
|
|
} \
|
|
|
PUSH_I32(readv); \
|
|
PUSH_I32(readv); \
|
|
|
break; \
|
|
break; \
|
|
@@ -736,39 +736,39 @@ trunc_f64_to_int(WASMModuleInstance *module, uint32 *frame_sp, float64 src_min,
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 1, maddr); \
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 1, maddr); \
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS(); \
|
|
CHECK_ATOMIC_MEMORY_ACCESS(); \
|
|
|
\
|
|
\
|
|
|
- os_mutex_lock(&module->e->mem_lock); \
|
|
|
|
|
|
|
+ os_mutex_lock(&node->shared_mem_lock); \
|
|
|
readv = (uint64)(*(uint8 *)maddr); \
|
|
readv = (uint64)(*(uint8 *)maddr); \
|
|
|
*(uint8 *)maddr = (uint8)(readv op sval); \
|
|
*(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) { \
|
|
else if (opcode == WASM_OP_ATOMIC_RMW_I64_##OP_NAME##16_U) { \
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 2, maddr); \
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 2, maddr); \
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS(); \
|
|
CHECK_ATOMIC_MEMORY_ACCESS(); \
|
|
|
\
|
|
\
|
|
|
- os_mutex_lock(&module->e->mem_lock); \
|
|
|
|
|
|
|
+ os_mutex_lock(&node->shared_mem_lock); \
|
|
|
readv = (uint64)LOAD_U16(maddr); \
|
|
readv = (uint64)LOAD_U16(maddr); \
|
|
|
STORE_U16(maddr, (uint16)(readv op sval)); \
|
|
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) { \
|
|
else if (opcode == WASM_OP_ATOMIC_RMW_I64_##OP_NAME##32_U) { \
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 4, maddr); \
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 4, maddr); \
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS(); \
|
|
CHECK_ATOMIC_MEMORY_ACCESS(); \
|
|
|
\
|
|
\
|
|
|
- os_mutex_lock(&module->e->mem_lock); \
|
|
|
|
|
|
|
+ os_mutex_lock(&node->shared_mem_lock); \
|
|
|
readv = (uint64)LOAD_U32(maddr); \
|
|
readv = (uint64)LOAD_U32(maddr); \
|
|
|
STORE_U32(maddr, (uint32)(readv op sval)); \
|
|
STORE_U32(maddr, (uint32)(readv op sval)); \
|
|
|
- os_mutex_unlock(&module->e->mem_lock); \
|
|
|
|
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock); \
|
|
|
} \
|
|
} \
|
|
|
else { \
|
|
else { \
|
|
|
uint64 op_result; \
|
|
uint64 op_result; \
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 8, maddr); \
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 8, maddr); \
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS(); \
|
|
CHECK_ATOMIC_MEMORY_ACCESS(); \
|
|
|
\
|
|
\
|
|
|
- os_mutex_lock(&module->e->mem_lock); \
|
|
|
|
|
|
|
+ os_mutex_lock(&node->shared_mem_lock); \
|
|
|
readv = (uint64)LOAD_I64(maddr); \
|
|
readv = (uint64)LOAD_I64(maddr); \
|
|
|
op_result = readv op sval; \
|
|
op_result = readv op sval; \
|
|
|
STORE_I64(maddr, op_result); \
|
|
STORE_I64(maddr, op_result); \
|
|
|
- os_mutex_unlock(&module->e->mem_lock); \
|
|
|
|
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock); \
|
|
|
} \
|
|
} \
|
|
|
PUSH_I64(readv); \
|
|
PUSH_I64(readv); \
|
|
|
break; \
|
|
break; \
|
|
@@ -1151,6 +1151,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
|
|
uint32 cache_index, type_index, param_cell_num, cell_num;
|
|
uint32 cache_index, type_index, param_cell_num, cell_num;
|
|
|
uint8 value_type;
|
|
uint8 value_type;
|
|
|
|
|
|
|
|
|
|
+#if WASM_ENABLE_SHARED_MEMORY != 0
|
|
|
|
|
+ WASMSharedMemNode *node =
|
|
|
|
|
+ wasm_module_get_shared_memory((WASMModuleCommon *)module->module);
|
|
|
|
|
+#endif
|
|
|
|
|
+
|
|
|
#if WASM_ENABLE_DEBUG_INTERP != 0
|
|
#if WASM_ENABLE_DEBUG_INTERP != 0
|
|
|
uint8 *frame_ip_orig = NULL;
|
|
uint8 *frame_ip_orig = NULL;
|
|
|
WASMDebugInstance *debug_instance = wasm_exec_env_get_instance(exec_env);
|
|
WASMDebugInstance *debug_instance = wasm_exec_env_get_instance(exec_env);
|
|
@@ -3458,23 +3463,23 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
|
|
if (opcode == WASM_OP_ATOMIC_I32_LOAD8_U) {
|
|
if (opcode == WASM_OP_ATOMIC_I32_LOAD8_U) {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 1, maddr);
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 1, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
readv = (uint32)(*(uint8 *)maddr);
|
|
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) {
|
|
else if (opcode == WASM_OP_ATOMIC_I32_LOAD16_U) {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 2, maddr);
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 2, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
readv = (uint32)LOAD_U16(maddr);
|
|
readv = (uint32)LOAD_U16(maddr);
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
}
|
|
|
else {
|
|
else {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 4, maddr);
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 4, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
readv = LOAD_I32(maddr);
|
|
readv = LOAD_I32(maddr);
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
PUSH_I32(readv);
|
|
PUSH_I32(readv);
|
|
@@ -3493,30 +3498,30 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
|
|
if (opcode == WASM_OP_ATOMIC_I64_LOAD8_U) {
|
|
if (opcode == WASM_OP_ATOMIC_I64_LOAD8_U) {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 1, maddr);
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 1, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
readv = (uint64)(*(uint8 *)maddr);
|
|
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) {
|
|
else if (opcode == WASM_OP_ATOMIC_I64_LOAD16_U) {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 2, maddr);
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 2, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
readv = (uint64)LOAD_U16(maddr);
|
|
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) {
|
|
else if (opcode == WASM_OP_ATOMIC_I64_LOAD32_U) {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 4, maddr);
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 4, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
readv = (uint64)LOAD_U32(maddr);
|
|
readv = (uint64)LOAD_U32(maddr);
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
}
|
|
|
else {
|
|
else {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 8, maddr);
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 8, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
readv = LOAD_I64(maddr);
|
|
readv = LOAD_I64(maddr);
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
PUSH_I64(readv);
|
|
PUSH_I64(readv);
|
|
@@ -3535,23 +3540,23 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
|
|
if (opcode == WASM_OP_ATOMIC_I32_STORE8) {
|
|
if (opcode == WASM_OP_ATOMIC_I32_STORE8) {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 1, maddr);
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 1, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
*(uint8 *)maddr = (uint8)sval;
|
|
*(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) {
|
|
else if (opcode == WASM_OP_ATOMIC_I32_STORE16) {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 2, maddr);
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 2, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
STORE_U16(maddr, (uint16)sval);
|
|
STORE_U16(maddr, (uint16)sval);
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
}
|
|
|
else {
|
|
else {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 4, maddr);
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 4, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
STORE_U32(maddr, frame_sp[1]);
|
|
STORE_U32(maddr, frame_sp[1]);
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
@@ -3569,31 +3574,31 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
|
|
if (opcode == WASM_OP_ATOMIC_I64_STORE8) {
|
|
if (opcode == WASM_OP_ATOMIC_I64_STORE8) {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 1, maddr);
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 1, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
*(uint8 *)maddr = (uint8)sval;
|
|
*(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) {
|
|
else if (opcode == WASM_OP_ATOMIC_I64_STORE16) {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 2, maddr);
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 2, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
STORE_U16(maddr, (uint16)sval);
|
|
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) {
|
|
else if (opcode == WASM_OP_ATOMIC_I64_STORE32) {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 4, maddr);
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 4, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
STORE_U32(maddr, (uint32)sval);
|
|
STORE_U32(maddr, (uint32)sval);
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
}
|
|
|
else {
|
|
else {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 8, maddr);
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 8, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
PUT_I64_TO_ADDR((uint32 *)maddr,
|
|
PUT_I64_TO_ADDR((uint32 *)maddr,
|
|
|
GET_I64_FROM_ADDR(frame_sp + 1));
|
|
GET_I64_FROM_ADDR(frame_sp + 1));
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
@@ -3613,32 +3618,32 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
|
|
|
|
|
expect = (uint8)expect;
|
|
expect = (uint8)expect;
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
readv = (uint32)(*(uint8 *)maddr);
|
|
readv = (uint32)(*(uint8 *)maddr);
|
|
|
if (readv == expect)
|
|
if (readv == expect)
|
|
|
*(uint8 *)maddr = (uint8)(sval);
|
|
*(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) {
|
|
else if (opcode == WASM_OP_ATOMIC_RMW_I32_CMPXCHG16_U) {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 2, maddr);
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 2, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
|
|
|
|
|
expect = (uint16)expect;
|
|
expect = (uint16)expect;
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
readv = (uint32)LOAD_U16(maddr);
|
|
readv = (uint32)LOAD_U16(maddr);
|
|
|
if (readv == expect)
|
|
if (readv == expect)
|
|
|
STORE_U16(maddr, (uint16)(sval));
|
|
STORE_U16(maddr, (uint16)(sval));
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
}
|
|
|
else {
|
|
else {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 4, maddr);
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 4, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
|
|
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
readv = LOAD_I32(maddr);
|
|
readv = LOAD_I32(maddr);
|
|
|
if (readv == expect)
|
|
if (readv == expect)
|
|
|
STORE_U32(maddr, sval);
|
|
STORE_U32(maddr, sval);
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
}
|
|
|
PUSH_I32(readv);
|
|
PUSH_I32(readv);
|
|
|
break;
|
|
break;
|
|
@@ -3659,44 +3664,44 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
|
|
|
|
|
expect = (uint8)expect;
|
|
expect = (uint8)expect;
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
readv = (uint64)(*(uint8 *)maddr);
|
|
readv = (uint64)(*(uint8 *)maddr);
|
|
|
if (readv == expect)
|
|
if (readv == expect)
|
|
|
*(uint8 *)maddr = (uint8)(sval);
|
|
*(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) {
|
|
else if (opcode == WASM_OP_ATOMIC_RMW_I64_CMPXCHG16_U) {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 2, maddr);
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 2, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
|
|
|
|
|
expect = (uint16)expect;
|
|
expect = (uint16)expect;
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
readv = (uint64)LOAD_U16(maddr);
|
|
readv = (uint64)LOAD_U16(maddr);
|
|
|
if (readv == expect)
|
|
if (readv == expect)
|
|
|
STORE_U16(maddr, (uint16)(sval));
|
|
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) {
|
|
else if (opcode == WASM_OP_ATOMIC_RMW_I64_CMPXCHG32_U) {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 4, maddr);
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 4, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
|
|
|
|
|
expect = (uint32)expect;
|
|
expect = (uint32)expect;
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
readv = (uint64)LOAD_U32(maddr);
|
|
readv = (uint64)LOAD_U32(maddr);
|
|
|
if (readv == expect)
|
|
if (readv == expect)
|
|
|
STORE_U32(maddr, (uint32)(sval));
|
|
STORE_U32(maddr, (uint32)(sval));
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
}
|
|
|
else {
|
|
else {
|
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 8, maddr);
|
|
CHECK_BULK_MEMORY_OVERFLOW(addr + offset, 8, maddr);
|
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
CHECK_ATOMIC_MEMORY_ACCESS();
|
|
|
|
|
|
|
|
- os_mutex_lock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_lock(&node->shared_mem_lock);
|
|
|
readv = (uint64)LOAD_I64(maddr);
|
|
readv = (uint64)LOAD_I64(maddr);
|
|
|
if (readv == expect) {
|
|
if (readv == expect) {
|
|
|
STORE_I64(maddr, sval);
|
|
STORE_I64(maddr, sval);
|
|
|
}
|
|
}
|
|
|
- os_mutex_unlock(&module->e->mem_lock);
|
|
|
|
|
|
|
+ os_mutex_unlock(&node->shared_mem_lock);
|
|
|
}
|
|
}
|
|
|
PUSH_I64(readv);
|
|
PUSH_I64(readv);
|
|
|
break;
|
|
break;
|