Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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/service_isolate.h" | 5 #include "vm/service_isolate.h" |
| 6 | 6 |
| 7 #include "vm/compiler.h" | 7 #include "vm/compiler.h" |
| 8 #include "vm/dart_api_impl.h" | 8 #include "vm/dart_api_impl.h" |
| 9 #include "vm/dart_entry.h" | 9 #include "vm/dart_entry.h" |
| 10 #include "vm/isolate.h" | 10 #include "vm/isolate.h" |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 248 // Service isolate already exists. | 248 // Service isolate already exists. |
| 249 return; | 249 return; |
| 250 } | 250 } |
| 251 SetServiceIsolate(I); | 251 SetServiceIsolate(I); |
| 252 } | 252 } |
| 253 | 253 |
| 254 | 254 |
| 255 void ServiceIsolate::ConstructExitMessageAndCache(Isolate* I) { | 255 void ServiceIsolate::ConstructExitMessageAndCache(Isolate* I) { |
| 256 // Construct and cache exit message here so we can send it without needing an | 256 // Construct and cache exit message here so we can send it without needing an |
| 257 // isolate. | 257 // isolate. |
| 258 StartIsolateScope iso_scope(I); | |
| 259 Thread* T = Thread::Current(); | 258 Thread* T = Thread::Current(); |
| 260 ASSERT(I == T->isolate()); | 259 ASSERT(I == T->isolate()); |
| 261 ASSERT(I != NULL); | 260 ASSERT(I != NULL); |
| 262 StackZone zone(T); | 261 StackZone zone(T); |
| 263 HANDLESCOPE(T); | 262 HANDLESCOPE(T); |
| 264 ASSERT(exit_message_ == NULL); | 263 ASSERT(exit_message_ == NULL); |
| 265 ASSERT(exit_message_length_ == 0); | 264 ASSERT(exit_message_length_ == 0); |
| 266 const Array& list = Array::Handle(Z, MakeServiceExitMessage()); | 265 const Array& list = Array::Handle(Z, MakeServiceExitMessage()); |
| 267 ASSERT(!list.IsNull()); | 266 ASSERT(!list.IsNull()); |
| 268 MessageWriter writer(&exit_message_, &allocator, false); | 267 MessageWriter writer(&exit_message_, &allocator, false); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 317 &api_flags, | 316 &api_flags, |
| 318 NULL, | 317 NULL, |
| 319 &error)); | 318 &error)); |
| 320 if (isolate == NULL) { | 319 if (isolate == NULL) { |
| 321 OS::PrintErr("vm-service: Isolate creation error: %s\n", error); | 320 OS::PrintErr("vm-service: Isolate creation error: %s\n", error); |
| 322 ServiceIsolate::SetServiceIsolate(NULL); | 321 ServiceIsolate::SetServiceIsolate(NULL); |
| 323 ServiceIsolate::FinishedInitializing(); | 322 ServiceIsolate::FinishedInitializing(); |
| 324 return; | 323 return; |
| 325 } | 324 } |
| 326 | 325 |
| 327 | 326 { |
| 328 Thread::ExitIsolate(); | 327 ASSERT(Isolate::Current() == NULL); |
| 329 | 328 StartIsolateScope start_scope(isolate); |
| 330 ServiceIsolate::ConstructExitMessageAndCache(isolate); | 329 ServiceIsolate::ConstructExitMessageAndCache(isolate); |
| 331 | 330 RunMain(isolate); |
| 332 RunMain(isolate); | 331 } |
| 333 | 332 |
| 334 ServiceIsolate::FinishedInitializing(); | 333 ServiceIsolate::FinishedInitializing(); |
| 335 | 334 |
| 336 isolate->message_handler()->Run(Dart::thread_pool(), | 335 isolate->message_handler()->Run(Dart::thread_pool(), |
| 337 NULL, | 336 NULL, |
| 338 ShutdownIsolate, | 337 ShutdownIsolate, |
| 339 reinterpret_cast<uword>(isolate)); | 338 reinterpret_cast<uword>(isolate)); |
| 340 } | 339 } |
| 341 | 340 |
| 342 protected: | 341 protected: |
| 343 static void ShutdownIsolate(uword parameter) { | 342 static void ShutdownIsolate(uword parameter) { |
| 344 Isolate* I = reinterpret_cast<Isolate*>(parameter); | 343 Isolate* I = reinterpret_cast<Isolate*>(parameter); |
| 345 ASSERT(ServiceIsolate::IsServiceIsolate(I)); | 344 ASSERT(ServiceIsolate::IsServiceIsolate(I)); |
| 346 ServiceIsolate::SetServiceIsolate(NULL); | 345 ServiceIsolate::SetServiceIsolate(NULL); |
| 347 ServiceIsolate::SetServicePort(ILLEGAL_PORT); | 346 ServiceIsolate::SetServicePort(ILLEGAL_PORT); |
| 348 { | 347 { |
| 349 // Print the error if there is one. This may execute dart code to | 348 // Print the error if there is one. This may execute dart code to |
| 350 // print the exception object, so we need to use a StartIsolateScope. | 349 // print the exception object, so we need to use a StartIsolateScope. |
| 350 ASSERT(Isolate::Current() == NULL); | |
| 351 StartIsolateScope start_scope(I); | 351 StartIsolateScope start_scope(I); |
| 352 Thread* T = Thread::Current(); | 352 Thread* T = Thread::Current(); |
| 353 ASSERT(I == T->isolate()); | 353 ASSERT(I == T->isolate()); |
| 354 StackZone zone(T); | 354 StackZone zone(T); |
| 355 HandleScope handle_scope(T); | 355 HandleScope handle_scope(T); |
|
zra
2015/10/30 04:47:50
Calling Dart::ShutdownIsolate() inside of a Handle
| |
| 356 Error& error = Error::Handle(Z); | 356 Error& error = Error::Handle(Z); |
| 357 error = I->object_store()->sticky_error(); | 357 error = I->object_store()->sticky_error(); |
| 358 if (!error.IsNull() && !error.IsUnwindError()) { | 358 if (!error.IsNull() && !error.IsUnwindError()) { |
| 359 OS::PrintErr("vm-service: Error: %s\n", error.ToErrorCString()); | 359 OS::PrintErr("vm-service: Error: %s\n", error.ToErrorCString()); |
| 360 } | 360 } |
| 361 Dart::RunShutdownCallback(); | 361 Dart::RunShutdownCallback(); |
| 362 } | 362 |
| 363 { | |
| 364 // Shut the isolate down. | 363 // Shut the isolate down. |
| 365 SwitchIsolateScope switch_scope(I); | |
| 366 Dart::ShutdownIsolate(); | 364 Dart::ShutdownIsolate(); |
| 367 } | 365 } |
| 368 if (FLAG_trace_service) { | 366 if (FLAG_trace_service) { |
| 369 OS::Print("vm-service: Shutdown.\n"); | 367 OS::Print("vm-service: Shutdown.\n"); |
| 370 } | 368 } |
| 371 ServiceIsolate::FinishedExiting(); | 369 ServiceIsolate::FinishedExiting(); |
| 372 } | 370 } |
| 373 | 371 |
| 374 void RunMain(Isolate* I) { | 372 void RunMain(Isolate* I) { |
| 375 if (Dart::IsRunningPrecompiledCode()) { | 373 if (Dart::IsRunningPrecompiledCode()) { |
| 376 // TODO(24651): Remove this. | 374 // TODO(24651): Remove this. |
| 377 return; | 375 return; |
| 378 } | 376 } |
| 379 | |
| 380 StartIsolateScope iso_scope(I); | |
| 381 Thread* T = Thread::Current(); | 377 Thread* T = Thread::Current(); |
| 382 ASSERT(I == T->isolate()); | 378 ASSERT(I == T->isolate()); |
| 383 StackZone zone(T); | 379 StackZone zone(T); |
| 384 HANDLESCOPE(T); | 380 HANDLESCOPE(T); |
| 385 // Invoke main which will return the loadScriptPort. | 381 // Invoke main which will return the loadScriptPort. |
| 386 const Library& root_library = Library::Handle(Z, | 382 const Library& root_library = Library::Handle(Z, |
| 387 I->object_store()->root_library()); | 383 I->object_store()->root_library()); |
| 388 if (root_library.IsNull()) { | 384 if (root_library.IsNull()) { |
| 389 if (FLAG_trace_service) { | 385 if (FLAG_trace_service) { |
| 390 OS::Print("vm-service: Embedder did not install a script."); | 386 OS::Print("vm-service: Embedder did not install a script."); |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 493 ASSERT(!result.IsNull()); | 489 ASSERT(!result.IsNull()); |
| 494 Dart_Port port = ILLEGAL_PORT; | 490 Dart_Port port = ILLEGAL_PORT; |
| 495 if (result.IsReceivePort()) { | 491 if (result.IsReceivePort()) { |
| 496 port = ReceivePort::Cast(result).Id(); | 492 port = ReceivePort::Cast(result).Id(); |
| 497 } | 493 } |
| 498 ASSERT(port != ILLEGAL_PORT); | 494 ASSERT(port != ILLEGAL_PORT); |
| 499 ServiceIsolate::SetServicePort(port); | 495 ServiceIsolate::SetServicePort(port); |
| 500 } | 496 } |
| 501 | 497 |
| 502 } // namespace dart | 498 } // namespace dart |
| OLD | NEW |