Index: runtime/vm/dart.cc |
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc |
index 4fd93cb190ae0d0ee5759ad7fbce3e6a8a8c1890..d4a984a1bdec9b7606c2d4d9646e4c2ca5a2c4d8 100644 |
--- a/runtime/vm/dart.cc |
+++ b/runtime/vm/dart.cc |
@@ -114,8 +114,6 @@ const char* Dart::InitOnce(const uint8_t* vm_isolate_snapshot, |
ASSERT(predefined_handles_ == NULL); |
predefined_handles_ = new ReadOnlyHandles(); |
// Create the VM isolate and finish the VM initialization. |
- ASSERT(thread_pool_ == NULL); |
- thread_pool_ = new ThreadPool(); |
{ |
ASSERT(vm_isolate_ == NULL); |
ASSERT(Flags::Initialized()); |
@@ -198,34 +196,25 @@ const char* Dart::InitOnce(const uint8_t* vm_isolate_snapshot, |
const char* Dart::Cleanup() { |
- // Shutdown the service isolate before shutting down the thread pool. |
- ServiceIsolate::Shutdown(); |
-#if 0 |
- // Ideally we should shutdown the VM isolate here, but the thread pool |
- // shutdown does not seem to ensure that all the threads have stopped |
- // execution before it terminates, this results in racing isolates. |
+ ASSERT(Isolate::Current() == NULL); |
if (vm_isolate_ == NULL) { |
return "VM already terminated."; |
} |
- ASSERT(Isolate::Current() == NULL); |
+ // Shutdown the service isolate before shutting down the thread pool. |
+ ServiceIsolate::Shutdown(); |
- delete thread_pool_; |
- thread_pool_ = NULL; |
+ // Shutdown the thread pool. On return, all thread pool threads have exited. |
+ ThreadPool::Shutdown(); |
// Set the VM isolate as current isolate. |
Thread::EnsureInit(); |
Thread::EnterIsolate(vm_isolate_); |
- // There is a planned and known asymmetry here: We exit one scope for the VM |
- // isolate to account for the scope that was entered in Dart_InitOnce. |
- Dart_ExitScope(); |
- |
ShutdownIsolate(); |
vm_isolate_ = NULL; |
TargetCPUFeatures::Cleanup(); |
-#endif |
Profiler::Shutdown(); |
CodeObservers::DeleteAll(); |