Chromium Code Reviews| 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" |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 47 "Pause isolates before starting."); | 47 "Pause isolates before starting."); |
| 48 DEFINE_FLAG(bool, pause_isolates_on_exit, false, | 48 DEFINE_FLAG(bool, pause_isolates_on_exit, false, |
| 49 "Pause isolates exiting."); | 49 "Pause isolates exiting."); |
| 50 DEFINE_FLAG(bool, break_at_isolate_spawn, false, | 50 DEFINE_FLAG(bool, break_at_isolate_spawn, false, |
| 51 "Insert a one-time breakpoint at the entrypoint for all spawned " | 51 "Insert a one-time breakpoint at the entrypoint for all spawned " |
| 52 "isolates"); | 52 "isolates"); |
| 53 DEFINE_FLAG(charp, isolate_log_filter, NULL, | 53 DEFINE_FLAG(charp, isolate_log_filter, NULL, |
| 54 "Log isolates whose name include the filter. " | 54 "Log isolates whose name include the filter. " |
| 55 "Default: service isolate log messages are suppressed."); | 55 "Default: service isolate log messages are suppressed."); |
| 56 | 56 |
| 57 // TODO(iposva): Make these isolate specific flags inaccessible using the | |
| 58 // regular FLAG_xyz pattern. | |
| 59 // These flags are per-isolate and only influence the defaults. | |
| 60 DEFINE_FLAG(bool, enable_asserts, false, "Enable assert statements."); | |
| 61 DEFINE_FLAG(bool, enable_type_checks, false, "Enable type checks."); | |
| 62 DEFINE_FLAG(bool, error_on_bad_override, false, | |
| 63 "Report error for bad overrides."); | |
| 64 DEFINE_FLAG(bool, error_on_bad_type, false, | |
| 65 "Report error for malformed types."); | |
| 66 | |
| 67 static void CheckedModeHandler(bool value) { | |
| 68 FLAG_enable_asserts = value; | |
| 69 FLAG_enable_type_checks = value; | |
| 70 } | |
| 71 | |
| 72 // --enable-checked-mode and --checked both enable checked mode which is | |
| 73 // equivalent to setting --enable-asserts and --enable-type-checks. | |
| 74 DEFINE_FLAG_HANDLER(CheckedModeHandler, | |
| 75 enable_checked_mode, | |
| 76 "Enable checked mode."); | |
| 77 | |
| 78 DEFINE_FLAG_HANDLER(CheckedModeHandler, | |
| 79 checked, | |
| 80 "Enable checked mode."); | |
| 81 | |
| 82 | |
| 57 // Quick access to the locally defined isolate() method. | 83 // Quick access to the locally defined isolate() method. |
| 58 #define I (isolate()) | 84 #define I (isolate()) |
| 59 | 85 |
| 60 #if defined(DEBUG) | 86 #if defined(DEBUG) |
| 61 // Helper class to ensure that a live origin_id is never reused | 87 // Helper class to ensure that a live origin_id is never reused |
| 62 // and assigned to an isolate. | 88 // and assigned to an isolate. |
| 63 class VerifyOriginId : public IsolateVisitor { | 89 class VerifyOriginId : public IsolateVisitor { |
| 64 public: | 90 public: |
| 65 explicit VerifyOriginId(Dart_Port id) : id_(id) {} | 91 explicit VerifyOriginId(Dart_Port id) : id_(id) {} |
| 66 | 92 |
| (...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 529 I->NotifyErrorListeners(exc_str, stacktrace_str); | 555 I->NotifyErrorListeners(exc_str, stacktrace_str); |
| 530 | 556 |
| 531 if (I->ErrorsFatal()) { | 557 if (I->ErrorsFatal()) { |
| 532 I->object_store()->set_sticky_error(result); | 558 I->object_store()->set_sticky_error(result); |
| 533 return false; | 559 return false; |
| 534 } | 560 } |
| 535 return true; | 561 return true; |
| 536 } | 562 } |
| 537 | 563 |
| 538 | 564 |
| 565 Isolate::Flags::Flags() | |
| 566 : type_checks_(FLAG_enable_type_checks), | |
| 567 asserts_(FLAG_enable_asserts), | |
| 568 error_on_bad_type_(FLAG_error_on_bad_type), | |
| 569 error_on_bad_override_(FLAG_error_on_bad_override) {} | |
| 570 | |
| 571 | |
| 572 void Isolate::Flags::CopyFrom(const Flags& orig) { | |
| 573 type_checks_ = orig.type_checks(); | |
| 574 asserts_ = orig.asserts(); | |
| 575 error_on_bad_type_ = orig.error_on_bad_type(); | |
| 576 error_on_bad_override_ = orig.error_on_bad_override(); | |
| 577 } | |
| 578 | |
| 579 | |
| 580 void Isolate::Flags::CopyFrom(const Dart_IsolateFlags& api_flags) { | |
| 581 type_checks_ = api_flags.enable_type_checks; | |
| 582 asserts_ = api_flags.enable_asserts; | |
| 583 // Leave others at defaults. | |
| 584 } | |
| 585 | |
| 586 | |
| 587 void Isolate::Flags::CopyTo(Dart_IsolateFlags* api_flags) const { | |
| 588 api_flags->version = DART_FLAGS_CURRENT_VERSION; | |
| 589 api_flags->enable_type_checks = type_checks(); | |
| 590 api_flags->enable_asserts = asserts(); | |
| 591 } | |
| 592 | |
| 593 | |
| 539 #if defined(DEBUG) | 594 #if defined(DEBUG) |
| 540 // static | 595 // static |
| 541 void BaseIsolate::AssertCurrent(BaseIsolate* isolate) { | 596 void BaseIsolate::AssertCurrent(BaseIsolate* isolate) { |
| 542 ASSERT(isolate == Isolate::Current()); | 597 ASSERT(isolate == Isolate::Current()); |
| 543 } | 598 } |
| 544 #endif // defined(DEBUG) | 599 #endif // defined(DEBUG) |
| 545 | 600 |
| 546 #if defined(DEBUG) | 601 #if defined(DEBUG) |
| 547 #define REUSABLE_HANDLE_SCOPE_INIT(object) \ | 602 #define REUSABLE_HANDLE_SCOPE_INIT(object) \ |
| 548 reusable_##object##_handle_scope_active_(false), | 603 reusable_##object##_handle_scope_active_(false), |
| 549 #else | 604 #else |
| 550 #define REUSABLE_HANDLE_SCOPE_INIT(object) | 605 #define REUSABLE_HANDLE_SCOPE_INIT(object) |
| 551 #endif // defined(DEBUG) | 606 #endif // defined(DEBUG) |
| 552 | 607 |
| 553 #define REUSABLE_HANDLE_INITIALIZERS(object) \ | 608 #define REUSABLE_HANDLE_INITIALIZERS(object) \ |
| 554 object##_handle_(NULL), | 609 object##_handle_(NULL), |
| 555 | 610 |
| 556 Isolate::Isolate() | 611 Isolate::Isolate(const Dart_IsolateFlags& api_flags) |
| 557 : mutator_thread_(NULL), | 612 : mutator_thread_(NULL), |
| 558 vm_tag_(0), | 613 vm_tag_(0), |
| 559 store_buffer_(), | 614 store_buffer_(), |
| 560 message_notify_callback_(NULL), | 615 message_notify_callback_(NULL), |
| 561 name_(NULL), | 616 name_(NULL), |
| 562 debugger_name_(NULL), | 617 debugger_name_(NULL), |
| 563 start_time_(OS::GetCurrentTimeMicros()), | 618 start_time_(OS::GetCurrentTimeMicros()), |
| 564 main_port_(0), | 619 main_port_(0), |
| 565 origin_id_(0), | 620 origin_id_(0), |
| 566 pause_capability_(0), | 621 pause_capability_(0), |
| 567 terminate_capability_(0), | 622 terminate_capability_(0), |
| 568 errors_fatal_(true), | 623 errors_fatal_(true), |
| 569 heap_(NULL), | 624 heap_(NULL), |
| 570 object_store_(NULL), | 625 object_store_(NULL), |
| 571 top_exit_frame_info_(0), | 626 top_exit_frame_info_(0), |
| 572 init_callback_data_(NULL), | 627 init_callback_data_(NULL), |
| 573 environment_callback_(NULL), | 628 environment_callback_(NULL), |
| 574 library_tag_handler_(NULL), | 629 library_tag_handler_(NULL), |
| 575 api_state_(NULL), | 630 api_state_(NULL), |
| 576 stub_code_(NULL), | 631 stub_code_(NULL), |
| 577 debugger_(NULL), | 632 debugger_(NULL), |
| 578 single_step_(false), | 633 single_step_(false), |
| 579 resume_request_(false), | 634 resume_request_(false), |
| 580 has_compiled_(false), | 635 has_compiled_(false), |
| 581 strict_compilation_(false), | 636 flags_(), |
|
Florian Schneider
2015/06/08 11:25:49
flags_(api_flags) and remove .CopyFrom below
| |
| 582 random_(), | 637 random_(), |
| 583 simulator_(NULL), | 638 simulator_(NULL), |
| 584 long_jump_base_(NULL), | 639 long_jump_base_(NULL), |
| 585 timer_list_(), | 640 timer_list_(), |
| 586 deopt_id_(0), | 641 deopt_id_(0), |
| 587 mutex_(new Mutex()), | 642 mutex_(new Mutex()), |
| 588 stack_limit_(0), | 643 stack_limit_(0), |
| 589 saved_stack_limit_(0), | 644 saved_stack_limit_(0), |
| 590 stack_base_(0), | 645 stack_base_(0), |
| 591 stack_overflow_flags_(0), | 646 stack_overflow_flags_(0), |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 613 current_tag_(UserTag::null()), | 668 current_tag_(UserTag::null()), |
| 614 default_tag_(UserTag::null()), | 669 default_tag_(UserTag::null()), |
| 615 deoptimized_code_array_(GrowableObjectArray::null()), | 670 deoptimized_code_array_(GrowableObjectArray::null()), |
| 616 metrics_list_head_(NULL), | 671 metrics_list_head_(NULL), |
| 617 cha_(NULL), | 672 cha_(NULL), |
| 618 next_(NULL), | 673 next_(NULL), |
| 619 pause_loop_monitor_(NULL), | 674 pause_loop_monitor_(NULL), |
| 620 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS) | 675 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS) |
| 621 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT) | 676 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT) |
| 622 reusable_handles_() { | 677 reusable_handles_() { |
| 678 flags_.CopyFrom(api_flags); | |
| 623 set_vm_tag(VMTag::kEmbedderTagId); | 679 set_vm_tag(VMTag::kEmbedderTagId); |
| 624 set_user_tag(UserTags::kDefaultUserTag); | 680 set_user_tag(UserTags::kDefaultUserTag); |
| 625 } | 681 } |
| 626 | 682 |
| 627 #undef REUSABLE_HANDLE_SCOPE_INIT | 683 #undef REUSABLE_HANDLE_SCOPE_INIT |
| 628 #undef REUSABLE_HANDLE_INITIALIZERS | 684 #undef REUSABLE_HANDLE_INITIALIZERS |
| 629 | 685 |
| 630 Isolate::~Isolate() { | 686 Isolate::~Isolate() { |
| 631 free(name_); | 687 free(name_); |
| 632 free(debugger_name_); | 688 free(debugger_name_); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 664 #endif // DEBUG | 720 #endif // DEBUG |
| 665 | 721 |
| 666 | 722 |
| 667 void Isolate::InitOnce() { | 723 void Isolate::InitOnce() { |
| 668 create_callback_ = NULL; | 724 create_callback_ = NULL; |
| 669 isolates_list_monitor_ = new Monitor(); | 725 isolates_list_monitor_ = new Monitor(); |
| 670 ASSERT(isolates_list_monitor_ != NULL); | 726 ASSERT(isolates_list_monitor_ != NULL); |
| 671 } | 727 } |
| 672 | 728 |
| 673 | 729 |
| 674 Isolate* Isolate::Init(const char* name_prefix, bool is_vm_isolate) { | 730 Isolate* Isolate::Init(const char* name_prefix, |
| 675 Isolate* result = new Isolate(); | 731 const Dart_IsolateFlags& api_flags, |
| 732 bool is_vm_isolate) { | |
| 733 Isolate* result = new Isolate(api_flags); | |
| 676 ASSERT(result != NULL); | 734 ASSERT(result != NULL); |
| 677 | 735 |
| 678 // Initialize metrics. | 736 // Initialize metrics. |
| 679 #define ISOLATE_METRIC_INIT(type, variable, name, unit) \ | 737 #define ISOLATE_METRIC_INIT(type, variable, name, unit) \ |
| 680 result->metric_##variable##_.Init(result, name, NULL, Metric::unit); | 738 result->metric_##variable##_.Init(result, name, NULL, Metric::unit); |
| 681 ISOLATE_METRIC_LIST(ISOLATE_METRIC_INIT); | 739 ISOLATE_METRIC_LIST(ISOLATE_METRIC_INIT); |
| 682 #undef ISOLATE_METRIC_INIT | 740 #undef ISOLATE_METRIC_INIT |
| 683 | 741 |
| 684 // TODO(5411455): For now just set the recently created isolate as | 742 // TODO(5411455): For now just set the recently created isolate as |
| 685 // the current isolate. | 743 // the current isolate. |
| (...skipping 1110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1796 ASSERT(!obj.IsError()); | 1854 ASSERT(!obj.IsError()); |
| 1797 Instance& instance = Instance::Handle(isolate); | 1855 Instance& instance = Instance::Handle(isolate); |
| 1798 instance ^= obj.raw(); // Can't use Instance::Cast because may be null. | 1856 instance ^= obj.raw(); // Can't use Instance::Cast because may be null. |
| 1799 return instance.raw(); | 1857 return instance.raw(); |
| 1800 } | 1858 } |
| 1801 | 1859 |
| 1802 | 1860 |
| 1803 IsolateSpawnState::IsolateSpawnState(Dart_Port parent_port, | 1861 IsolateSpawnState::IsolateSpawnState(Dart_Port parent_port, |
| 1804 const Function& func, | 1862 const Function& func, |
| 1805 const Instance& message, | 1863 const Instance& message, |
| 1806 bool paused, | 1864 bool paused) |
| 1807 bool checkedFlag) | |
| 1808 : isolate_(NULL), | 1865 : isolate_(NULL), |
| 1809 parent_port_(parent_port), | 1866 parent_port_(parent_port), |
| 1810 script_url_(NULL), | 1867 script_url_(NULL), |
| 1811 package_root_(NULL), | 1868 package_root_(NULL), |
| 1812 library_url_(NULL), | 1869 library_url_(NULL), |
| 1813 class_name_(NULL), | 1870 class_name_(NULL), |
| 1814 function_name_(NULL), | 1871 function_name_(NULL), |
| 1815 serialized_args_(NULL), | 1872 serialized_args_(NULL), |
| 1816 serialized_args_len_(0), | 1873 serialized_args_len_(0), |
| 1817 serialized_message_(NULL), | 1874 serialized_message_(NULL), |
| 1818 serialized_message_len_(0), | 1875 serialized_message_len_(0), |
| 1819 paused_(paused), | 1876 isolate_flags_(), |
|
Florian Schneider
2015/06/08 11:25:49
isolate(Isolate::Current()->flags()) and remove ->
| |
| 1820 checked_(checkedFlag) { | 1877 paused_(paused) { |
| 1821 script_url_ = NULL; | 1878 script_url_ = NULL; |
| 1822 const Class& cls = Class::Handle(func.Owner()); | 1879 const Class& cls = Class::Handle(func.Owner()); |
| 1823 const Library& lib = Library::Handle(cls.library()); | 1880 const Library& lib = Library::Handle(cls.library()); |
| 1824 const String& lib_url = String::Handle(lib.url()); | 1881 const String& lib_url = String::Handle(lib.url()); |
| 1825 library_url_ = strdup(lib_url.ToCString()); | 1882 library_url_ = strdup(lib_url.ToCString()); |
| 1826 | 1883 |
| 1827 const String& func_name = String::Handle(func.name()); | 1884 const String& func_name = String::Handle(func.name()); |
| 1828 function_name_ = strdup(func_name.ToCString()); | 1885 function_name_ = strdup(func_name.ToCString()); |
| 1829 if (!cls.IsTopLevel()) { | 1886 if (!cls.IsTopLevel()) { |
| 1830 const String& class_name = String::Handle(cls.Name()); | 1887 const String& class_name = String::Handle(cls.Name()); |
| 1831 class_name_ = strdup(class_name.ToCString()); | 1888 class_name_ = strdup(class_name.ToCString()); |
| 1832 } | 1889 } |
| 1833 bool can_send_any_object = true; | 1890 bool can_send_any_object = true; |
| 1834 SerializeObject(message, | 1891 SerializeObject(message, |
| 1835 &serialized_message_, | 1892 &serialized_message_, |
| 1836 &serialized_message_len_, | 1893 &serialized_message_len_, |
| 1837 can_send_any_object); | 1894 can_send_any_object); |
| 1895 // Inherit flags from spawning isolate. | |
| 1896 isolate_flags()->CopyFrom(Isolate::Current()->flags()); | |
| 1838 } | 1897 } |
| 1839 | 1898 |
| 1840 | 1899 |
| 1841 IsolateSpawnState::IsolateSpawnState(Dart_Port parent_port, | 1900 IsolateSpawnState::IsolateSpawnState(Dart_Port parent_port, |
| 1842 const char* script_url, | 1901 const char* script_url, |
| 1843 const char* package_root, | 1902 const char* package_root, |
| 1844 const Instance& args, | 1903 const Instance& args, |
| 1845 const Instance& message, | 1904 const Instance& message, |
| 1846 bool paused, | 1905 bool paused) |
| 1847 bool checkedFlag) | |
| 1848 : isolate_(NULL), | 1906 : isolate_(NULL), |
| 1849 parent_port_(parent_port), | 1907 parent_port_(parent_port), |
| 1850 package_root_(NULL), | 1908 package_root_(NULL), |
| 1851 library_url_(NULL), | 1909 library_url_(NULL), |
| 1852 class_name_(NULL), | 1910 class_name_(NULL), |
| 1853 function_name_(NULL), | 1911 function_name_(NULL), |
| 1854 serialized_args_(NULL), | 1912 serialized_args_(NULL), |
| 1855 serialized_args_len_(0), | 1913 serialized_args_len_(0), |
| 1856 serialized_message_(NULL), | 1914 serialized_message_(NULL), |
| 1857 serialized_message_len_(0), | 1915 serialized_message_len_(0), |
| 1858 paused_(paused), | 1916 isolate_flags_(), |
|
Florian Schneider
2015/06/08 11:25:49
isolate_flags_(Isolate::Current()->flags()) and r
| |
| 1859 checked_(checkedFlag) { | 1917 paused_(paused) { |
| 1860 script_url_ = strdup(script_url); | 1918 script_url_ = strdup(script_url); |
| 1861 if (package_root != NULL) { | 1919 if (package_root != NULL) { |
| 1862 package_root_ = strdup(package_root); | 1920 package_root_ = strdup(package_root); |
| 1863 } | 1921 } |
| 1864 library_url_ = NULL; | 1922 library_url_ = NULL; |
| 1865 function_name_ = strdup("main"); | 1923 function_name_ = strdup("main"); |
| 1866 bool can_send_any_object = false; | 1924 bool can_send_any_object = false; |
| 1867 SerializeObject(args, | 1925 SerializeObject(args, |
| 1868 &serialized_args_, | 1926 &serialized_args_, |
| 1869 &serialized_args_len_, | 1927 &serialized_args_len_, |
| 1870 can_send_any_object); | 1928 can_send_any_object); |
| 1871 SerializeObject(message, | 1929 SerializeObject(message, |
| 1872 &serialized_message_, | 1930 &serialized_message_, |
| 1873 &serialized_message_len_, | 1931 &serialized_message_len_, |
| 1874 can_send_any_object); | 1932 can_send_any_object); |
| 1933 // By default inherit flags from spawning isolate. These can be overridden | |
| 1934 // from the calling code. | |
| 1935 isolate_flags()->CopyFrom(Isolate::Current()->flags()); | |
| 1875 } | 1936 } |
| 1876 | 1937 |
| 1877 | 1938 |
| 1878 IsolateSpawnState::~IsolateSpawnState() { | 1939 IsolateSpawnState::~IsolateSpawnState() { |
| 1879 free(script_url_); | 1940 free(script_url_); |
| 1880 free(package_root_); | 1941 free(package_root_); |
| 1881 free(library_url_); | 1942 free(library_url_); |
| 1882 free(function_name_); | 1943 free(function_name_); |
| 1883 free(class_name_); | 1944 free(class_name_); |
| 1884 free(serialized_args_); | 1945 free(serialized_args_); |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1965 serialized_message_, serialized_message_len_); | 2026 serialized_message_, serialized_message_len_); |
| 1966 } | 2027 } |
| 1967 | 2028 |
| 1968 | 2029 |
| 1969 void IsolateSpawnState::Cleanup() { | 2030 void IsolateSpawnState::Cleanup() { |
| 1970 SwitchIsolateScope switch_scope(I); | 2031 SwitchIsolateScope switch_scope(I); |
| 1971 Dart::ShutdownIsolate(); | 2032 Dart::ShutdownIsolate(); |
| 1972 } | 2033 } |
| 1973 | 2034 |
| 1974 } // namespace dart | 2035 } // namespace dart |
| OLD | NEW |