Commit be69c78e authored by jochen@chromium.org's avatar jochen@chromium.org

Fix data race on Debug::thread_local_.current_debug_scope_

BUG=v8:3614
R=yangguo@chromium.org
LOG=n

Review URL: https://codereview.chromium.org/631223004

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@24441 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 5a6f37c7
...@@ -563,7 +563,8 @@ void Debug::ThreadInit() { ...@@ -563,7 +563,8 @@ void Debug::ThreadInit() {
thread_local_.step_into_fp_ = 0; thread_local_.step_into_fp_ = 0;
thread_local_.step_out_fp_ = 0; thread_local_.step_out_fp_ = 0;
// TODO(isolates): frames_are_dropped_? // TODO(isolates): frames_are_dropped_?
thread_local_.current_debug_scope_ = NULL; base::NoBarrier_Store(&thread_local_.current_debug_scope_,
static_cast<base::AtomicWord>(NULL));
thread_local_.restarter_frame_function_pointer_ = NULL; thread_local_.restarter_frame_function_pointer_ = NULL;
} }
...@@ -3089,7 +3090,8 @@ DebugScope::DebugScope(Debug* debug) ...@@ -3089,7 +3090,8 @@ DebugScope::DebugScope(Debug* debug)
no_termination_exceptons_(debug_->isolate_, no_termination_exceptons_(debug_->isolate_,
StackGuard::TERMINATE_EXECUTION) { StackGuard::TERMINATE_EXECUTION) {
// Link recursive debugger entry. // Link recursive debugger entry.
debug_->thread_local_.current_debug_scope_ = this; base::NoBarrier_Store(&debug_->thread_local_.current_debug_scope_,
reinterpret_cast<base::AtomicWord>(this));
// Store the previous break id and frame id. // Store the previous break id and frame id.
break_id_ = debug_->break_id(); break_id_ = debug_->break_id();
...@@ -3126,7 +3128,8 @@ DebugScope::~DebugScope() { ...@@ -3126,7 +3128,8 @@ DebugScope::~DebugScope() {
} }
// Leaving this debugger entry. // Leaving this debugger entry.
debug_->thread_local_.current_debug_scope_ = prev_; base::NoBarrier_Store(&debug_->thread_local_.current_debug_scope_,
reinterpret_cast<base::AtomicWord>(prev_));
// Restore to the previous break state. // Restore to the previous break state.
debug_->thread_local_.break_frame_id_ = break_frame_id_; debug_->thread_local_.break_frame_id_ = break_frame_id_;
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "src/allocation.h" #include "src/allocation.h"
#include "src/arguments.h" #include "src/arguments.h"
#include "src/assembler.h" #include "src/assembler.h"
#include "src/base/atomicops.h"
#include "src/base/platform/platform.h" #include "src/base/platform/platform.h"
#include "src/execution.h" #include "src/execution.h"
#include "src/factory.h" #include "src/factory.h"
...@@ -459,7 +460,10 @@ class Debug { ...@@ -459,7 +460,10 @@ class Debug {
} }
// Flags and states. // Flags and states.
DebugScope* debugger_entry() { return thread_local_.current_debug_scope_; } DebugScope* debugger_entry() {
return reinterpret_cast<DebugScope*>(
base::NoBarrier_Load(&thread_local_.current_debug_scope_));
}
inline Handle<Context> debug_context() { return debug_context_; } inline Handle<Context> debug_context() { return debug_context_; }
void set_live_edit_enabled(bool v) { live_edit_enabled_ = v; } void set_live_edit_enabled(bool v) { live_edit_enabled_ = v; }
bool live_edit_enabled() const { bool live_edit_enabled() const {
...@@ -470,7 +474,7 @@ class Debug { ...@@ -470,7 +474,7 @@ class Debug {
inline bool is_loaded() const { return !debug_context_.is_null(); } inline bool is_loaded() const { return !debug_context_.is_null(); }
inline bool has_break_points() const { return has_break_points_; } inline bool has_break_points() const { return has_break_points_; }
inline bool in_debug_scope() const { inline bool in_debug_scope() const {
return thread_local_.current_debug_scope_ != NULL; return !!base::NoBarrier_Load(&thread_local_.current_debug_scope_);
} }
void set_disable_break(bool v) { break_disabled_ = v; } void set_disable_break(bool v) { break_disabled_ = v; }
...@@ -599,7 +603,7 @@ class Debug { ...@@ -599,7 +603,7 @@ class Debug {
class ThreadLocal { class ThreadLocal {
public: public:
// Top debugger entry. // Top debugger entry.
DebugScope* current_debug_scope_; base::AtomicWord current_debug_scope_;
// Counter for generating next break id. // Counter for generating next break id.
int break_count_; int break_count_;
......
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