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); |