Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(543)

Side by Side Diff: runtime/vm/dart.cc

Issue 1177153005: Enables clean VM shutdown. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Kill isolates from the service isolate Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/dart.h" 5 #include "vm/dart.h"
6 6
7 #include "vm/code_observers.h" 7 #include "vm/code_observers.h"
8 #include "vm/cpu.h" 8 #include "vm/cpu.h"
9 #include "vm/dart_api_state.h" 9 #include "vm/dart_api_state.h"
10 #include "vm/dart_entry.h" 10 #include "vm/dart_entry.h"
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 Metric::InitOnce(); 107 Metric::InitOnce();
108 StoreBuffer::InitOnce(); 108 StoreBuffer::InitOnce();
109 109
110 #if defined(USING_SIMULATOR) 110 #if defined(USING_SIMULATOR)
111 Simulator::InitOnce(); 111 Simulator::InitOnce();
112 #endif 112 #endif
113 // Create the read-only handles area. 113 // Create the read-only handles area.
114 ASSERT(predefined_handles_ == NULL); 114 ASSERT(predefined_handles_ == NULL);
115 predefined_handles_ = new ReadOnlyHandles(); 115 predefined_handles_ = new ReadOnlyHandles();
116 // Create the VM isolate and finish the VM initialization. 116 // Create the VM isolate and finish the VM initialization.
117 ASSERT(thread_pool_ == NULL);
118 thread_pool_ = new ThreadPool();
119 { 117 {
120 ASSERT(vm_isolate_ == NULL); 118 ASSERT(vm_isolate_ == NULL);
121 ASSERT(Flags::Initialized()); 119 ASSERT(Flags::Initialized());
122 const bool is_vm_isolate = true; 120 const bool is_vm_isolate = true;
123 Thread::EnsureInit(); 121 Thread::EnsureInit();
124 122
125 // Setup default flags for the VM isolate. 123 // Setup default flags for the VM isolate.
126 Isolate::Flags vm_flags; 124 Isolate::Flags vm_flags;
127 Dart_IsolateFlags api_flags; 125 Dart_IsolateFlags api_flags;
128 vm_flags.CopyTo(&api_flags); 126 vm_flags.CopyTo(&api_flags);
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 Isolate::SetUnhandledExceptionCallback(unhandled); 189 Isolate::SetUnhandledExceptionCallback(unhandled);
192 Isolate::SetShutdownCallback(shutdown); 190 Isolate::SetShutdownCallback(shutdown);
193 191
194 ServiceIsolate::Run(); 192 ServiceIsolate::Run();
195 193
196 return NULL; 194 return NULL;
197 } 195 }
198 196
199 197
200 const char* Dart::Cleanup() { 198 const char* Dart::Cleanup() {
201 // Shutdown the service isolate before shutting down the thread pool. 199 ASSERT(Isolate::Current() == NULL);
202 ServiceIsolate::Shutdown();
203 #if 0
204 // Ideally we should shutdown the VM isolate here, but the thread pool
205 // shutdown does not seem to ensure that all the threads have stopped
206 // execution before it terminates, this results in racing isolates.
207 if (vm_isolate_ == NULL) { 200 if (vm_isolate_ == NULL) {
208 return "VM already terminated."; 201 return "VM already terminated.";
209 } 202 }
210 203
211 ASSERT(Isolate::Current() == NULL); 204 // Shutdown the service isolate before shutting down the thread pool.
205 ServiceIsolate::Shutdown();
212 206
213 delete thread_pool_; 207 // Shutdown the thread pool. On return, all thread pool threads have exited.
214 thread_pool_ = NULL; 208 ThreadPool::Shutdown();
215 209
216 // Set the VM isolate as current isolate. 210 // Set the VM isolate as current isolate.
217 Thread::EnsureInit(); 211 Thread::EnsureInit();
218 Thread::EnterIsolate(vm_isolate_); 212 Thread::EnterIsolate(vm_isolate_);
219 213
220 // There is a planned and known asymmetry here: We exit one scope for the VM
221 // isolate to account for the scope that was entered in Dart_InitOnce.
222 Dart_ExitScope();
223
224 ShutdownIsolate(); 214 ShutdownIsolate();
225 vm_isolate_ = NULL; 215 vm_isolate_ = NULL;
226 216
227 TargetCPUFeatures::Cleanup(); 217 TargetCPUFeatures::Cleanup();
228 #endif
229 218
230 Profiler::Shutdown(); 219 Profiler::Shutdown();
231 CodeObservers::DeleteAll(); 220 CodeObservers::DeleteAll();
232 221
233 return NULL; 222 return NULL;
234 } 223 }
235 224
236 225
237 Isolate* Dart::CreateIsolate(const char* name_prefix, 226 Isolate* Dart::CreateIsolate(const char* name_prefix,
238 const Dart_IsolateFlags& api_flags) { 227 const Dart_IsolateFlags& api_flags) {
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
373 return predefined_handles_->handles_.IsValidScopedHandle(address); 362 return predefined_handles_->handles_.IsValidScopedHandle(address);
374 } 363 }
375 364
376 365
377 bool Dart::IsReadOnlyApiHandle(Dart_Handle handle) { 366 bool Dart::IsReadOnlyApiHandle(Dart_Handle handle) {
378 ASSERT(predefined_handles_ != NULL); 367 ASSERT(predefined_handles_ != NULL);
379 return predefined_handles_->api_handles_.IsValidHandle(handle); 368 return predefined_handles_->api_handles_.IsValidHandle(handle);
380 } 369 }
381 370
382 } // namespace dart 371 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698