| Index: runtime/vm/thread.cc
|
| diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc
|
| index 3b3eb3308d30b292147168449f670ba1f62033f5..b1fd5765bb9b3afa5ebc240bef026f331c5ae23d 100644
|
| --- a/runtime/vm/thread.cc
|
| +++ b/runtime/vm/thread.cc
|
| @@ -134,11 +134,15 @@ void Thread::EnterIsolate(Isolate* isolate) {
|
| 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
|
| + // TODO(koda): Calling Isolate::CheckForDuplicateThreadState(thread_state)
|
| + // here can lead to deadlock. Isolate::KillAllIsolates(), takes the isolate
|
| + // list lock and posts the kill message to the target isolate, entering the
|
| + // monitor at the top of MessageHandler::PostMessage() to do so. That monitor
|
| + // is also entered before calling MessageHandler::HandleMessages(), which
|
| + // enters a StartIsolateScope, which calls Thread::EnterIsolate(), which would
|
| + // call Isolate::CheckForDuplicateThreadState(), which attempts to take the
|
| + // isolate list lock, potentially creating a cycle.
|
| + // Evaluate doing this check some other way.
|
| ASSERT(thread_state != NULL);
|
| // TODO(koda): Migrate profiler interface to use Thread.
|
| Profiler::BeginExecution(isolate);
|
|
|