Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(305)

Side by Side Diff: src/debug.cc

Issue 631223004: Fix data race on Debug::thread_local_.current_debug_scope_ (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: updates Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/debug.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/arguments.h" 8 #include "src/arguments.h"
9 #include "src/bootstrapper.h" 9 #include "src/bootstrapper.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after
556 thread_local_.break_id_ = 0; 556 thread_local_.break_id_ = 0;
557 thread_local_.break_frame_id_ = StackFrame::NO_ID; 557 thread_local_.break_frame_id_ = StackFrame::NO_ID;
558 thread_local_.last_step_action_ = StepNone; 558 thread_local_.last_step_action_ = StepNone;
559 thread_local_.last_statement_position_ = RelocInfo::kNoPosition; 559 thread_local_.last_statement_position_ = RelocInfo::kNoPosition;
560 thread_local_.step_count_ = 0; 560 thread_local_.step_count_ = 0;
561 thread_local_.last_fp_ = 0; 561 thread_local_.last_fp_ = 0;
562 thread_local_.queued_step_count_ = 0; 562 thread_local_.queued_step_count_ = 0;
563 thread_local_.step_into_fp_ = 0; 563 thread_local_.step_into_fp_ = 0;
564 thread_local_.step_out_fp_ = 0; 564 thread_local_.step_out_fp_ = 0;
565 // TODO(isolates): frames_are_dropped_? 565 // TODO(isolates): frames_are_dropped_?
566 thread_local_.current_debug_scope_ = NULL; 566 base::NoBarrier_Store(&thread_local_.current_debug_scope_,
567 static_cast<base::AtomicWord>(NULL));
567 thread_local_.restarter_frame_function_pointer_ = NULL; 568 thread_local_.restarter_frame_function_pointer_ = NULL;
568 } 569 }
569 570
570 571
571 char* Debug::ArchiveDebug(char* storage) { 572 char* Debug::ArchiveDebug(char* storage) {
572 char* to = storage; 573 char* to = storage;
573 MemCopy(to, reinterpret_cast<char*>(&thread_local_), sizeof(ThreadLocal)); 574 MemCopy(to, reinterpret_cast<char*>(&thread_local_), sizeof(ThreadLocal));
574 ThreadInit(); 575 ThreadInit();
575 return storage + ArchiveSpacePerThread(); 576 return storage + ArchiveSpacePerThread();
576 } 577 }
(...skipping 2505 matching lines...) Expand 10 before | Expand all | Expand 10 after
3082 } 3083 }
3083 3084
3084 3085
3085 DebugScope::DebugScope(Debug* debug) 3086 DebugScope::DebugScope(Debug* debug)
3086 : debug_(debug), 3087 : debug_(debug),
3087 prev_(debug->debugger_entry()), 3088 prev_(debug->debugger_entry()),
3088 save_(debug_->isolate_), 3089 save_(debug_->isolate_),
3089 no_termination_exceptons_(debug_->isolate_, 3090 no_termination_exceptons_(debug_->isolate_,
3090 StackGuard::TERMINATE_EXECUTION) { 3091 StackGuard::TERMINATE_EXECUTION) {
3091 // Link recursive debugger entry. 3092 // Link recursive debugger entry.
3092 debug_->thread_local_.current_debug_scope_ = this; 3093 base::NoBarrier_Store(&debug_->thread_local_.current_debug_scope_,
3094 reinterpret_cast<base::AtomicWord>(this));
3093 3095
3094 // Store the previous break id and frame id. 3096 // Store the previous break id and frame id.
3095 break_id_ = debug_->break_id(); 3097 break_id_ = debug_->break_id();
3096 break_frame_id_ = debug_->break_frame_id(); 3098 break_frame_id_ = debug_->break_frame_id();
3097 3099
3098 // Create the new break info. If there is no JavaScript frames there is no 3100 // Create the new break info. If there is no JavaScript frames there is no
3099 // break frame id. 3101 // break frame id.
3100 JavaScriptFrameIterator it(isolate()); 3102 JavaScriptFrameIterator it(isolate());
3101 bool has_js_frames = !it.done(); 3103 bool has_js_frames = !it.done();
3102 debug_->thread_local_.break_frame_id_ = has_js_frames ? it.frame()->id() 3104 debug_->thread_local_.break_frame_id_ = has_js_frames ? it.frame()->id()
(...skipping 16 matching lines...) Expand all
3119 // JavaScript. This can happen if the v8::Debug::Call is used in which 3121 // JavaScript. This can happen if the v8::Debug::Call is used in which
3120 // case the exception should end up in the calling code. 3122 // case the exception should end up in the calling code.
3121 if (!isolate()->has_pending_exception()) debug_->ClearMirrorCache(); 3123 if (!isolate()->has_pending_exception()) debug_->ClearMirrorCache();
3122 3124
3123 // If there are commands in the queue when leaving the debugger request 3125 // If there are commands in the queue when leaving the debugger request
3124 // that these commands are processed. 3126 // that these commands are processed.
3125 if (debug_->has_commands()) isolate()->stack_guard()->RequestDebugCommand(); 3127 if (debug_->has_commands()) isolate()->stack_guard()->RequestDebugCommand();
3126 } 3128 }
3127 3129
3128 // Leaving this debugger entry. 3130 // Leaving this debugger entry.
3129 debug_->thread_local_.current_debug_scope_ = prev_; 3131 base::NoBarrier_Store(&debug_->thread_local_.current_debug_scope_,
3132 reinterpret_cast<base::AtomicWord>(prev_));
3130 3133
3131 // Restore to the previous break state. 3134 // Restore to the previous break state.
3132 debug_->thread_local_.break_frame_id_ = break_frame_id_; 3135 debug_->thread_local_.break_frame_id_ = break_frame_id_;
3133 debug_->thread_local_.break_id_ = break_id_; 3136 debug_->thread_local_.break_id_ = break_id_;
3134 3137
3135 debug_->UpdateState(); 3138 debug_->UpdateState();
3136 } 3139 }
3137 3140
3138 3141
3139 MessageImpl MessageImpl::NewEvent(DebugEvent event, 3142 MessageImpl MessageImpl::NewEvent(DebugEvent event,
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
3382 logger_->DebugEvent("Put", message.text()); 3385 logger_->DebugEvent("Put", message.text());
3383 } 3386 }
3384 3387
3385 3388
3386 void LockingCommandMessageQueue::Clear() { 3389 void LockingCommandMessageQueue::Clear() {
3387 base::LockGuard<base::Mutex> lock_guard(&mutex_); 3390 base::LockGuard<base::Mutex> lock_guard(&mutex_);
3388 queue_.Clear(); 3391 queue_.Clear();
3389 } 3392 }
3390 3393
3391 } } // namespace v8::internal 3394 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/debug.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698