Commit b7e94287 authored by Eric Holk's avatar Eric Holk Committed by Commit Bot

[wasm] clear and set thread-in-wasm flag on runtime calls

This was causing GC stress failures. Garbage collections can happen during
runtime calls, such was WasmStackGuard. If the collection cleans up Wasm
objects, then they will have to modify the trap handler data structures, which
requires taking a lock. This lock can only be taken if the thread-in-wasm flag
is clear. We were getting crashes because this flag was not clear.

This change fixes the issue by making sure any runtime calls from Wasm clear the
thread-in-wasm flag and then restore it upon return. In addition, it cleans up
the code by adding a helper function that generates the code to modify the flag.

BUG= v8:6132

Change-Id: I95d43388dff60ba792c57fe13448a40a02ed4802
Reviewed-on: https://chromium-review.googlesource.com/458698
Commit-Queue: Eric Holk <eholk@chromium.org>
Reviewed-by: 's avatarMircea Trofin <mtrofin@chromium.org>
Reviewed-by: 's avatarBrad Nelson <bradnelson@chromium.org>
Cr-Commit-Position: refs/heads/master@{#44165}
parent 35701006
This diff is collapsed.
...@@ -221,10 +221,8 @@ RUNTIME_FUNCTION(Runtime_WasmRunInterpreter) { ...@@ -221,10 +221,8 @@ RUNTIME_FUNCTION(Runtime_WasmRunInterpreter) {
frame_pointer = it.frame()->fp(); frame_pointer = it.frame()->fp();
} }
trap_handler::ClearThreadInWasm();
bool success = instance->debug_info()->RunInterpreter(frame_pointer, bool success = instance->debug_info()->RunInterpreter(frame_pointer,
func_index, arg_buffer); func_index, arg_buffer);
trap_handler::SetThreadInWasm();
if (!success) { if (!success) {
DCHECK(isolate->has_pending_exception()); DCHECK(isolate->has_pending_exception());
...@@ -236,6 +234,13 @@ RUNTIME_FUNCTION(Runtime_WasmRunInterpreter) { ...@@ -236,6 +234,13 @@ RUNTIME_FUNCTION(Runtime_WasmRunInterpreter) {
RUNTIME_FUNCTION(Runtime_WasmStackGuard) { RUNTIME_FUNCTION(Runtime_WasmStackGuard) {
SealHandleScope shs(isolate); SealHandleScope shs(isolate);
DCHECK_EQ(0, args.length()); DCHECK_EQ(0, args.length());
DCHECK(!trap_handler::UseTrapHandler() || trap_handler::IsThreadInWasm());
struct ClearAndRestoreThreadInWasm {
ClearAndRestoreThreadInWasm() { trap_handler::ClearThreadInWasm(); }
~ClearAndRestoreThreadInWasm() { trap_handler::SetThreadInWasm(); }
} restore_thread_in_wasm;
// Set the current isolate's context. // Set the current isolate's context.
DCHECK_NULL(isolate->context()); DCHECK_NULL(isolate->context());
......
...@@ -75,6 +75,7 @@ inline void SetThreadInWasm() { ...@@ -75,6 +75,7 @@ inline void SetThreadInWasm() {
g_thread_in_wasm_code = true; g_thread_in_wasm_code = true;
} }
} }
inline void ClearThreadInWasm() { inline void ClearThreadInWasm() {
if (UseTrapHandler()) { if (UseTrapHandler()) {
DCHECK(IsThreadInWasm()); DCHECK(IsThreadInWasm());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment