| 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 #ifndef VM_ISOLATE_H_ | 5 #ifndef VM_ISOLATE_H_ |
| 6 #define VM_ISOLATE_H_ | 6 #define VM_ISOLATE_H_ |
| 7 | 7 |
| 8 #include "include/dart_api.h" | 8 #include "include/dart_api.h" |
| 9 #include "platform/assert.h" | 9 #include "platform/assert.h" |
| 10 #include "vm/atomic.h" | 10 #include "vm/atomic.h" |
| 11 #include "vm/base_isolate.h" | 11 #include "vm/base_isolate.h" |
| 12 #include "vm/class_table.h" | 12 #include "vm/class_table.h" |
| 13 #include "vm/handles.h" | 13 #include "vm/handles.h" |
| 14 #include "vm/megamorphic_cache_table.h" | 14 #include "vm/megamorphic_cache_table.h" |
| 15 #include "vm/metrics.h" | 15 #include "vm/metrics.h" |
| 16 #include "vm/random.h" | 16 #include "vm/random.h" |
| 17 #include "vm/tags.h" | 17 #include "vm/tags.h" |
| 18 #include "vm/thread.h" | 18 #include "vm/thread.h" |
| 19 #include "vm/os_thread.h" | 19 #include "vm/os_thread.h" |
| 20 #include "vm/timeline.h" | 20 #include "vm/timeline.h" |
| 21 #include "vm/timer.h" | 21 #include "vm/timer.h" |
| 22 #include "vm/trace_buffer.h" | 22 #include "vm/trace_buffer.h" |
| 23 | 23 |
| 24 namespace dart { | 24 namespace dart { |
| 25 | 25 |
| 26 // Forward declarations. | 26 // Forward declarations. |
| 27 class AbstractType; | |
| 28 class ApiState; | 27 class ApiState; |
| 29 class Array; | |
| 30 class BackgroundCompiler; | 28 class BackgroundCompiler; |
| 31 class Capability; | 29 class Capability; |
| 32 class CHA; | 30 class CHA; |
| 33 class Class; | |
| 34 class Code; | |
| 35 class CodeIndexTable; | 31 class CodeIndexTable; |
| 36 class CompilerStats; | 32 class CompilerStats; |
| 37 class Debugger; | 33 class Debugger; |
| 38 class DeoptContext; | 34 class DeoptContext; |
| 39 class Error; | |
| 40 class ExceptionHandlers; | |
| 41 class Field; | |
| 42 class Function; | |
| 43 class GrowableObjectArray; | |
| 44 class HandleScope; | 35 class HandleScope; |
| 45 class HandleVisitor; | 36 class HandleVisitor; |
| 46 class Heap; | 37 class Heap; |
| 47 class ICData; | 38 class ICData; |
| 48 class Instance; | |
| 49 class IsolateProfilerData; | 39 class IsolateProfilerData; |
| 50 class IsolateSpawnState; | 40 class IsolateSpawnState; |
| 51 class Library; | |
| 52 class Log; | 41 class Log; |
| 53 class MessageHandler; | 42 class MessageHandler; |
| 54 class Mutex; | 43 class Mutex; |
| 55 class Object; | 44 class Object; |
| 56 class ObjectIdRing; | 45 class ObjectIdRing; |
| 57 class ObjectPointerVisitor; | 46 class ObjectPointerVisitor; |
| 58 class ObjectStore; | 47 class ObjectStore; |
| 59 class PcDescriptors; | |
| 60 class RawInstance; | 48 class RawInstance; |
| 61 class RawArray; | 49 class RawArray; |
| 62 class RawContext; | 50 class RawContext; |
| 63 class RawDouble; | 51 class RawDouble; |
| 64 class RawGrowableObjectArray; | 52 class RawGrowableObjectArray; |
| 65 class RawMint; | 53 class RawMint; |
| 66 class RawObject; | 54 class RawObject; |
| 67 class RawInteger; | 55 class RawInteger; |
| 68 class RawError; | 56 class RawError; |
| 69 class RawFloat32x4; | 57 class RawFloat32x4; |
| 70 class RawInt32x4; | 58 class RawInt32x4; |
| 71 class RawUserTag; | 59 class RawUserTag; |
| 72 class SampleBuffer; | 60 class SampleBuffer; |
| 73 class SendPort; | 61 class SendPort; |
| 74 class ServiceIdZone; | 62 class ServiceIdZone; |
| 75 class Simulator; | 63 class Simulator; |
| 76 class StackResource; | 64 class StackResource; |
| 77 class StackZone; | 65 class StackZone; |
| 78 class StoreBuffer; | 66 class StoreBuffer; |
| 79 class StubCode; | 67 class StubCode; |
| 80 class ThreadRegistry; | 68 class ThreadRegistry; |
| 81 class TypeArguments; | |
| 82 class TypeParameter; | |
| 83 class UserTag; | 69 class UserTag; |
| 84 | 70 |
| 85 | 71 |
| 86 class IsolateVisitor { | 72 class IsolateVisitor { |
| 87 public: | 73 public: |
| 88 IsolateVisitor() {} | 74 IsolateVisitor() {} |
| 89 virtual ~IsolateVisitor() {} | 75 virtual ~IsolateVisitor() {} |
| 90 | 76 |
| 91 virtual void VisitIsolate(Isolate* isolate) = 0; | 77 virtual void VisitIsolate(Isolate* isolate) = 0; |
| 92 | 78 |
| 93 private: | 79 private: |
| 94 DISALLOW_COPY_AND_ASSIGN(IsolateVisitor); | 80 DISALLOW_COPY_AND_ASSIGN(IsolateVisitor); |
| 95 }; | 81 }; |
| 96 | 82 |
| 97 #define REUSABLE_HANDLE_LIST(V) \ | |
| 98 V(AbstractType) \ | |
| 99 V(Array) \ | |
| 100 V(Class) \ | |
| 101 V(Code) \ | |
| 102 V(Error) \ | |
| 103 V(ExceptionHandlers) \ | |
| 104 V(Field) \ | |
| 105 V(Function) \ | |
| 106 V(GrowableObjectArray) \ | |
| 107 V(Instance) \ | |
| 108 V(Library) \ | |
| 109 V(Object) \ | |
| 110 V(PcDescriptors) \ | |
| 111 V(String) \ | |
| 112 V(TypeArguments) \ | |
| 113 V(TypeParameter) \ | |
| 114 | 83 |
| 115 class Isolate : public BaseIsolate { | 84 class Isolate : public BaseIsolate { |
| 116 public: | 85 public: |
| 117 // Keep both these enums in sync with isolate_patch.dart. | 86 // Keep both these enums in sync with isolate_patch.dart. |
| 118 // The different Isolate API message types. | 87 // The different Isolate API message types. |
| 119 enum LibMsgId { | 88 enum LibMsgId { |
| 120 kPauseMsg = 1, | 89 kPauseMsg = 1, |
| 121 kResumeMsg = 2, | 90 kResumeMsg = 2, |
| 122 kPingMsg = 3, | 91 kPingMsg = 3, |
| 123 kKillMsg = 4, | 92 kKillMsg = 4, |
| (...skipping 599 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 723 void AppendServiceExtensionCall(const Instance& closure, | 692 void AppendServiceExtensionCall(const Instance& closure, |
| 724 const String& method_name, | 693 const String& method_name, |
| 725 const Array& parameter_keys, | 694 const Array& parameter_keys, |
| 726 const Array& parameter_values, | 695 const Array& parameter_values, |
| 727 const Instance& reply_port, | 696 const Instance& reply_port, |
| 728 const Instance& id); | 697 const Instance& id); |
| 729 void RegisterServiceExtensionHandler(const String& name, | 698 void RegisterServiceExtensionHandler(const String& name, |
| 730 const Instance& closure); | 699 const Instance& closure); |
| 731 RawInstance* LookupServiceExtensionHandler(const String& name); | 700 RawInstance* LookupServiceExtensionHandler(const String& name); |
| 732 | 701 |
| 733 #if defined(DEBUG) | |
| 734 #define REUSABLE_HANDLE_SCOPE_ACCESSORS(object) \ | |
| 735 void set_reusable_##object##_handle_scope_active(bool value) { \ | |
| 736 reusable_##object##_handle_scope_active_ = value; \ | |
| 737 } \ | |
| 738 bool reusable_##object##_handle_scope_active() const { \ | |
| 739 return reusable_##object##_handle_scope_active_; \ | |
| 740 } | |
| 741 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_ACCESSORS) | |
| 742 #undef REUSABLE_HANDLE_SCOPE_ACCESSORS | |
| 743 #endif // defined(DEBUG) | |
| 744 | |
| 745 #define REUSABLE_HANDLE(object) \ | |
| 746 object& object##Handle() const { \ | |
| 747 return *object##_handle_; \ | |
| 748 } | |
| 749 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE) | |
| 750 #undef REUSABLE_HANDLE | |
| 751 | |
| 752 static void VisitIsolates(IsolateVisitor* visitor); | 702 static void VisitIsolates(IsolateVisitor* visitor); |
| 753 | 703 |
| 754 // Handle service messages until we are told to resume execution. | 704 // Handle service messages until we are told to resume execution. |
| 755 void PauseEventHandler(); | 705 void PauseEventHandler(); |
| 756 | 706 |
| 757 // DEPRECATED: Use Thread's methods instead. During migration, these default | 707 // DEPRECATED: Use Thread's methods instead. During migration, these default |
| 758 // to using the mutator thread (which must also be the current thread). | 708 // to using the mutator thread (which must also be the current thread). |
| 759 Zone* current_zone() const { | 709 Zone* current_zone() const { |
| 760 ASSERT(Thread::Current() == mutator_thread_); | 710 ASSERT(Thread::Current() == mutator_thread_); |
| 761 return mutator_thread_->zone(); | 711 return mutator_thread_->zone(); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 822 } | 772 } |
| 823 void MakeCurrentThreadMutator(Thread* thread) { | 773 void MakeCurrentThreadMutator(Thread* thread) { |
| 824 ASSERT(thread == Thread::Current()); | 774 ASSERT(thread == Thread::Current()); |
| 825 DEBUG_ASSERT(IsIsolateOf(thread)); | 775 DEBUG_ASSERT(IsIsolateOf(thread)); |
| 826 mutator_thread_ = thread; | 776 mutator_thread_ = thread; |
| 827 } | 777 } |
| 828 #if defined(DEBUG) | 778 #if defined(DEBUG) |
| 829 bool IsIsolateOf(Thread* thread); | 779 bool IsIsolateOf(Thread* thread); |
| 830 #endif // DEBUG | 780 #endif // DEBUG |
| 831 | 781 |
| 832 template<class T> T* AllocateReusableHandle(); | |
| 833 | |
| 834 // Accessed from generated code: | 782 // Accessed from generated code: |
| 835 uword stack_limit_; | 783 uword stack_limit_; |
| 836 StoreBuffer* store_buffer_; | 784 StoreBuffer* store_buffer_; |
| 837 Heap* heap_; | 785 Heap* heap_; |
| 838 uword vm_tag_; | 786 uword vm_tag_; |
| 839 uword user_tag_; | 787 uword user_tag_; |
| 840 RawUserTag* current_tag_; | 788 RawUserTag* current_tag_; |
| 841 RawUserTag* default_tag_; | 789 RawUserTag* default_tag_; |
| 842 ClassTable class_table_; | 790 ClassTable class_table_; |
| 843 bool single_step_; | 791 bool single_step_; |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 935 | 883 |
| 936 // TODO(23153): Move this out of Isolate/Thread. | 884 // TODO(23153): Move this out of Isolate/Thread. |
| 937 CHA* cha_; | 885 CHA* cha_; |
| 938 | 886 |
| 939 // Isolate list next pointer. | 887 // Isolate list next pointer. |
| 940 Isolate* next_; | 888 Isolate* next_; |
| 941 | 889 |
| 942 // Used to wake the isolate when it is in the pause event loop. | 890 // Used to wake the isolate when it is in the pause event loop. |
| 943 Monitor* pause_loop_monitor_; | 891 Monitor* pause_loop_monitor_; |
| 944 | 892 |
| 945 // Reusable handles support. | |
| 946 #define REUSABLE_HANDLE_FIELDS(object) \ | |
| 947 object* object##_handle_; | |
| 948 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_FIELDS) | |
| 949 #undef REUSABLE_HANDLE_FIELDS | |
| 950 | |
| 951 #if defined(DEBUG) | |
| 952 #define REUSABLE_HANDLE_SCOPE_VARIABLE(object) \ | |
| 953 bool reusable_##object##_handle_scope_active_; | |
| 954 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_VARIABLE); | |
| 955 #undef REUSABLE_HANDLE_SCOPE_VARIABLE | |
| 956 #endif // defined(DEBUG) | |
| 957 | |
| 958 #define ISOLATE_METRIC_VARIABLE(type, variable, name, unit) \ | 893 #define ISOLATE_METRIC_VARIABLE(type, variable, name, unit) \ |
| 959 type metric_##variable##_; | 894 type metric_##variable##_; |
| 960 ISOLATE_METRIC_LIST(ISOLATE_METRIC_VARIABLE); | 895 ISOLATE_METRIC_LIST(ISOLATE_METRIC_VARIABLE); |
| 961 #undef ISOLATE_METRIC_VARIABLE | 896 #undef ISOLATE_METRIC_VARIABLE |
| 962 | 897 |
| 963 #define ISOLATE_TIMELINE_STREAM_VARIABLE(name, not_used) \ | 898 #define ISOLATE_TIMELINE_STREAM_VARIABLE(name, not_used) \ |
| 964 TimelineStream stream_##name##_; | 899 TimelineStream stream_##name##_; |
| 965 ISOLATE_TIMELINE_STREAM_LIST(ISOLATE_TIMELINE_STREAM_VARIABLE) | 900 ISOLATE_TIMELINE_STREAM_LIST(ISOLATE_TIMELINE_STREAM_VARIABLE) |
| 966 #undef ISOLATE_TIMELINE_STREAM_VARIABLE | 901 #undef ISOLATE_TIMELINE_STREAM_VARIABLE |
| 967 | 902 |
| 968 VMHandles reusable_handles_; | |
| 969 | |
| 970 static Dart_IsolateCreateCallback create_callback_; | 903 static Dart_IsolateCreateCallback create_callback_; |
| 971 static Dart_IsolateInterruptCallback interrupt_callback_; | 904 static Dart_IsolateInterruptCallback interrupt_callback_; |
| 972 static Dart_IsolateUnhandledExceptionCallback unhandled_exception_callback_; | 905 static Dart_IsolateUnhandledExceptionCallback unhandled_exception_callback_; |
| 973 static Dart_IsolateShutdownCallback shutdown_callback_; | 906 static Dart_IsolateShutdownCallback shutdown_callback_; |
| 974 static Dart_FileOpenCallback file_open_callback_; | 907 static Dart_FileOpenCallback file_open_callback_; |
| 975 static Dart_FileReadCallback file_read_callback_; | 908 static Dart_FileReadCallback file_read_callback_; |
| 976 static Dart_FileWriteCallback file_write_callback_; | 909 static Dart_FileWriteCallback file_write_callback_; |
| 977 static Dart_FileCloseCallback file_close_callback_; | 910 static Dart_FileCloseCallback file_close_callback_; |
| 978 static Dart_EntropySource entropy_source_callback_; | 911 static Dart_EntropySource entropy_source_callback_; |
| 979 static Dart_IsolateInterruptCallback vmstats_callback_; | 912 static Dart_IsolateInterruptCallback vmstats_callback_; |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1143 uint8_t* serialized_message_; | 1076 uint8_t* serialized_message_; |
| 1144 intptr_t serialized_message_len_; | 1077 intptr_t serialized_message_len_; |
| 1145 Isolate::Flags isolate_flags_; | 1078 Isolate::Flags isolate_flags_; |
| 1146 bool paused_; | 1079 bool paused_; |
| 1147 bool errors_are_fatal_; | 1080 bool errors_are_fatal_; |
| 1148 }; | 1081 }; |
| 1149 | 1082 |
| 1150 } // namespace dart | 1083 } // namespace dart |
| 1151 | 1084 |
| 1152 #endif // VM_ISOLATE_H_ | 1085 #endif // VM_ISOLATE_H_ |
| OLD | NEW |