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/base_isolate.h" | 10 #include "vm/base_isolate.h" |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
233 } | 233 } |
234 | 234 |
235 Dart_LibraryTagHandler library_tag_handler() const { | 235 Dart_LibraryTagHandler library_tag_handler() const { |
236 return library_tag_handler_; | 236 return library_tag_handler_; |
237 } | 237 } |
238 void set_library_tag_handler(Dart_LibraryTagHandler value) { | 238 void set_library_tag_handler(Dart_LibraryTagHandler value) { |
239 library_tag_handler_ = value; | 239 library_tag_handler_ = value; |
240 } | 240 } |
241 | 241 |
242 void SetStackLimit(uword value); | 242 void SetStackLimit(uword value); |
243 void SetStackLimitFromCurrentTOS(uword isolate_stack_top); | 243 void SetStackLimitFromStackBase(uword stack_base); |
| 244 void ClearStackLimit(); |
244 | 245 |
245 uword stack_limit_address() const { | 246 uword stack_limit_address() const { |
246 return reinterpret_cast<uword>(&stack_limit_); | 247 return reinterpret_cast<uword>(&stack_limit_); |
247 } | 248 } |
248 | 249 |
249 // The current stack limit. This may be overwritten with a special | 250 // The current stack limit. This may be overwritten with a special |
250 // value to trigger interrupts. | 251 // value to trigger interrupts. |
251 uword stack_limit() const { return stack_limit_; } | 252 uword stack_limit() const { return stack_limit_; } |
252 static intptr_t stack_limit_offset() { | 253 static intptr_t stack_limit_offset() { |
253 return OFFSET_OF(Isolate, stack_limit_); | 254 return OFFSET_OF(Isolate, stack_limit_); |
254 } | 255 } |
255 | 256 |
256 // The true stack limit for this isolate. | 257 // The true stack limit for this isolate. |
257 uword saved_stack_limit() const { return saved_stack_limit_; } | 258 uword saved_stack_limit() const { return saved_stack_limit_; } |
258 | 259 |
| 260 uword stack_base() const { return stack_base_; } |
| 261 |
259 // Stack overflow flags | 262 // Stack overflow flags |
260 enum { | 263 enum { |
261 kOsrRequest = 0x1, // Current stack overflow caused by OSR request. | 264 kOsrRequest = 0x1, // Current stack overflow caused by OSR request. |
262 }; | 265 }; |
263 | 266 |
264 uword stack_overflow_flags_address() const { | 267 uword stack_overflow_flags_address() const { |
265 return reinterpret_cast<uword>(&stack_overflow_flags_); | 268 return reinterpret_cast<uword>(&stack_overflow_flags_); |
266 } | 269 } |
267 | 270 |
268 int32_t IncrementAndGetStackOverflowCount() { | 271 int32_t IncrementAndGetStackOverflowCount() { |
269 return ++stack_overflow_count_; | 272 return ++stack_overflow_count_; |
270 } | 273 } |
271 | 274 |
272 // Retrieves and clears the stack overflow flags. These are set by | 275 // Retrieves and clears the stack overflow flags. These are set by |
273 // the generated code before the slow path runtime routine for a | 276 // the generated code before the slow path runtime routine for a |
274 // stack overflow is called. | 277 // stack overflow is called. |
275 uword GetAndClearStackOverflowFlags(); | 278 uword GetAndClearStackOverflowFlags(); |
276 | 279 |
277 // Retrieve the stack address bounds. | 280 // Retrieve the stack address bounds for profiler. |
278 bool GetStackBounds(uword* lower, uword* upper); | 281 bool GetProfilerStackBounds(uword* lower, uword* upper) const; |
279 | 282 |
280 static uword GetSpecifiedStackSize(); | 283 static uword GetSpecifiedStackSize(); |
281 | 284 |
282 static const intptr_t kStackSizeBuffer = (4 * KB * kWordSize); | 285 static const intptr_t kStackSizeBuffer = (4 * KB * kWordSize); |
283 | 286 |
284 // Interrupt bits. | 287 // Interrupt bits. |
285 enum { | 288 enum { |
286 kApiInterrupt = 0x1, // An interrupt from Dart_InterruptIsolate. | 289 kApiInterrupt = 0x1, // An interrupt from Dart_InterruptIsolate. |
287 kMessageInterrupt = 0x2, // An interrupt to process an out of band message. | 290 kMessageInterrupt = 0x2, // An interrupt to process an out of band message. |
288 kStoreBufferInterrupt = 0x4, // An interrupt to process the store buffer. | 291 kStoreBufferInterrupt = 0x4, // An interrupt to process the store buffer. |
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
642 bool single_step_; | 645 bool single_step_; |
643 bool resume_request_; | 646 bool resume_request_; |
644 Random random_; | 647 Random random_; |
645 Simulator* simulator_; | 648 Simulator* simulator_; |
646 LongJumpScope* long_jump_base_; | 649 LongJumpScope* long_jump_base_; |
647 TimerList timer_list_; | 650 TimerList timer_list_; |
648 intptr_t deopt_id_; | 651 intptr_t deopt_id_; |
649 Mutex* mutex_; // protects stack_limit_ and saved_stack_limit_. | 652 Mutex* mutex_; // protects stack_limit_ and saved_stack_limit_. |
650 uword stack_limit_; | 653 uword stack_limit_; |
651 uword saved_stack_limit_; | 654 uword saved_stack_limit_; |
| 655 uword stack_base_; |
652 uword stack_overflow_flags_; | 656 uword stack_overflow_flags_; |
653 int32_t stack_overflow_count_; | 657 int32_t stack_overflow_count_; |
654 MessageHandler* message_handler_; | 658 MessageHandler* message_handler_; |
655 IsolateSpawnState* spawn_state_; | 659 IsolateSpawnState* spawn_state_; |
656 bool is_runnable_; | 660 bool is_runnable_; |
657 Dart_GcPrologueCallback gc_prologue_callback_; | 661 Dart_GcPrologueCallback gc_prologue_callback_; |
658 Dart_GcEpilogueCallback gc_epilogue_callback_; | 662 Dart_GcEpilogueCallback gc_epilogue_callback_; |
659 intptr_t defer_finalization_count_; | 663 intptr_t defer_finalization_count_; |
660 DeoptContext* deopt_context_; | 664 DeoptContext* deopt_context_; |
661 | 665 |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
742 // When we need to execute code in an isolate, we use the | 746 // When we need to execute code in an isolate, we use the |
743 // StartIsolateScope. | 747 // StartIsolateScope. |
744 class StartIsolateScope { | 748 class StartIsolateScope { |
745 public: | 749 public: |
746 explicit StartIsolateScope(Isolate* new_isolate) | 750 explicit StartIsolateScope(Isolate* new_isolate) |
747 : new_isolate_(new_isolate), saved_isolate_(Isolate::Current()) { | 751 : new_isolate_(new_isolate), saved_isolate_(Isolate::Current()) { |
748 ASSERT(new_isolate_ != NULL); | 752 ASSERT(new_isolate_ != NULL); |
749 if (saved_isolate_ != new_isolate_) { | 753 if (saved_isolate_ != new_isolate_) { |
750 ASSERT(Isolate::Current() == NULL); | 754 ASSERT(Isolate::Current() == NULL); |
751 Isolate::SetCurrent(new_isolate_); | 755 Isolate::SetCurrent(new_isolate_); |
752 new_isolate_->SetStackLimitFromCurrentTOS(reinterpret_cast<uword>(this)); | 756 new_isolate_->SetStackLimitFromStackBase(reinterpret_cast<uword>(this)); |
753 } | 757 } |
754 } | 758 } |
755 | 759 |
756 ~StartIsolateScope() { | 760 ~StartIsolateScope() { |
757 if (saved_isolate_ != new_isolate_) { | 761 if (saved_isolate_ != new_isolate_) { |
758 new_isolate_->SetStackLimit(~static_cast<uword>(0)); | 762 new_isolate_->ClearStackLimit(); |
759 Isolate::SetCurrent(saved_isolate_); | 763 Isolate::SetCurrent(saved_isolate_); |
760 } | 764 } |
761 } | 765 } |
762 | 766 |
763 private: | 767 private: |
764 Isolate* new_isolate_; | 768 Isolate* new_isolate_; |
765 Isolate* saved_isolate_; | 769 Isolate* saved_isolate_; |
766 | 770 |
767 DISALLOW_COPY_AND_ASSIGN(StartIsolateScope); | 771 DISALLOW_COPY_AND_ASSIGN(StartIsolateScope); |
768 }; | 772 }; |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
841 char* exception_callback_name_; | 845 char* exception_callback_name_; |
842 uint8_t* serialized_args_; | 846 uint8_t* serialized_args_; |
843 intptr_t serialized_args_len_; | 847 intptr_t serialized_args_len_; |
844 uint8_t* serialized_message_; | 848 uint8_t* serialized_message_; |
845 intptr_t serialized_message_len_; | 849 intptr_t serialized_message_len_; |
846 }; | 850 }; |
847 | 851 |
848 } // namespace dart | 852 } // namespace dart |
849 | 853 |
850 #endif // VM_ISOLATE_H_ | 854 #endif // VM_ISOLATE_H_ |
OLD | NEW |