| 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 131 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 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_ = ILLEGAL_PORT; | 150 Dart_Port ServiceIsolate::port_ = ILLEGAL_PORT; | 
| 151 Dart_Port ServiceIsolate::load_port_ = ILLEGAL_PORT; | 151 Dart_Port ServiceIsolate::load_port_ = ILLEGAL_PORT; | 
|  | 152 Dart_Port ServiceIsolate::origin_ = ILLEGAL_PORT; | 
| 152 Dart_IsolateCreateCallback ServiceIsolate::create_callback_ = NULL; | 153 Dart_IsolateCreateCallback ServiceIsolate::create_callback_ = NULL; | 
| 153 uint8_t* ServiceIsolate::exit_message_ = NULL; | 154 uint8_t* ServiceIsolate::exit_message_ = NULL; | 
| 154 intptr_t ServiceIsolate::exit_message_length_ = 0; | 155 intptr_t ServiceIsolate::exit_message_length_ = 0; | 
| 155 Monitor* ServiceIsolate::monitor_ = NULL; | 156 Monitor* ServiceIsolate::monitor_ = NULL; | 
| 156 bool ServiceIsolate::initializing_ = true; | 157 bool ServiceIsolate::initializing_ = true; | 
| 157 bool ServiceIsolate::shutting_down_ = false; | 158 bool ServiceIsolate::shutting_down_ = false; | 
| 158 | 159 | 
| 159 | 160 | 
| 160 class RegisterRunningIsolatesVisitor : public IsolateVisitor { | 161 class RegisterRunningIsolatesVisitor : public IsolateVisitor { | 
| 161  public: | 162  public: | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 173     // Get function. | 174     // Get function. | 
| 174     const String& function_name = | 175     const String& function_name = | 
| 175         String::Handle(String::New("_registerIsolate")); | 176         String::Handle(String::New("_registerIsolate")); | 
| 176     ASSERT(!function_name.IsNull()); | 177     ASSERT(!function_name.IsNull()); | 
| 177     register_function_ = library.LookupFunctionAllowPrivate(function_name); | 178     register_function_ = library.LookupFunctionAllowPrivate(function_name); | 
| 178     ASSERT(!register_function_.IsNull()); | 179     ASSERT(!register_function_.IsNull()); | 
| 179   } | 180   } | 
| 180 | 181 | 
| 181   virtual void VisitIsolate(Isolate* isolate) { | 182   virtual void VisitIsolate(Isolate* isolate) { | 
| 182     ASSERT(ServiceIsolate::IsServiceIsolate(Isolate::Current())); | 183     ASSERT(ServiceIsolate::IsServiceIsolate(Isolate::Current())); | 
| 183     if (ServiceIsolate::IsServiceIsolate(isolate) || | 184     if (ServiceIsolate::IsServiceIsolateDescendant(isolate) || | 
| 184         (isolate == Dart::vm_isolate())) { | 185         (isolate == Dart::vm_isolate())) { | 
| 185       // We do not register the service or vm isolate. | 186       // We do not register the service (and descendants) or the vm-isolate. | 
| 186       return; | 187       return; | 
| 187     } | 188     } | 
| 188     // Setup arguments for call. | 189     // Setup arguments for call. | 
| 189     Dart_Port port_id = isolate->main_port(); | 190     Dart_Port port_id = isolate->main_port(); | 
| 190     const Integer& port_int = Integer::Handle(Integer::New(port_id)); | 191     const Integer& port_int = Integer::Handle(Integer::New(port_id)); | 
| 191     ASSERT(!port_int.IsNull()); | 192     ASSERT(!port_int.IsNull()); | 
| 192     const SendPort& send_port = SendPort::Handle(SendPort::New(port_id)); | 193     const SendPort& send_port = SendPort::Handle(SendPort::New(port_id)); | 
| 193     const String& name = String::Handle(String::New(isolate->name())); | 194     const String& name = String::Handle(String::New(isolate->name())); | 
| 194     ASSERT(!name.IsNull()); | 195     ASSERT(!name.IsNull()); | 
| 195     const Array& args = Array::Handle(Array::New(3)); | 196     const Array& args = Array::Handle(Array::New(3)); | 
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 370   return (port_ != ILLEGAL_PORT) && (isolate_ != NULL); | 371   return (port_ != ILLEGAL_PORT) && (isolate_ != NULL); | 
| 371 } | 372 } | 
| 372 | 373 | 
| 373 | 374 | 
| 374 bool ServiceIsolate::IsServiceIsolate(Isolate* isolate) { | 375 bool ServiceIsolate::IsServiceIsolate(Isolate* isolate) { | 
| 375   MonitorLocker ml(monitor_); | 376   MonitorLocker ml(monitor_); | 
| 376   return isolate == isolate_; | 377   return isolate == isolate_; | 
| 377 } | 378 } | 
| 378 | 379 | 
| 379 | 380 | 
|  | 381 bool ServiceIsolate::IsServiceIsolateDescendant(Isolate* isolate) { | 
|  | 382   MonitorLocker ml(monitor_); | 
|  | 383   return isolate->origin_id() == origin_; | 
|  | 384 } | 
|  | 385 | 
|  | 386 | 
| 380 Dart_Port ServiceIsolate::Port() { | 387 Dart_Port ServiceIsolate::Port() { | 
| 381   MonitorLocker ml(monitor_); | 388   MonitorLocker ml(monitor_); | 
| 382   return port_; | 389   return port_; | 
| 383 } | 390 } | 
| 384 | 391 | 
| 385 | 392 | 
| 386 Dart_Port ServiceIsolate::WaitForLoadPort() { | 393 Dart_Port ServiceIsolate::WaitForLoadPort() { | 
| 387   MonitorLocker ml(monitor_); | 394   MonitorLocker ml(monitor_); | 
| 388 | 395 | 
| 389   while (initializing_ && (load_port_ == ILLEGAL_PORT)) { | 396   while (initializing_ && (load_port_ == ILLEGAL_PORT)) { | 
| 390     ml.Wait(); | 397     ml.Wait(); | 
| 391   } | 398   } | 
| 392 | 399 | 
| 393   return load_port_; | 400   return load_port_; | 
| 394 } | 401 } | 
| 395 | 402 | 
| 396 | 403 | 
| 397 Dart_Port ServiceIsolate::LoadPort() { | 404 Dart_Port ServiceIsolate::LoadPort() { | 
| 398   MonitorLocker ml(monitor_); | 405   MonitorLocker ml(monitor_); | 
| 399   return load_port_; | 406   return load_port_; | 
| 400 } | 407 } | 
| 401 | 408 | 
| 402 | 409 | 
| 403 bool ServiceIsolate::SendIsolateStartupMessage() { | 410 bool ServiceIsolate::SendIsolateStartupMessage() { | 
| 404   if (!IsRunning()) { | 411   if (!IsRunning()) { | 
| 405     return false; | 412     return false; | 
| 406   } | 413   } | 
| 407   Isolate* isolate = Isolate::Current(); | 414   Isolate* isolate = Isolate::Current(); | 
| 408   if (IsServiceIsolate(isolate)) { | 415   if (IsServiceIsolateDescendant(isolate)) { | 
| 409     return false; | 416     return false; | 
| 410   } | 417   } | 
| 411   ASSERT(isolate != NULL); | 418   ASSERT(isolate != NULL); | 
| 412   HANDLESCOPE(isolate); | 419   HANDLESCOPE(isolate); | 
| 413   const String& name = String::Handle(String::New(isolate->name())); | 420   const String& name = String::Handle(String::New(isolate->name())); | 
| 414   ASSERT(!name.IsNull()); | 421   ASSERT(!name.IsNull()); | 
| 415   const Array& list = Array::Handle( | 422   const Array& list = Array::Handle( | 
| 416       MakeServiceControlMessage(Dart_GetMainPortId(), | 423       MakeServiceControlMessage(Dart_GetMainPortId(), | 
| 417                                 VM_SERVICE_ISOLATE_STARTUP_MESSAGE_ID, | 424                                 VM_SERVICE_ISOLATE_STARTUP_MESSAGE_ID, | 
| 418                                 name)); | 425                                 name)); | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 429   return PortMap::PostMessage( | 436   return PortMap::PostMessage( | 
| 430       new Message(port_, data, len, Message::kNormalPriority)); | 437       new Message(port_, data, len, Message::kNormalPriority)); | 
| 431 } | 438 } | 
| 432 | 439 | 
| 433 | 440 | 
| 434 bool ServiceIsolate::SendIsolateShutdownMessage() { | 441 bool ServiceIsolate::SendIsolateShutdownMessage() { | 
| 435   if (!IsRunning()) { | 442   if (!IsRunning()) { | 
| 436     return false; | 443     return false; | 
| 437   } | 444   } | 
| 438   Isolate* isolate = Isolate::Current(); | 445   Isolate* isolate = Isolate::Current(); | 
| 439   if (IsServiceIsolate(isolate)) { | 446   if (IsServiceIsolateDescendant(isolate)) { | 
| 440     return false; | 447     return false; | 
| 441   } | 448   } | 
| 442   ASSERT(isolate != NULL); | 449   ASSERT(isolate != NULL); | 
| 443   HANDLESCOPE(isolate); | 450   HANDLESCOPE(isolate); | 
| 444   const String& name = String::Handle(String::New(isolate->name())); | 451   const String& name = String::Handle(String::New(isolate->name())); | 
| 445   ASSERT(!name.IsNull()); | 452   ASSERT(!name.IsNull()); | 
| 446   const Array& list = Array::Handle( | 453   const Array& list = Array::Handle( | 
| 447       MakeServiceControlMessage(Dart_GetMainPortId(), | 454       MakeServiceControlMessage(Dart_GetMainPortId(), | 
| 448                                 VM_SERVICE_ISOLATE_SHUTDOWN_MESSAGE_ID, | 455                                 VM_SERVICE_ISOLATE_SHUTDOWN_MESSAGE_ID, | 
| 449                                 name)); | 456                                 name)); | 
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 483   MonitorLocker ml(monitor_); | 490   MonitorLocker ml(monitor_); | 
| 484   port_ = port; | 491   port_ = port; | 
| 485 } | 492 } | 
| 486 | 493 | 
| 487 | 494 | 
| 488 void ServiceIsolate::SetServiceIsolate(Isolate* isolate) { | 495 void ServiceIsolate::SetServiceIsolate(Isolate* isolate) { | 
| 489   MonitorLocker ml(monitor_); | 496   MonitorLocker ml(monitor_); | 
| 490   isolate_ = isolate; | 497   isolate_ = isolate; | 
| 491   if (isolate_ != NULL) { | 498   if (isolate_ != NULL) { | 
| 492     isolate_->is_service_isolate_ = true; | 499     isolate_->is_service_isolate_ = true; | 
|  | 500     origin_ = isolate_->origin_id(); | 
|  | 501   } else { | 
|  | 502     origin_ = ILLEGAL_PORT; | 
| 493   } | 503   } | 
| 494 } | 504 } | 
| 495 | 505 | 
| 496 void ServiceIsolate::SetLoadPort(Dart_Port port) { | 506 void ServiceIsolate::SetLoadPort(Dart_Port port) { | 
| 497   MonitorLocker ml(monitor_); | 507   MonitorLocker ml(monitor_); | 
| 498   load_port_ = port; | 508   load_port_ = port; | 
| 499 } | 509 } | 
| 500 | 510 | 
| 501 | 511 | 
| 502 void ServiceIsolate::MaybeInjectVMServiceLibrary(Isolate* isolate) { | 512 void ServiceIsolate::MaybeInjectVMServiceLibrary(Isolate* isolate) { | 
| (...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 773     return result; | 783     return result; | 
| 774   } | 784   } | 
| 775   Dart_Handle source = GetSource(url_string); | 785   Dart_Handle source = GetSource(url_string); | 
| 776   if (Dart_IsError(source)) { | 786   if (Dart_IsError(source)) { | 
| 777     return source; | 787     return source; | 
| 778   } | 788   } | 
| 779   return Dart_LoadSource(library, url, source, 0, 0); | 789   return Dart_LoadSource(library, url, source, 0, 0); | 
| 780 } | 790 } | 
| 781 | 791 | 
| 782 }  // namespace dart | 792 }  // namespace dart | 
| OLD | NEW | 
|---|