| 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 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 102 | 102 |
| 103 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) { | 103 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) { |
| 104 void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size); | 104 void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size); |
| 105 return reinterpret_cast<uint8_t*>(new_ptr); | 105 return reinterpret_cast<uint8_t*>(new_ptr); |
| 106 } | 106 } |
| 107 | 107 |
| 108 | 108 |
| 109 static Dart_Port ExtractPort(Isolate* isolate, Dart_Handle receivePort) { | 109 static Dart_Port ExtractPort(Isolate* isolate, Dart_Handle receivePort) { |
| 110 const ReceivePort& rp = Api::UnwrapReceivePortHandle(isolate, receivePort); | 110 const ReceivePort& rp = Api::UnwrapReceivePortHandle(isolate, receivePort); |
| 111 if (rp.IsNull()) { | 111 if (rp.IsNull()) { |
| 112 return DART_ILLEGAL_PORT; | 112 return ILLEGAL_PORT; |
| 113 } | 113 } |
| 114 return rp.Id(); | 114 return rp.Id(); |
| 115 } | 115 } |
| 116 | 116 |
| 117 | 117 |
| 118 // These must be kept in sync with service/constants.dart | 118 // These must be kept in sync with service/constants.dart |
| 119 #define VM_SERVICE_ISOLATE_EXIT_MESSAGE_ID 0 | 119 #define VM_SERVICE_ISOLATE_EXIT_MESSAGE_ID 0 |
| 120 #define VM_SERVICE_ISOLATE_STARTUP_MESSAGE_ID 1 | 120 #define VM_SERVICE_ISOLATE_STARTUP_MESSAGE_ID 1 |
| 121 #define VM_SERVICE_ISOLATE_SHUTDOWN_MESSAGE_ID 2 | 121 #define VM_SERVICE_ISOLATE_SHUTDOWN_MESSAGE_ID 2 |
| 122 | 122 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 140 ASSERT(!list.IsNull()); | 140 ASSERT(!list.IsNull()); |
| 141 const intptr_t code = VM_SERVICE_ISOLATE_EXIT_MESSAGE_ID; | 141 const intptr_t code = VM_SERVICE_ISOLATE_EXIT_MESSAGE_ID; |
| 142 const Integer& code_int = Integer::Handle(Integer::New(code)); | 142 const Integer& code_int = Integer::Handle(Integer::New(code)); |
| 143 list.SetAt(0, code_int); | 143 list.SetAt(0, code_int); |
| 144 return list.raw(); | 144 return list.raw(); |
| 145 } | 145 } |
| 146 | 146 |
| 147 | 147 |
| 148 const char* ServiceIsolate::kName = "vm-service"; | 148 const char* ServiceIsolate::kName = "vm-service"; |
| 149 Isolate* ServiceIsolate::isolate_ = NULL; | 149 Isolate* ServiceIsolate::isolate_ = NULL; |
| 150 Dart_Port ServiceIsolate::port_ = DART_ILLEGAL_PORT; | 150 Dart_Port ServiceIsolate::port_ = ILLEGAL_PORT; |
| 151 Dart_Port ServiceIsolate::load_port_ = DART_ILLEGAL_PORT; | 151 Dart_Port ServiceIsolate::load_port_ = ILLEGAL_PORT; |
| 152 Dart_Port ServiceIsolate::origin_ = DART_ILLEGAL_PORT; | 152 Dart_Port ServiceIsolate::origin_ = ILLEGAL_PORT; |
| 153 Dart_IsolateCreateCallback ServiceIsolate::create_callback_ = NULL; | 153 Dart_IsolateCreateCallback ServiceIsolate::create_callback_ = NULL; |
| 154 uint8_t* ServiceIsolate::exit_message_ = NULL; | 154 uint8_t* ServiceIsolate::exit_message_ = NULL; |
| 155 intptr_t ServiceIsolate::exit_message_length_ = 0; | 155 intptr_t ServiceIsolate::exit_message_length_ = 0; |
| 156 Monitor* ServiceIsolate::monitor_ = NULL; | 156 Monitor* ServiceIsolate::monitor_ = NULL; |
| 157 bool ServiceIsolate::initializing_ = true; | 157 bool ServiceIsolate::initializing_ = true; |
| 158 bool ServiceIsolate::shutting_down_ = false; | 158 bool ServiceIsolate::shutting_down_ = false; |
| 159 | 159 |
| 160 | 160 |
| 161 class RegisterRunningIsolatesVisitor : public IsolateVisitor { | 161 class RegisterRunningIsolatesVisitor : public IsolateVisitor { |
| 162 public: | 162 public: |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 263 // Boot the dart:vmservice library. | 263 // Boot the dart:vmservice library. |
| 264 Dart_EnterScope(); | 264 Dart_EnterScope(); |
| 265 Dart_Handle url_str = | 265 Dart_Handle url_str = |
| 266 Dart_NewStringFromCString(Symbols::Name(Symbols::kDartVMServiceId)); | 266 Dart_NewStringFromCString(Symbols::Name(Symbols::kDartVMServiceId)); |
| 267 Dart_Handle library = Dart_LookupLibrary(url_str); | 267 Dart_Handle library = Dart_LookupLibrary(url_str); |
| 268 ASSERT(Dart_IsLibrary(library)); | 268 ASSERT(Dart_IsLibrary(library)); |
| 269 Dart_Handle result = | 269 Dart_Handle result = |
| 270 Dart_Invoke(library, Dart_NewStringFromCString("boot"), 0, NULL); | 270 Dart_Invoke(library, Dart_NewStringFromCString("boot"), 0, NULL); |
| 271 ASSERT(!Dart_IsError(result)); | 271 ASSERT(!Dart_IsError(result)); |
| 272 Dart_Port port = ExtractPort(isolate, result); | 272 Dart_Port port = ExtractPort(isolate, result); |
| 273 ASSERT(port != DART_ILLEGAL_PORT); | 273 ASSERT(port != ILLEGAL_PORT); |
| 274 ServiceIsolate::SetServicePort(port); | 274 ServiceIsolate::SetServicePort(port); |
| 275 Dart_ExitScope(); | 275 Dart_ExitScope(); |
| 276 } | 276 } |
| 277 | 277 |
| 278 { | 278 { |
| 279 if (FLAG_trace_service) { | 279 if (FLAG_trace_service) { |
| 280 OS::Print("vm-service: Registering running isolates.\n"); | 280 OS::Print("vm-service: Registering running isolates.\n"); |
| 281 } | 281 } |
| 282 // Register running isolates with service. | 282 // Register running isolates with service. |
| 283 RegisterRunningIsolatesVisitor register_isolates(isolate); | 283 RegisterRunningIsolatesVisitor register_isolates(isolate); |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 349 | 349 |
| 350 | 350 |
| 351 bool ServiceIsolate::Exists() { | 351 bool ServiceIsolate::Exists() { |
| 352 MonitorLocker ml(monitor_); | 352 MonitorLocker ml(monitor_); |
| 353 return isolate_ != NULL; | 353 return isolate_ != NULL; |
| 354 } | 354 } |
| 355 | 355 |
| 356 | 356 |
| 357 bool ServiceIsolate::IsRunning() { | 357 bool ServiceIsolate::IsRunning() { |
| 358 MonitorLocker ml(monitor_); | 358 MonitorLocker ml(monitor_); |
| 359 return (port_ != DART_ILLEGAL_PORT) && (isolate_ != NULL); | 359 return (port_ != ILLEGAL_PORT) && (isolate_ != NULL); |
| 360 } | 360 } |
| 361 | 361 |
| 362 | 362 |
| 363 bool ServiceIsolate::IsServiceIsolate(Isolate* isolate) { | 363 bool ServiceIsolate::IsServiceIsolate(Isolate* isolate) { |
| 364 MonitorLocker ml(monitor_); | 364 MonitorLocker ml(monitor_); |
| 365 return isolate == isolate_; | 365 return isolate == isolate_; |
| 366 } | 366 } |
| 367 | 367 |
| 368 | 368 |
| 369 bool ServiceIsolate::IsServiceIsolateDescendant(Isolate* isolate) { | 369 bool ServiceIsolate::IsServiceIsolateDescendant(Isolate* isolate) { |
| 370 MonitorLocker ml(monitor_); | 370 MonitorLocker ml(monitor_); |
| 371 return isolate->origin_id() == origin_; | 371 return isolate->origin_id() == origin_; |
| 372 } | 372 } |
| 373 | 373 |
| 374 | 374 |
| 375 Dart_Port ServiceIsolate::Port() { | 375 Dart_Port ServiceIsolate::Port() { |
| 376 MonitorLocker ml(monitor_); | 376 MonitorLocker ml(monitor_); |
| 377 return port_; | 377 return port_; |
| 378 } | 378 } |
| 379 | 379 |
| 380 | 380 |
| 381 Dart_Port ServiceIsolate::WaitForLoadPort() { | 381 Dart_Port ServiceIsolate::WaitForLoadPort() { |
| 382 MonitorLocker ml(monitor_); | 382 MonitorLocker ml(monitor_); |
| 383 | 383 |
| 384 while (initializing_ && (load_port_ == DART_ILLEGAL_PORT)) { | 384 while (initializing_ && (load_port_ == ILLEGAL_PORT)) { |
| 385 ml.Wait(); | 385 ml.Wait(); |
| 386 } | 386 } |
| 387 | 387 |
| 388 return load_port_; | 388 return load_port_; |
| 389 } | 389 } |
| 390 | 390 |
| 391 | 391 |
| 392 Dart_Port ServiceIsolate::LoadPort() { | 392 Dart_Port ServiceIsolate::LoadPort() { |
| 393 MonitorLocker ml(monitor_); | 393 MonitorLocker ml(monitor_); |
| 394 return load_port_; | 394 return load_port_; |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 480 } | 480 } |
| 481 | 481 |
| 482 | 482 |
| 483 void ServiceIsolate::SetServiceIsolate(Isolate* isolate) { | 483 void ServiceIsolate::SetServiceIsolate(Isolate* isolate) { |
| 484 MonitorLocker ml(monitor_); | 484 MonitorLocker ml(monitor_); |
| 485 isolate_ = isolate; | 485 isolate_ = isolate; |
| 486 if (isolate_ != NULL) { | 486 if (isolate_ != NULL) { |
| 487 isolate_->is_service_isolate_ = true; | 487 isolate_->is_service_isolate_ = true; |
| 488 origin_ = isolate_->origin_id(); | 488 origin_ = isolate_->origin_id(); |
| 489 } else { | 489 } else { |
| 490 origin_ = DART_ILLEGAL_PORT; | 490 origin_ = ILLEGAL_PORT; |
| 491 } | 491 } |
| 492 } | 492 } |
| 493 | 493 |
| 494 void ServiceIsolate::SetLoadPort(Dart_Port port) { | 494 void ServiceIsolate::SetLoadPort(Dart_Port port) { |
| 495 MonitorLocker ml(monitor_); | 495 MonitorLocker ml(monitor_); |
| 496 load_port_ = port; | 496 load_port_ = port; |
| 497 } | 497 } |
| 498 | 498 |
| 499 | 499 |
| 500 void ServiceIsolate::MaybeInjectVMServiceLibrary(Isolate* isolate) { | 500 void ServiceIsolate::MaybeInjectVMServiceLibrary(Isolate* isolate) { |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 594 | 594 |
| 595 Dart_IsolateCreateCallback create_callback = | 595 Dart_IsolateCreateCallback create_callback = |
| 596 ServiceIsolate::create_callback(); | 596 ServiceIsolate::create_callback(); |
| 597 // TODO(johnmccutchan): Support starting up service isolate without embedder | 597 // TODO(johnmccutchan): Support starting up service isolate without embedder |
| 598 // provided isolate creation callback. | 598 // provided isolate creation callback. |
| 599 if (create_callback == NULL) { | 599 if (create_callback == NULL) { |
| 600 ServiceIsolate::FinishedInitializing(); | 600 ServiceIsolate::FinishedInitializing(); |
| 601 return; | 601 return; |
| 602 } | 602 } |
| 603 | 603 |
| 604 isolate = Api::CastIsolate(create_callback(ServiceIsolate::kName, | 604 isolate = |
| 605 NULL, | 605 reinterpret_cast<Isolate*>(create_callback(ServiceIsolate::kName, |
| 606 NULL, | 606 NULL, |
| 607 NULL, | 607 NULL, |
| 608 &error)); | 608 NULL, |
| 609 &error)); |
| 609 if (isolate == NULL) { | 610 if (isolate == NULL) { |
| 610 OS::PrintErr("vm-service: Isolate creation error: %s\n", error); | 611 OS::PrintErr("vm-service: Isolate creation error: %s\n", error); |
| 611 ServiceIsolate::FinishedInitializing(); | 612 ServiceIsolate::FinishedInitializing(); |
| 612 return; | 613 return; |
| 613 } | 614 } |
| 614 | 615 |
| 615 Thread::ExitIsolate(); | 616 Thread::ExitIsolate(); |
| 616 | 617 |
| 617 ServiceIsolate::ConstructExitMessageAndCache(isolate); | 618 ServiceIsolate::ConstructExitMessageAndCache(isolate); |
| 618 | 619 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 642 OS::PrintErr("vm-service: Error: %s\n", error.ToErrorCString()); | 643 OS::PrintErr("vm-service: Error: %s\n", error.ToErrorCString()); |
| 643 } | 644 } |
| 644 Dart::RunShutdownCallback(); | 645 Dart::RunShutdownCallback(); |
| 645 } | 646 } |
| 646 { | 647 { |
| 647 // Shut the isolate down. | 648 // Shut the isolate down. |
| 648 SwitchIsolateScope switch_scope(isolate); | 649 SwitchIsolateScope switch_scope(isolate); |
| 649 Dart::ShutdownIsolate(); | 650 Dart::ShutdownIsolate(); |
| 650 } | 651 } |
| 651 ServiceIsolate::SetServiceIsolate(NULL); | 652 ServiceIsolate::SetServiceIsolate(NULL); |
| 652 ServiceIsolate::SetServicePort(DART_ILLEGAL_PORT); | 653 ServiceIsolate::SetServicePort(ILLEGAL_PORT); |
| 653 if (FLAG_trace_service) { | 654 if (FLAG_trace_service) { |
| 654 OS::Print("vm-service: Shutdown.\n"); | 655 OS::Print("vm-service: Shutdown.\n"); |
| 655 } | 656 } |
| 656 ServiceIsolate::FinishedExiting(); | 657 ServiceIsolate::FinishedExiting(); |
| 657 } | 658 } |
| 658 | 659 |
| 659 void RunMain(Isolate* isolate) { | 660 void RunMain(Isolate* isolate) { |
| 660 StartIsolateScope iso_scope(isolate); | 661 StartIsolateScope iso_scope(isolate); |
| 661 StackZone zone(isolate); | 662 StackZone zone(isolate); |
| 662 HANDLESCOPE(isolate); | 663 HANDLESCOPE(isolate); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 720 if (!IsRunning()) { | 721 if (!IsRunning()) { |
| 721 return; | 722 return; |
| 722 } | 723 } |
| 723 { | 724 { |
| 724 MonitorLocker ml(monitor_); | 725 MonitorLocker ml(monitor_); |
| 725 shutting_down_ = true; | 726 shutting_down_ = true; |
| 726 } | 727 } |
| 727 SendServiceExitMessage(); | 728 SendServiceExitMessage(); |
| 728 { | 729 { |
| 729 MonitorLocker ml(monitor_); | 730 MonitorLocker ml(monitor_); |
| 730 while (shutting_down_ && (port_ != DART_ILLEGAL_PORT)) { | 731 while (shutting_down_ && (port_ != ILLEGAL_PORT)) { |
| 731 ml.Wait(); | 732 ml.Wait(); |
| 732 } | 733 } |
| 733 } | 734 } |
| 734 } | 735 } |
| 735 | 736 |
| 736 | 737 |
| 737 Dart_Handle ServiceIsolate::GetSource(const char* name) { | 738 Dart_Handle ServiceIsolate::GetSource(const char* name) { |
| 738 ASSERT(name != NULL); | 739 ASSERT(name != NULL); |
| 739 int i = 0; | 740 int i = 0; |
| 740 while (true) { | 741 while (true) { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 774 return result; | 775 return result; |
| 775 } | 776 } |
| 776 Dart_Handle source = GetSource(url_string); | 777 Dart_Handle source = GetSource(url_string); |
| 777 if (Dart_IsError(source)) { | 778 if (Dart_IsError(source)) { |
| 778 return source; | 779 return source; |
| 779 } | 780 } |
| 780 return Dart_LoadSource(library, url, source, 0, 0); | 781 return Dart_LoadSource(library, url, source, 0, 0); |
| 781 } | 782 } |
| 782 | 783 |
| 783 } // namespace dart | 784 } // namespace dart |
| OLD | NEW |