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 905 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
916 } | 916 } |
917 } | 917 } |
918 | 918 |
919 private: | 919 private: |
920 Isolate* new_isolate_; | 920 Isolate* new_isolate_; |
921 Isolate* saved_isolate_; | 921 Isolate* saved_isolate_; |
922 | 922 |
923 DISALLOW_COPY_AND_ASSIGN(StartIsolateScope); | 923 DISALLOW_COPY_AND_ASSIGN(StartIsolateScope); |
924 }; | 924 }; |
925 | 925 |
926 // When we need to temporarily become another isolate, we use the | |
927 // SwitchIsolateScope. It is not permitted to run dart code while in | |
928 // a SwitchIsolateScope. | |
929 class SwitchIsolateScope { | |
930 public: | |
931 explicit SwitchIsolateScope(Isolate* new_isolate) | |
932 : new_isolate_(new_isolate), | |
933 saved_isolate_(Isolate::Current()), | |
934 saved_stack_limit_(saved_isolate_ | |
935 ? saved_isolate_->saved_stack_limit() : 0) { | |
936 // TODO(koda): Audit users; why would these two ever be equal? | |
937 if (saved_isolate_ != new_isolate_) { | |
938 if (new_isolate_ == NULL) { | |
939 Thread::ExitIsolate(); | |
940 } else { | |
941 Thread::EnterIsolate(new_isolate_); | |
942 // Don't allow dart code to execute. | |
943 new_isolate_->SetStackLimit(~static_cast<uword>(0)); | |
944 } | |
945 } | |
946 } | |
947 | |
948 ~SwitchIsolateScope() { | |
949 if (saved_isolate_ != new_isolate_) { | |
950 if (new_isolate_ != NULL) { | |
951 Thread::ExitIsolate(); | |
952 } | |
953 if (saved_isolate_ != NULL) { | |
954 Thread::EnterIsolate(saved_isolate_); | |
955 saved_isolate_->SetStackLimit(saved_stack_limit_); | |
956 } | |
957 } | |
958 } | |
959 | |
960 private: | |
961 Isolate* new_isolate_; | |
962 Isolate* saved_isolate_; | |
963 uword saved_stack_limit_; | |
964 | |
965 DISALLOW_COPY_AND_ASSIGN(SwitchIsolateScope); | |
966 }; | |
967 | |
968 | 926 |
969 class IsolateSpawnState { | 927 class IsolateSpawnState { |
970 public: | 928 public: |
971 IsolateSpawnState(Dart_Port parent_port, | 929 IsolateSpawnState(Dart_Port parent_port, |
972 const Function& func, | 930 const Function& func, |
973 const Instance& message, | 931 const Instance& message, |
974 bool paused, | 932 bool paused, |
975 bool errorsAreFatal, | 933 bool errorsAreFatal, |
976 Dart_Port onExit, | 934 Dart_Port onExit, |
977 Dart_Port onError); | 935 Dart_Port onError); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1024 uint8_t* serialized_message_; | 982 uint8_t* serialized_message_; |
1025 intptr_t serialized_message_len_; | 983 intptr_t serialized_message_len_; |
1026 Isolate::Flags isolate_flags_; | 984 Isolate::Flags isolate_flags_; |
1027 bool paused_; | 985 bool paused_; |
1028 bool errors_are_fatal_; | 986 bool errors_are_fatal_; |
1029 }; | 987 }; |
1030 | 988 |
1031 } // namespace dart | 989 } // namespace dart |
1032 | 990 |
1033 #endif // VM_ISOLATE_H_ | 991 #endif // VM_ISOLATE_H_ |
OLD | NEW |