| 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/isolate.h" | 5 #include "vm/isolate.h" |
| 6 | 6 |
| 7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
| 8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
| 9 #include "platform/json.h" | 9 #include "platform/json.h" |
| 10 #include "vm/code_observers.h" | 10 #include "vm/code_observers.h" |
| 11 #include "vm/compiler_stats.h" | 11 #include "vm/compiler_stats.h" |
| 12 #include "vm/coverage.h" | 12 #include "vm/coverage.h" |
| 13 #include "vm/dart_api_state.h" | 13 #include "vm/dart_api_state.h" |
| 14 #include "vm/dart_entry.h" | 14 #include "vm/dart_entry.h" |
| 15 #include "vm/debugger.h" | 15 #include "vm/debugger.h" |
| 16 #include "vm/deopt_instructions.h" | 16 #include "vm/deopt_instructions.h" |
| 17 #include "vm/heap.h" | 17 #include "vm/heap.h" |
| 18 #include "vm/lockers.h" | 18 #include "vm/lockers.h" |
| 19 #include "vm/log.h" |
| 19 #include "vm/message_handler.h" | 20 #include "vm/message_handler.h" |
| 20 #include "vm/object_id_ring.h" | 21 #include "vm/object_id_ring.h" |
| 21 #include "vm/object_store.h" | 22 #include "vm/object_store.h" |
| 22 #include "vm/parser.h" | 23 #include "vm/parser.h" |
| 23 #include "vm/port.h" | 24 #include "vm/port.h" |
| 24 #include "vm/profiler.h" | 25 #include "vm/profiler.h" |
| 25 #include "vm/reusable_handles.h" | 26 #include "vm/reusable_handles.h" |
| 26 #include "vm/service.h" | 27 #include "vm/service.h" |
| 27 #include "vm/simulator.h" | 28 #include "vm/simulator.h" |
| 28 #include "vm/stack_frame.h" | 29 #include "vm/stack_frame.h" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 39 | 40 |
| 40 DEFINE_FLAG(bool, trace_isolates, false, | 41 DEFINE_FLAG(bool, trace_isolates, false, |
| 41 "Trace isolate creation and shut down."); | 42 "Trace isolate creation and shut down."); |
| 42 DEFINE_FLAG(bool, pause_isolates_on_start, false, | 43 DEFINE_FLAG(bool, pause_isolates_on_start, false, |
| 43 "Pause isolates before starting."); | 44 "Pause isolates before starting."); |
| 44 DEFINE_FLAG(bool, pause_isolates_on_exit, false, | 45 DEFINE_FLAG(bool, pause_isolates_on_exit, false, |
| 45 "Pause isolates exiting."); | 46 "Pause isolates exiting."); |
| 46 DEFINE_FLAG(bool, break_at_isolate_spawn, false, | 47 DEFINE_FLAG(bool, break_at_isolate_spawn, false, |
| 47 "Insert a one-time breakpoint at the entrypoint for all spawned " | 48 "Insert a one-time breakpoint at the entrypoint for all spawned " |
| 48 "isolates"); | 49 "isolates"); |
| 49 | 50 DEFINE_FLAG(charp, isolate_log_filter, NULL, |
| 51 "Log isolates whose name include the filter. " |
| 52 "Default: service isolate log messages are suppressed."); |
| 50 | 53 |
| 51 // Quick access to the locally defined isolate() method. | 54 // Quick access to the locally defined isolate() method. |
| 52 #define I (isolate()) | 55 #define I (isolate()) |
| 53 | 56 |
| 54 | 57 |
| 55 #if defined(DEBUG) | 58 #if defined(DEBUG) |
| 56 // Helper class to ensure that a live origin_id is never reused | 59 // Helper class to ensure that a live origin_id is never reused |
| 57 // and assigned to an isolate. | 60 // and assigned to an isolate. |
| 58 class VerifyOriginId : public IsolateVisitor { | 61 class VerifyOriginId : public IsolateVisitor { |
| 59 public: | 62 public: |
| (...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 468 stack_base_(0), | 471 stack_base_(0), |
| 469 stack_overflow_flags_(0), | 472 stack_overflow_flags_(0), |
| 470 stack_overflow_count_(0), | 473 stack_overflow_count_(0), |
| 471 message_handler_(NULL), | 474 message_handler_(NULL), |
| 472 spawn_state_(NULL), | 475 spawn_state_(NULL), |
| 473 is_runnable_(false), | 476 is_runnable_(false), |
| 474 gc_prologue_callback_(NULL), | 477 gc_prologue_callback_(NULL), |
| 475 gc_epilogue_callback_(NULL), | 478 gc_epilogue_callback_(NULL), |
| 476 defer_finalization_count_(0), | 479 defer_finalization_count_(0), |
| 477 deopt_context_(NULL), | 480 deopt_context_(NULL), |
| 481 is_service_isolate_(false), |
| 482 log_(new class Log()), |
| 478 stacktrace_(NULL), | 483 stacktrace_(NULL), |
| 479 stack_frame_index_(-1), | 484 stack_frame_index_(-1), |
| 480 last_allocationprofile_accumulator_reset_timestamp_(0), | 485 last_allocationprofile_accumulator_reset_timestamp_(0), |
| 481 last_allocationprofile_gc_timestamp_(0), | 486 last_allocationprofile_gc_timestamp_(0), |
| 482 cha_(NULL), | 487 cha_(NULL), |
| 483 object_id_ring_(NULL), | 488 object_id_ring_(NULL), |
| 484 trace_buffer_(NULL), | 489 trace_buffer_(NULL), |
| 485 profiler_data_(NULL), | 490 profiler_data_(NULL), |
| 486 thread_state_(NULL), | 491 thread_state_(NULL), |
| 487 tag_table_(GrowableObjectArray::null()), | 492 tag_table_(GrowableObjectArray::null()), |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 527 saved_stack_limit_(0), | 532 saved_stack_limit_(0), |
| 528 stack_overflow_flags_(0), | 533 stack_overflow_flags_(0), |
| 529 stack_overflow_count_(0), | 534 stack_overflow_count_(0), |
| 530 message_handler_(NULL), | 535 message_handler_(NULL), |
| 531 spawn_state_(NULL), | 536 spawn_state_(NULL), |
| 532 is_runnable_(false), | 537 is_runnable_(false), |
| 533 gc_prologue_callback_(NULL), | 538 gc_prologue_callback_(NULL), |
| 534 gc_epilogue_callback_(NULL), | 539 gc_epilogue_callback_(NULL), |
| 535 defer_finalization_count_(0), | 540 defer_finalization_count_(0), |
| 536 deopt_context_(NULL), | 541 deopt_context_(NULL), |
| 542 is_service_isolate_(false), |
| 543 log_(new class Log()), |
| 537 stacktrace_(NULL), | 544 stacktrace_(NULL), |
| 538 stack_frame_index_(-1), | 545 stack_frame_index_(-1), |
| 539 last_allocationprofile_accumulator_reset_timestamp_(0), | 546 last_allocationprofile_accumulator_reset_timestamp_(0), |
| 540 last_allocationprofile_gc_timestamp_(0), | 547 last_allocationprofile_gc_timestamp_(0), |
| 541 cha_(NULL), | 548 cha_(NULL), |
| 542 object_id_ring_(NULL), | 549 object_id_ring_(NULL), |
| 543 trace_buffer_(NULL), | 550 trace_buffer_(NULL), |
| 544 profiler_data_(NULL), | 551 profiler_data_(NULL), |
| 545 thread_state_(NULL), | 552 thread_state_(NULL), |
| 546 tag_table_(GrowableObjectArray::null()), | 553 tag_table_(GrowableObjectArray::null()), |
| (...skipping 17 matching lines...) Expand all Loading... |
| 564 delete debugger_; | 571 delete debugger_; |
| 565 #if defined(USING_SIMULATOR) | 572 #if defined(USING_SIMULATOR) |
| 566 delete simulator_; | 573 delete simulator_; |
| 567 #endif | 574 #endif |
| 568 delete mutex_; | 575 delete mutex_; |
| 569 mutex_ = NULL; // Fail fast if interrupts are scheduled on a dead isolate. | 576 mutex_ = NULL; // Fail fast if interrupts are scheduled on a dead isolate. |
| 570 delete message_handler_; | 577 delete message_handler_; |
| 571 message_handler_ = NULL; // Fail fast if we send messages to a dead isolate. | 578 message_handler_ = NULL; // Fail fast if we send messages to a dead isolate. |
| 572 ASSERT(deopt_context_ == NULL); // No deopt in progress when isolate deleted. | 579 ASSERT(deopt_context_ == NULL); // No deopt in progress when isolate deleted. |
| 573 delete spawn_state_; | 580 delete spawn_state_; |
| 581 delete log_; |
| 582 log_ = NULL; |
| 574 } | 583 } |
| 575 | 584 |
| 576 | 585 |
| 577 void Isolate::SetCurrent(Isolate* current) { | 586 void Isolate::SetCurrent(Isolate* current) { |
| 578 Isolate* old_current = Current(); | 587 Isolate* old_current = Current(); |
| 579 if (old_current != NULL) { | 588 if (old_current != NULL) { |
| 580 old_current->set_vm_tag(VMTag::kIdleTagId); | 589 old_current->set_vm_tag(VMTag::kIdleTagId); |
| 581 old_current->set_thread_state(NULL); | 590 old_current->set_thread_state(NULL); |
| 582 Profiler::EndExecution(old_current); | 591 Profiler::EndExecution(old_current); |
| 583 } | 592 } |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 688 name_ = strdup(name_prefix); | 697 name_ = strdup(name_prefix); |
| 689 return; | 698 return; |
| 690 } | 699 } |
| 691 const char* kFormat = "%s-%lld"; | 700 const char* kFormat = "%s-%lld"; |
| 692 intptr_t len = OS::SNPrint(NULL, 0, kFormat, name_prefix, main_port()) + 1; | 701 intptr_t len = OS::SNPrint(NULL, 0, kFormat, name_prefix, main_port()) + 1; |
| 693 name_ = reinterpret_cast<char*>(malloc(len)); | 702 name_ = reinterpret_cast<char*>(malloc(len)); |
| 694 OS::SNPrint(name_, len, kFormat, name_prefix, main_port()); | 703 OS::SNPrint(name_, len, kFormat, name_prefix, main_port()); |
| 695 } | 704 } |
| 696 | 705 |
| 697 | 706 |
| 707 Log* Isolate::Log() const { |
| 708 if (FLAG_isolate_log_filter == NULL) { |
| 709 if (is_service_isolate_) { |
| 710 // By default, do not log for the service isolate. |
| 711 return Log::NoOpLog(); |
| 712 } |
| 713 return log_; |
| 714 } |
| 715 ASSERT(name_ != NULL); |
| 716 if (strstr(name_, FLAG_isolate_log_filter) == NULL) { |
| 717 // Filter does not match, do not log for this isolate. |
| 718 return Log::NoOpLog(); |
| 719 } |
| 720 return log_; |
| 721 } |
| 722 |
| 723 |
| 698 // TODO(5411455): Use flag to override default value and Validate the | 724 // TODO(5411455): Use flag to override default value and Validate the |
| 699 // stack size by querying OS. | 725 // stack size by querying OS. |
| 700 uword Isolate::GetSpecifiedStackSize() { | 726 uword Isolate::GetSpecifiedStackSize() { |
| 701 ASSERT(Isolate::kStackSizeBuffer < OSThread::GetMaxStackSize()); | 727 ASSERT(Isolate::kStackSizeBuffer < OSThread::GetMaxStackSize()); |
| 702 uword stack_size = OSThread::GetMaxStackSize() - Isolate::kStackSizeBuffer; | 728 uword stack_size = OSThread::GetMaxStackSize() - Isolate::kStackSizeBuffer; |
| 703 return stack_size; | 729 return stack_size; |
| 704 } | 730 } |
| 705 | 731 |
| 706 | 732 |
| 707 void Isolate::SetStackLimitFromStackBase(uword stack_base) { | 733 void Isolate::SetStackLimitFromStackBase(uword stack_base) { |
| (...skipping 940 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1648 serialized_message_, serialized_message_len_); | 1674 serialized_message_, serialized_message_len_); |
| 1649 } | 1675 } |
| 1650 | 1676 |
| 1651 | 1677 |
| 1652 void IsolateSpawnState::Cleanup() { | 1678 void IsolateSpawnState::Cleanup() { |
| 1653 SwitchIsolateScope switch_scope(I); | 1679 SwitchIsolateScope switch_scope(I); |
| 1654 Dart::ShutdownIsolate(); | 1680 Dart::ShutdownIsolate(); |
| 1655 } | 1681 } |
| 1656 | 1682 |
| 1657 } // namespace dart | 1683 } // namespace dart |
| OLD | NEW |