| 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 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 247 uword stack_limit_address() const { | 247 uword stack_limit_address() const { |
| 248 return reinterpret_cast<uword>(&stack_limit_); | 248 return reinterpret_cast<uword>(&stack_limit_); |
| 249 } | 249 } |
| 250 static intptr_t stack_limit_offset() { | 250 static intptr_t stack_limit_offset() { |
| 251 return OFFSET_OF(Isolate, stack_limit_); | 251 return OFFSET_OF(Isolate, stack_limit_); |
| 252 } | 252 } |
| 253 | 253 |
| 254 // The true stack limit for this isolate. | 254 // The true stack limit for this isolate. |
| 255 uword saved_stack_limit() const { return saved_stack_limit_; } | 255 uword saved_stack_limit() const { return saved_stack_limit_; } |
| 256 | 256 |
| 257 uword stack_base() const { return stack_base_; } | |
| 258 | |
| 259 // Stack overflow flags | 257 // Stack overflow flags |
| 260 enum { | 258 enum { |
| 261 kOsrRequest = 0x1, // Current stack overflow caused by OSR request. | 259 kOsrRequest = 0x1, // Current stack overflow caused by OSR request. |
| 262 }; | 260 }; |
| 263 | 261 |
| 264 uword stack_overflow_flags_address() const { | 262 uword stack_overflow_flags_address() const { |
| 265 return reinterpret_cast<uword>(&stack_overflow_flags_); | 263 return reinterpret_cast<uword>(&stack_overflow_flags_); |
| 266 } | 264 } |
| 267 | 265 |
| 268 int32_t IncrementAndGetStackOverflowCount() { | 266 int32_t IncrementAndGetStackOverflowCount() { |
| 269 return ++stack_overflow_count_; | 267 return ++stack_overflow_count_; |
| 270 } | 268 } |
| 271 | 269 |
| 272 // Retrieves and clears the stack overflow flags. These are set by | 270 // Retrieves and clears the stack overflow flags. These are set by |
| 273 // the generated code before the slow path runtime routine for a | 271 // the generated code before the slow path runtime routine for a |
| 274 // stack overflow is called. | 272 // stack overflow is called. |
| 275 uword GetAndClearStackOverflowFlags(); | 273 uword GetAndClearStackOverflowFlags(); |
| 276 | 274 |
| 277 // Retrieve the stack address bounds for profiler. | |
| 278 bool GetProfilerStackBounds(uword* lower, uword* upper) const; | |
| 279 | |
| 280 static uword GetSpecifiedStackSize(); | |
| 281 | |
| 282 static const intptr_t kStackSizeBuffer = (4 * KB * kWordSize); | |
| 283 | |
| 284 // Interrupt bits. | 275 // Interrupt bits. |
| 285 enum { | 276 enum { |
| 286 kVMInterrupt = 0x1, // Internal VM checks: safepoints, store buffers, etc. | 277 kVMInterrupt = 0x1, // Internal VM checks: safepoints, store buffers, etc. |
| 287 kMessageInterrupt = 0x2, // An interrupt to process an out of band message. | 278 kMessageInterrupt = 0x2, // An interrupt to process an out of band message. |
| 288 | 279 |
| 289 kInterruptsMask = (kVMInterrupt | kMessageInterrupt), | 280 kInterruptsMask = (kVMInterrupt | kMessageInterrupt), |
| 290 }; | 281 }; |
| 291 | 282 |
| 292 void ScheduleInterrupts(uword interrupt_bits); | 283 void ScheduleInterrupts(uword interrupt_bits); |
| 293 RawError* HandleInterrupts(); | 284 RawError* HandleInterrupts(); |
| (...skipping 470 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 764 ApiState* api_state_; | 755 ApiState* api_state_; |
| 765 Debugger* debugger_; | 756 Debugger* debugger_; |
| 766 bool resume_request_; | 757 bool resume_request_; |
| 767 int64_t last_resume_timestamp_; | 758 int64_t last_resume_timestamp_; |
| 768 bool has_compiled_code_; // Can check that no compilation occured. | 759 bool has_compiled_code_; // Can check that no compilation occured. |
| 769 Flags flags_; | 760 Flags flags_; |
| 770 Random random_; | 761 Random random_; |
| 771 Simulator* simulator_; | 762 Simulator* simulator_; |
| 772 Mutex* mutex_; // protects stack_limit_, saved_stack_limit_, compiler stats. | 763 Mutex* mutex_; // protects stack_limit_, saved_stack_limit_, compiler stats. |
| 773 uword saved_stack_limit_; | 764 uword saved_stack_limit_; |
| 774 uword stack_base_; | |
| 775 uword stack_overflow_flags_; | 765 uword stack_overflow_flags_; |
| 776 int32_t stack_overflow_count_; | 766 int32_t stack_overflow_count_; |
| 777 MessageHandler* message_handler_; | 767 MessageHandler* message_handler_; |
| 778 IsolateSpawnState* spawn_state_; | 768 IsolateSpawnState* spawn_state_; |
| 779 bool is_runnable_; | 769 bool is_runnable_; |
| 780 Dart_GcPrologueCallback gc_prologue_callback_; | 770 Dart_GcPrologueCallback gc_prologue_callback_; |
| 781 Dart_GcEpilogueCallback gc_epilogue_callback_; | 771 Dart_GcEpilogueCallback gc_epilogue_callback_; |
| 782 intptr_t defer_finalization_count_; | 772 intptr_t defer_finalization_count_; |
| 783 DeoptContext* deopt_context_; | 773 DeoptContext* deopt_context_; |
| 784 | 774 |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 901 : new_isolate_(new_isolate), saved_isolate_(Isolate::Current()) { | 891 : new_isolate_(new_isolate), saved_isolate_(Isolate::Current()) { |
| 902 // TODO(koda): Audit users; passing NULL goes against naming of this class. | 892 // TODO(koda): Audit users; passing NULL goes against naming of this class. |
| 903 if (new_isolate_ == NULL) { | 893 if (new_isolate_ == NULL) { |
| 904 ASSERT(Isolate::Current() == NULL); | 894 ASSERT(Isolate::Current() == NULL); |
| 905 // Do nothing. | 895 // Do nothing. |
| 906 return; | 896 return; |
| 907 } | 897 } |
| 908 if (saved_isolate_ != new_isolate_) { | 898 if (saved_isolate_ != new_isolate_) { |
| 909 ASSERT(Isolate::Current() == NULL); | 899 ASSERT(Isolate::Current() == NULL); |
| 910 // Ensure this is not a nested 'isolate enter' with prior state. | 900 // Ensure this is not a nested 'isolate enter' with prior state. |
| 911 ASSERT(new_isolate_->stack_base() == 0); | 901 ASSERT(new_isolate_->saved_stack_limit() == 0); |
| 912 Thread::EnterIsolate(new_isolate_); | 902 Thread::EnterIsolate(new_isolate_); |
| 913 } | 903 } |
| 914 } | 904 } |
| 915 | 905 |
| 916 ~StartIsolateScope() { | 906 ~StartIsolateScope() { |
| 917 if (new_isolate_ == NULL) { | 907 if (new_isolate_ == NULL) { |
| 918 ASSERT(Isolate::Current() == NULL); | 908 ASSERT(Isolate::Current() == NULL); |
| 919 // Do nothing. | 909 // Do nothing. |
| 920 return; | 910 return; |
| 921 } | 911 } |
| 922 if (saved_isolate_ != new_isolate_) { | 912 if (saved_isolate_ != new_isolate_) { |
| 923 ASSERT(saved_isolate_ == NULL); | 913 ASSERT(saved_isolate_ == NULL); |
| 924 // ASSERT that we have bottomed out of all Dart invocations. | 914 // ASSERT that we have bottomed out of all Dart invocations. |
| 925 ASSERT(new_isolate_->stack_base() == 0); | 915 ASSERT(new_isolate_->saved_stack_limit() == 0); |
| 926 Thread::ExitIsolate(); | 916 Thread::ExitIsolate(); |
| 927 } | 917 } |
| 928 } | 918 } |
| 929 | 919 |
| 930 private: | 920 private: |
| 931 Isolate* new_isolate_; | 921 Isolate* new_isolate_; |
| 932 Isolate* saved_isolate_; | 922 Isolate* saved_isolate_; |
| 933 | 923 |
| 934 DISALLOW_COPY_AND_ASSIGN(StartIsolateScope); | 924 DISALLOW_COPY_AND_ASSIGN(StartIsolateScope); |
| 935 }; | 925 }; |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 993 uint8_t* serialized_message_; | 983 uint8_t* serialized_message_; |
| 994 intptr_t serialized_message_len_; | 984 intptr_t serialized_message_len_; |
| 995 Isolate::Flags isolate_flags_; | 985 Isolate::Flags isolate_flags_; |
| 996 bool paused_; | 986 bool paused_; |
| 997 bool errors_are_fatal_; | 987 bool errors_are_fatal_; |
| 998 }; | 988 }; |
| 999 | 989 |
| 1000 } // namespace dart | 990 } // namespace dart |
| 1001 | 991 |
| 1002 #endif // VM_ISOLATE_H_ | 992 #endif // VM_ISOLATE_H_ |
| OLD | NEW |