| 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 "include/dart_native_api.h" | 8 #include "include/dart_native_api.h" |
| 9 #include "platform/assert.h" | 9 #include "platform/assert.h" |
| 10 #include "platform/text_buffer.h" | 10 #include "platform/text_buffer.h" |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 | 70 |
| 71 DEFINE_FLAG(int, new_gen_semi_max_size, (kWordSize <= 4) ? 16 : 32, | 71 DEFINE_FLAG(int, new_gen_semi_max_size, (kWordSize <= 4) ? 16 : 32, |
| 72 "Max size of new gen semi space in MB"); | 72 "Max size of new gen semi space in MB"); |
| 73 DEFINE_FLAG(int, old_gen_heap_size, 0, | 73 DEFINE_FLAG(int, old_gen_heap_size, 0, |
| 74 "Max size of old gen heap size in MB, or 0 for unlimited," | 74 "Max size of old gen heap size in MB, or 0 for unlimited," |
| 75 "e.g: --old_gen_heap_size=1024 allows up to 1024MB old gen heap"); | 75 "e.g: --old_gen_heap_size=1024 allows up to 1024MB old gen heap"); |
| 76 DEFINE_FLAG(int, external_max_size, (kWordSize <= 4) ? 512 : 1024, | 76 DEFINE_FLAG(int, external_max_size, (kWordSize <= 4) ? 512 : 1024, |
| 77 "Max total size of external allocations in MB, or 0 for unlimited," | 77 "Max total size of external allocations in MB, or 0 for unlimited," |
| 78 "e.g: --external_max_size=1024 allows up to 1024MB of externals"); | 78 "e.g: --external_max_size=1024 allows up to 1024MB of externals"); |
| 79 | 79 |
| 80 // TODO(iposva): Make these isolate specific flags inaccessible using the | |
| 81 // regular FLAG_xyz pattern. | |
| 82 // These flags are per-isolate and only influence the defaults. | |
| 83 DEFINE_FLAG(bool, enable_asserts, false, "Enable assert statements."); | |
| 84 DEFINE_FLAG(bool, enable_type_checks, false, "Enable type checks."); | |
| 85 DEFINE_FLAG(bool, error_on_bad_override, false, | |
| 86 "Report error for bad overrides."); | |
| 87 DEFINE_FLAG(bool, error_on_bad_type, false, | |
| 88 "Report error for malformed types."); | |
| 89 | |
| 90 DECLARE_FLAG(bool, warn_on_pause_with_no_debugger); | 80 DECLARE_FLAG(bool, warn_on_pause_with_no_debugger); |
| 91 | 81 |
| 82 NOT_IN_PRODUCT( |
| 92 static void CheckedModeHandler(bool value) { | 83 static void CheckedModeHandler(bool value) { |
| 93 FLAG_enable_asserts = value; | 84 FLAG_enable_asserts = value; |
| 94 FLAG_enable_type_checks = value; | 85 FLAG_enable_type_checks = value; |
| 95 } | 86 } |
| 96 | 87 |
| 97 // --enable-checked-mode and --checked both enable checked mode which is | 88 // --enable-checked-mode and --checked both enable checked mode which is |
| 98 // equivalent to setting --enable-asserts and --enable-type-checks. | 89 // equivalent to setting --enable-asserts and --enable-type-checks. |
| 99 DEFINE_FLAG_HANDLER(CheckedModeHandler, | 90 DEFINE_FLAG_HANDLER(CheckedModeHandler, |
| 100 enable_checked_mode, | 91 enable_checked_mode, |
| 101 "Enable checked mode."); | 92 "Enable checked mode."); |
| 102 | 93 |
| 103 DEFINE_FLAG_HANDLER(CheckedModeHandler, | 94 DEFINE_FLAG_HANDLER(CheckedModeHandler, |
| 104 checked, | 95 checked, |
| 105 "Enable checked mode."); | 96 "Enable checked mode."); |
| 97 ) |
| 106 | 98 |
| 107 | 99 |
| 108 // Quick access to the locally defined thread() and isolate() methods. | 100 // Quick access to the locally defined thread() and isolate() methods. |
| 109 #define T (thread()) | 101 #define T (thread()) |
| 110 #define I (isolate()) | 102 #define I (isolate()) |
| 111 | 103 |
| 112 #if defined(DEBUG) | 104 #if defined(DEBUG) |
| 113 // Helper class to ensure that a live origin_id is never reused | 105 // Helper class to ensure that a live origin_id is never reused |
| 114 // and assigned to an isolate. | 106 // and assigned to an isolate. |
| 115 class VerifyOriginId : public IsolateVisitor { | 107 class VerifyOriginId : public IsolateVisitor { |
| (...skipping 589 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 705 } | 697 } |
| 706 } | 698 } |
| 707 } | 699 } |
| 708 return kError; | 700 return kError; |
| 709 } | 701 } |
| 710 } | 702 } |
| 711 return kOK; | 703 return kOK; |
| 712 } | 704 } |
| 713 | 705 |
| 714 | 706 |
| 715 Isolate::Flags::Flags() | 707 void Isolate::FlagsInitialize(Dart_IsolateFlags* api_flags) { |
| 716 : type_checks_(FLAG_enable_type_checks), | 708 api_flags->version = DART_FLAGS_CURRENT_VERSION; |
| 717 asserts_(FLAG_enable_asserts), | 709 api_flags->enable_type_checks = FLAG_enable_type_checks; |
| 718 error_on_bad_type_(FLAG_error_on_bad_type), | 710 api_flags->enable_asserts = FLAG_enable_asserts; |
| 719 error_on_bad_override_(FLAG_error_on_bad_override) {} | 711 api_flags->enable_error_on_bad_type = FLAG_error_on_bad_type; |
| 720 | 712 api_flags->enable_error_on_bad_override = FLAG_error_on_bad_override; |
| 721 | |
| 722 void Isolate::Flags::CopyFrom(const Flags& orig) { | |
| 723 type_checks_ = orig.type_checks(); | |
| 724 asserts_ = orig.asserts(); | |
| 725 error_on_bad_type_ = orig.error_on_bad_type(); | |
| 726 error_on_bad_override_ = orig.error_on_bad_override(); | |
| 727 } | 713 } |
| 728 | 714 |
| 729 | 715 |
| 730 void Isolate::Flags::CopyFrom(const Dart_IsolateFlags& api_flags) { | 716 void Isolate::FlagsCopyTo(Dart_IsolateFlags* api_flags) const { |
| 731 type_checks_ = api_flags.enable_type_checks; | |
| 732 asserts_ = api_flags.enable_asserts; | |
| 733 error_on_bad_type_ = api_flags.enable_error_on_bad_type; | |
| 734 error_on_bad_override_ = api_flags.enable_error_on_bad_override; | |
| 735 // Leave others at defaults. | |
| 736 } | |
| 737 | |
| 738 | |
| 739 void Isolate::Flags::CopyTo(Dart_IsolateFlags* api_flags) const { | |
| 740 api_flags->version = DART_FLAGS_CURRENT_VERSION; | 717 api_flags->version = DART_FLAGS_CURRENT_VERSION; |
| 741 api_flags->enable_type_checks = type_checks(); | 718 api_flags->enable_type_checks = type_checks(); |
| 742 api_flags->enable_asserts = asserts(); | 719 api_flags->enable_asserts = asserts(); |
| 743 api_flags->enable_error_on_bad_type = error_on_bad_type(); | 720 api_flags->enable_error_on_bad_type = error_on_bad_type(); |
| 744 api_flags->enable_error_on_bad_override = error_on_bad_override(); | 721 api_flags->enable_error_on_bad_override = error_on_bad_override(); |
| 745 } | 722 } |
| 746 | 723 |
| 747 | 724 |
| 748 #if defined(DEBUG) | 725 NOT_IN_PRODUCT( |
| 726 void Isolate::FlagsCopyFrom(const Dart_IsolateFlags& api_flags) { |
| 727 type_checks_ = api_flags.enable_type_checks; |
| 728 asserts_ = api_flags.enable_asserts; |
| 729 error_on_bad_type_ = api_flags.enable_error_on_bad_type; |
| 730 error_on_bad_override_ = api_flags.enable_error_on_bad_override; |
| 731 // Leave others at defaults. |
| 732 }) |
| 733 |
| 734 |
| 735 DEBUG_ONLY( |
| 749 // static | 736 // static |
| 750 void BaseIsolate::AssertCurrent(BaseIsolate* isolate) { | 737 void BaseIsolate::AssertCurrent(BaseIsolate* isolate) { |
| 751 ASSERT(isolate == Isolate::Current()); | 738 ASSERT(isolate == Isolate::Current()); |
| 752 } | 739 } |
| 753 | 740 |
| 754 void BaseIsolate::AssertCurrentThreadIsMutator() const { | 741 void BaseIsolate::AssertCurrentThreadIsMutator() const { |
| 755 ASSERT(Isolate::Current() == this); | 742 ASSERT(Isolate::Current() == this); |
| 756 ASSERT(Thread::Current()->IsMutatorThread()); | 743 ASSERT(Thread::Current()->IsMutatorThread()); |
| 757 } | 744 } |
| 758 #endif // defined(DEBUG) | 745 ) |
| 759 | 746 |
| 760 #if defined(DEBUG) | 747 #if defined(DEBUG) |
| 761 #define REUSABLE_HANDLE_SCOPE_INIT(object) \ | 748 #define REUSABLE_HANDLE_SCOPE_INIT(object) \ |
| 762 reusable_##object##_handle_scope_active_(false), | 749 reusable_##object##_handle_scope_active_(false), |
| 763 #else | 750 #else |
| 764 #define REUSABLE_HANDLE_SCOPE_INIT(object) | 751 #define REUSABLE_HANDLE_SCOPE_INIT(object) |
| 765 #endif // defined(DEBUG) | 752 #endif // defined(DEBUG) |
| 766 | 753 |
| 767 #define REUSABLE_HANDLE_INITIALIZERS(object) \ | 754 #define REUSABLE_HANDLE_INITIALIZERS(object) \ |
| 768 object##_handle_(NULL), | 755 object##_handle_(NULL), |
| (...skipping 23 matching lines...) Expand all Loading... |
| 792 object_store_(NULL), | 779 object_store_(NULL), |
| 793 top_exit_frame_info_(0), | 780 top_exit_frame_info_(0), |
| 794 init_callback_data_(NULL), | 781 init_callback_data_(NULL), |
| 795 environment_callback_(NULL), | 782 environment_callback_(NULL), |
| 796 library_tag_handler_(NULL), | 783 library_tag_handler_(NULL), |
| 797 api_state_(NULL), | 784 api_state_(NULL), |
| 798 debugger_(NULL), | 785 debugger_(NULL), |
| 799 resume_request_(false), | 786 resume_request_(false), |
| 800 last_resume_timestamp_(OS::GetCurrentTimeMillis()), | 787 last_resume_timestamp_(OS::GetCurrentTimeMillis()), |
| 801 has_compiled_code_(false), | 788 has_compiled_code_(false), |
| 802 flags_(), | |
| 803 random_(), | 789 random_(), |
| 804 simulator_(NULL), | 790 simulator_(NULL), |
| 805 mutex_(new Mutex()), | 791 mutex_(new Mutex()), |
| 806 symbols_mutex_(new Mutex()), | 792 symbols_mutex_(new Mutex()), |
| 807 saved_stack_limit_(0), | 793 saved_stack_limit_(0), |
| 808 deferred_interrupts_mask_(0), | 794 deferred_interrupts_mask_(0), |
| 809 deferred_interrupts_(0), | 795 deferred_interrupts_(0), |
| 810 stack_overflow_flags_(0), | 796 stack_overflow_flags_(0), |
| 811 stack_overflow_count_(0), | 797 stack_overflow_count_(0), |
| 812 message_handler_(NULL), | 798 message_handler_(NULL), |
| (...skipping 20 matching lines...) Expand all Loading... |
| 833 all_classes_finalized_(false), | 819 all_classes_finalized_(false), |
| 834 next_(NULL), | 820 next_(NULL), |
| 835 pause_loop_monitor_(NULL), | 821 pause_loop_monitor_(NULL), |
| 836 cha_invalidation_gen_(kInvalidGen), | 822 cha_invalidation_gen_(kInvalidGen), |
| 837 field_invalidation_gen_(kInvalidGen), | 823 field_invalidation_gen_(kInvalidGen), |
| 838 prefix_invalidation_gen_(kInvalidGen), | 824 prefix_invalidation_gen_(kInvalidGen), |
| 839 boxed_field_list_monitor_(new Monitor()), | 825 boxed_field_list_monitor_(new Monitor()), |
| 840 boxed_field_list_(GrowableObjectArray::null()), | 826 boxed_field_list_(GrowableObjectArray::null()), |
| 841 spawn_count_monitor_(new Monitor()), | 827 spawn_count_monitor_(new Monitor()), |
| 842 spawn_count_(0) { | 828 spawn_count_(0) { |
| 843 flags_.CopyFrom(api_flags); | 829 NOT_IN_PRODUCT(FlagsCopyFrom(api_flags)); |
| 844 // TODO(asiva): A Thread is not available here, need to figure out | 830 // TODO(asiva): A Thread is not available here, need to figure out |
| 845 // how the vm_tag (kEmbedderTagId) can be set, these tags need to | 831 // how the vm_tag (kEmbedderTagId) can be set, these tags need to |
| 846 // move to the OSThread structure. | 832 // move to the OSThread structure. |
| 847 set_user_tag(UserTags::kDefaultUserTag); | 833 set_user_tag(UserTags::kDefaultUserTag); |
| 848 } | 834 } |
| 849 | 835 |
| 850 #undef REUSABLE_HANDLE_SCOPE_INIT | 836 #undef REUSABLE_HANDLE_SCOPE_INIT |
| 851 #undef REUSABLE_HANDLE_INITIALIZERS | 837 #undef REUSABLE_HANDLE_INITIALIZERS |
| 852 | 838 |
| 853 Isolate::~Isolate() { | 839 Isolate::~Isolate() { |
| (...skipping 1795 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2649 package_config_(package_config), | 2635 package_config_(package_config), |
| 2650 library_url_(NULL), | 2636 library_url_(NULL), |
| 2651 class_name_(NULL), | 2637 class_name_(NULL), |
| 2652 function_name_(NULL), | 2638 function_name_(NULL), |
| 2653 serialized_args_(NULL), | 2639 serialized_args_(NULL), |
| 2654 serialized_args_len_(0), | 2640 serialized_args_len_(0), |
| 2655 serialized_message_(NULL), | 2641 serialized_message_(NULL), |
| 2656 serialized_message_len_(0), | 2642 serialized_message_len_(0), |
| 2657 spawn_count_monitor_(spawn_count_monitor), | 2643 spawn_count_monitor_(spawn_count_monitor), |
| 2658 spawn_count_(spawn_count), | 2644 spawn_count_(spawn_count), |
| 2659 isolate_flags_(), | |
| 2660 paused_(paused), | 2645 paused_(paused), |
| 2661 errors_are_fatal_(errors_are_fatal) { | 2646 errors_are_fatal_(errors_are_fatal) { |
| 2662 const Class& cls = Class::Handle(func.Owner()); | 2647 const Class& cls = Class::Handle(func.Owner()); |
| 2663 const Library& lib = Library::Handle(cls.library()); | 2648 const Library& lib = Library::Handle(cls.library()); |
| 2664 const String& lib_url = String::Handle(lib.url()); | 2649 const String& lib_url = String::Handle(lib.url()); |
| 2665 library_url_ = NewConstChar(lib_url.ToCString()); | 2650 library_url_ = NewConstChar(lib_url.ToCString()); |
| 2666 | 2651 |
| 2667 const String& func_name = String::Handle(func.name()); | 2652 const String& func_name = String::Handle(func.name()); |
| 2668 function_name_ = NewConstChar(func_name.ToCString()); | 2653 function_name_ = NewConstChar(func_name.ToCString()); |
| 2669 if (!cls.IsTopLevel()) { | 2654 if (!cls.IsTopLevel()) { |
| 2670 const String& class_name = String::Handle(cls.Name()); | 2655 const String& class_name = String::Handle(cls.Name()); |
| 2671 class_name_ = NewConstChar(class_name.ToCString()); | 2656 class_name_ = NewConstChar(class_name.ToCString()); |
| 2672 } | 2657 } |
| 2673 bool can_send_any_object = true; | 2658 bool can_send_any_object = true; |
| 2674 SerializeObject(message, | 2659 SerializeObject(message, |
| 2675 &serialized_message_, | 2660 &serialized_message_, |
| 2676 &serialized_message_len_, | 2661 &serialized_message_len_, |
| 2677 can_send_any_object); | 2662 can_send_any_object); |
| 2678 // Inherit flags from spawning isolate. | 2663 // Inherit flags from spawning isolate. |
| 2679 isolate_flags()->CopyFrom(Isolate::Current()->flags()); | 2664 Isolate::Current()->FlagsCopyTo(isolate_flags()); |
| 2680 } | 2665 } |
| 2681 | 2666 |
| 2682 | 2667 |
| 2683 IsolateSpawnState::IsolateSpawnState(Dart_Port parent_port, | 2668 IsolateSpawnState::IsolateSpawnState(Dart_Port parent_port, |
| 2684 void* init_data, | 2669 void* init_data, |
| 2685 const char* script_url, | 2670 const char* script_url, |
| 2686 const char* package_root, | 2671 const char* package_root, |
| 2687 const char* package_config, | 2672 const char* package_config, |
| 2688 const Instance& args, | 2673 const Instance& args, |
| 2689 const Instance& message, | 2674 const Instance& message, |
| (...skipping 29 matching lines...) Expand all Loading... |
| 2719 SerializeObject(args, | 2704 SerializeObject(args, |
| 2720 &serialized_args_, | 2705 &serialized_args_, |
| 2721 &serialized_args_len_, | 2706 &serialized_args_len_, |
| 2722 can_send_any_object); | 2707 can_send_any_object); |
| 2723 SerializeObject(message, | 2708 SerializeObject(message, |
| 2724 &serialized_message_, | 2709 &serialized_message_, |
| 2725 &serialized_message_len_, | 2710 &serialized_message_len_, |
| 2726 can_send_any_object); | 2711 can_send_any_object); |
| 2727 // By default inherit flags from spawning isolate. These can be overridden | 2712 // By default inherit flags from spawning isolate. These can be overridden |
| 2728 // from the calling code. | 2713 // from the calling code. |
| 2729 isolate_flags()->CopyFrom(Isolate::Current()->flags()); | 2714 Isolate::Current()->FlagsCopyTo(isolate_flags()); |
| 2730 } | 2715 } |
| 2731 | 2716 |
| 2732 | 2717 |
| 2733 IsolateSpawnState::~IsolateSpawnState() { | 2718 IsolateSpawnState::~IsolateSpawnState() { |
| 2734 delete[] script_url_; | 2719 delete[] script_url_; |
| 2735 delete[] package_root_; | 2720 delete[] package_root_; |
| 2736 delete[] package_config_; | 2721 delete[] package_config_; |
| 2737 delete[] library_url_; | 2722 delete[] library_url_; |
| 2738 delete[] class_name_; | 2723 delete[] class_name_; |
| 2739 delete[] function_name_; | 2724 delete[] function_name_; |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2824 void IsolateSpawnState::DecrementSpawnCount() { | 2809 void IsolateSpawnState::DecrementSpawnCount() { |
| 2825 ASSERT(spawn_count_monitor_ != NULL); | 2810 ASSERT(spawn_count_monitor_ != NULL); |
| 2826 ASSERT(spawn_count_ != NULL); | 2811 ASSERT(spawn_count_ != NULL); |
| 2827 MonitorLocker ml(spawn_count_monitor_); | 2812 MonitorLocker ml(spawn_count_monitor_); |
| 2828 ASSERT(*spawn_count_ > 0); | 2813 ASSERT(*spawn_count_ > 0); |
| 2829 *spawn_count_ = *spawn_count_ - 1; | 2814 *spawn_count_ = *spawn_count_ - 1; |
| 2830 ml.Notify(); | 2815 ml.Notify(); |
| 2831 } | 2816 } |
| 2832 | 2817 |
| 2833 } // namespace dart | 2818 } // namespace dart |
| OLD | NEW |