| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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_THREAD_H_ | 5 #ifndef VM_THREAD_H_ |
| 6 #define VM_THREAD_H_ | 6 #define VM_THREAD_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 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 111 CACHED_VM_OBJECTS_LIST(V) \ | 111 CACHED_VM_OBJECTS_LIST(V) \ |
| 112 CACHED_ADDRESSES_LIST(V) \ | 112 CACHED_ADDRESSES_LIST(V) \ |
| 113 | 113 |
| 114 // A VM thread; may be executing Dart code or performing helper tasks like | 114 // A VM thread; may be executing Dart code or performing helper tasks like |
| 115 // garbage collection or compilation. The Thread structure associated with | 115 // garbage collection or compilation. The Thread structure associated with |
| 116 // a thread is allocated by EnsureInit before entering an isolate, and destroyed | 116 // a thread is allocated by EnsureInit before entering an isolate, and destroyed |
| 117 // automatically when the underlying OS thread exits. NOTE: On Windows, CleanUp | 117 // automatically when the underlying OS thread exits. NOTE: On Windows, CleanUp |
| 118 // must currently be called manually (issue 23474). | 118 // must currently be called manually (issue 23474). |
| 119 class Thread : public BaseThread { | 119 class Thread : public BaseThread { |
| 120 public: | 120 public: |
| 121 // The kind of task this thread is performing. Sampled by the profiler. |
| 122 enum TaskKind { |
| 123 kUnknownTask = 0x0, |
| 124 kMutatorTask = 0x1, |
| 125 kCompilerTask = 0x2, |
| 126 kSweeperTask = 0x4, |
| 127 kMarkerTask = 0x8, |
| 128 }; |
| 121 ~Thread(); | 129 ~Thread(); |
| 122 | 130 |
| 123 // The currently executing thread, or NULL if not yet initialized. | 131 // The currently executing thread, or NULL if not yet initialized. |
| 124 static Thread* Current() { | 132 static Thread* Current() { |
| 125 BaseThread* thread = OSThread::GetCurrentTLS(); | 133 BaseThread* thread = OSThread::GetCurrentTLS(); |
| 126 if (thread == NULL || thread->is_os_thread()) { | 134 if (thread == NULL || thread->is_os_thread()) { |
| 127 return NULL; | 135 return NULL; |
| 128 } | 136 } |
| 129 return reinterpret_cast<Thread*>(thread); | 137 return reinterpret_cast<Thread*>(thread); |
| 130 } | 138 } |
| 131 | 139 |
| 132 // Makes the current thread enter 'isolate'. | 140 // Makes the current thread enter 'isolate'. |
| 133 static bool EnterIsolate(Isolate* isolate); | 141 static bool EnterIsolate(Isolate* isolate); |
| 134 // Makes the current thread exit its isolate. | 142 // Makes the current thread exit its isolate. |
| 135 static void ExitIsolate(); | 143 static void ExitIsolate(); |
| 136 | 144 |
| 137 // A VM thread other than the main mutator thread can enter an isolate as a | 145 // A VM thread other than the main mutator thread can enter an isolate as a |
| 138 // "helper" to gain limited concurrent access to the isolate. One example is | 146 // "helper" to gain limited concurrent access to the isolate. One example is |
| 139 // SweeperTask (which uses the class table, which is copy-on-write). | 147 // SweeperTask (which uses the class table, which is copy-on-write). |
| 140 // TODO(koda): Properly synchronize heap access to expand allowed operations. | 148 // TODO(koda): Properly synchronize heap access to expand allowed operations. |
| 141 static bool EnterIsolateAsHelper(Isolate* isolate, | 149 static bool EnterIsolateAsHelper(Isolate* isolate, |
| 150 TaskKind kind, |
| 142 bool bypass_safepoint = false); | 151 bool bypass_safepoint = false); |
| 143 static void ExitIsolateAsHelper(bool bypass_safepoint = false); | 152 static void ExitIsolateAsHelper(bool bypass_safepoint = false); |
| 144 | 153 |
| 145 // Empties the store buffer block into the isolate. | 154 // Empties the store buffer block into the isolate. |
| 146 void PrepareForGC(); | 155 void PrepareForGC(); |
| 147 | 156 |
| 148 void SetStackLimit(uword value); | 157 void SetStackLimit(uword value); |
| 149 void SetStackLimitFromStackBase(uword stack_base); | 158 void SetStackLimitFromStackBase(uword stack_base); |
| 150 void ClearStackLimit(); | 159 void ClearStackLimit(); |
| 151 | 160 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 174 return reinterpret_cast<uword>(&stack_overflow_flags_); | 183 return reinterpret_cast<uword>(&stack_overflow_flags_); |
| 175 } | 184 } |
| 176 static intptr_t stack_overflow_flags_offset() { | 185 static intptr_t stack_overflow_flags_offset() { |
| 177 return OFFSET_OF(Thread, stack_overflow_flags_); | 186 return OFFSET_OF(Thread, stack_overflow_flags_); |
| 178 } | 187 } |
| 179 | 188 |
| 180 int32_t IncrementAndGetStackOverflowCount() { | 189 int32_t IncrementAndGetStackOverflowCount() { |
| 181 return ++stack_overflow_count_; | 190 return ++stack_overflow_count_; |
| 182 } | 191 } |
| 183 | 192 |
| 193 TaskKind task_kind() const { |
| 194 return task_kind_; |
| 195 } |
| 196 |
| 184 // Retrieves and clears the stack overflow flags. These are set by | 197 // Retrieves and clears the stack overflow flags. These are set by |
| 185 // the generated code before the slow path runtime routine for a | 198 // the generated code before the slow path runtime routine for a |
| 186 // stack overflow is called. | 199 // stack overflow is called. |
| 187 uword GetAndClearStackOverflowFlags(); | 200 uword GetAndClearStackOverflowFlags(); |
| 188 | 201 |
| 189 // Interrupt bits. | 202 // Interrupt bits. |
| 190 enum { | 203 enum { |
| 191 kVMInterrupt = 0x1, // Internal VM checks: safepoints, store buffers, etc. | 204 kVMInterrupt = 0x1, // Internal VM checks: safepoints, store buffers, etc. |
| 192 kMessageInterrupt = 0x2, // An interrupt to process an out of band message. | 205 kMessageInterrupt = 0x2, // An interrupt to process an out of band message. |
| 193 | 206 |
| (...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 588 template<class T> T* AllocateReusableHandle(); | 601 template<class T> T* AllocateReusableHandle(); |
| 589 | 602 |
| 590 // Accessed from generated code: | 603 // Accessed from generated code: |
| 591 uword stack_limit_; | 604 uword stack_limit_; |
| 592 uword stack_overflow_flags_; | 605 uword stack_overflow_flags_; |
| 593 Isolate* isolate_; | 606 Isolate* isolate_; |
| 594 Heap* heap_; | 607 Heap* heap_; |
| 595 uword top_exit_frame_info_; | 608 uword top_exit_frame_info_; |
| 596 StoreBufferBlock* store_buffer_block_; | 609 StoreBufferBlock* store_buffer_block_; |
| 597 uword vm_tag_; | 610 uword vm_tag_; |
| 611 TaskKind task_kind_; |
| 598 // State that is cached in the TLS for fast access in generated code. | 612 // State that is cached in the TLS for fast access in generated code. |
| 599 #define DECLARE_MEMBERS(type_name, member_name, expr, default_init_value) \ | 613 #define DECLARE_MEMBERS(type_name, member_name, expr, default_init_value) \ |
| 600 type_name member_name; | 614 type_name member_name; |
| 601 CACHED_CONSTANTS_LIST(DECLARE_MEMBERS) | 615 CACHED_CONSTANTS_LIST(DECLARE_MEMBERS) |
| 602 #undef DECLARE_MEMBERS | 616 #undef DECLARE_MEMBERS |
| 603 | 617 |
| 604 #define DECLARE_MEMBERS(name) \ | 618 #define DECLARE_MEMBERS(name) \ |
| 605 uword name##_entry_point_; | 619 uword name##_entry_point_; |
| 606 RUNTIME_ENTRY_LIST(DECLARE_MEMBERS) | 620 RUNTIME_ENTRY_LIST(DECLARE_MEMBERS) |
| 607 #undef DECLARE_MEMBERS | 621 #undef DECLARE_MEMBERS |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 713 // Disable thread interrupts. | 727 // Disable thread interrupts. |
| 714 class DisableThreadInterruptsScope : public StackResource { | 728 class DisableThreadInterruptsScope : public StackResource { |
| 715 public: | 729 public: |
| 716 explicit DisableThreadInterruptsScope(Thread* thread); | 730 explicit DisableThreadInterruptsScope(Thread* thread); |
| 717 ~DisableThreadInterruptsScope(); | 731 ~DisableThreadInterruptsScope(); |
| 718 }; | 732 }; |
| 719 | 733 |
| 720 } // namespace dart | 734 } // namespace dart |
| 721 | 735 |
| 722 #endif // VM_THREAD_H_ | 736 #endif // VM_THREAD_H_ |
| OLD | NEW |