Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(357)

Side by Side Diff: runtime/vm/isolate.h

Issue 9924015: Use the ThreadPool for all isolates and native ports. Previously, (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/dart_api_impl.cc ('k') | runtime/vm/isolate.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 "platform/thread.h" 10 #include "platform/thread.h"
(...skipping 15 matching lines...) Expand all
26 class MessageHandler; 26 class MessageHandler;
27 class Mutex; 27 class Mutex;
28 class ObjectPointerVisitor; 28 class ObjectPointerVisitor;
29 class ObjectStore; 29 class ObjectStore;
30 class RawContext; 30 class RawContext;
31 class RawError; 31 class RawError;
32 class StackResource; 32 class StackResource;
33 class StubCode; 33 class StubCode;
34 class Zone; 34 class Zone;
35 35
36
37 class Isolate : public BaseIsolate { 36 class Isolate : public BaseIsolate {
38 public: 37 public:
39 ~Isolate(); 38 ~Isolate();
40 39
41 static inline Isolate* Current() { 40 static inline Isolate* Current() {
42 return reinterpret_cast<Isolate*>(Thread::GetThreadLocal(isolate_key)); 41 return reinterpret_cast<Isolate*>(Thread::GetThreadLocal(isolate_key));
43 } 42 }
44 43
45 static void SetCurrent(Isolate* isolate); 44 static void SetCurrent(Isolate* isolate);
46 45
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
132 void SetStackLimitFromCurrentTOS(uword isolate_stack_top); 131 void SetStackLimitFromCurrentTOS(uword isolate_stack_top);
133 132
134 uword stack_limit_address() const { 133 uword stack_limit_address() const {
135 return reinterpret_cast<uword>(&stack_limit_); 134 return reinterpret_cast<uword>(&stack_limit_);
136 } 135 }
137 136
138 // The current stack limit. This may be overwritten with a special 137 // The current stack limit. This may be overwritten with a special
139 // value to trigger interrupts. 138 // value to trigger interrupts.
140 uword stack_limit() const { return stack_limit_; } 139 uword stack_limit() const { return stack_limit_; }
141 140
142 // The true stack limit for this isolate. This does not change 141 // The true stack limit for this isolate.
143 // after isolate initialization.
144 uword saved_stack_limit() const { return saved_stack_limit_; } 142 uword saved_stack_limit() const { return saved_stack_limit_; }
145 143
146 enum { 144 enum {
147 kApiInterrupt = 0x1, // An interrupt from Dart_InterruptIsolate. 145 kApiInterrupt = 0x1, // An interrupt from Dart_InterruptIsolate.
148 kMessageInterrupt = 0x2, // An interrupt to process an out of band message. 146 kMessageInterrupt = 0x2, // An interrupt to process an out of band message.
149 147
150 kInterruptsMask = kApiInterrupt | kMessageInterrupt, 148 kInterruptsMask = kApiInterrupt | kMessageInterrupt,
151 }; 149 };
152 150
153 void ScheduleInterrupts(uword interrupt_bits); 151 void ScheduleInterrupts(uword interrupt_bits);
154 uword GetAndClearInterrupts(); 152 uword GetAndClearInterrupts();
155 153
156 MessageHandler* message_handler() const { return message_handler_; } 154 MessageHandler* message_handler() const { return message_handler_; }
157 void set_message_handler(MessageHandler* value) { message_handler_ = value; } 155 void set_message_handler(MessageHandler* value) { message_handler_ = value; }
158 156
159 // Returns null on success, a RawError on failure. 157 uword spawn_data() const { return spawn_data_; }
160 RawError* StandardRunLoop(); 158 void set_spawn_data(uword value) { spawn_data_ = value; }
161 159
162 intptr_t ast_node_id() const { return ast_node_id_; } 160 intptr_t ast_node_id() const { return ast_node_id_; }
163 void set_ast_node_id(int value) { ast_node_id_ = value; } 161 void set_ast_node_id(int value) { ast_node_id_ = value; }
164 162
165 Debugger* debugger() const { return debugger_; } 163 Debugger* debugger() const { return debugger_; }
166 164
167 static void SetCreateCallback(Dart_IsolateCreateCallback cback); 165 static void SetCreateCallback(Dart_IsolateCreateCallback cback);
168 static Dart_IsolateCreateCallback CreateCallback(); 166 static Dart_IsolateCreateCallback CreateCallback();
169 167
170 static void SetInterruptCallback(Dart_IsolateInterruptCallback cback); 168 static void SetInterruptCallback(Dart_IsolateInterruptCallback cback);
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
204 ApiState* api_state_; 202 ApiState* api_state_;
205 StubCode* stub_code_; 203 StubCode* stub_code_;
206 Debugger* debugger_; 204 Debugger* debugger_;
207 LongJump* long_jump_base_; 205 LongJump* long_jump_base_;
208 TimerList timer_list_; 206 TimerList timer_list_;
209 intptr_t ast_node_id_; 207 intptr_t ast_node_id_;
210 Mutex* mutex_; // protects stack_limit_ and saved_stack_limit_. 208 Mutex* mutex_; // protects stack_limit_ and saved_stack_limit_.
211 uword stack_limit_; 209 uword stack_limit_;
212 uword saved_stack_limit_; 210 uword saved_stack_limit_;
213 MessageHandler* message_handler_; 211 MessageHandler* message_handler_;
212 uword spawn_data_;
214 GcPrologueCallbacks gc_prologue_callbacks_; 213 GcPrologueCallbacks gc_prologue_callbacks_;
215 GcEpilogueCallbacks gc_epilogue_callbacks_; 214 GcEpilogueCallbacks gc_epilogue_callbacks_;
216 215
217 static Dart_IsolateCreateCallback create_callback_; 216 static Dart_IsolateCreateCallback create_callback_;
218 static Dart_IsolateInterruptCallback interrupt_callback_; 217 static Dart_IsolateInterruptCallback interrupt_callback_;
219 218
220 DISALLOW_COPY_AND_ASSIGN(Isolate); 219 DISALLOW_COPY_AND_ASSIGN(Isolate);
221 }; 220 };
222 221
222 // When we need to execute code in an isolate, we use the
223 // StartIsolateScope.
224 class StartIsolateScope {
225 public:
226 explicit StartIsolateScope(Isolate* new_isolate)
227 : new_isolate_(new_isolate), saved_isolate_(Isolate::Current()) {
228 ASSERT(new_isolate_ != NULL);
229 if (saved_isolate_ != new_isolate_) {
230 ASSERT(Isolate::Current() == NULL);
231 Isolate::SetCurrent(new_isolate_);
232 new_isolate_->SetStackLimitFromCurrentTOS(reinterpret_cast<uword>(this));
233 }
234 }
235
236 ~StartIsolateScope() {
237 if (saved_isolate_ != new_isolate_) {
238 new_isolate_->SetStackLimit(~static_cast<uword>(0));
239 Isolate::SetCurrent(saved_isolate_);
240 }
241 }
242
243 private:
244 Isolate* new_isolate_;
245 Isolate* saved_isolate_;
246
247 DISALLOW_COPY_AND_ASSIGN(StartIsolateScope);
248 };
249
250 // When we need to temporarily become another isolate, we use the
251 // SwitchIsolateScope. It is not permitted to run dart code while in
252 // a SwitchIsolateScope.
253 class SwitchIsolateScope {
254 public:
255 explicit SwitchIsolateScope(Isolate* new_isolate)
256 : new_isolate_(new_isolate),
257 saved_isolate_(Isolate::Current()),
258 saved_stack_limit_(saved_isolate_
259 ? saved_isolate_->saved_stack_limit() : 0) {
260 if (saved_isolate_ != new_isolate_) {
261 Isolate::SetCurrent(new_isolate_);
262 if (new_isolate_ != NULL) {
263 // Don't allow dart code to execute.
264 new_isolate_->SetStackLimit(~static_cast<uword>(0));
265 }
266 }
267 }
268
269 ~SwitchIsolateScope() {
270 if (saved_isolate_ != new_isolate_) {
271 Isolate::SetCurrent(saved_isolate_);
272 if (saved_isolate_ != NULL) {
273 saved_isolate_->SetStackLimit(saved_stack_limit_);
274 }
275 }
276 }
277
278 private:
279 Isolate* new_isolate_;
280 Isolate* saved_isolate_;
281 uword saved_stack_limit_;
282
283 DISALLOW_COPY_AND_ASSIGN(SwitchIsolateScope);
284 };
285
223 } // namespace dart 286 } // namespace dart
224 287
225 #endif // VM_ISOLATE_H_ 288 #endif // VM_ISOLATE_H_
OLDNEW
« no previous file with comments | « runtime/vm/dart_api_impl.cc ('k') | runtime/vm/isolate.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698