Index: runtime/vm/dart.cc |
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc |
index 599d334449a10f11628eff1b9759639dff420f64..ae603daee1816cbd21cbee687dd5b4aeabba3025 100644 |
--- a/runtime/vm/dart.cc |
+++ b/runtime/vm/dart.cc |
@@ -41,7 +41,6 @@ DECLARE_FLAG(bool, print_class_table); |
DECLARE_FLAG(bool, trace_time_all); |
DEFINE_FLAG(bool, keep_code, false, |
"Keep deoptimized code for profiling."); |
-DEFINE_FLAG(bool, shutdown, true, "Do a clean shutdown of the VM"); |
DEFINE_FLAG(bool, trace_shutdown, false, "Trace VM shutdown on stderr"); |
Isolate* Dart::vm_isolate_ = NULL; |
@@ -375,105 +374,89 @@ const char* Dart::Cleanup() { |
Thread::ExitIsolate(); |
} |
- if (FLAG_shutdown) { |
- // Disable the creation of new isolates. |
- if (FLAG_trace_shutdown) { |
- OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Disabling isolate creation\n", |
- timestamp()); |
- } |
- Isolate::DisableIsolateCreation(); |
- |
- // Send the OOB Kill message to all remaining application isolates. |
- if (FLAG_trace_shutdown) { |
- OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Killing all app isolates\n", |
- timestamp()); |
- } |
- Isolate::KillAllIsolates(Isolate::kInternalKillMsg); |
- |
- // Wait for all isolates, but the service and the vm isolate to shut down. |
- // Only do that if there is a service isolate running. |
- if (ServiceIsolate::IsRunning()) { |
- if (FLAG_trace_shutdown) { |
- OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Shutting down app isolates\n", |
- timestamp()); |
- } |
- WaitForApplicationIsolateShutdown(); |
- } |
- |
- // Shutdown the service isolate. |
- if (FLAG_trace_shutdown) { |
- OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Shutting down service isolate\n", |
- timestamp()); |
- } |
- ServiceIsolate::Shutdown(); |
+ // Disable the creation of new isolates. |
+ if (FLAG_trace_shutdown) { |
+ OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Disabling isolate creation\n", |
+ timestamp()); |
+ } |
+ Isolate::DisableIsolateCreation(); |
- // Wait for the remaining isolate (service isolate) to shutdown |
- // before shutting down the thread pool. |
- if (FLAG_trace_shutdown) { |
- OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Waiting for isolate shutdown\n", |
- timestamp()); |
- } |
- WaitForIsolateShutdown(); |
+ // Send the OOB Kill message to all remaining application isolates. |
+ if (FLAG_trace_shutdown) { |
+ OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Killing all app isolates\n", |
+ timestamp()); |
+ } |
+ Isolate::KillAllIsolates(Isolate::kInternalKillMsg); |
- // Shutdown the thread pool. On return, all thread pool threads have exited. |
+ // Wait for all isolates, but the service and the vm isolate to shut down. |
+ // Only do that if there is a service isolate running. |
+ if (ServiceIsolate::IsRunning()) { |
if (FLAG_trace_shutdown) { |
- OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Deleting thread pool\n", |
+ OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Shutting down app isolates\n", |
timestamp()); |
} |
- delete thread_pool_; |
- thread_pool_ = NULL; |
- |
- // Disable creation of any new OSThread structures which means no more new |
- // threads can do an EnterIsolate. This must come after isolate shutdown |
- // because new threads may need to be spawned to shutdown the isolates. |
- // This must come after deletion of the thread pool to avoid a race in which |
- // a thread spawned by the thread pool does not exit through the thread |
- // pool, messing up its bookkeeping. |
- if (FLAG_trace_shutdown) { |
- OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Disabling OS Thread creation\n", |
- timestamp()); |
- } |
- OSThread::DisableOSThreadCreation(); |
+ WaitForApplicationIsolateShutdown(); |
+ } |
- // Set the VM isolate as current isolate. |
- if (FLAG_trace_shutdown) { |
- OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Cleaning up vm isolate\n", |
- timestamp()); |
- } |
- bool result = Thread::EnterIsolate(vm_isolate_); |
- ASSERT(result); |
+ // Shutdown the service isolate. |
+ if (FLAG_trace_shutdown) { |
+ OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Shutting down service isolate\n", |
+ timestamp()); |
+ } |
+ ServiceIsolate::Shutdown(); |
- ShutdownIsolate(); |
- vm_isolate_ = NULL; |
- ASSERT(Isolate::IsolateListLength() == 0); |
+ // Wait for the remaining isolate (service isolate) to shutdown |
+ // before shutting down the thread pool. |
+ if (FLAG_trace_shutdown) { |
+ OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Waiting for isolate shutdown\n", |
+ timestamp()); |
+ } |
+ WaitForIsolateShutdown(); |
- TargetCPUFeatures::Cleanup(); |
- StoreBuffer::ShutDown(); |
+ // Shutdown the thread pool. On return, all thread pool threads have exited. |
+ if (FLAG_trace_shutdown) { |
+ OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Deleting thread pool\n", |
+ timestamp()); |
+ } |
+ delete thread_pool_; |
+ thread_pool_ = NULL; |
+ |
+ // Disable creation of any new OSThread structures which means no more new |
+ // threads can do an EnterIsolate. This must come after isolate shutdown |
+ // because new threads may need to be spawned to shutdown the isolates. |
+ // This must come after deletion of the thread pool to avoid a race in which |
+ // a thread spawned by the thread pool does not exit through the thread |
+ // pool, messing up its bookkeeping. |
+ if (FLAG_trace_shutdown) { |
+ OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Disabling OS Thread creation\n", |
+ timestamp()); |
+ } |
+ OSThread::DisableOSThreadCreation(); |
- // Delete the current thread's TLS and set it's TLS to null. |
- // If it is the last thread then the destructor would call |
- // OSThread::Cleanup. |
- OSThread* os_thread = OSThread::Current(); |
- OSThread::SetCurrent(NULL); |
- delete os_thread; |
- if (FLAG_trace_shutdown) { |
- OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Deleted os_thread\n", |
- timestamp()); |
- } |
- } else { |
- // Shutdown the service isolate. |
- if (FLAG_trace_shutdown) { |
- OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Shutting down service isolate\n", |
- timestamp()); |
- } |
- ServiceIsolate::Shutdown(); |
+ // Set the VM isolate as current isolate. |
+ if (FLAG_trace_shutdown) { |
+ OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Cleaning up vm isolate\n", |
+ timestamp()); |
+ } |
+ bool result = Thread::EnterIsolate(vm_isolate_); |
+ ASSERT(result); |
- // Disable thread creation. |
- if (FLAG_trace_shutdown) { |
- OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Disabling OS Thread creation\n", |
- timestamp()); |
- } |
- OSThread::DisableOSThreadCreation(); |
+ ShutdownIsolate(); |
+ vm_isolate_ = NULL; |
+ ASSERT(Isolate::IsolateListLength() == 0); |
+ |
+ TargetCPUFeatures::Cleanup(); |
+ StoreBuffer::ShutDown(); |
+ |
+ // Delete the current thread's TLS and set it's TLS to null. |
+ // If it is the last thread then the destructor would call |
+ // OSThread::Cleanup. |
+ OSThread* os_thread = OSThread::Current(); |
+ OSThread::SetCurrent(NULL); |
+ delete os_thread; |
+ if (FLAG_trace_shutdown) { |
+ OS::PrintErr("[+%" Pd64 "ms] SHUTDOWN: Deleted os_thread\n", |
+ timestamp()); |
} |
if (FLAG_trace_shutdown) { |