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

Side by Side Diff: runtime/vm/thread.cc

Issue 1537543002: Fix for issue 25236 (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: code-review-comments Created 5 years 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
« no previous file with comments | « runtime/vm/thread.h ('k') | runtime/vm/thread_registry.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/thread.h" 5 #include "vm/thread.h"
6 6
7 #include "vm/dart_api_state.h" 7 #include "vm/dart_api_state.h"
8 #include "vm/growable_array.h" 8 #include "vm/growable_array.h"
9 #include "vm/isolate.h" 9 #include "vm/isolate.h"
10 #include "vm/lockers.h" 10 #include "vm/lockers.h"
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 165
166 166
167 RawGrowableObjectArray* Thread::pending_functions() { 167 RawGrowableObjectArray* Thread::pending_functions() {
168 if (pending_functions_ == GrowableObjectArray::null()) { 168 if (pending_functions_ == GrowableObjectArray::null()) {
169 pending_functions_ = GrowableObjectArray::New(Heap::kOld); 169 pending_functions_ = GrowableObjectArray::New(Heap::kOld);
170 } 170 }
171 return pending_functions_; 171 return pending_functions_;
172 } 172 }
173 173
174 174
175 void Thread::EnterIsolate(Isolate* isolate) { 175 bool Thread::EnterIsolate(Isolate* isolate) {
176 const bool kIsMutatorThread = true; 176 const bool kIsMutatorThread = true;
177 const bool kDontBypassSafepoints = false; 177 const bool kDontBypassSafepoints = false;
178 ThreadRegistry* tr = isolate->thread_registry(); 178 ThreadRegistry* tr = isolate->thread_registry();
179 Thread* thread = tr->Schedule( 179 Thread* thread = tr->Schedule(
180 isolate, kIsMutatorThread, kDontBypassSafepoints); 180 isolate, kIsMutatorThread, kDontBypassSafepoints);
181 isolate->MakeCurrentThreadMutator(thread); 181 if (thread != NULL) {
182 thread->set_vm_tag(VMTag::kVMTagId); 182 isolate->MakeCurrentThreadMutator(thread);
183 ASSERT(thread->store_buffer_block_ == NULL); 183 thread->set_vm_tag(VMTag::kVMTagId);
184 thread->StoreBufferAcquire(); 184 ASSERT(thread->store_buffer_block_ == NULL);
185 thread->StoreBufferAcquire();
186 return true;
187 }
188 return false;
185 } 189 }
186 190
187 191
188 void Thread::ExitIsolate() { 192 void Thread::ExitIsolate() {
189 Thread* thread = Thread::Current(); 193 Thread* thread = Thread::Current();
190 ASSERT(thread != NULL); 194 ASSERT(thread != NULL);
191 ASSERT(thread->IsMutatorThread()); 195 ASSERT(thread->IsMutatorThread());
192 #if defined(DEBUG) 196 #if defined(DEBUG)
193 ASSERT(!thread->IsAnyReusableHandleScopeActive()); 197 ASSERT(!thread->IsAnyReusableHandleScopeActive());
194 #endif // DEBUG 198 #endif // DEBUG
195 // Clear since GC will not visit the thread once it is unscheduled. 199 // Clear since GC will not visit the thread once it is unscheduled.
196 thread->ClearReusableHandles(); 200 thread->ClearReusableHandles();
197 thread->StoreBufferRelease(); 201 thread->StoreBufferRelease();
198 Isolate* isolate = thread->isolate(); 202 Isolate* isolate = thread->isolate();
199 ASSERT(isolate != NULL); 203 ASSERT(isolate != NULL);
200 if (isolate->is_runnable()) { 204 if (isolate->is_runnable()) {
201 thread->set_vm_tag(VMTag::kIdleTagId); 205 thread->set_vm_tag(VMTag::kIdleTagId);
202 } else { 206 } else {
203 thread->set_vm_tag(VMTag::kLoadWaitTagId); 207 thread->set_vm_tag(VMTag::kLoadWaitTagId);
204 } 208 }
205 const bool kIsMutatorThread = true; 209 const bool kIsMutatorThread = true;
206 const bool kDontBypassSafepoints = false; 210 const bool kDontBypassSafepoints = false;
207 ThreadRegistry* tr = isolate->thread_registry(); 211 ThreadRegistry* tr = isolate->thread_registry();
208 tr->Unschedule(thread, kIsMutatorThread, kDontBypassSafepoints); 212 tr->Unschedule(thread, kIsMutatorThread, kDontBypassSafepoints);
209 isolate->ClearMutatorThread(); 213 isolate->ClearMutatorThread();
210 } 214 }
211 215
212 216
213 void Thread::EnterIsolateAsHelper(Isolate* isolate, bool bypass_safepoint) { 217 bool Thread::EnterIsolateAsHelper(Isolate* isolate, bool bypass_safepoint) {
214 const bool kIsNotMutatorThread = false; 218 const bool kIsNotMutatorThread = false;
215 ThreadRegistry* tr = isolate->thread_registry(); 219 ThreadRegistry* tr = isolate->thread_registry();
216 Thread* thread = tr->Schedule(isolate, kIsNotMutatorThread, bypass_safepoint); 220 Thread* thread = tr->Schedule(isolate, kIsNotMutatorThread, bypass_safepoint);
217 ASSERT(thread->store_buffer_block_ == NULL); 221 if (thread != NULL) {
218 // TODO(koda): Use StoreBufferAcquire once we properly flush before Scavenge. 222 ASSERT(thread->store_buffer_block_ == NULL);
219 thread->store_buffer_block_ = 223 // TODO(koda): Use StoreBufferAcquire once we properly flush
220 thread->isolate()->store_buffer()->PopEmptyBlock(); 224 // before Scavenge.
221 // This thread should not be the main mutator. 225 thread->store_buffer_block_ =
222 ASSERT(!thread->IsMutatorThread()); 226 thread->isolate()->store_buffer()->PopEmptyBlock();
227 // This thread should not be the main mutator.
228 ASSERT(!thread->IsMutatorThread());
229 return true;
230 }
231 return false;
223 } 232 }
224 233
225 234
226 void Thread::ExitIsolateAsHelper(bool bypass_safepoint) { 235 void Thread::ExitIsolateAsHelper(bool bypass_safepoint) {
227 Thread* thread = Thread::Current(); 236 Thread* thread = Thread::Current();
228 ASSERT(thread != NULL); 237 ASSERT(thread != NULL);
229 ASSERT(!thread->IsMutatorThread()); 238 ASSERT(!thread->IsMutatorThread());
230 thread->StoreBufferRelease(); 239 thread->StoreBufferRelease();
231 Isolate* isolate = thread->isolate(); 240 Isolate* isolate = thread->isolate();
232 ASSERT(isolate != NULL); 241 ASSERT(isolate != NULL);
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
449 458
450 DisableThreadInterruptsScope::~DisableThreadInterruptsScope() { 459 DisableThreadInterruptsScope::~DisableThreadInterruptsScope() {
451 if (thread() != NULL) { 460 if (thread() != NULL) {
452 OSThread* os_thread = thread()->os_thread(); 461 OSThread* os_thread = thread()->os_thread();
453 ASSERT(os_thread != NULL); 462 ASSERT(os_thread != NULL);
454 os_thread->EnableThreadInterrupts(); 463 os_thread->EnableThreadInterrupts();
455 } 464 }
456 } 465 }
457 466
458 } // namespace dart 467 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/thread.h ('k') | runtime/vm/thread_registry.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698