OLD | NEW |
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 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
85 Dart_GetVMServiceAssetsArchive get_service_assets) { | 85 Dart_GetVMServiceAssetsArchive get_service_assets) { |
86 // TODO(iposva): Fix race condition here. | 86 // TODO(iposva): Fix race condition here. |
87 if (vm_isolate_ != NULL || !Flags::Initialized()) { | 87 if (vm_isolate_ != NULL || !Flags::Initialized()) { |
88 return "VM already initialized or flags not initialized."; | 88 return "VM already initialized or flags not initialized."; |
89 } | 89 } |
90 Isolate::SetFileCallbacks(file_open, file_read, file_write, file_close); | 90 Isolate::SetFileCallbacks(file_open, file_read, file_write, file_close); |
91 Isolate::SetEntropySourceCallback(entropy_source); | 91 Isolate::SetEntropySourceCallback(entropy_source); |
92 OS::InitOnce(); | 92 OS::InitOnce(); |
93 VirtualMemory::InitOnce(); | 93 VirtualMemory::InitOnce(); |
94 OSThread::InitOnce(); | 94 OSThread::InitOnce(); |
95 Timeline::InitOnce(); | 95 if (FLAG_support_timeline) { |
| 96 Timeline::InitOnce(); |
| 97 } |
| 98 #ifndef PRODUCT |
96 TimelineDurationScope tds(Timeline::GetVMStream(), | 99 TimelineDurationScope tds(Timeline::GetVMStream(), |
97 "Dart::InitOnce"); | 100 "Dart::InitOnce"); |
| 101 #endif |
98 Isolate::InitOnce(); | 102 Isolate::InitOnce(); |
99 PortMap::InitOnce(); | 103 PortMap::InitOnce(); |
100 FreeListElement::InitOnce(); | 104 FreeListElement::InitOnce(); |
101 Api::InitOnce(); | 105 Api::InitOnce(); |
102 CodeObservers::InitOnce(); | 106 CodeObservers::InitOnce(); |
103 ThreadInterrupter::InitOnce(); | 107 if (FLAG_profiler) { |
104 Profiler::InitOnce(); | 108 ThreadInterrupter::InitOnce(); |
| 109 Profiler::InitOnce(); |
| 110 } |
105 SemiSpace::InitOnce(); | 111 SemiSpace::InitOnce(); |
106 Metric::InitOnce(); | 112 Metric::InitOnce(); |
107 StoreBuffer::InitOnce(); | 113 StoreBuffer::InitOnce(); |
108 MarkingStack::InitOnce(); | 114 MarkingStack::InitOnce(); |
109 | 115 |
110 #if defined(USING_SIMULATOR) | 116 #if defined(USING_SIMULATOR) |
111 Simulator::InitOnce(); | 117 Simulator::InitOnce(); |
112 #endif | 118 #endif |
113 // Create the read-only handles area. | 119 // Create the read-only handles area. |
114 ASSERT(predefined_handles_ == NULL); | 120 ASSERT(predefined_handles_ == NULL); |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
221 ASSERT(Isolate::isolates_list_head_ == Dart::vm_isolate()); | 227 ASSERT(Isolate::isolates_list_head_ == Dart::vm_isolate()); |
222 } | 228 } |
223 | 229 |
224 | 230 |
225 const char* Dart::Cleanup() { | 231 const char* Dart::Cleanup() { |
226 ASSERT(Isolate::Current() == NULL); | 232 ASSERT(Isolate::Current() == NULL); |
227 if (vm_isolate_ == NULL) { | 233 if (vm_isolate_ == NULL) { |
228 return "VM already terminated."; | 234 return "VM already terminated."; |
229 } | 235 } |
230 | 236 |
231 // Shut down profiling. | 237 if (FLAG_profiler) { |
232 Profiler::Shutdown(); | 238 // Shut down profiling. |
| 239 Profiler::Shutdown(); |
| 240 } |
| 241 |
233 | 242 |
234 { | 243 { |
235 // Set the VM isolate as current isolate when shutting down | 244 // Set the VM isolate as current isolate when shutting down |
236 // Metrics so that we can use a StackZone. | 245 // Metrics so that we can use a StackZone. |
237 bool result = Thread::EnterIsolate(vm_isolate_); | 246 bool result = Thread::EnterIsolate(vm_isolate_); |
238 ASSERT(result); | 247 ASSERT(result); |
239 Metric::Cleanup(); | 248 Metric::Cleanup(); |
240 Thread::ExitIsolate(); | 249 Thread::ExitIsolate(); |
241 } | 250 } |
242 | 251 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
285 delete os_thread; | 294 delete os_thread; |
286 } else { | 295 } else { |
287 // Shutdown the service isolate. | 296 // Shutdown the service isolate. |
288 ServiceIsolate::Shutdown(); | 297 ServiceIsolate::Shutdown(); |
289 | 298 |
290 // Disable thread creation. | 299 // Disable thread creation. |
291 OSThread::DisableOSThreadCreation(); | 300 OSThread::DisableOSThreadCreation(); |
292 } | 301 } |
293 | 302 |
294 CodeObservers::DeleteAll(); | 303 CodeObservers::DeleteAll(); |
295 Timeline::Shutdown(); | 304 if (FLAG_support_timeline) { |
| 305 Timeline::Shutdown(); |
| 306 } |
296 | 307 |
297 return NULL; | 308 return NULL; |
298 } | 309 } |
299 | 310 |
300 | 311 |
301 Isolate* Dart::CreateIsolate(const char* name_prefix, | 312 Isolate* Dart::CreateIsolate(const char* name_prefix, |
302 const Dart_IsolateFlags& api_flags) { | 313 const Dart_IsolateFlags& api_flags) { |
303 // Create a new isolate. | 314 // Create a new isolate. |
304 Isolate* isolate = Isolate::Init(name_prefix, api_flags); | 315 Isolate* isolate = Isolate::Init(name_prefix, api_flags); |
305 return isolate; | 316 return isolate; |
306 } | 317 } |
307 | 318 |
308 | 319 |
309 RawError* Dart::InitializeIsolate(const uint8_t* snapshot_buffer, void* data) { | 320 RawError* Dart::InitializeIsolate(const uint8_t* snapshot_buffer, void* data) { |
310 // Initialize the new isolate. | 321 // Initialize the new isolate. |
311 Thread* T = Thread::Current(); | 322 Thread* T = Thread::Current(); |
312 Isolate* I = T->isolate(); | 323 Isolate* I = T->isolate(); |
| 324 #ifndef PRODUCT |
313 TimelineDurationScope tds(T, I->GetIsolateStream(), "InitializeIsolate"); | 325 TimelineDurationScope tds(T, I->GetIsolateStream(), "InitializeIsolate"); |
314 tds.SetNumArguments(1); | 326 tds.SetNumArguments(1); |
315 tds.CopyArgument(0, "isolateName", I->name()); | 327 tds.CopyArgument(0, "isolateName", I->name()); |
316 | 328 #endif // !PRODUCT |
317 ASSERT(I != NULL); | 329 ASSERT(I != NULL); |
318 StackZone zone(T); | 330 StackZone zone(T); |
319 HandleScope handle_scope(T); | 331 HandleScope handle_scope(T); |
320 { | 332 { |
| 333 #ifndef PRODUCT |
321 TimelineDurationScope tds(T, I->GetIsolateStream(), "ObjectStore::Init"); | 334 TimelineDurationScope tds(T, I->GetIsolateStream(), "ObjectStore::Init"); |
| 335 #endif // !PRODUCT |
322 ObjectStore::Init(I); | 336 ObjectStore::Init(I); |
323 } | 337 } |
324 | 338 |
325 const Error& error = Error::Handle(Object::Init(I)); | 339 const Error& error = Error::Handle(Object::Init(I)); |
326 if (!error.IsNull()) { | 340 if (!error.IsNull()) { |
327 return error.raw(); | 341 return error.raw(); |
328 } | 342 } |
329 if (snapshot_buffer != NULL) { | 343 if (snapshot_buffer != NULL) { |
330 // Read the snapshot and setup the initial state. | 344 // Read the snapshot and setup the initial state. |
| 345 #ifndef PRODUCT |
331 TimelineDurationScope tds( | 346 TimelineDurationScope tds( |
332 T, I->GetIsolateStream(), "IsolateSnapshotReader"); | 347 T, I->GetIsolateStream(), "IsolateSnapshotReader"); |
| 348 #endif // !PRODUCT |
333 // TODO(turnidge): Remove once length is not part of the snapshot. | 349 // TODO(turnidge): Remove once length is not part of the snapshot. |
334 const Snapshot* snapshot = Snapshot::SetupFromBuffer(snapshot_buffer); | 350 const Snapshot* snapshot = Snapshot::SetupFromBuffer(snapshot_buffer); |
335 if (snapshot == NULL) { | 351 if (snapshot == NULL) { |
336 const String& message = String::Handle( | 352 const String& message = String::Handle( |
337 String::New("Invalid snapshot.")); | 353 String::New("Invalid snapshot.")); |
338 return ApiError::New(message); | 354 return ApiError::New(message); |
339 } | 355 } |
340 ASSERT(snapshot->kind() == Snapshot::kFull); | 356 ASSERT(snapshot->kind() == Snapshot::kFull); |
341 if (FLAG_trace_isolates) { | 357 if (FLAG_trace_isolates) { |
342 OS::Print("Size of isolate snapshot = %" Pd "\n", snapshot->length()); | 358 OS::Print("Size of isolate snapshot = %" Pd "\n", snapshot->length()); |
(...skipping 17 matching lines...) Expand all Loading... |
360 // read into the VM isolate. | 376 // read into the VM isolate. |
361 Symbols::AddPredefinedSymbolsToIsolate(); | 377 Symbols::AddPredefinedSymbolsToIsolate(); |
362 } | 378 } |
363 | 379 |
364 Object::VerifyBuiltinVtables(); | 380 Object::VerifyBuiltinVtables(); |
365 #if defined(DEBUG) | 381 #if defined(DEBUG) |
366 I->heap()->Verify(kForbidMarked); | 382 I->heap()->Verify(kForbidMarked); |
367 #endif | 383 #endif |
368 | 384 |
369 { | 385 { |
| 386 #ifndef PRODUCT |
370 TimelineDurationScope tds(T, I->GetIsolateStream(), "StubCode::Init"); | 387 TimelineDurationScope tds(T, I->GetIsolateStream(), "StubCode::Init"); |
| 388 #endif // !PRODUCT |
371 StubCode::Init(I); | 389 StubCode::Init(I); |
372 } | 390 } |
373 | 391 |
374 // When running precompiled, the megamorphic miss function/code comes from the | 392 // When running precompiled, the megamorphic miss function/code comes from the |
375 // snapshot. | 393 // snapshot. |
376 if (!Dart::IsRunningPrecompiledCode()) { | 394 if (!Dart::IsRunningPrecompiledCode()) { |
377 MegamorphicCacheTable::InitMissHandler(I); | 395 MegamorphicCacheTable::InitMissHandler(I); |
378 } | 396 } |
379 const Code& miss_code = | 397 const Code& miss_code = |
380 Code::Handle(I->object_store()->megamorphic_miss_code()); | 398 Code::Handle(I->object_store()->megamorphic_miss_code()); |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
467 return predefined_handles_->handles_.IsValidScopedHandle(address); | 485 return predefined_handles_->handles_.IsValidScopedHandle(address); |
468 } | 486 } |
469 | 487 |
470 | 488 |
471 bool Dart::IsReadOnlyApiHandle(Dart_Handle handle) { | 489 bool Dart::IsReadOnlyApiHandle(Dart_Handle handle) { |
472 ASSERT(predefined_handles_ != NULL); | 490 ASSERT(predefined_handles_ != NULL); |
473 return predefined_handles_->api_handles_.IsValidHandle(handle); | 491 return predefined_handles_->api_handles_.IsValidHandle(handle); |
474 } | 492 } |
475 | 493 |
476 } // namespace dart | 494 } // namespace dart |
OLD | NEW |