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 |