| 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" |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 class Capability; | 28 class Capability; |
| 29 class CodeIndexTable; | 29 class CodeIndexTable; |
| 30 class CompilerStats; | 30 class CompilerStats; |
| 31 class Debugger; | 31 class Debugger; |
| 32 class DeoptContext; | 32 class DeoptContext; |
| 33 class HandleScope; | 33 class HandleScope; |
| 34 class HandleVisitor; | 34 class HandleVisitor; |
| 35 class Heap; | 35 class Heap; |
| 36 class ICData; | 36 class ICData; |
| 37 class IsolateProfilerData; | 37 class IsolateProfilerData; |
| 38 class IsolateReloadContext; |
| 38 class IsolateSpawnState; | 39 class IsolateSpawnState; |
| 39 class Log; | 40 class Log; |
| 40 class MessageHandler; | 41 class MessageHandler; |
| 41 class Mutex; | 42 class Mutex; |
| 42 class Object; | 43 class Object; |
| 43 class ObjectIdRing; | 44 class ObjectIdRing; |
| 44 class ObjectPointerVisitor; | 45 class ObjectPointerVisitor; |
| 45 class ObjectStore; | 46 class ObjectStore; |
| 46 class RawInstance; | 47 class RawInstance; |
| 47 class RawArray; | 48 class RawArray; |
| 48 class RawContext; | 49 class RawContext; |
| 49 class RawDouble; | 50 class RawDouble; |
| 51 class RawError; |
| 52 class RawField; |
| 50 class RawGrowableObjectArray; | 53 class RawGrowableObjectArray; |
| 51 class RawMint; | 54 class RawMint; |
| 52 class RawObject; | 55 class RawObject; |
| 53 class RawInteger; | 56 class RawInteger; |
| 54 class RawError; | |
| 55 class RawField; | |
| 56 class RawFloat32x4; | 57 class RawFloat32x4; |
| 57 class RawInt32x4; | 58 class RawInt32x4; |
| 58 class RawUserTag; | 59 class RawUserTag; |
| 59 class SafepointHandler; | 60 class SafepointHandler; |
| 60 class SampleBuffer; | 61 class SampleBuffer; |
| 61 class SendPort; | 62 class SendPort; |
| 62 class ServiceIdZone; | 63 class ServiceIdZone; |
| 63 class Simulator; | 64 class Simulator; |
| 64 class StackResource; | 65 class StackResource; |
| 65 class StackZone; | 66 class StackZone; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 84 // Disallow OOB message handling within this scope. | 85 // Disallow OOB message handling within this scope. |
| 85 class NoOOBMessageScope : public StackResource { | 86 class NoOOBMessageScope : public StackResource { |
| 86 public: | 87 public: |
| 87 explicit NoOOBMessageScope(Thread* thread); | 88 explicit NoOOBMessageScope(Thread* thread); |
| 88 ~NoOOBMessageScope(); | 89 ~NoOOBMessageScope(); |
| 89 private: | 90 private: |
| 90 DISALLOW_COPY_AND_ASSIGN(NoOOBMessageScope); | 91 DISALLOW_COPY_AND_ASSIGN(NoOOBMessageScope); |
| 91 }; | 92 }; |
| 92 | 93 |
| 93 | 94 |
| 95 // Disallow isolate reload. |
| 96 class NoReloadScope : public StackResource { |
| 97 public: |
| 98 NoReloadScope(Isolate* isolate, Thread* thread); |
| 99 ~NoReloadScope(); |
| 100 |
| 101 private: |
| 102 Isolate* isolate_; |
| 103 DISALLOW_COPY_AND_ASSIGN(NoReloadScope); |
| 104 }; |
| 105 |
| 106 |
| 94 class Isolate : public BaseIsolate { | 107 class Isolate : public BaseIsolate { |
| 95 public: | 108 public: |
| 96 // Keep both these enums in sync with isolate_patch.dart. | 109 // Keep both these enums in sync with isolate_patch.dart. |
| 97 // The different Isolate API message types. | 110 // The different Isolate API message types. |
| 98 enum LibMsgId { | 111 enum LibMsgId { |
| 99 kPauseMsg = 1, | 112 kPauseMsg = 1, |
| 100 kResumeMsg = 2, | 113 kResumeMsg = 2, |
| 101 kPingMsg = 3, | 114 kPingMsg = 3, |
| 102 kKillMsg = 4, | 115 kKillMsg = 4, |
| 103 kAddExitMsg = 5, | 116 kAddExitMsg = 5, |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 143 StoreBuffer* store_buffer() { return store_buffer_; } | 156 StoreBuffer* store_buffer() { return store_buffer_; } |
| 144 | 157 |
| 145 ThreadRegistry* thread_registry() const { return thread_registry_; } | 158 ThreadRegistry* thread_registry() const { return thread_registry_; } |
| 146 SafepointHandler* safepoint_handler() const { return safepoint_handler_; } | 159 SafepointHandler* safepoint_handler() const { return safepoint_handler_; } |
| 147 | 160 |
| 148 ClassTable* class_table() { return &class_table_; } | 161 ClassTable* class_table() { return &class_table_; } |
| 149 static intptr_t class_table_offset() { | 162 static intptr_t class_table_offset() { |
| 150 return OFFSET_OF(Isolate, class_table_); | 163 return OFFSET_OF(Isolate, class_table_); |
| 151 } | 164 } |
| 152 | 165 |
| 166 // Prefers old classes when we are in the middle of a reload. |
| 167 RawClass* GetClassForHeapWalkAt(intptr_t cid); |
| 168 |
| 153 static intptr_t ic_miss_code_offset() { | 169 static intptr_t ic_miss_code_offset() { |
| 154 return OFFSET_OF(Isolate, ic_miss_code_); | 170 return OFFSET_OF(Isolate, ic_miss_code_); |
| 155 } | 171 } |
| 156 | 172 |
| 157 Dart_MessageNotifyCallback message_notify_callback() const { | 173 Dart_MessageNotifyCallback message_notify_callback() const { |
| 158 return message_notify_callback_; | 174 return message_notify_callback_; |
| 159 } | 175 } |
| 160 void set_message_notify_callback(Dart_MessageNotifyCallback value) { | 176 void set_message_notify_callback(Dart_MessageNotifyCallback value) { |
| 161 message_notify_callback_ = value; | 177 message_notify_callback_ = value; |
| 162 } | 178 } |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 230 | 246 |
| 231 void SetupInstructionsSnapshotPage( | 247 void SetupInstructionsSnapshotPage( |
| 232 const uint8_t* instructions_snapshot_buffer); | 248 const uint8_t* instructions_snapshot_buffer); |
| 233 void SetupDataSnapshotPage( | 249 void SetupDataSnapshotPage( |
| 234 const uint8_t* instructions_snapshot_buffer); | 250 const uint8_t* instructions_snapshot_buffer); |
| 235 | 251 |
| 236 void ScheduleMessageInterrupts(); | 252 void ScheduleMessageInterrupts(); |
| 237 | 253 |
| 238 // Marks all libraries as loaded. | 254 // Marks all libraries as loaded. |
| 239 void DoneLoading(); | 255 void DoneLoading(); |
| 256 void DoneFinalizing(); |
| 257 |
| 258 void OnStackReload(); |
| 259 void ReloadSources(bool test_mode = false); |
| 240 | 260 |
| 241 bool MakeRunnable(); | 261 bool MakeRunnable(); |
| 242 void Run(); | 262 void Run(); |
| 243 | 263 |
| 244 MessageHandler* message_handler() const { return message_handler_; } | 264 MessageHandler* message_handler() const { return message_handler_; } |
| 245 void set_message_handler(MessageHandler* value) { message_handler_ = value; } | 265 void set_message_handler(MessageHandler* value) { message_handler_ = value; } |
| 246 | 266 |
| 247 bool is_runnable() const { return is_runnable_; } | 267 bool is_runnable() const { return is_runnable_; } |
| 248 void set_is_runnable(bool value) { | 268 void set_is_runnable(bool value) { |
| 249 is_runnable_ = value; | 269 is_runnable_ = value; |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 381 | 401 |
| 382 BackgroundCompiler* background_compiler() const { | 402 BackgroundCompiler* background_compiler() const { |
| 383 return background_compiler_; | 403 return background_compiler_; |
| 384 } | 404 } |
| 385 void set_background_compiler(BackgroundCompiler* value) { | 405 void set_background_compiler(BackgroundCompiler* value) { |
| 386 // Do not overwrite a background compiler (memory leak). | 406 // Do not overwrite a background compiler (memory leak). |
| 387 ASSERT((value == NULL) || (background_compiler_ == NULL)); | 407 ASSERT((value == NULL) || (background_compiler_ == NULL)); |
| 388 background_compiler_ = value; | 408 background_compiler_ = value; |
| 389 } | 409 } |
| 390 | 410 |
| 411 void enable_background_compiler() { |
| 412 background_compiler_disabled_depth_--; |
| 413 if (background_compiler_disabled_depth_ < 0) { |
| 414 FATAL("Mismatched number of calls to disable_background_compiler and " |
| 415 "enable_background_compiler."); |
| 416 } |
| 417 } |
| 418 |
| 419 void disable_background_compiler() { |
| 420 background_compiler_disabled_depth_++; |
| 421 } |
| 422 |
| 423 bool is_background_compiler_disabled() const { |
| 424 return background_compiler_disabled_depth_ > 0; |
| 425 } |
| 426 |
| 391 void UpdateLastAllocationProfileAccumulatorResetTimestamp() { | 427 void UpdateLastAllocationProfileAccumulatorResetTimestamp() { |
| 392 last_allocationprofile_accumulator_reset_timestamp_ = | 428 last_allocationprofile_accumulator_reset_timestamp_ = |
| 393 OS::GetCurrentTimeMillis(); | 429 OS::GetCurrentTimeMillis(); |
| 394 } | 430 } |
| 395 | 431 |
| 396 int64_t last_allocationprofile_accumulator_reset_timestamp() const { | 432 int64_t last_allocationprofile_accumulator_reset_timestamp() const { |
| 397 return last_allocationprofile_accumulator_reset_timestamp_; | 433 return last_allocationprofile_accumulator_reset_timestamp_; |
| 398 } | 434 } |
| 399 | 435 |
| 400 void UpdateLastAllocationProfileGCTimestamp() { | 436 void UpdateLastAllocationProfileGCTimestamp() { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 425 // Mutator thread is used to aggregate compiler stats. | 461 // Mutator thread is used to aggregate compiler stats. |
| 426 CompilerStats* aggregate_compiler_stats() { | 462 CompilerStats* aggregate_compiler_stats() { |
| 427 ASSERT(HasMutatorThread()); | 463 ASSERT(HasMutatorThread()); |
| 428 return mutator_thread_->compiler_stats(); | 464 return mutator_thread_->compiler_stats(); |
| 429 } | 465 } |
| 430 | 466 |
| 431 VMTagCounters* vm_tag_counters() { | 467 VMTagCounters* vm_tag_counters() { |
| 432 return &vm_tag_counters_; | 468 return &vm_tag_counters_; |
| 433 } | 469 } |
| 434 | 470 |
| 471 bool IsReloading() const { |
| 472 return reload_context_ != NULL; |
| 473 } |
| 474 |
| 475 IsolateReloadContext* reload_context() { |
| 476 return reload_context_; |
| 477 } |
| 478 |
| 479 bool HasAttemptedReload() const { |
| 480 return has_attempted_reload_; |
| 481 } |
| 482 |
| 483 bool CanReload() const; |
| 484 |
| 485 void ReportReloadError(const Error& error); |
| 486 |
| 435 uword user_tag() const { | 487 uword user_tag() const { |
| 436 return user_tag_; | 488 return user_tag_; |
| 437 } | 489 } |
| 438 static intptr_t user_tag_offset() { | 490 static intptr_t user_tag_offset() { |
| 439 return OFFSET_OF(Isolate, user_tag_); | 491 return OFFSET_OF(Isolate, user_tag_); |
| 440 } | 492 } |
| 441 static intptr_t current_tag_offset() { | 493 static intptr_t current_tag_offset() { |
| 442 return OFFSET_OF(Isolate, current_tag_); | 494 return OFFSET_OF(Isolate, current_tag_); |
| 443 } | 495 } |
| 444 static intptr_t default_tag_offset() { | 496 static intptr_t default_tag_offset() { |
| (...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 710 | 762 |
| 711 VMTagCounters vm_tag_counters_; | 763 VMTagCounters vm_tag_counters_; |
| 712 RawGrowableObjectArray* tag_table_; | 764 RawGrowableObjectArray* tag_table_; |
| 713 | 765 |
| 714 RawGrowableObjectArray* deoptimized_code_array_; | 766 RawGrowableObjectArray* deoptimized_code_array_; |
| 715 | 767 |
| 716 RawError* sticky_error_; | 768 RawError* sticky_error_; |
| 717 | 769 |
| 718 // Background compilation. | 770 // Background compilation. |
| 719 BackgroundCompiler* background_compiler_; | 771 BackgroundCompiler* background_compiler_; |
| 772 intptr_t background_compiler_disabled_depth_; |
| 720 | 773 |
| 721 // We use 6 list entries for each pending service extension calls. | 774 // We use 6 list entries for each pending service extension calls. |
| 722 enum { | 775 enum { |
| 723 kPendingHandlerIndex = 0, | 776 kPendingHandlerIndex = 0, |
| 724 kPendingMethodNameIndex, | 777 kPendingMethodNameIndex, |
| 725 kPendingKeysIndex, | 778 kPendingKeysIndex, |
| 726 kPendingValuesIndex, | 779 kPendingValuesIndex, |
| 727 kPendingReplyPortIndex, | 780 kPendingReplyPortIndex, |
| 728 kPendingIdIndex, | 781 kPendingIdIndex, |
| 729 kPendingEntrySize | 782 kPendingEntrySize |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 762 RawGrowableObjectArray* boxed_field_list_; | 815 RawGrowableObjectArray* boxed_field_list_; |
| 763 // List of fields that were disabling code while background compiler | 816 // List of fields that were disabling code while background compiler |
| 764 // was running. | 817 // was running. |
| 765 RawGrowableObjectArray* disabling_field_list_; | 818 RawGrowableObjectArray* disabling_field_list_; |
| 766 | 819 |
| 767 // This guards spawn_count_. An isolate cannot complete shutdown and be | 820 // This guards spawn_count_. An isolate cannot complete shutdown and be |
| 768 // destroyed while there are child isolates in the midst of a spawn. | 821 // destroyed while there are child isolates in the midst of a spawn. |
| 769 Monitor* spawn_count_monitor_; | 822 Monitor* spawn_count_monitor_; |
| 770 intptr_t spawn_count_; | 823 intptr_t spawn_count_; |
| 771 | 824 |
| 825 // Has a reload ever been attempted? |
| 826 bool has_attempted_reload_; |
| 827 intptr_t no_reload_scope_depth_; // we can only reload when this is 0. |
| 828 IsolateReloadContext* reload_context_; |
| 829 |
| 772 #define ISOLATE_METRIC_VARIABLE(type, variable, name, unit) \ | 830 #define ISOLATE_METRIC_VARIABLE(type, variable, name, unit) \ |
| 773 type metric_##variable##_; | 831 type metric_##variable##_; |
| 774 ISOLATE_METRIC_LIST(ISOLATE_METRIC_VARIABLE); | 832 ISOLATE_METRIC_LIST(ISOLATE_METRIC_VARIABLE); |
| 775 #undef ISOLATE_METRIC_VARIABLE | 833 #undef ISOLATE_METRIC_VARIABLE |
| 776 | 834 |
| 777 | 835 |
| 778 static Dart_IsolateCreateCallback create_callback_; | 836 static Dart_IsolateCreateCallback create_callback_; |
| 779 static Dart_IsolateShutdownCallback shutdown_callback_; | 837 static Dart_IsolateShutdownCallback shutdown_callback_; |
| 780 static Dart_IsolateInterruptCallback vmstats_callback_; | 838 static Dart_IsolateInterruptCallback vmstats_callback_; |
| 781 | 839 |
| 782 static void WakePauseEventHandler(Dart_Isolate isolate); | 840 static void WakePauseEventHandler(Dart_Isolate isolate); |
| 783 | 841 |
| 784 // Manage list of existing isolates. | 842 // Manage list of existing isolates. |
| 785 static bool AddIsolateToList(Isolate* isolate); | 843 static bool AddIsolateToList(Isolate* isolate); |
| 786 static void RemoveIsolateFromList(Isolate* isolate); | 844 static void RemoveIsolateFromList(Isolate* isolate); |
| 787 | 845 |
| 788 // This monitor protects isolates_list_head_, and creation_enabled_. | 846 // This monitor protects isolates_list_head_, and creation_enabled_. |
| 789 static Monitor* isolates_list_monitor_; | 847 static Monitor* isolates_list_monitor_; |
| 790 static Isolate* isolates_list_head_; | 848 static Isolate* isolates_list_head_; |
| 791 static bool creation_enabled_; | 849 static bool creation_enabled_; |
| 792 | 850 |
| 793 #define REUSABLE_FRIEND_DECLARATION(name) \ | 851 #define REUSABLE_FRIEND_DECLARATION(name) \ |
| 794 friend class Reusable##name##HandleScope; | 852 friend class Reusable##name##HandleScope; |
| 795 REUSABLE_HANDLE_LIST(REUSABLE_FRIEND_DECLARATION) | 853 REUSABLE_HANDLE_LIST(REUSABLE_FRIEND_DECLARATION) |
| 796 #undef REUSABLE_FRIEND_DECLARATION | 854 #undef REUSABLE_FRIEND_DECLARATION |
| 797 | 855 |
| 856 friend class Become; // VisitObjectPointers |
| 798 friend class GCMarker; // VisitObjectPointers | 857 friend class GCMarker; // VisitObjectPointers |
| 799 friend class SafepointHandler; | 858 friend class SafepointHandler; |
| 800 friend class Scavenger; // VisitObjectPointers | 859 friend class Scavenger; // VisitObjectPointers |
| 801 friend class ServiceIsolate; | 860 friend class ServiceIsolate; |
| 802 friend class Thread; | 861 friend class Thread; |
| 803 friend class Timeline; | 862 friend class Timeline; |
| 863 friend class NoReloadScope; // reload_block |
| 864 |
| 804 | 865 |
| 805 DISALLOW_COPY_AND_ASSIGN(Isolate); | 866 DISALLOW_COPY_AND_ASSIGN(Isolate); |
| 806 }; | 867 }; |
| 807 | 868 |
| 808 | 869 |
| 809 // When we need to execute code in an isolate, we use the | 870 // When we need to execute code in an isolate, we use the |
| 810 // StartIsolateScope. | 871 // StartIsolateScope. |
| 811 class StartIsolateScope { | 872 class StartIsolateScope { |
| 812 public: | 873 public: |
| 813 explicit StartIsolateScope(Isolate* new_isolate) | 874 explicit StartIsolateScope(Isolate* new_isolate) |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 928 intptr_t* spawn_count_; | 989 intptr_t* spawn_count_; |
| 929 | 990 |
| 930 Dart_IsolateFlags isolate_flags_; | 991 Dart_IsolateFlags isolate_flags_; |
| 931 bool paused_; | 992 bool paused_; |
| 932 bool errors_are_fatal_; | 993 bool errors_are_fatal_; |
| 933 }; | 994 }; |
| 934 | 995 |
| 935 } // namespace dart | 996 } // namespace dart |
| 936 | 997 |
| 937 #endif // VM_ISOLATE_H_ | 998 #endif // VM_ISOLATE_H_ |
| OLD | NEW |