Index: runtime/vm/thread.cc |
diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc |
index a79b086b7e5c0b587049a5e48c17b71d8c18d9ff..4f18b5dd9d1cfc0ea344243e6b1784edbd6f1b19 100644 |
--- a/runtime/vm/thread.cc |
+++ b/runtime/vm/thread.cc |
@@ -18,7 +18,6 @@ namespace dart { |
// The single thread local key which stores all the thread local data |
// for a thread. |
-// TODO(koda): Can we merge this with ThreadInterrupter::thread_state_key_? |
ThreadLocalKey Thread::thread_key_ = OSThread::kUnsetThreadLocalKey; |
@@ -126,17 +125,17 @@ void Thread::EnterIsolate(Isolate* isolate) { |
ASSERT(isolate->mutator_thread() == NULL); |
thread->isolate_ = isolate; |
isolate->set_mutator_thread(thread); |
- // TODO(koda): Migrate thread_state_ and profile_data_ to Thread, to allow |
- // helper threads concurrent with mutator. |
- ASSERT(isolate->thread_state() == NULL); |
+ ASSERT(thread->thread_state() == NULL); |
InterruptableThreadState* thread_state = |
ThreadInterrupter::GetCurrentThreadState(); |
#if defined(DEBUG) |
+ thread->set_thread_state(NULL); // Exclude thread itself from the dupe check. |
Isolate::CheckForDuplicateThreadState(thread_state); |
+ thread->set_thread_state(thread_state); |
#endif |
ASSERT(thread_state != NULL); |
+ // TODO(koda): Migrate profiler interface to use Thread. |
Profiler::BeginExecution(isolate); |
- isolate->set_thread_state(thread_state); |
isolate->set_vm_tag(VMTag::kVMTagId); |
ASSERT(thread->store_buffer_block_ == NULL); |
thread->store_buffer_block_ = isolate->store_buffer()->PopBlock(); |
@@ -160,8 +159,8 @@ void Thread::ExitIsolate() { |
} else { |
isolate->set_vm_tag(VMTag::kLoadWaitTagId); |
} |
- isolate->set_thread_state(NULL); |
Profiler::EndExecution(isolate); |
+ thread->set_thread_state(NULL); |
isolate->set_mutator_thread(NULL); |
thread->isolate_ = NULL; |
ASSERT(Isolate::Current() == NULL); |
@@ -176,6 +175,7 @@ void Thread::EnterIsolateAsHelper(Isolate* isolate) { |
thread->isolate_ = isolate; |
ASSERT(isolate->heap() != NULL); |
thread->heap_ = isolate->heap(); |
+ ASSERT(thread->thread_state() == NULL); |
// Do not update isolate->mutator_thread, but perform sanity check: |
// this thread should not be both the main mutator and helper. |
ASSERT(isolate->mutator_thread() != thread); |
@@ -191,6 +191,7 @@ void Thread::ExitIsolateAsHelper() { |
Isolate* isolate = thread->isolate(); |
ASSERT(isolate != NULL); |
thread->Unschedule(); |
+ thread->set_thread_state(NULL); |
thread->isolate_ = NULL; |
thread->heap_ = NULL; |
ASSERT(isolate->mutator_thread() != thread); |