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 #include "vm/isolate.h" | 5 #include "vm/isolate.h" |
6 | 6 |
7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
8 #include "include/dart_native_api.h" | 8 #include "include/dart_native_api.h" |
9 #include "platform/assert.h" | 9 #include "platform/assert.h" |
10 #include "platform/text_buffer.h" | 10 #include "platform/text_buffer.h" |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 DECLARE_FLAG(bool, trace_service); | 57 DECLARE_FLAG(bool, trace_service); |
58 DECLARE_FLAG(bool, warn_on_pause_with_no_debugger); | 58 DECLARE_FLAG(bool, warn_on_pause_with_no_debugger); |
59 | 59 |
60 // Reload flags. | 60 // Reload flags. |
61 DECLARE_FLAG(bool, check_reloaded); | 61 DECLARE_FLAG(bool, check_reloaded); |
62 DECLARE_FLAG(int, reload_every); | 62 DECLARE_FLAG(int, reload_every); |
63 DECLARE_FLAG(bool, reload_every_back_off); | 63 DECLARE_FLAG(bool, reload_every_back_off); |
64 DECLARE_FLAG(bool, trace_reload); | 64 DECLARE_FLAG(bool, trace_reload); |
65 | 65 |
66 | 66 |
67 NOT_IN_PRODUCT( | 67 #if !defined(PRODUCT) |
68 static void CheckedModeHandler(bool value) { | 68 static void CheckedModeHandler(bool value) { |
69 FLAG_enable_asserts = value; | 69 FLAG_enable_asserts = value; |
70 FLAG_enable_type_checks = value; | 70 FLAG_enable_type_checks = value; |
71 } | 71 } |
72 | 72 |
73 // --enable-checked-mode and --checked both enable checked mode which is | 73 // --enable-checked-mode and --checked both enable checked mode which is |
74 // equivalent to setting --enable-asserts and --enable-type-checks. | 74 // equivalent to setting --enable-asserts and --enable-type-checks. |
75 DEFINE_FLAG_HANDLER(CheckedModeHandler, | 75 DEFINE_FLAG_HANDLER(CheckedModeHandler, |
76 enable_checked_mode, | 76 enable_checked_mode, |
77 "Enable checked mode."); | 77 "Enable checked mode."); |
78 | 78 |
79 DEFINE_FLAG_HANDLER(CheckedModeHandler, | 79 DEFINE_FLAG_HANDLER(CheckedModeHandler, checked, "Enable checked mode."); |
80 checked, | 80 #endif // !defined(PRODUCT) |
81 "Enable checked mode."); | |
82 ) | |
83 | 81 |
84 | 82 |
85 // Quick access to the locally defined thread() and isolate() methods. | 83 // Quick access to the locally defined thread() and isolate() methods. |
86 #define T (thread()) | 84 #define T (thread()) |
87 #define I (isolate()) | 85 #define I (isolate()) |
88 | 86 |
89 #if defined(DEBUG) | 87 #if defined(DEBUG) |
90 // Helper class to ensure that a live origin_id is never reused | 88 // Helper class to ensure that a live origin_id is never reused |
91 // and assigned to an isolate. | 89 // and assigned to an isolate. |
92 class VerifyOriginId : public IsolateVisitor { | 90 class VerifyOriginId : public IsolateVisitor { |
93 public: | 91 public: |
94 explicit VerifyOriginId(Dart_Port id) : id_(id) {} | 92 explicit VerifyOriginId(Dart_Port id) : id_(id) {} |
95 | 93 |
96 void VisitIsolate(Isolate* isolate) { | 94 void VisitIsolate(Isolate* isolate) { ASSERT(isolate->origin_id() != id_); } |
97 ASSERT(isolate->origin_id() != id_); | |
98 } | |
99 | 95 |
100 private: | 96 private: |
101 Dart_Port id_; | 97 Dart_Port id_; |
102 DISALLOW_COPY_AND_ASSIGN(VerifyOriginId); | 98 DISALLOW_COPY_AND_ASSIGN(VerifyOriginId); |
103 }; | 99 }; |
104 #endif | 100 #endif |
105 | 101 |
106 | 102 |
107 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) { | 103 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) { |
108 void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size); | 104 void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size); |
109 return reinterpret_cast<uint8_t*>(new_ptr); | 105 return reinterpret_cast<uint8_t*>(new_ptr); |
110 } | 106 } |
111 | 107 |
112 | 108 |
113 static void SerializeObject(const Instance& obj, | 109 static void SerializeObject(const Instance& obj, |
114 uint8_t** obj_data, | 110 uint8_t** obj_data, |
115 intptr_t* obj_len, | 111 intptr_t* obj_len, |
116 bool allow_any_object) { | 112 bool allow_any_object) { |
117 MessageWriter writer(obj_data, &allocator, allow_any_object); | 113 MessageWriter writer(obj_data, &allocator, allow_any_object); |
118 writer.WriteMessage(obj); | 114 writer.WriteMessage(obj); |
119 *obj_len = writer.BytesWritten(); | 115 *obj_len = writer.BytesWritten(); |
120 } | 116 } |
121 | 117 |
122 // TODO(zra): Allocation of Message objects should be centralized. | 118 // TODO(zra): Allocation of Message objects should be centralized. |
123 static Message* SerializeMessage( | 119 static Message* SerializeMessage(Dart_Port dest_port, const Instance& obj) { |
124 Dart_Port dest_port, const Instance& obj) { | |
125 if (ApiObjectConverter::CanConvert(obj.raw())) { | 120 if (ApiObjectConverter::CanConvert(obj.raw())) { |
126 return new Message(dest_port, obj.raw(), Message::kNormalPriority); | 121 return new Message(dest_port, obj.raw(), Message::kNormalPriority); |
127 } else { | 122 } else { |
128 uint8_t* obj_data; | 123 uint8_t* obj_data; |
129 intptr_t obj_len; | 124 intptr_t obj_len; |
130 SerializeObject(obj, &obj_data, &obj_len, false); | 125 SerializeObject(obj, &obj_data, &obj_len, false); |
131 return new Message(dest_port, obj_data, obj_len, Message::kNormalPriority); | 126 return new Message(dest_port, obj_data, obj_len, Message::kNormalPriority); |
132 } | 127 } |
133 } | 128 } |
134 | 129 |
135 | 130 |
136 NoOOBMessageScope::NoOOBMessageScope(Thread* thread) : StackResource(thread) { | 131 NoOOBMessageScope::NoOOBMessageScope(Thread* thread) : StackResource(thread) { |
137 thread->DeferOOBMessageInterrupts(); | 132 thread->DeferOOBMessageInterrupts(); |
138 } | 133 } |
139 | 134 |
140 | 135 |
141 NoOOBMessageScope::~NoOOBMessageScope() { | 136 NoOOBMessageScope::~NoOOBMessageScope() { |
142 thread()->RestoreOOBMessageInterrupts(); | 137 thread()->RestoreOOBMessageInterrupts(); |
143 } | 138 } |
144 | 139 |
145 | 140 |
146 NoReloadScope::NoReloadScope(Isolate* isolate, Thread* thread) | 141 NoReloadScope::NoReloadScope(Isolate* isolate, Thread* thread) |
147 : StackResource(thread), | 142 : StackResource(thread), isolate_(isolate) { |
148 isolate_(isolate) { | |
149 ASSERT(isolate_ != NULL); | 143 ASSERT(isolate_ != NULL); |
150 AtomicOperations::FetchAndIncrement(&(isolate_->no_reload_scope_depth_)); | 144 AtomicOperations::FetchAndIncrement(&(isolate_->no_reload_scope_depth_)); |
151 ASSERT( | 145 ASSERT(AtomicOperations::LoadRelaxed(&(isolate_->no_reload_scope_depth_)) >= |
152 AtomicOperations::LoadRelaxed(&(isolate_->no_reload_scope_depth_)) >= 0); | 146 0); |
153 } | 147 } |
154 | 148 |
155 | 149 |
156 NoReloadScope::~NoReloadScope() { | 150 NoReloadScope::~NoReloadScope() { |
157 AtomicOperations::FetchAndDecrement(&(isolate_->no_reload_scope_depth_)); | 151 AtomicOperations::FetchAndDecrement(&(isolate_->no_reload_scope_depth_)); |
158 ASSERT( | 152 ASSERT(AtomicOperations::LoadRelaxed(&(isolate_->no_reload_scope_depth_)) >= |
159 AtomicOperations::LoadRelaxed(&(isolate_->no_reload_scope_depth_)) >= 0); | 153 0); |
160 } | 154 } |
161 | 155 |
162 | 156 |
163 void Isolate::RegisterClass(const Class& cls) { | 157 void Isolate::RegisterClass(const Class& cls) { |
164 NOT_IN_PRODUCT( | 158 #if !defined(PRODUCT) |
165 if (IsReloading()) { | 159 if (IsReloading()) { |
166 reload_context()->RegisterClass(cls); | 160 reload_context()->RegisterClass(cls); |
167 return; | 161 return; |
168 } | 162 } |
169 ) | 163 #endif // !defined(PRODUCT) |
170 class_table()->Register(cls); | 164 class_table()->Register(cls); |
171 } | 165 } |
172 | 166 |
173 | 167 |
174 void Isolate::RegisterClassAt(intptr_t index, const Class& cls) { | 168 void Isolate::RegisterClassAt(intptr_t index, const Class& cls) { |
175 class_table()->RegisterAt(index, cls); | 169 class_table()->RegisterAt(index, cls); |
176 } | 170 } |
177 | 171 |
178 | 172 |
179 void Isolate::ValidateClassTable() { | 173 void Isolate::ValidateClassTable() { |
180 class_table()->Validate(); | 174 class_table()->Validate(); |
181 } | 175 } |
182 | 176 |
183 | 177 |
184 void Isolate::SendInternalLibMessage(LibMsgId msg_id, uint64_t capability) { | 178 void Isolate::SendInternalLibMessage(LibMsgId msg_id, uint64_t capability) { |
185 const Array& msg = Array::Handle(Array::New(3)); | 179 const Array& msg = Array::Handle(Array::New(3)); |
186 Object& element = Object::Handle(); | 180 Object& element = Object::Handle(); |
187 | 181 |
188 element = Smi::New(Message::kIsolateLibOOBMsg); | 182 element = Smi::New(Message::kIsolateLibOOBMsg); |
189 msg.SetAt(0, element); | 183 msg.SetAt(0, element); |
190 element = Smi::New(msg_id); | 184 element = Smi::New(msg_id); |
191 msg.SetAt(1, element); | 185 msg.SetAt(1, element); |
192 element = Capability::New(capability); | 186 element = Capability::New(capability); |
193 msg.SetAt(2, element); | 187 msg.SetAt(2, element); |
194 | 188 |
195 uint8_t* data = NULL; | 189 uint8_t* data = NULL; |
196 MessageWriter writer(&data, &allocator, false); | 190 MessageWriter writer(&data, &allocator, false); |
197 writer.WriteMessage(msg); | 191 writer.WriteMessage(msg); |
198 | 192 |
199 PortMap::PostMessage(new Message(main_port(), | 193 PortMap::PostMessage(new Message(main_port(), data, writer.BytesWritten(), |
200 data, writer.BytesWritten(), | |
201 Message::kOOBPriority)); | 194 Message::kOOBPriority)); |
202 } | 195 } |
203 | 196 |
204 | 197 |
205 class IsolateMessageHandler : public MessageHandler { | 198 class IsolateMessageHandler : public MessageHandler { |
206 public: | 199 public: |
207 explicit IsolateMessageHandler(Isolate* isolate); | 200 explicit IsolateMessageHandler(Isolate* isolate); |
208 ~IsolateMessageHandler(); | 201 ~IsolateMessageHandler(); |
209 | 202 |
210 const char* name() const; | 203 const char* name() const; |
(...skipping 15 matching lines...) Expand all Loading... |
226 // A result of false indicates that the isolate should terminate the | 219 // A result of false indicates that the isolate should terminate the |
227 // processing of further events. | 220 // processing of further events. |
228 RawError* HandleLibMessage(const Array& message); | 221 RawError* HandleLibMessage(const Array& message); |
229 | 222 |
230 MessageStatus ProcessUnhandledException(const Error& result); | 223 MessageStatus ProcessUnhandledException(const Error& result); |
231 Isolate* isolate_; | 224 Isolate* isolate_; |
232 }; | 225 }; |
233 | 226 |
234 | 227 |
235 IsolateMessageHandler::IsolateMessageHandler(Isolate* isolate) | 228 IsolateMessageHandler::IsolateMessageHandler(Isolate* isolate) |
236 : isolate_(isolate) { | 229 : isolate_(isolate) {} |
237 } | |
238 | 230 |
239 | 231 |
240 IsolateMessageHandler::~IsolateMessageHandler() { | 232 IsolateMessageHandler::~IsolateMessageHandler() {} |
241 } | |
242 | 233 |
243 const char* IsolateMessageHandler::name() const { | 234 const char* IsolateMessageHandler::name() const { |
244 return isolate_->name(); | 235 return isolate_->name(); |
245 } | 236 } |
246 | 237 |
247 | 238 |
248 // Isolate library OOB messages are fixed sized arrays which have the | 239 // Isolate library OOB messages are fixed sized arrays which have the |
249 // following format: | 240 // following format: |
250 // [ OOB dispatch, Isolate library dispatch, <message specific data> ] | 241 // [ OOB dispatch, Isolate library dispatch, <message specific data> ] |
251 RawError* IsolateMessageHandler::HandleLibMessage(const Array& message) { | 242 RawError* IsolateMessageHandler::HandleLibMessage(const Array& message) { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
286 if (!obj2.IsSendPort()) return Error::null(); | 277 if (!obj2.IsSendPort()) return Error::null(); |
287 const SendPort& send_port = SendPort::Cast(obj2); | 278 const SendPort& send_port = SendPort::Cast(obj2); |
288 const Object& obj3 = Object::Handle(zone, message.At(3)); | 279 const Object& obj3 = Object::Handle(zone, message.At(3)); |
289 if (!obj3.IsSmi()) return Error::null(); | 280 if (!obj3.IsSmi()) return Error::null(); |
290 const intptr_t priority = Smi::Cast(obj3).Value(); | 281 const intptr_t priority = Smi::Cast(obj3).Value(); |
291 const Object& obj4 = Object::Handle(zone, message.At(4)); | 282 const Object& obj4 = Object::Handle(zone, message.At(4)); |
292 if (!obj4.IsInstance() && !obj4.IsNull()) return Error::null(); | 283 if (!obj4.IsInstance() && !obj4.IsNull()) return Error::null(); |
293 const Instance& response = | 284 const Instance& response = |
294 obj4.IsNull() ? Instance::null_instance() : Instance::Cast(obj4); | 285 obj4.IsNull() ? Instance::null_instance() : Instance::Cast(obj4); |
295 if (priority == Isolate::kImmediateAction) { | 286 if (priority == Isolate::kImmediateAction) { |
296 PortMap::PostMessage(SerializeMessage( | 287 PortMap::PostMessage(SerializeMessage(send_port.Id(), response)); |
297 send_port.Id(), response)); | |
298 } else { | 288 } else { |
299 ASSERT((priority == Isolate::kBeforeNextEventAction) || | 289 ASSERT((priority == Isolate::kBeforeNextEventAction) || |
300 (priority == Isolate::kAsEventAction)); | 290 (priority == Isolate::kAsEventAction)); |
301 // Update the message so that it will be handled immediately when it | 291 // Update the message so that it will be handled immediately when it |
302 // is picked up from the message queue the next time. | 292 // is picked up from the message queue the next time. |
303 message.SetAt(0, Smi::Handle(zone, | 293 message.SetAt( |
304 Smi::New(Message::kDelayedIsolateLibOOBMsg))); | 294 0, Smi::Handle(zone, Smi::New(Message::kDelayedIsolateLibOOBMsg))); |
305 message.SetAt(3, Smi::Handle(zone, | 295 message.SetAt(3, |
306 Smi::New(Isolate::kImmediateAction))); | 296 Smi::Handle(zone, Smi::New(Isolate::kImmediateAction))); |
307 this->PostMessage(SerializeMessage( | 297 this->PostMessage( |
308 Message::kIllegalPort, message), | 298 SerializeMessage(Message::kIllegalPort, message), |
309 priority == Isolate::kBeforeNextEventAction /* at_head */); | 299 priority == Isolate::kBeforeNextEventAction /* at_head */); |
310 } | 300 } |
311 break; | 301 break; |
312 } | 302 } |
313 case Isolate::kKillMsg: | 303 case Isolate::kKillMsg: |
314 case Isolate::kInternalKillMsg: | 304 case Isolate::kInternalKillMsg: |
315 case Isolate::kVMRestartMsg: { | 305 case Isolate::kVMRestartMsg: { |
316 // [ OOB, kKillMsg, terminate capability, priority ] | 306 // [ OOB, kKillMsg, terminate capability, priority ] |
317 if (message.Length() != 4) return Error::null(); | 307 if (message.Length() != 4) return Error::null(); |
318 Object& obj = Object::Handle(zone, message.At(3)); | 308 Object& obj = Object::Handle(zone, message.At(3)); |
319 if (!obj.IsSmi()) return Error::null(); | 309 if (!obj.IsSmi()) return Error::null(); |
320 const intptr_t priority = Smi::Cast(obj).Value(); | 310 const intptr_t priority = Smi::Cast(obj).Value(); |
321 if (priority == Isolate::kImmediateAction) { | 311 if (priority == Isolate::kImmediateAction) { |
322 obj = message.At(2); | 312 obj = message.At(2); |
323 if (I->VerifyTerminateCapability(obj)) { | 313 if (I->VerifyTerminateCapability(obj)) { |
324 // We will kill the current isolate by returning an UnwindError. | 314 // We will kill the current isolate by returning an UnwindError. |
325 if (msg_type == Isolate::kKillMsg) { | 315 if (msg_type == Isolate::kKillMsg) { |
326 const String& msg = String::Handle(String::New( | 316 const String& msg = String::Handle( |
327 "isolate terminated by Isolate.kill")); | 317 String::New("isolate terminated by Isolate.kill")); |
328 const UnwindError& error = | 318 const UnwindError& error = |
329 UnwindError::Handle(UnwindError::New(msg)); | 319 UnwindError::Handle(UnwindError::New(msg)); |
330 error.set_is_user_initiated(true); | 320 error.set_is_user_initiated(true); |
331 return error.raw(); | 321 return error.raw(); |
332 } else if (msg_type == Isolate::kInternalKillMsg) { | 322 } else if (msg_type == Isolate::kInternalKillMsg) { |
333 const String& msg = String::Handle(String::New( | 323 const String& msg = |
334 "isolate terminated by vm")); | 324 String::Handle(String::New("isolate terminated by vm")); |
335 return UnwindError::New(msg); | 325 return UnwindError::New(msg); |
336 } else if (msg_type == Isolate::kVMRestartMsg) { | 326 } else if (msg_type == Isolate::kVMRestartMsg) { |
337 // If this is the main isolate, this request to restart | 327 // If this is the main isolate, this request to restart |
338 // will be caught and handled in the embedder. Otherwise | 328 // will be caught and handled in the embedder. Otherwise |
339 // this unwind error will cause the isolate to exit. | 329 // this unwind error will cause the isolate to exit. |
340 const String& msg = String::Handle(String::New( | 330 const String& msg = String::Handle( |
341 "isolate terminated for vm restart")); | 331 String::New("isolate terminated for vm restart")); |
342 const UnwindError& error = | 332 const UnwindError& error = |
343 UnwindError::Handle(UnwindError::New(msg)); | 333 UnwindError::Handle(UnwindError::New(msg)); |
344 error.set_is_vm_restart(true); | 334 error.set_is_vm_restart(true); |
345 return error.raw(); | 335 return error.raw(); |
346 } else { | 336 } else { |
347 UNREACHABLE(); | 337 UNREACHABLE(); |
348 } | 338 } |
349 } else { | 339 } else { |
350 return Error::null(); | 340 return Error::null(); |
351 } | 341 } |
352 } else { | 342 } else { |
353 ASSERT((priority == Isolate::kBeforeNextEventAction) || | 343 ASSERT((priority == Isolate::kBeforeNextEventAction) || |
354 (priority == Isolate::kAsEventAction)); | 344 (priority == Isolate::kAsEventAction)); |
355 // Update the message so that it will be handled immediately when it | 345 // Update the message so that it will be handled immediately when it |
356 // is picked up from the message queue the next time. | 346 // is picked up from the message queue the next time. |
357 message.SetAt(0, Smi::Handle(zone, | 347 message.SetAt( |
358 Smi::New(Message::kDelayedIsolateLibOOBMsg))); | 348 0, Smi::Handle(zone, Smi::New(Message::kDelayedIsolateLibOOBMsg))); |
359 message.SetAt(3, Smi::Handle(zone, | 349 message.SetAt(3, |
360 Smi::New(Isolate::kImmediateAction))); | 350 Smi::Handle(zone, Smi::New(Isolate::kImmediateAction))); |
361 this->PostMessage(SerializeMessage( | 351 this->PostMessage( |
362 Message::kIllegalPort, message), | 352 SerializeMessage(Message::kIllegalPort, message), |
363 priority == Isolate::kBeforeNextEventAction /* at_head */); | 353 priority == Isolate::kBeforeNextEventAction /* at_head */); |
364 } | 354 } |
365 break; | 355 break; |
366 } | 356 } |
367 case Isolate::kInterruptMsg: { | 357 case Isolate::kInterruptMsg: { |
368 // [ OOB, kInterruptMsg, pause capability ] | 358 // [ OOB, kInterruptMsg, pause capability ] |
369 if (message.Length() != 3) return Error::null(); | 359 if (message.Length() != 3) return Error::null(); |
370 Object& obj = Object::Handle(zone, message.At(2)); | 360 Object& obj = Object::Handle(zone, message.At(2)); |
371 if (!I->VerifyPauseCapability(obj)) return Error::null(); | 361 if (!I->VerifyPauseCapability(obj)) return Error::null(); |
372 | 362 |
(...skipping 14 matching lines...) Expand all Loading... |
387 if (!obj.IsSendPort()) return Error::null(); | 377 if (!obj.IsSendPort()) return Error::null(); |
388 const SendPort& listener = SendPort::Cast(obj); | 378 const SendPort& listener = SendPort::Cast(obj); |
389 switch (msg_type) { | 379 switch (msg_type) { |
390 case Isolate::kAddExitMsg: { | 380 case Isolate::kAddExitMsg: { |
391 if (message.Length() != 4) return Error::null(); | 381 if (message.Length() != 4) return Error::null(); |
392 // [ OOB, msg, listener port, response object ] | 382 // [ OOB, msg, listener port, response object ] |
393 const Object& response = Object::Handle(zone, message.At(3)); | 383 const Object& response = Object::Handle(zone, message.At(3)); |
394 if (!response.IsInstance() && !response.IsNull()) { | 384 if (!response.IsInstance() && !response.IsNull()) { |
395 return Error::null(); | 385 return Error::null(); |
396 } | 386 } |
397 I->AddExitListener(listener, | 387 I->AddExitListener(listener, response.IsNull() |
398 response.IsNull() ? Instance::null_instance() | 388 ? Instance::null_instance() |
399 : Instance::Cast(response)); | 389 : Instance::Cast(response)); |
400 break; | 390 break; |
401 } | 391 } |
402 case Isolate::kDelExitMsg: | 392 case Isolate::kDelExitMsg: |
403 if (message.Length() != 3) return Error::null(); | 393 if (message.Length() != 3) return Error::null(); |
404 I->RemoveExitListener(listener); | 394 I->RemoveExitListener(listener); |
405 break; | 395 break; |
406 case Isolate::kAddErrorMsg: | 396 case Isolate::kAddErrorMsg: |
407 if (message.Length() != 3) return Error::null(); | 397 if (message.Length() != 3) return Error::null(); |
408 I->AddErrorListener(listener); | 398 I->AddErrorListener(listener); |
409 break; | 399 break; |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
453 | 443 |
454 | 444 |
455 MessageHandler::MessageStatus IsolateMessageHandler::HandleMessage( | 445 MessageHandler::MessageStatus IsolateMessageHandler::HandleMessage( |
456 Message* message) { | 446 Message* message) { |
457 ASSERT(IsCurrentIsolate()); | 447 ASSERT(IsCurrentIsolate()); |
458 Thread* thread = Thread::Current(); | 448 Thread* thread = Thread::Current(); |
459 StackZone stack_zone(thread); | 449 StackZone stack_zone(thread); |
460 Zone* zone = stack_zone.GetZone(); | 450 Zone* zone = stack_zone.GetZone(); |
461 HandleScope handle_scope(thread); | 451 HandleScope handle_scope(thread); |
462 #ifndef PRODUCT | 452 #ifndef PRODUCT |
463 TimelineDurationScope tds(thread, | 453 TimelineDurationScope tds(thread, Timeline::GetIsolateStream(), |
464 Timeline::GetIsolateStream(), | |
465 "HandleMessage"); | 454 "HandleMessage"); |
466 tds.SetNumArguments(1); | 455 tds.SetNumArguments(1); |
467 tds.CopyArgument(0, "isolateName", I->name()); | 456 tds.CopyArgument(0, "isolateName", I->name()); |
468 #endif | 457 #endif |
469 | 458 |
470 // If the message is in band we lookup the handler to dispatch to. If the | 459 // If the message is in band we lookup the handler to dispatch to. If the |
471 // receive port was closed, we drop the message without deserializing it. | 460 // receive port was closed, we drop the message without deserializing it. |
472 // Illegal port is a special case for artificially enqueued isolate library | 461 // Illegal port is a special case for artificially enqueued isolate library |
473 // messages which are handled in C++ code below. | 462 // messages which are handled in C++ code below. |
474 Object& msg_handler = Object::Handle(zone); | 463 Object& msg_handler = Object::Handle(zone); |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
564 if (oob_tag.IsSmi() && | 553 if (oob_tag.IsSmi() && |
565 (Smi::Cast(oob_tag).Value() == Message::kDelayedIsolateLibOOBMsg)) { | 554 (Smi::Cast(oob_tag).Value() == Message::kDelayedIsolateLibOOBMsg)) { |
566 const Error& error = Error::Handle(HandleLibMessage(msg_arr)); | 555 const Error& error = Error::Handle(HandleLibMessage(msg_arr)); |
567 if (!error.IsNull()) { | 556 if (!error.IsNull()) { |
568 status = ProcessUnhandledException(error); | 557 status = ProcessUnhandledException(error); |
569 } | 558 } |
570 } | 559 } |
571 } | 560 } |
572 } | 561 } |
573 } else { | 562 } else { |
574 const Object& result = Object::Handle(zone, | 563 const Object& result = |
575 DartLibraryCalls::HandleMessage(msg_handler, msg)); | 564 Object::Handle(zone, DartLibraryCalls::HandleMessage(msg_handler, msg)); |
576 if (result.IsError()) { | 565 if (result.IsError()) { |
577 status = ProcessUnhandledException(Error::Cast(result)); | 566 status = ProcessUnhandledException(Error::Cast(result)); |
578 } else { | 567 } else { |
579 ASSERT(result.IsNull()); | 568 ASSERT(result.IsNull()); |
580 } | 569 } |
581 } | 570 } |
582 delete message; | 571 delete message; |
583 #ifndef PRODUCT | 572 #ifndef PRODUCT |
584 if (status == kOK) { | 573 if (status == kOK) { |
585 const Object& result = | 574 const Object& result = |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
617 if (!FLAG_support_service) { | 606 if (!FLAG_support_service) { |
618 return; | 607 return; |
619 } | 608 } |
620 if (Service::debug_stream.enabled() || FLAG_warn_on_pause_with_no_debugger) { | 609 if (Service::debug_stream.enabled() || FLAG_warn_on_pause_with_no_debugger) { |
621 StartIsolateScope start_isolate(I); | 610 StartIsolateScope start_isolate(I); |
622 StackZone zone(T); | 611 StackZone zone(T); |
623 HandleScope handle_scope(T); | 612 HandleScope handle_scope(T); |
624 ServiceEvent pause_event(I, ServiceEvent::kPauseExit); | 613 ServiceEvent pause_event(I, ServiceEvent::kPauseExit); |
625 Service::HandleEvent(&pause_event); | 614 Service::HandleEvent(&pause_event); |
626 } else if (FLAG_trace_service) { | 615 } else if (FLAG_trace_service) { |
627 OS::Print("vm-service: Dropping event of type PauseExit (%s)\n", | 616 OS::Print("vm-service: Dropping event of type PauseExit (%s)\n", I->name()); |
628 I->name()); | |
629 } | 617 } |
630 } | 618 } |
631 #endif // !PRODUCT | 619 #endif // !PRODUCT |
632 | 620 |
633 | 621 |
634 #if defined(DEBUG) | 622 #if defined(DEBUG) |
635 void IsolateMessageHandler::CheckAccess() { | 623 void IsolateMessageHandler::CheckAccess() { |
636 ASSERT(IsCurrentIsolate()); | 624 ASSERT(IsCurrentIsolate()); |
637 } | 625 } |
638 #endif | 626 #endif |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
730 | 718 |
731 void Isolate::FlagsCopyTo(Dart_IsolateFlags* api_flags) const { | 719 void Isolate::FlagsCopyTo(Dart_IsolateFlags* api_flags) const { |
732 api_flags->version = DART_FLAGS_CURRENT_VERSION; | 720 api_flags->version = DART_FLAGS_CURRENT_VERSION; |
733 api_flags->enable_type_checks = type_checks(); | 721 api_flags->enable_type_checks = type_checks(); |
734 api_flags->enable_asserts = asserts(); | 722 api_flags->enable_asserts = asserts(); |
735 api_flags->enable_error_on_bad_type = error_on_bad_type(); | 723 api_flags->enable_error_on_bad_type = error_on_bad_type(); |
736 api_flags->enable_error_on_bad_override = error_on_bad_override(); | 724 api_flags->enable_error_on_bad_override = error_on_bad_override(); |
737 } | 725 } |
738 | 726 |
739 | 727 |
740 NOT_IN_PRODUCT( | 728 #if !defined(PRODUCT) |
741 void Isolate::FlagsCopyFrom(const Dart_IsolateFlags& api_flags) { | 729 void Isolate::FlagsCopyFrom(const Dart_IsolateFlags& api_flags) { |
742 type_checks_ = api_flags.enable_type_checks; | 730 type_checks_ = api_flags.enable_type_checks; |
743 asserts_ = api_flags.enable_asserts; | 731 asserts_ = api_flags.enable_asserts; |
744 error_on_bad_type_ = api_flags.enable_error_on_bad_type; | 732 error_on_bad_type_ = api_flags.enable_error_on_bad_type; |
745 error_on_bad_override_ = api_flags.enable_error_on_bad_override; | 733 error_on_bad_override_ = api_flags.enable_error_on_bad_override; |
746 // Leave others at defaults. | 734 // Leave others at defaults. |
747 }) | 735 } |
| 736 #endif // !defined(PRODUCT) |
748 | 737 |
749 | 738 |
750 DEBUG_ONLY( | 739 #if defined(DEBUG) |
751 // static | 740 // static |
752 void BaseIsolate::AssertCurrent(BaseIsolate* isolate) { | 741 void BaseIsolate::AssertCurrent(BaseIsolate* isolate) { |
753 ASSERT(isolate == Isolate::Current()); | 742 ASSERT(isolate == Isolate::Current()); |
754 } | 743 } |
755 | 744 |
756 void BaseIsolate::AssertCurrentThreadIsMutator() const { | 745 void BaseIsolate::AssertCurrentThreadIsMutator() const { |
757 ASSERT(Isolate::Current() == this); | 746 ASSERT(Isolate::Current() == this); |
758 ASSERT(Thread::Current()->IsMutatorThread()); | 747 ASSERT(Thread::Current()->IsMutatorThread()); |
759 } | 748 } |
760 ) | 749 #endif // defined(DEBUG) |
761 | 750 |
762 #if defined(DEBUG) | 751 #if defined(DEBUG) |
763 #define REUSABLE_HANDLE_SCOPE_INIT(object) \ | 752 #define REUSABLE_HANDLE_SCOPE_INIT(object) \ |
764 reusable_##object##_handle_scope_active_(false), | 753 reusable_##object##_handle_scope_active_(false), |
765 #else | 754 #else |
766 #define REUSABLE_HANDLE_SCOPE_INIT(object) | 755 #define REUSABLE_HANDLE_SCOPE_INIT(object) |
767 #endif // defined(DEBUG) | 756 #endif // defined(DEBUG) |
768 | 757 |
769 #define REUSABLE_HANDLE_INITIALIZERS(object) \ | 758 #define REUSABLE_HANDLE_INITIALIZERS(object) object##_handle_(NULL), |
770 object##_handle_(NULL), | |
771 | 759 |
772 // TODO(srdjan): Some Isolate monitors can be shared. Replace their usage with | 760 // TODO(srdjan): Some Isolate monitors can be shared. Replace their usage with |
773 // that shared monitor. | 761 // that shared monitor. |
774 Isolate::Isolate(const Dart_IsolateFlags& api_flags) | 762 Isolate::Isolate(const Dart_IsolateFlags& api_flags) |
775 : store_buffer_(new StoreBuffer()), | 763 : store_buffer_(new StoreBuffer()), |
776 heap_(NULL), | 764 heap_(NULL), |
777 user_tag_(0), | 765 user_tag_(0), |
778 current_tag_(UserTag::null()), | 766 current_tag_(UserTag::null()), |
779 default_tag_(UserTag::null()), | 767 default_tag_(UserTag::null()), |
780 object_store_(NULL), | 768 object_store_(NULL), |
781 class_table_(), | 769 class_table_(), |
782 single_step_(false), | 770 single_step_(false), |
783 thread_registry_(new ThreadRegistry()), | 771 thread_registry_(new ThreadRegistry()), |
784 safepoint_handler_(new SafepointHandler(this)), | 772 safepoint_handler_(new SafepointHandler(this)), |
785 message_notify_callback_(NULL), | 773 message_notify_callback_(NULL), |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
830 all_classes_finalized_(false), | 818 all_classes_finalized_(false), |
831 next_(NULL), | 819 next_(NULL), |
832 pause_loop_monitor_(NULL), | 820 pause_loop_monitor_(NULL), |
833 loading_invalidation_gen_(kInvalidGen), | 821 loading_invalidation_gen_(kInvalidGen), |
834 top_level_parsing_count_(0), | 822 top_level_parsing_count_(0), |
835 field_list_mutex_(new Mutex()), | 823 field_list_mutex_(new Mutex()), |
836 boxed_field_list_(GrowableObjectArray::null()), | 824 boxed_field_list_(GrowableObjectArray::null()), |
837 spawn_count_monitor_(new Monitor()), | 825 spawn_count_monitor_(new Monitor()), |
838 spawn_count_(0), | 826 spawn_count_(0), |
839 #define ISOLATE_METRIC_CONSTRUCTORS(type, variable, name, unit) \ | 827 #define ISOLATE_METRIC_CONSTRUCTORS(type, variable, name, unit) \ |
840 metric_##variable##_(), | 828 metric_##variable##_(), |
841 ISOLATE_METRIC_LIST(ISOLATE_METRIC_CONSTRUCTORS) | 829 ISOLATE_METRIC_LIST(ISOLATE_METRIC_CONSTRUCTORS) |
842 #undef ISOLATE_METRIC_CONSTRUCTORS | 830 #undef ISOLATE_METRIC_CONSTRUCTORS |
843 has_attempted_reload_(false), | 831 has_attempted_reload_(false), |
844 no_reload_scope_depth_(0), | 832 no_reload_scope_depth_(0), |
845 reload_every_n_stack_overflow_checks_(FLAG_reload_every), | 833 reload_every_n_stack_overflow_checks_(FLAG_reload_every), |
846 reload_context_(NULL), | 834 reload_context_(NULL), |
847 last_reload_timestamp_(OS::GetCurrentTimeMillis()), | 835 last_reload_timestamp_(OS::GetCurrentTimeMillis()), |
848 should_pause_post_service_request_(false) { | 836 should_pause_post_service_request_(false) { |
849 NOT_IN_PRODUCT(FlagsCopyFrom(api_flags)); | 837 NOT_IN_PRODUCT(FlagsCopyFrom(api_flags)); |
850 // TODO(asiva): A Thread is not available here, need to figure out | 838 // TODO(asiva): A Thread is not available here, need to figure out |
851 // how the vm_tag (kEmbedderTagId) can be set, these tags need to | 839 // how the vm_tag (kEmbedderTagId) can be set, these tags need to |
852 // move to the OSThread structure. | 840 // move to the OSThread structure. |
853 set_user_tag(UserTags::kDefaultUserTag); | 841 set_user_tag(UserTags::kDefaultUserTag); |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
911 EnableIsolateCreation(); | 899 EnableIsolateCreation(); |
912 } | 900 } |
913 | 901 |
914 | 902 |
915 Isolate* Isolate::Init(const char* name_prefix, | 903 Isolate* Isolate::Init(const char* name_prefix, |
916 const Dart_IsolateFlags& api_flags, | 904 const Dart_IsolateFlags& api_flags, |
917 bool is_vm_isolate) { | 905 bool is_vm_isolate) { |
918 Isolate* result = new Isolate(api_flags); | 906 Isolate* result = new Isolate(api_flags); |
919 ASSERT(result != NULL); | 907 ASSERT(result != NULL); |
920 | 908 |
921 // Initialize metrics. | 909 // Initialize metrics. |
922 #define ISOLATE_METRIC_INIT(type, variable, name, unit) \ | 910 #define ISOLATE_METRIC_INIT(type, variable, name, unit) \ |
923 result->metric_##variable##_.Init(result, name, NULL, Metric::unit); | 911 result->metric_##variable##_.Init(result, name, NULL, Metric::unit); |
924 ISOLATE_METRIC_LIST(ISOLATE_METRIC_INIT); | 912 ISOLATE_METRIC_LIST(ISOLATE_METRIC_INIT); |
925 #undef ISOLATE_METRIC_INIT | 913 #undef ISOLATE_METRIC_INIT |
926 | 914 |
927 Heap::Init(result, | 915 Heap::Init(result, |
928 is_vm_isolate | 916 is_vm_isolate |
929 ? 0 // New gen size 0; VM isolate should only allocate in old. | 917 ? 0 // New gen size 0; VM isolate should only allocate in old. |
930 : FLAG_new_gen_semi_max_size * MBInWords, | 918 : FLAG_new_gen_semi_max_size * MBInWords, |
931 FLAG_old_gen_heap_size * MBInWords, | 919 FLAG_old_gen_heap_size * MBInWords, |
(...skipping 28 matching lines...) Expand all Loading... |
960 result->set_pause_capability(result->random()->NextUInt64()); | 948 result->set_pause_capability(result->random()->NextUInt64()); |
961 result->set_terminate_capability(result->random()->NextUInt64()); | 949 result->set_terminate_capability(result->random()->NextUInt64()); |
962 | 950 |
963 result->BuildName(name_prefix); | 951 result->BuildName(name_prefix); |
964 if (FLAG_support_debugger) { | 952 if (FLAG_support_debugger) { |
965 result->debugger_ = new Debugger(); | 953 result->debugger_ = new Debugger(); |
966 result->debugger_->Initialize(result); | 954 result->debugger_->Initialize(result); |
967 } | 955 } |
968 if (FLAG_trace_isolates) { | 956 if (FLAG_trace_isolates) { |
969 if (name_prefix == NULL || strcmp(name_prefix, "vm-isolate") != 0) { | 957 if (name_prefix == NULL || strcmp(name_prefix, "vm-isolate") != 0) { |
970 OS::Print("[+] Starting isolate:\n" | 958 OS::Print( |
971 "\tisolate: %s\n", result->name()); | 959 "[+] Starting isolate:\n" |
| 960 "\tisolate: %s\n", |
| 961 result->name()); |
972 } | 962 } |
973 } | 963 } |
974 | 964 |
975 #ifndef PRODUCT | 965 #ifndef PRODUCT |
976 if (FLAG_support_service) { | 966 if (FLAG_support_service) { |
977 ObjectIdRing::Init(result); | 967 ObjectIdRing::Init(result); |
978 } | 968 } |
979 #endif // !PRODUCT | 969 #endif // !PRODUCT |
980 | 970 |
981 // Add to isolate list. Shutdown and delete the isolate on failure. | 971 // Add to isolate list. Shutdown and delete the isolate on failure. |
(...skipping 15 matching lines...) Expand all Loading... |
997 | 987 |
998 | 988 |
999 void Isolate::SetupInstructionsSnapshotPage( | 989 void Isolate::SetupInstructionsSnapshotPage( |
1000 const uint8_t* instructions_snapshot_buffer) { | 990 const uint8_t* instructions_snapshot_buffer) { |
1001 InstructionsSnapshot snapshot(instructions_snapshot_buffer); | 991 InstructionsSnapshot snapshot(instructions_snapshot_buffer); |
1002 #if defined(DEBUG) | 992 #if defined(DEBUG) |
1003 if (FLAG_trace_isolates) { | 993 if (FLAG_trace_isolates) { |
1004 OS::Print("Precompiled instructions are at [0x%" Px ", 0x%" Px ")\n", | 994 OS::Print("Precompiled instructions are at [0x%" Px ", 0x%" Px ")\n", |
1005 reinterpret_cast<uword>(snapshot.instructions_start()), | 995 reinterpret_cast<uword>(snapshot.instructions_start()), |
1006 reinterpret_cast<uword>(snapshot.instructions_start()) + | 996 reinterpret_cast<uword>(snapshot.instructions_start()) + |
1007 snapshot.instructions_size()); | 997 snapshot.instructions_size()); |
1008 } | 998 } |
1009 #endif | 999 #endif |
1010 heap_->SetupExternalPage(snapshot.instructions_start(), | 1000 heap_->SetupExternalPage(snapshot.instructions_start(), |
1011 snapshot.instructions_size(), | 1001 snapshot.instructions_size(), |
1012 /* is_executable = */ true); | 1002 /* is_executable = */ true); |
1013 } | 1003 } |
1014 | 1004 |
1015 | 1005 |
1016 void Isolate::SetupDataSnapshotPage(const uint8_t* data_snapshot_buffer) { | 1006 void Isolate::SetupDataSnapshotPage(const uint8_t* data_snapshot_buffer) { |
1017 DataSnapshot snapshot(data_snapshot_buffer); | 1007 DataSnapshot snapshot(data_snapshot_buffer); |
1018 #if defined(DEBUG) | 1008 #if defined(DEBUG) |
1019 if (FLAG_trace_isolates) { | 1009 if (FLAG_trace_isolates) { |
1020 OS::Print("Precompiled rodata are at [0x%" Px ", 0x%" Px ")\n", | 1010 OS::Print( |
1021 reinterpret_cast<uword>(snapshot.data_start()), | 1011 "Precompiled rodata are at [0x%" Px ", 0x%" Px ")\n", |
1022 reinterpret_cast<uword>(snapshot.data_start()) + | 1012 reinterpret_cast<uword>(snapshot.data_start()), |
1023 snapshot.data_size()); | 1013 reinterpret_cast<uword>(snapshot.data_start()) + snapshot.data_size()); |
1024 } | 1014 } |
1025 #endif | 1015 #endif |
1026 heap_->SetupExternalPage(snapshot.data_start(), | 1016 heap_->SetupExternalPage(snapshot.data_start(), snapshot.data_size(), |
1027 snapshot.data_size(), | |
1028 /* is_executable = */ false); | 1017 /* is_executable = */ false); |
1029 } | 1018 } |
1030 | 1019 |
1031 | 1020 |
1032 void Isolate::ScheduleMessageInterrupts() { | 1021 void Isolate::ScheduleMessageInterrupts() { |
1033 // We take the threads lock here to ensure that the mutator thread does not | 1022 // We take the threads lock here to ensure that the mutator thread does not |
1034 // exit the isolate while we are trying to schedule interrupts on it. | 1023 // exit the isolate while we are trying to schedule interrupts on it. |
1035 MonitorLocker ml(threads_lock()); | 1024 MonitorLocker ml(threads_lock()); |
1036 Thread* mthread = mutator_thread(); | 1025 Thread* mthread = mutator_thread(); |
1037 if (mthread != NULL) { | 1026 if (mthread != NULL) { |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1074 set_debugger_name(name_prefix); | 1063 set_debugger_name(name_prefix); |
1075 if (ServiceIsolate::NameEquals(name_prefix)) { | 1064 if (ServiceIsolate::NameEquals(name_prefix)) { |
1076 name_ = strdup(name_prefix); | 1065 name_ = strdup(name_prefix); |
1077 return; | 1066 return; |
1078 } | 1067 } |
1079 name_ = OS::SCreate(NULL, "%s-%" Pd64 "", name_prefix, main_port()); | 1068 name_ = OS::SCreate(NULL, "%s-%" Pd64 "", name_prefix, main_port()); |
1080 } | 1069 } |
1081 | 1070 |
1082 | 1071 |
1083 void Isolate::DoneLoading() { | 1072 void Isolate::DoneLoading() { |
1084 GrowableObjectArray& libs = GrowableObjectArray::Handle(current_zone(), | 1073 GrowableObjectArray& libs = |
1085 object_store()->libraries()); | 1074 GrowableObjectArray::Handle(current_zone(), object_store()->libraries()); |
1086 Library& lib = Library::Handle(current_zone()); | 1075 Library& lib = Library::Handle(current_zone()); |
1087 intptr_t num_libs = libs.Length(); | 1076 intptr_t num_libs = libs.Length(); |
1088 for (intptr_t i = 0; i < num_libs; i++) { | 1077 for (intptr_t i = 0; i < num_libs; i++) { |
1089 lib ^= libs.At(i); | 1078 lib ^= libs.At(i); |
1090 // If this library was loaded with Dart_LoadLibrary, it was marked | 1079 // If this library was loaded with Dart_LoadLibrary, it was marked |
1091 // as 'load in progres'. Set the status to 'loaded'. | 1080 // as 'load in progres'. Set the status to 'loaded'. |
1092 if (lib.LoadInProgress()) { | 1081 if (lib.LoadInProgress()) { |
1093 lib.SetLoaded(); | 1082 lib.SetLoaded(); |
1094 } | 1083 } |
1095 lib.InitExportedNamesCache(); | 1084 lib.InitExportedNamesCache(); |
1096 } | 1085 } |
1097 TokenStream::CloseSharedTokenList(this); | 1086 TokenStream::CloseSharedTokenList(this); |
1098 } | 1087 } |
1099 | 1088 |
1100 | 1089 |
1101 bool Isolate::CanReload() const { | 1090 bool Isolate::CanReload() const { |
1102 #ifndef PRODUCT | 1091 #ifndef PRODUCT |
1103 return !ServiceIsolate::IsServiceIsolateDescendant(this) && | 1092 return !ServiceIsolate::IsServiceIsolateDescendant(this) && is_runnable() && |
1104 is_runnable() && !IsReloading() && | 1093 !IsReloading() && |
1105 (AtomicOperations::LoadRelaxed(&no_reload_scope_depth_) == 0) && | 1094 (AtomicOperations::LoadRelaxed(&no_reload_scope_depth_) == 0) && |
1106 IsolateCreationEnabled(); | 1095 IsolateCreationEnabled(); |
1107 #else | 1096 #else |
1108 return false; | 1097 return false; |
1109 #endif | 1098 #endif |
1110 } | 1099 } |
1111 | 1100 |
1112 | 1101 |
1113 #ifndef PRODUCT | 1102 #ifndef PRODUCT |
1114 bool Isolate::ReloadSources(JSONStream* js, | 1103 bool Isolate::ReloadSources(JSONStream* js, |
(...skipping 26 matching lines...) Expand all Loading... |
1141 Thread* thread = Thread::Current(); | 1130 Thread* thread = Thread::Current(); |
1142 SafepointOperationScope safepoint_scope(thread); | 1131 SafepointOperationScope safepoint_scope(thread); |
1143 | 1132 |
1144 delete reload_context_; | 1133 delete reload_context_; |
1145 reload_context_ = NULL; | 1134 reload_context_ = NULL; |
1146 } | 1135 } |
1147 #endif // !PRODUCT | 1136 #endif // !PRODUCT |
1148 | 1137 |
1149 | 1138 |
1150 void Isolate::DoneFinalizing() { | 1139 void Isolate::DoneFinalizing() { |
1151 NOT_IN_PRODUCT( | 1140 #if !defined(PRODUCT) |
1152 if (IsReloading()) { | 1141 if (IsReloading()) { |
1153 reload_context_->FinalizeLoading(); | 1142 reload_context_->FinalizeLoading(); |
1154 } | 1143 } |
1155 ) | 1144 #endif // !defined(PRODUCT) |
1156 } | 1145 } |
1157 | 1146 |
1158 | 1147 |
1159 | |
1160 bool Isolate::MakeRunnable() { | 1148 bool Isolate::MakeRunnable() { |
1161 ASSERT(Isolate::Current() == NULL); | 1149 ASSERT(Isolate::Current() == NULL); |
1162 | 1150 |
1163 MutexLocker ml(mutex_); | 1151 MutexLocker ml(mutex_); |
1164 // Check if we are in a valid state to make the isolate runnable. | 1152 // Check if we are in a valid state to make the isolate runnable. |
1165 if (is_runnable() == true) { | 1153 if (is_runnable() == true) { |
1166 return false; // Already runnable. | 1154 return false; // Already runnable. |
1167 } | 1155 } |
1168 // Set the isolate as runnable and if we are being spawned schedule | 1156 // Set the isolate as runnable and if we are being spawned schedule |
1169 // isolate on thread pool for execution. | 1157 // isolate on thread pool for execution. |
(...skipping 24 matching lines...) Expand all Loading... |
1194 if (FLAG_support_service && Service::isolate_stream.enabled()) { | 1182 if (FLAG_support_service && Service::isolate_stream.enabled()) { |
1195 ServiceEvent runnableEvent(this, ServiceEvent::kIsolateRunnable); | 1183 ServiceEvent runnableEvent(this, ServiceEvent::kIsolateRunnable); |
1196 Service::HandleEvent(&runnableEvent); | 1184 Service::HandleEvent(&runnableEvent); |
1197 } | 1185 } |
1198 #endif // !PRODUCT | 1186 #endif // !PRODUCT |
1199 return true; | 1187 return true; |
1200 } | 1188 } |
1201 | 1189 |
1202 | 1190 |
1203 bool Isolate::VerifyPauseCapability(const Object& capability) const { | 1191 bool Isolate::VerifyPauseCapability(const Object& capability) const { |
1204 return !capability.IsNull() && | 1192 return !capability.IsNull() && capability.IsCapability() && |
1205 capability.IsCapability() && | 1193 (pause_capability() == Capability::Cast(capability).Id()); |
1206 (pause_capability() == Capability::Cast(capability).Id()); | |
1207 } | 1194 } |
1208 | 1195 |
1209 | 1196 |
1210 bool Isolate::VerifyTerminateCapability(const Object& capability) const { | 1197 bool Isolate::VerifyTerminateCapability(const Object& capability) const { |
1211 return !capability.IsNull() && | 1198 return !capability.IsNull() && capability.IsCapability() && |
1212 capability.IsCapability() && | 1199 (terminate_capability() == Capability::Cast(capability).Id()); |
1213 (terminate_capability() == Capability::Cast(capability).Id()); | |
1214 } | 1200 } |
1215 | 1201 |
1216 | 1202 |
1217 bool Isolate::AddResumeCapability(const Capability& capability) { | 1203 bool Isolate::AddResumeCapability(const Capability& capability) { |
1218 // Ensure a limit for the number of resume capabilities remembered. | 1204 // Ensure a limit for the number of resume capabilities remembered. |
1219 static const intptr_t kMaxResumeCapabilities = kSmiMax / (6 * kWordSize); | 1205 static const intptr_t kMaxResumeCapabilities = kSmiMax / (6 * kWordSize); |
1220 | 1206 |
1221 const GrowableObjectArray& caps = GrowableObjectArray::Handle( | 1207 const GrowableObjectArray& caps = GrowableObjectArray::Handle( |
1222 current_zone(), object_store()->resume_capabilities()); | 1208 current_zone(), object_store()->resume_capabilities()); |
1223 Capability& current = Capability::Handle(current_zone()); | 1209 Capability& current = Capability::Handle(current_zone()); |
(...skipping 18 matching lines...) Expand all Loading... |
1242 caps.Add(capability); | 1228 caps.Add(capability); |
1243 } else { | 1229 } else { |
1244 caps.SetAt(insertion_index, capability); | 1230 caps.SetAt(insertion_index, capability); |
1245 } | 1231 } |
1246 return true; | 1232 return true; |
1247 } | 1233 } |
1248 | 1234 |
1249 | 1235 |
1250 bool Isolate::RemoveResumeCapability(const Capability& capability) { | 1236 bool Isolate::RemoveResumeCapability(const Capability& capability) { |
1251 const GrowableObjectArray& caps = GrowableObjectArray::Handle( | 1237 const GrowableObjectArray& caps = GrowableObjectArray::Handle( |
1252 current_zone(), object_store()->resume_capabilities()); | 1238 current_zone(), object_store()->resume_capabilities()); |
1253 Capability& current = Capability::Handle(current_zone()); | 1239 Capability& current = Capability::Handle(current_zone()); |
1254 for (intptr_t i = 0; i < caps.Length(); i++) { | 1240 for (intptr_t i = 0; i < caps.Length(); i++) { |
1255 current ^= caps.At(i); | 1241 current ^= caps.At(i); |
1256 if (!current.IsNull() && (current.Id() == capability.Id())) { | 1242 if (!current.IsNull() && (current.Id() == capability.Id())) { |
1257 // Remove the matching capability from the list. | 1243 // Remove the matching capability from the list. |
1258 current = Capability::null(); | 1244 current = Capability::null(); |
1259 caps.SetAt(i, current); | 1245 caps.SetAt(i, current); |
1260 return true; | 1246 return true; |
1261 } | 1247 } |
1262 } | 1248 } |
1263 return false; | 1249 return false; |
1264 } | 1250 } |
1265 | 1251 |
1266 | 1252 |
1267 // TODO(iposva): Remove duplicated code and start using some hash based | 1253 // TODO(iposva): Remove duplicated code and start using some hash based |
1268 // structure instead of these linear lookups. | 1254 // structure instead of these linear lookups. |
1269 void Isolate::AddExitListener(const SendPort& listener, | 1255 void Isolate::AddExitListener(const SendPort& listener, |
1270 const Instance& response) { | 1256 const Instance& response) { |
1271 // Ensure a limit for the number of listeners remembered. | 1257 // Ensure a limit for the number of listeners remembered. |
1272 static const intptr_t kMaxListeners = kSmiMax / (12 * kWordSize); | 1258 static const intptr_t kMaxListeners = kSmiMax / (12 * kWordSize); |
1273 | 1259 |
1274 const GrowableObjectArray& listeners = GrowableObjectArray::Handle( | 1260 const GrowableObjectArray& listeners = GrowableObjectArray::Handle( |
1275 current_zone(), object_store()->exit_listeners()); | 1261 current_zone(), object_store()->exit_listeners()); |
1276 SendPort& current = SendPort::Handle(current_zone()); | 1262 SendPort& current = SendPort::Handle(current_zone()); |
1277 intptr_t insertion_index = -1; | 1263 intptr_t insertion_index = -1; |
1278 for (intptr_t i = 0; i < listeners.Length(); i += 2) { | 1264 for (intptr_t i = 0; i < listeners.Length(); i += 2) { |
1279 current ^= listeners.At(i); | 1265 current ^= listeners.At(i); |
1280 if (current.IsNull()) { | 1266 if (current.IsNull()) { |
1281 if (insertion_index < 0) { | 1267 if (insertion_index < 0) { |
1282 insertion_index = i; | 1268 insertion_index = i; |
1283 } | 1269 } |
1284 } else if (current.Id() == listener.Id()) { | 1270 } else if (current.Id() == listener.Id()) { |
1285 listeners.SetAt(i + 1, response); | 1271 listeners.SetAt(i + 1, response); |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1432 if (state->on_error_port() != ILLEGAL_PORT) { | 1418 if (state->on_error_port() != ILLEGAL_PORT) { |
1433 const SendPort& listener = | 1419 const SendPort& listener = |
1434 SendPort::Handle(SendPort::New(state->on_error_port())); | 1420 SendPort::Handle(SendPort::New(state->on_error_port())); |
1435 isolate->AddErrorListener(listener); | 1421 isolate->AddErrorListener(listener); |
1436 } | 1422 } |
1437 | 1423 |
1438 // Switch back to spawning isolate. | 1424 // Switch back to spawning isolate. |
1439 | 1425 |
1440 | 1426 |
1441 if (!ClassFinalizer::ProcessPendingClasses()) { | 1427 if (!ClassFinalizer::ProcessPendingClasses()) { |
1442 // Error is in sticky error already. | 1428 // Error is in sticky error already. |
1443 #if defined(DEBUG) | 1429 #if defined(DEBUG) |
1444 const Error& error = Error::Handle(thread->sticky_error()); | 1430 const Error& error = Error::Handle(thread->sticky_error()); |
1445 ASSERT(!error.IsUnwindError()); | 1431 ASSERT(!error.IsUnwindError()); |
1446 #endif | 1432 #endif |
1447 return MessageHandler::kError; | 1433 return MessageHandler::kError; |
1448 } | 1434 } |
1449 | 1435 |
1450 Object& result = Object::Handle(); | 1436 Object& result = Object::Handle(); |
1451 result = state->ResolveFunction(); | 1437 result = state->ResolveFunction(); |
1452 bool is_spawn_uri = state->is_spawn_uri(); | 1438 bool is_spawn_uri = state->is_spawn_uri(); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1487 // Since this function ("RunIsolate") is used for both Isolate.spawn and | 1473 // Since this function ("RunIsolate") is used for both Isolate.spawn and |
1488 // Isolate.spawnUri we also send a boolean flag as argument so that the | 1474 // Isolate.spawnUri we also send a boolean flag as argument so that the |
1489 // "_startIsolate" function can act corresponding to how the isolate was | 1475 // "_startIsolate" function can act corresponding to how the isolate was |
1490 // created. | 1476 // created. |
1491 const Array& args = Array::Handle(Array::New(7)); | 1477 const Array& args = Array::Handle(Array::New(7)); |
1492 args.SetAt(0, SendPort::Handle(SendPort::New(state->parent_port()))); | 1478 args.SetAt(0, SendPort::Handle(SendPort::New(state->parent_port()))); |
1493 args.SetAt(1, Instance::Handle(func.ImplicitStaticClosure())); | 1479 args.SetAt(1, Instance::Handle(func.ImplicitStaticClosure())); |
1494 args.SetAt(2, Instance::Handle(state->BuildArgs(thread))); | 1480 args.SetAt(2, Instance::Handle(state->BuildArgs(thread))); |
1495 args.SetAt(3, Instance::Handle(state->BuildMessage(thread))); | 1481 args.SetAt(3, Instance::Handle(state->BuildMessage(thread))); |
1496 args.SetAt(4, is_spawn_uri ? Bool::True() : Bool::False()); | 1482 args.SetAt(4, is_spawn_uri ? Bool::True() : Bool::False()); |
1497 args.SetAt(5, ReceivePort::Handle( | 1483 args.SetAt(5, ReceivePort::Handle(ReceivePort::New( |
1498 ReceivePort::New(isolate->main_port(), true /* control port */))); | 1484 isolate->main_port(), true /* control port */))); |
1499 args.SetAt(6, capabilities); | 1485 args.SetAt(6, capabilities); |
1500 | 1486 |
1501 const Library& lib = Library::Handle(Library::IsolateLibrary()); | 1487 const Library& lib = Library::Handle(Library::IsolateLibrary()); |
1502 const String& entry_name = String::Handle(String::New("_startIsolate")); | 1488 const String& entry_name = String::Handle(String::New("_startIsolate")); |
1503 const Function& entry_point = | 1489 const Function& entry_point = |
1504 Function::Handle(lib.LookupLocalFunction(entry_name)); | 1490 Function::Handle(lib.LookupLocalFunction(entry_name)); |
1505 ASSERT(entry_point.IsFunction() && !entry_point.IsNull()); | 1491 ASSERT(entry_point.IsFunction() && !entry_point.IsNull()); |
1506 | 1492 |
1507 result = DartEntry::InvokeFunction(entry_point, args); | 1493 result = DartEntry::InvokeFunction(entry_point, args); |
1508 if (result.IsError()) { | 1494 if (result.IsError()) { |
(...skipping 10 matching lines...) Expand all Loading... |
1519 // running the shutdown callback. | 1505 // running the shutdown callback. |
1520 isolate->WaitForOutstandingSpawns(); | 1506 isolate->WaitForOutstandingSpawns(); |
1521 { | 1507 { |
1522 // Print the error if there is one. This may execute dart code to | 1508 // Print the error if there is one. This may execute dart code to |
1523 // print the exception object, so we need to use a StartIsolateScope. | 1509 // print the exception object, so we need to use a StartIsolateScope. |
1524 StartIsolateScope start_scope(isolate); | 1510 StartIsolateScope start_scope(isolate); |
1525 Thread* thread = Thread::Current(); | 1511 Thread* thread = Thread::Current(); |
1526 ASSERT(thread->isolate() == isolate); | 1512 ASSERT(thread->isolate() == isolate); |
1527 StackZone zone(thread); | 1513 StackZone zone(thread); |
1528 HandleScope handle_scope(thread); | 1514 HandleScope handle_scope(thread); |
1529 // TODO(27003): Enable for precompiled. | 1515 // TODO(27003): Enable for precompiled. |
1530 #if defined(DEBUG) && !defined(DART_PRECOMPILED_RUNTIME) | 1516 #if defined(DEBUG) && !defined(DART_PRECOMPILED_RUNTIME) |
1531 if (!isolate->HasAttemptedReload()) { | 1517 if (!isolate->HasAttemptedReload()) { |
1532 // For this verification we need to stop the background compiler earlier. | 1518 // For this verification we need to stop the background compiler earlier. |
1533 // This would otherwise happen in Dart::ShowdownIsolate. | 1519 // This would otherwise happen in Dart::ShowdownIsolate. |
1534 isolate->StopBackgroundCompiler(); | 1520 isolate->StopBackgroundCompiler(); |
1535 isolate->heap()->CollectAllGarbage(); | 1521 isolate->heap()->CollectAllGarbage(); |
1536 VerifyCanonicalVisitor check_canonical(thread); | 1522 VerifyCanonicalVisitor check_canonical(thread); |
1537 isolate->heap()->IterateObjects(&check_canonical); | 1523 isolate->heap()->IterateObjects(&check_canonical); |
1538 } | 1524 } |
1539 #endif // DEBUG | 1525 #endif // DEBUG |
1540 const Error& error = Error::Handle(thread->sticky_error()); | 1526 const Error& error = Error::Handle(thread->sticky_error()); |
1541 if (!error.IsNull() && !error.IsUnwindError()) { | 1527 if (!error.IsNull() && !error.IsUnwindError()) { |
1542 OS::PrintErr("in ShutdownIsolate: %s\n", error.ToErrorCString()); | 1528 OS::PrintErr("in ShutdownIsolate: %s\n", error.ToErrorCString()); |
1543 } | 1529 } |
1544 Dart::RunShutdownCallback(); | 1530 Dart::RunShutdownCallback(); |
1545 } | 1531 } |
1546 // Shut the isolate down. | 1532 // Shut the isolate down. |
1547 Dart::ShutdownIsolate(isolate); | 1533 Dart::ShutdownIsolate(isolate); |
1548 } | 1534 } |
1549 | 1535 |
1550 | 1536 |
1551 void Isolate::SetStickyError(RawError* sticky_error) { | 1537 void Isolate::SetStickyError(RawError* sticky_error) { |
1552 ASSERT(((sticky_error_ == Error::null()) || | 1538 ASSERT( |
1553 (sticky_error == Error::null())) && | 1539 ((sticky_error_ == Error::null()) || (sticky_error == Error::null())) && |
1554 (sticky_error != sticky_error_)); | 1540 (sticky_error != sticky_error_)); |
1555 sticky_error_ = sticky_error; | 1541 sticky_error_ = sticky_error; |
1556 } | 1542 } |
1557 | 1543 |
1558 | 1544 |
1559 void Isolate::Run() { | 1545 void Isolate::Run() { |
1560 message_handler()->Run(Dart::thread_pool(), | 1546 message_handler()->Run(Dart::thread_pool(), RunIsolate, ShutdownIsolate, |
1561 RunIsolate, | |
1562 ShutdownIsolate, | |
1563 reinterpret_cast<uword>(this)); | 1547 reinterpret_cast<uword>(this)); |
1564 } | 1548 } |
1565 | 1549 |
1566 | 1550 |
1567 void Isolate::AddClosureFunction(const Function& function) const { | 1551 void Isolate::AddClosureFunction(const Function& function) const { |
1568 ASSERT(!Compiler::IsBackgroundCompilation()); | 1552 ASSERT(!Compiler::IsBackgroundCompilation()); |
1569 GrowableObjectArray& closures = | 1553 GrowableObjectArray& closures = |
1570 GrowableObjectArray::Handle(object_store()->closure_functions()); | 1554 GrowableObjectArray::Handle(object_store()->closure_functions()); |
1571 ASSERT(!closures.IsNull()); | 1555 ASSERT(!closures.IsNull()); |
1572 ASSERT(function.IsNonImplicitClosureFunction()); | 1556 ASSERT(function.IsNonImplicitClosureFunction()); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1616 GrowableObjectArray::Handle(object_store()->closure_functions()); | 1600 GrowableObjectArray::Handle(object_store()->closure_functions()); |
1617 if ((idx < 0) || (idx >= closures_array.Length())) { | 1601 if ((idx < 0) || (idx >= closures_array.Length())) { |
1618 return Function::null(); | 1602 return Function::null(); |
1619 } | 1603 } |
1620 return Function::RawCast(closures_array.At(idx)); | 1604 return Function::RawCast(closures_array.At(idx)); |
1621 } | 1605 } |
1622 | 1606 |
1623 | 1607 |
1624 class FinalizeWeakPersistentHandlesVisitor : public HandleVisitor { | 1608 class FinalizeWeakPersistentHandlesVisitor : public HandleVisitor { |
1625 public: | 1609 public: |
1626 FinalizeWeakPersistentHandlesVisitor() : HandleVisitor(Thread::Current()) { | 1610 FinalizeWeakPersistentHandlesVisitor() : HandleVisitor(Thread::Current()) {} |
1627 } | |
1628 | 1611 |
1629 void VisitHandle(uword addr) { | 1612 void VisitHandle(uword addr) { |
1630 FinalizablePersistentHandle* handle = | 1613 FinalizablePersistentHandle* handle = |
1631 reinterpret_cast<FinalizablePersistentHandle*>(addr); | 1614 reinterpret_cast<FinalizablePersistentHandle*>(addr); |
1632 FinalizationQueue* queue = NULL; // Finalize in the foreground. | 1615 FinalizationQueue* queue = NULL; // Finalize in the foreground. |
1633 handle->UpdateUnreachable(thread()->isolate(), queue); | 1616 handle->UpdateUnreachable(thread()->isolate(), queue); |
1634 } | 1617 } |
1635 | 1618 |
1636 private: | 1619 private: |
1637 DISALLOW_COPY_AND_ASSIGN(FinalizeWeakPersistentHandlesVisitor); | 1620 DISALLOW_COPY_AND_ASSIGN(FinalizeWeakPersistentHandlesVisitor); |
1638 }; | 1621 }; |
1639 | 1622 |
1640 | 1623 |
1641 void Isolate::LowLevelShutdown() { | 1624 void Isolate::LowLevelShutdown() { |
1642 // Ensure we have a zone and handle scope so that we can call VM functions, | 1625 // Ensure we have a zone and handle scope so that we can call VM functions, |
1643 // but we no longer allocate new heap objects. | 1626 // but we no longer allocate new heap objects. |
1644 Thread* thread = Thread::Current(); | 1627 Thread* thread = Thread::Current(); |
1645 StackZone stack_zone(thread); | 1628 StackZone stack_zone(thread); |
1646 HandleScope handle_scope(thread); | 1629 HandleScope handle_scope(thread); |
1647 NoSafepointScope no_safepoint_scope; | 1630 NoSafepointScope no_safepoint_scope; |
1648 | 1631 |
1649 // Notify exit listeners that this isolate is shutting down. | 1632 // Notify exit listeners that this isolate is shutting down. |
1650 if (object_store() != NULL) { | 1633 if (object_store() != NULL) { |
1651 const Error& error = Error::Handle(thread->sticky_error()); | 1634 const Error& error = Error::Handle(thread->sticky_error()); |
1652 if (error.IsNull() || | 1635 if (error.IsNull() || !error.IsUnwindError() || |
1653 !error.IsUnwindError() || | |
1654 UnwindError::Cast(error).is_user_initiated()) { | 1636 UnwindError::Cast(error).is_user_initiated()) { |
1655 NotifyExitListeners(); | 1637 NotifyExitListeners(); |
1656 } | 1638 } |
1657 } | 1639 } |
1658 | 1640 |
1659 // Clean up debugger resources. | 1641 // Clean up debugger resources. |
1660 if (FLAG_support_debugger) { | 1642 if (FLAG_support_debugger) { |
1661 debugger()->Shutdown(); | 1643 debugger()->Shutdown(); |
1662 } | 1644 } |
1663 | 1645 |
1664 | 1646 |
1665 // Close all the ports owned by this isolate. | 1647 // Close all the ports owned by this isolate. |
1666 PortMap::ClosePorts(message_handler()); | 1648 PortMap::ClosePorts(message_handler()); |
1667 | 1649 |
1668 // Fail fast if anybody tries to post any more messsages to this isolate. | 1650 // Fail fast if anybody tries to post any more messsages to this isolate. |
1669 delete message_handler(); | 1651 delete message_handler(); |
1670 set_message_handler(NULL); | 1652 set_message_handler(NULL); |
1671 if (FLAG_support_timeline) { | 1653 if (FLAG_support_timeline) { |
1672 // Before analyzing the isolate's timeline blocks- reclaim all cached | 1654 // Before analyzing the isolate's timeline blocks- reclaim all cached |
1673 // blocks. | 1655 // blocks. |
1674 Timeline::ReclaimCachedBlocksFromThreads(); | 1656 Timeline::ReclaimCachedBlocksFromThreads(); |
1675 } | 1657 } |
1676 | 1658 |
1677 // Dump all timing data for the isolate. | 1659 // Dump all timing data for the isolate. |
1678 #ifndef PRODUCT | 1660 #ifndef PRODUCT |
1679 if (FLAG_support_timeline && FLAG_timing) { | 1661 if (FLAG_support_timeline && FLAG_timing) { |
1680 TimelinePauseTrace tpt; | 1662 TimelinePauseTrace tpt; |
1681 tpt.Print(); | 1663 tpt.Print(); |
1682 } | 1664 } |
1683 #endif // !PRODUCT | 1665 #endif // !PRODUCT |
1684 | 1666 |
1685 // Finalize any weak persistent handles with a non-null referent. | 1667 // Finalize any weak persistent handles with a non-null referent. |
1686 FinalizeWeakPersistentHandlesVisitor visitor; | 1668 FinalizeWeakPersistentHandlesVisitor visitor; |
1687 api_state()->weak_persistent_handles().VisitHandles(&visitor); | 1669 api_state()->weak_persistent_handles().VisitHandles(&visitor); |
1688 | 1670 |
1689 if (FLAG_dump_megamorphic_stats) { | 1671 if (FLAG_dump_megamorphic_stats) { |
1690 MegamorphicCacheTable::PrintSizes(this); | 1672 MegamorphicCacheTable::PrintSizes(this); |
1691 } | 1673 } |
1692 if (FLAG_trace_isolates) { | 1674 if (FLAG_trace_isolates) { |
1693 heap()->PrintSizes(); | 1675 heap()->PrintSizes(); |
1694 Symbols::DumpStats(); | 1676 Symbols::DumpStats(); |
1695 OS::Print("[-] Stopping isolate:\n" | 1677 OS::Print( |
1696 "\tisolate: %s\n", name()); | 1678 "[-] Stopping isolate:\n" |
| 1679 "\tisolate: %s\n", |
| 1680 name()); |
1697 } | 1681 } |
1698 if (FLAG_print_metrics) { | 1682 if (FLAG_print_metrics) { |
1699 LogBlock lb; | 1683 LogBlock lb; |
1700 OS::PrintErr("Printing metrics for %s\n", name()); | 1684 OS::PrintErr("Printing metrics for %s\n", name()); |
1701 #define ISOLATE_METRIC_PRINT(type, variable, name, unit) \ | 1685 #define ISOLATE_METRIC_PRINT(type, variable, name, unit) \ |
1702 OS::PrintErr("%s\n", metric_##variable##_.ToString()); | 1686 OS::PrintErr("%s\n", metric_##variable##_.ToString()); |
1703 | 1687 |
1704 ISOLATE_METRIC_LIST(ISOLATE_METRIC_PRINT); | 1688 ISOLATE_METRIC_LIST(ISOLATE_METRIC_PRINT); |
1705 #undef ISOLATE_METRIC_PRINT | 1689 #undef ISOLATE_METRIC_PRINT |
1706 OS::PrintErr("\n"); | 1690 OS::PrintErr("\n"); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1747 // Don't allow anymore dart code to execution on this isolate. | 1731 // Don't allow anymore dart code to execution on this isolate. |
1748 thread->ClearStackLimit(); | 1732 thread->ClearStackLimit(); |
1749 | 1733 |
1750 // First, perform higher-level cleanup that may need to allocate. | 1734 // First, perform higher-level cleanup that may need to allocate. |
1751 { | 1735 { |
1752 // Ensure we have a zone and handle scope so that we can call VM functions. | 1736 // Ensure we have a zone and handle scope so that we can call VM functions. |
1753 StackZone stack_zone(thread); | 1737 StackZone stack_zone(thread); |
1754 HandleScope handle_scope(thread); | 1738 HandleScope handle_scope(thread); |
1755 | 1739 |
1756 // Write compiler stats data if enabled. | 1740 // Write compiler stats data if enabled. |
1757 if (FLAG_support_compiler_stats && FLAG_compiler_stats | 1741 if (FLAG_support_compiler_stats && FLAG_compiler_stats && |
1758 && !ServiceIsolate::IsServiceIsolateDescendant(this) | 1742 !ServiceIsolate::IsServiceIsolateDescendant(this) && |
1759 && (this != Dart::vm_isolate())) { | 1743 (this != Dart::vm_isolate())) { |
1760 OS::Print("%s", aggregate_compiler_stats()->PrintToZone()); | 1744 OS::Print("%s", aggregate_compiler_stats()->PrintToZone()); |
1761 } | 1745 } |
1762 } | 1746 } |
1763 | 1747 |
1764 // Remove this isolate from the list *before* we start tearing it down, to | 1748 // Remove this isolate from the list *before* we start tearing it down, to |
1765 // avoid exposing it in a state of decay. | 1749 // avoid exposing it in a state of decay. |
1766 RemoveIsolateFromList(this); | 1750 RemoveIsolateFromList(this); |
1767 | 1751 |
1768 if (heap_ != NULL) { | 1752 if (heap_ != NULL) { |
1769 // Wait for any concurrent GC tasks to finish before shutting down. | 1753 // Wait for any concurrent GC tasks to finish before shutting down. |
1770 // TODO(koda): Support faster sweeper shutdown (e.g., after current page). | 1754 // TODO(koda): Support faster sweeper shutdown (e.g., after current page). |
1771 PageSpace* old_space = heap_->old_space(); | 1755 PageSpace* old_space = heap_->old_space(); |
1772 MonitorLocker ml(old_space->tasks_lock()); | 1756 MonitorLocker ml(old_space->tasks_lock()); |
1773 while (old_space->tasks() > 0) { | 1757 while (old_space->tasks() > 0) { |
1774 ml.Wait(); | 1758 ml.Wait(); |
1775 } | 1759 } |
1776 } | 1760 } |
1777 | 1761 |
1778 if (FLAG_check_reloaded && is_runnable() && | 1762 if (FLAG_check_reloaded && is_runnable() && (this != Dart::vm_isolate()) && |
1779 (this != Dart::vm_isolate()) && | |
1780 !ServiceIsolate::IsServiceIsolateDescendant(this)) { | 1763 !ServiceIsolate::IsServiceIsolateDescendant(this)) { |
1781 if (!HasAttemptedReload()) { | 1764 if (!HasAttemptedReload()) { |
1782 FATAL("Isolate did not reload before exiting and " | 1765 FATAL( |
1783 "--check-reloaded is enabled.\n"); | 1766 "Isolate did not reload before exiting and " |
| 1767 "--check-reloaded is enabled.\n"); |
1784 } | 1768 } |
1785 } | 1769 } |
1786 | 1770 |
1787 // Then, proceed with low-level teardown. | 1771 // Then, proceed with low-level teardown. |
1788 LowLevelShutdown(); | 1772 LowLevelShutdown(); |
1789 | 1773 |
1790 #if defined(DEBUG) | 1774 #if defined(DEBUG) |
1791 // No concurrent sweeper tasks should be running at this point. | 1775 // No concurrent sweeper tasks should be running at this point. |
1792 if (heap_ != NULL) { | 1776 if (heap_ != NULL) { |
1793 PageSpace* old_space = heap_->old_space(); | 1777 PageSpace* old_space = heap_->old_space(); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1844 visitor->VisitPointer(reinterpret_cast<RawObject**>(&tag_table_)); | 1828 visitor->VisitPointer(reinterpret_cast<RawObject**>(&tag_table_)); |
1845 | 1829 |
1846 if (background_compiler() != NULL) { | 1830 if (background_compiler() != NULL) { |
1847 background_compiler()->VisitPointers(visitor); | 1831 background_compiler()->VisitPointers(visitor); |
1848 } | 1832 } |
1849 | 1833 |
1850 // Visit the deoptimized code array which is stored in the isolate. | 1834 // Visit the deoptimized code array which is stored in the isolate. |
1851 visitor->VisitPointer( | 1835 visitor->VisitPointer( |
1852 reinterpret_cast<RawObject**>(&deoptimized_code_array_)); | 1836 reinterpret_cast<RawObject**>(&deoptimized_code_array_)); |
1853 | 1837 |
1854 visitor->VisitPointer( | 1838 visitor->VisitPointer(reinterpret_cast<RawObject**>(&sticky_error_)); |
1855 reinterpret_cast<RawObject**>(&sticky_error_)); | |
1856 | 1839 |
1857 // Visit the pending service extension calls. | 1840 // Visit the pending service extension calls. |
1858 visitor->VisitPointer( | 1841 visitor->VisitPointer( |
1859 reinterpret_cast<RawObject**>(&pending_service_extension_calls_)); | 1842 reinterpret_cast<RawObject**>(&pending_service_extension_calls_)); |
1860 | 1843 |
1861 // Visit the registered service extension handlers. | 1844 // Visit the registered service extension handlers. |
1862 visitor->VisitPointer( | 1845 visitor->VisitPointer( |
1863 reinterpret_cast<RawObject**>(®istered_service_extension_handlers_)); | 1846 reinterpret_cast<RawObject**>(®istered_service_extension_handlers_)); |
1864 | 1847 |
1865 // Visit the boxed_field_list_. | 1848 // Visit the boxed_field_list_. |
1866 // 'boxed_field_list_' access via mutator and background compilation threads | 1849 // 'boxed_field_list_' access via mutator and background compilation threads |
1867 // is guarded with a monitor. This means that we can visit it only | 1850 // is guarded with a monitor. This means that we can visit it only |
1868 // when at safepoint or the field_list_mutex_ lock has been taken. | 1851 // when at safepoint or the field_list_mutex_ lock has been taken. |
1869 visitor->VisitPointer(reinterpret_cast<RawObject**>(&boxed_field_list_)); | 1852 visitor->VisitPointer(reinterpret_cast<RawObject**>(&boxed_field_list_)); |
1870 | 1853 |
1871 // Visit objects in the debugger. | 1854 // Visit objects in the debugger. |
1872 if (FLAG_support_debugger) { | 1855 if (FLAG_support_debugger) { |
1873 debugger()->VisitObjectPointers(visitor); | 1856 debugger()->VisitObjectPointers(visitor); |
1874 } | 1857 } |
1875 | 1858 |
1876 NOT_IN_PRODUCT( | 1859 #if !defined(PRODUCT) |
1877 // Visit objects that are being used for isolate reload. | 1860 // Visit objects that are being used for isolate reload. |
1878 if (reload_context() != NULL) { | 1861 if (reload_context() != NULL) { |
1879 reload_context()->VisitObjectPointers(visitor); | 1862 reload_context()->VisitObjectPointers(visitor); |
1880 } | 1863 } |
1881 if (ServiceIsolate::IsServiceIsolate(this)) { | 1864 if (ServiceIsolate::IsServiceIsolate(this)) { |
1882 ServiceIsolate::VisitObjectPointers(visitor); | 1865 ServiceIsolate::VisitObjectPointers(visitor); |
1883 } | 1866 } |
1884 ) | 1867 #endif // !defined(PRODUCT) |
1885 | 1868 |
1886 // Visit objects that are being used for deoptimization. | 1869 // Visit objects that are being used for deoptimization. |
1887 if (deopt_context() != NULL) { | 1870 if (deopt_context() != NULL) { |
1888 deopt_context()->VisitObjectPointers(visitor); | 1871 deopt_context()->VisitObjectPointers(visitor); |
1889 } | 1872 } |
1890 | 1873 |
1891 // Visit objects in all threads (e.g., Dart stack, handles in zones). | 1874 // Visit objects in all threads (e.g., Dart stack, handles in zones). |
1892 thread_registry()->VisitObjectPointers(visitor, validate_frames); | 1875 thread_registry()->VisitObjectPointers(visitor, validate_frames); |
1893 } | 1876 } |
1894 | 1877 |
(...skipping 27 matching lines...) Expand all Loading... |
1922 ASSERT(raw_class->ptr()->id_ == cid); | 1905 ASSERT(raw_class->ptr()->id_ == cid); |
1923 #endif | 1906 #endif |
1924 return raw_class; | 1907 return raw_class; |
1925 } | 1908 } |
1926 | 1909 |
1927 | 1910 |
1928 void Isolate::AddPendingDeopt(uword fp, uword pc) { | 1911 void Isolate::AddPendingDeopt(uword fp, uword pc) { |
1929 // GrowableArray::Add is not atomic and may be interrupt by a profiler | 1912 // GrowableArray::Add is not atomic and may be interrupt by a profiler |
1930 // stack walk. | 1913 // stack walk. |
1931 MallocGrowableArray<PendingLazyDeopt>* old_pending_deopts = pending_deopts_; | 1914 MallocGrowableArray<PendingLazyDeopt>* old_pending_deopts = pending_deopts_; |
1932 MallocGrowableArray<PendingLazyDeopt>* new_pending_deopts | 1915 MallocGrowableArray<PendingLazyDeopt>* new_pending_deopts = |
1933 = new MallocGrowableArray<PendingLazyDeopt>( | 1916 new MallocGrowableArray<PendingLazyDeopt>(old_pending_deopts->length() + |
1934 old_pending_deopts->length() + 1); | 1917 1); |
1935 for (intptr_t i = 0; i < old_pending_deopts->length(); i++) { | 1918 for (intptr_t i = 0; i < old_pending_deopts->length(); i++) { |
1936 ASSERT((*old_pending_deopts)[i].fp() != fp); | 1919 ASSERT((*old_pending_deopts)[i].fp() != fp); |
1937 new_pending_deopts->Add((*old_pending_deopts)[i]); | 1920 new_pending_deopts->Add((*old_pending_deopts)[i]); |
1938 } | 1921 } |
1939 PendingLazyDeopt deopt(fp, pc); | 1922 PendingLazyDeopt deopt(fp, pc); |
1940 new_pending_deopts->Add(deopt); | 1923 new_pending_deopts->Add(deopt); |
1941 | 1924 |
1942 pending_deopts_ = new_pending_deopts; | 1925 pending_deopts_ = new_pending_deopts; |
1943 delete old_pending_deopts; | 1926 delete old_pending_deopts; |
1944 } | 1927 } |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1983 void Isolate::PrintJSON(JSONStream* stream, bool ref) { | 1966 void Isolate::PrintJSON(JSONStream* stream, bool ref) { |
1984 if (!FLAG_support_service) { | 1967 if (!FLAG_support_service) { |
1985 return; | 1968 return; |
1986 } | 1969 } |
1987 JSONObject jsobj(stream); | 1970 JSONObject jsobj(stream); |
1988 jsobj.AddProperty("type", (ref ? "@Isolate" : "Isolate")); | 1971 jsobj.AddProperty("type", (ref ? "@Isolate" : "Isolate")); |
1989 jsobj.AddFixedServiceId("isolates/%" Pd64 "", | 1972 jsobj.AddFixedServiceId("isolates/%" Pd64 "", |
1990 static_cast<int64_t>(main_port())); | 1973 static_cast<int64_t>(main_port())); |
1991 | 1974 |
1992 jsobj.AddProperty("name", debugger_name()); | 1975 jsobj.AddProperty("name", debugger_name()); |
1993 jsobj.AddPropertyF("number", "%" Pd64 "", | 1976 jsobj.AddPropertyF("number", "%" Pd64 "", static_cast<int64_t>(main_port())); |
1994 static_cast<int64_t>(main_port())); | |
1995 if (ref) { | 1977 if (ref) { |
1996 return; | 1978 return; |
1997 } | 1979 } |
1998 jsobj.AddPropertyF("_originNumber", "%" Pd64 "", | 1980 jsobj.AddPropertyF("_originNumber", "%" Pd64 "", |
1999 static_cast<int64_t>(origin_id())); | 1981 static_cast<int64_t>(origin_id())); |
2000 int64_t start_time_millis = start_time() / kMicrosecondsPerMillisecond; | 1982 int64_t start_time_millis = start_time() / kMicrosecondsPerMillisecond; |
2001 jsobj.AddPropertyTimeMillis("startTime", start_time_millis); | 1983 jsobj.AddPropertyTimeMillis("startTime", start_time_millis); |
2002 { | 1984 { |
2003 JSONObject jsheap(&jsobj, "_heaps"); | 1985 JSONObject jsheap(&jsobj, "_heaps"); |
2004 heap()->PrintToJSONObject(Heap::kNew, &jsheap); | 1986 heap()->PrintToJSONObject(Heap::kNew, &jsheap); |
(...skipping 12 matching lines...) Expand all Loading... |
2017 jsobj.AddProperty("pauseEvent", &pause_event); | 1999 jsobj.AddProperty("pauseEvent", &pause_event); |
2018 } else if (message_handler()->is_paused_on_start() || | 2000 } else if (message_handler()->is_paused_on_start() || |
2019 message_handler()->should_pause_on_start()) { | 2001 message_handler()->should_pause_on_start()) { |
2020 ASSERT((debugger() == NULL) || (debugger()->PauseEvent() == NULL)); | 2002 ASSERT((debugger() == NULL) || (debugger()->PauseEvent() == NULL)); |
2021 ServiceEvent pause_event(this, ServiceEvent::kPauseStart); | 2003 ServiceEvent pause_event(this, ServiceEvent::kPauseStart); |
2022 jsobj.AddProperty("pauseEvent", &pause_event); | 2004 jsobj.AddProperty("pauseEvent", &pause_event); |
2023 } else if (message_handler()->is_paused_on_exit() && | 2005 } else if (message_handler()->is_paused_on_exit() && |
2024 ((debugger() == NULL) || (debugger()->PauseEvent() == NULL))) { | 2006 ((debugger() == NULL) || (debugger()->PauseEvent() == NULL))) { |
2025 ServiceEvent pause_event(this, ServiceEvent::kPauseExit); | 2007 ServiceEvent pause_event(this, ServiceEvent::kPauseExit); |
2026 jsobj.AddProperty("pauseEvent", &pause_event); | 2008 jsobj.AddProperty("pauseEvent", &pause_event); |
2027 } else if ((debugger() != NULL) && | 2009 } else if ((debugger() != NULL) && (debugger()->PauseEvent() != NULL) && |
2028 (debugger()->PauseEvent() != NULL) && | |
2029 !resume_request_) { | 2010 !resume_request_) { |
2030 jsobj.AddProperty("pauseEvent", debugger()->PauseEvent()); | 2011 jsobj.AddProperty("pauseEvent", debugger()->PauseEvent()); |
2031 } else { | 2012 } else { |
2032 ServiceEvent pause_event(this, ServiceEvent::kResume); | 2013 ServiceEvent pause_event(this, ServiceEvent::kResume); |
2033 | 2014 |
2034 if (debugger() != NULL) { | 2015 if (debugger() != NULL) { |
2035 // TODO(turnidge): Don't compute a full stack trace. | 2016 // TODO(turnidge): Don't compute a full stack trace. |
2036 DebuggerStackTrace* stack = debugger()->StackTrace(); | 2017 DebuggerStackTrace* stack = debugger()->StackTrace(); |
2037 if (stack->Length() > 0) { | 2018 if (stack->Length() > 0) { |
2038 pause_event.set_top_frame(stack->FrameAt(0)); | 2019 pause_event.set_top_frame(stack->FrameAt(0)); |
2039 } | 2020 } |
2040 } | 2021 } |
2041 jsobj.AddProperty("pauseEvent", &pause_event); | 2022 jsobj.AddProperty("pauseEvent", &pause_event); |
2042 } | 2023 } |
2043 | 2024 |
2044 const Library& lib = | 2025 const Library& lib = Library::Handle(object_store()->root_library()); |
2045 Library::Handle(object_store()->root_library()); | |
2046 if (!lib.IsNull()) { | 2026 if (!lib.IsNull()) { |
2047 jsobj.AddProperty("rootLib", lib); | 2027 jsobj.AddProperty("rootLib", lib); |
2048 } | 2028 } |
2049 | 2029 |
2050 if (FLAG_profiler) { | 2030 if (FLAG_profiler) { |
2051 JSONObject tagCounters(&jsobj, "_tagCounters"); | 2031 JSONObject tagCounters(&jsobj, "_tagCounters"); |
2052 vm_tag_counters()->PrintToJSONObject(&tagCounters); | 2032 vm_tag_counters()->PrintToJSONObject(&tagCounters); |
2053 } | 2033 } |
2054 if (Thread::Current()->sticky_error() != Object::null()) { | 2034 if (Thread::Current()->sticky_error() != Object::null()) { |
2055 Error& error = Error::Handle(Thread::Current()->sticky_error()); | 2035 Error& error = Error::Handle(Thread::Current()->sticky_error()); |
(...skipping 20 matching lines...) Expand all Loading... |
2076 } | 2056 } |
2077 | 2057 |
2078 { | 2058 { |
2079 JSONArray breakpoints(&jsobj, "breakpoints"); | 2059 JSONArray breakpoints(&jsobj, "breakpoints"); |
2080 if (debugger() != NULL) { | 2060 if (debugger() != NULL) { |
2081 debugger()->PrintBreakpointsToJSONArray(&breakpoints); | 2061 debugger()->PrintBreakpointsToJSONArray(&breakpoints); |
2082 } | 2062 } |
2083 } | 2063 } |
2084 | 2064 |
2085 Dart_ExceptionPauseInfo pause_info = (debugger() != NULL) | 2065 Dart_ExceptionPauseInfo pause_info = (debugger() != NULL) |
2086 ? debugger()->GetExceptionPauseInfo() | 2066 ? debugger()->GetExceptionPauseInfo() |
2087 : kNoPauseOnExceptions; | 2067 : kNoPauseOnExceptions; |
2088 jsobj.AddProperty("exceptionPauseMode", | 2068 jsobj.AddProperty("exceptionPauseMode", |
2089 ExceptionPauseInfoToServiceEnum(pause_info)); | 2069 ExceptionPauseInfoToServiceEnum(pause_info)); |
2090 | 2070 |
2091 if (debugger() != NULL) { | 2071 if (debugger() != NULL) { |
2092 JSONObject settings(&jsobj, "_debuggerSettings"); | 2072 JSONObject settings(&jsobj, "_debuggerSettings"); |
2093 debugger()->PrintSettingsToJSONObject(&settings); | 2073 debugger()->PrintSettingsToJSONObject(&settings); |
2094 } | 2074 } |
2095 | 2075 |
2096 { | 2076 { |
2097 GrowableObjectArray& handlers = | 2077 GrowableObjectArray& handlers = |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2150 deoptimized_code.Add(code); | 2130 deoptimized_code.Add(code); |
2151 } | 2131 } |
2152 | 2132 |
2153 | 2133 |
2154 void Isolate::clear_sticky_error() { | 2134 void Isolate::clear_sticky_error() { |
2155 sticky_error_ = Error::null(); | 2135 sticky_error_ = Error::null(); |
2156 } | 2136 } |
2157 | 2137 |
2158 | 2138 |
2159 void Isolate::set_pending_service_extension_calls( | 2139 void Isolate::set_pending_service_extension_calls( |
2160 const GrowableObjectArray& value) { | 2140 const GrowableObjectArray& value) { |
2161 pending_service_extension_calls_ = value.raw(); | 2141 pending_service_extension_calls_ = value.raw(); |
2162 } | 2142 } |
2163 | 2143 |
2164 | 2144 |
2165 void Isolate::set_registered_service_extension_handlers( | 2145 void Isolate::set_registered_service_extension_handlers( |
2166 const GrowableObjectArray& value) { | 2146 const GrowableObjectArray& value) { |
2167 registered_service_extension_handlers_ = value.raw(); | 2147 registered_service_extension_handlers_ = value.raw(); |
2168 } | 2148 } |
2169 | 2149 |
2170 | 2150 |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2239 ASSERT(!parameter_values.IsNull()); | 2219 ASSERT(!parameter_values.IsNull()); |
2240 arguments.SetAt(kPendingValuesIndex, parameter_values); | 2220 arguments.SetAt(kPendingValuesIndex, parameter_values); |
2241 reply_port ^= calls.At(i + kPendingReplyPortIndex); | 2221 reply_port ^= calls.At(i + kPendingReplyPortIndex); |
2242 ASSERT(!reply_port.IsNull()); | 2222 ASSERT(!reply_port.IsNull()); |
2243 arguments.SetAt(kPendingReplyPortIndex, reply_port); | 2223 arguments.SetAt(kPendingReplyPortIndex, reply_port); |
2244 id ^= calls.At(i + kPendingIdIndex); | 2224 id ^= calls.At(i + kPendingIdIndex); |
2245 arguments.SetAt(kPendingIdIndex, id); | 2225 arguments.SetAt(kPendingIdIndex, id); |
2246 arguments.SetAt(kPendingEntrySize, Bool::Get(FLAG_trace_service)); | 2226 arguments.SetAt(kPendingEntrySize, Bool::Get(FLAG_trace_service)); |
2247 | 2227 |
2248 if (FLAG_trace_service) { | 2228 if (FLAG_trace_service) { |
2249 OS::Print( | 2229 OS::Print("[+%" Pd64 "ms] Isolate %s invoking _runExtension for %s\n", |
2250 "[+%" Pd64 "ms] Isolate %s invoking _runExtension for %s\n", | 2230 Dart::timestamp(), name(), method_name.ToCString()); |
2251 Dart::timestamp(), name(), method_name.ToCString()); | |
2252 } | 2231 } |
2253 result = DartEntry::InvokeFunction(run_extension, arguments); | 2232 result = DartEntry::InvokeFunction(run_extension, arguments); |
2254 if (FLAG_trace_service) { | 2233 if (FLAG_trace_service) { |
2255 OS::Print( | 2234 OS::Print("[+%" Pd64 "ms] Isolate %s : _runExtension complete for %s\n", |
2256 "[+%" Pd64 "ms] Isolate %s : _runExtension complete for %s\n", | 2235 Dart::timestamp(), name(), method_name.ToCString()); |
2257 Dart::timestamp(), name(), method_name.ToCString()); | |
2258 } | 2236 } |
2259 // Propagate the error. | 2237 // Propagate the error. |
2260 if (result.IsError()) { | 2238 if (result.IsError()) { |
2261 // Remaining service extension calls are dropped. | 2239 // Remaining service extension calls are dropped. |
2262 if (!result.IsUnwindError()) { | 2240 if (!result.IsUnwindError()) { |
2263 // Send error back over the protocol. | 2241 // Send error back over the protocol. |
2264 Service::PostError(method_name, | 2242 Service::PostError(method_name, parameter_keys, parameter_values, |
2265 parameter_keys, | 2243 reply_port, id, Error::Cast(result)); |
2266 parameter_values, | |
2267 reply_port, | |
2268 id, | |
2269 Error::Cast(result)); | |
2270 } | 2244 } |
2271 return result.raw(); | 2245 return result.raw(); |
2272 } | 2246 } |
2273 // Drain the microtask queue. | 2247 // Drain the microtask queue. |
2274 result = DartLibraryCalls::DrainMicrotaskQueue(); | 2248 result = DartLibraryCalls::DrainMicrotaskQueue(); |
2275 // Propagate the error. | 2249 // Propagate the error. |
2276 if (result.IsError()) { | 2250 if (result.IsError()) { |
2277 // Remaining service extension calls are dropped. | 2251 // Remaining service extension calls are dropped. |
2278 return result.raw(); | 2252 return result.raw(); |
2279 } | 2253 } |
2280 } | 2254 } |
2281 return Object::null(); | 2255 return Object::null(); |
2282 } | 2256 } |
2283 | 2257 |
2284 | 2258 |
2285 RawGrowableObjectArray* Isolate::GetAndClearPendingServiceExtensionCalls() { | 2259 RawGrowableObjectArray* Isolate::GetAndClearPendingServiceExtensionCalls() { |
2286 RawGrowableObjectArray* r = pending_service_extension_calls_; | 2260 RawGrowableObjectArray* r = pending_service_extension_calls_; |
2287 pending_service_extension_calls_ = GrowableObjectArray::null(); | 2261 pending_service_extension_calls_ = GrowableObjectArray::null(); |
2288 return r; | 2262 return r; |
2289 } | 2263 } |
2290 | 2264 |
2291 | 2265 |
2292 void Isolate::AppendServiceExtensionCall(const Instance& closure, | 2266 void Isolate::AppendServiceExtensionCall(const Instance& closure, |
2293 const String& method_name, | 2267 const String& method_name, |
2294 const Array& parameter_keys, | 2268 const Array& parameter_keys, |
2295 const Array& parameter_values, | 2269 const Array& parameter_values, |
2296 const Instance& reply_port, | 2270 const Instance& reply_port, |
2297 const Instance& id) { | 2271 const Instance& id) { |
2298 if (FLAG_trace_service) { | 2272 if (FLAG_trace_service) { |
2299 OS::Print( | 2273 OS::Print("[+%" Pd64 "ms] Isolate %s ENQUEUING request for extension %s\n", |
2300 "[+%" Pd64 "ms] Isolate %s ENQUEUING request for extension %s\n", | 2274 Dart::timestamp(), name(), method_name.ToCString()); |
2301 Dart::timestamp(), name(), method_name.ToCString()); | |
2302 } | 2275 } |
2303 GrowableObjectArray& calls = | 2276 GrowableObjectArray& calls = |
2304 GrowableObjectArray::Handle(pending_service_extension_calls()); | 2277 GrowableObjectArray::Handle(pending_service_extension_calls()); |
2305 if (calls.IsNull()) { | 2278 if (calls.IsNull()) { |
2306 calls ^= GrowableObjectArray::New(); | 2279 calls ^= GrowableObjectArray::New(); |
2307 ASSERT(!calls.IsNull()); | 2280 ASSERT(!calls.IsNull()); |
2308 set_pending_service_extension_calls(calls); | 2281 set_pending_service_extension_calls(calls); |
2309 } | 2282 } |
2310 ASSERT(kPendingHandlerIndex == 0); | 2283 ASSERT(kPendingHandlerIndex == 0); |
2311 calls.Add(closure); | 2284 calls.Add(closure); |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2396 // embedder. We don't know what kind of thread we are on -- it | 2369 // embedder. We don't know what kind of thread we are on -- it |
2397 // could be from our thread pool or it could be a thread from the | 2370 // could be from our thread pool or it could be a thread from the |
2398 // embedder. Sit on the current thread handling service events | 2371 // embedder. Sit on the current thread handling service events |
2399 // until we are told to resume. | 2372 // until we are told to resume. |
2400 if (pause_loop_monitor_ == NULL) { | 2373 if (pause_loop_monitor_ == NULL) { |
2401 pause_loop_monitor_ = new Monitor(); | 2374 pause_loop_monitor_ = new Monitor(); |
2402 } | 2375 } |
2403 Dart_EnterScope(); | 2376 Dart_EnterScope(); |
2404 MonitorLocker ml(pause_loop_monitor_); | 2377 MonitorLocker ml(pause_loop_monitor_); |
2405 | 2378 |
2406 Dart_MessageNotifyCallback saved_notify_callback = | 2379 Dart_MessageNotifyCallback saved_notify_callback = message_notify_callback(); |
2407 message_notify_callback(); | |
2408 set_message_notify_callback(Isolate::WakePauseEventHandler); | 2380 set_message_notify_callback(Isolate::WakePauseEventHandler); |
2409 | 2381 |
2410 const bool had_isolate_reload_context = reload_context() != NULL; | 2382 const bool had_isolate_reload_context = reload_context() != NULL; |
2411 const int64_t start_time_micros = | 2383 const int64_t start_time_micros = |
2412 !had_isolate_reload_context ? 0 : reload_context()->start_time_micros(); | 2384 !had_isolate_reload_context ? 0 : reload_context()->start_time_micros(); |
2413 bool resume = false; | 2385 bool resume = false; |
2414 while (true) { | 2386 while (true) { |
2415 // Handle all available vm service messages, up to a resume | 2387 // Handle all available vm service messages, up to a resume |
2416 // request. | 2388 // request. |
2417 while (!resume && Dart_HasServiceMessages()) { | 2389 while (!resume && Dart_HasServiceMessages()) { |
2418 ml.Exit(); | 2390 ml.Exit(); |
2419 resume = Dart_HandleServiceMessages(); | 2391 resume = Dart_HandleServiceMessages(); |
2420 ml.Enter(); | 2392 ml.Enter(); |
2421 } | 2393 } |
2422 if (resume) { | 2394 if (resume) { |
2423 break; | 2395 break; |
2424 } | 2396 } |
2425 | 2397 |
2426 if (had_isolate_reload_context && (reload_context() == NULL)) { | 2398 if (had_isolate_reload_context && (reload_context() == NULL)) { |
2427 if (FLAG_trace_reload) { | 2399 if (FLAG_trace_reload) { |
2428 const int64_t reload_time_micros = | 2400 const int64_t reload_time_micros = |
2429 OS::GetCurrentMonotonicMicros() - start_time_micros; | 2401 OS::GetCurrentMonotonicMicros() - start_time_micros; |
2430 double reload_millis = | 2402 double reload_millis = MicrosecondsToMilliseconds(reload_time_micros); |
2431 MicrosecondsToMilliseconds(reload_time_micros); | |
2432 OS::Print("Reloading has finished! (%.2f ms)\n", reload_millis); | 2403 OS::Print("Reloading has finished! (%.2f ms)\n", reload_millis); |
2433 } | 2404 } |
2434 break; | 2405 break; |
2435 } | 2406 } |
2436 | 2407 |
2437 // Wait for more service messages. | 2408 // Wait for more service messages. |
2438 Monitor::WaitResult res = ml.Wait(); | 2409 Monitor::WaitResult res = ml.Wait(); |
2439 ASSERT(res == Monitor::kNotified); | 2410 ASSERT(res == Monitor::kNotified); |
2440 } | 2411 } |
2441 set_message_notify_callback(saved_notify_callback); | 2412 set_message_notify_callback(saved_notify_callback); |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2557 imm.value.as_int32 = Isolate::kImmediateAction; | 2528 imm.value.as_int32 = Isolate::kImmediateAction; |
2558 list_values[3] = &imm; | 2529 list_values[3] = &imm; |
2559 | 2530 |
2560 { | 2531 { |
2561 uint8_t* buffer = NULL; | 2532 uint8_t* buffer = NULL; |
2562 ApiMessageWriter writer(&buffer, allocator); | 2533 ApiMessageWriter writer(&buffer, allocator); |
2563 bool success = writer.WriteCMessage(&kill_msg); | 2534 bool success = writer.WriteCMessage(&kill_msg); |
2564 ASSERT(success); | 2535 ASSERT(success); |
2565 | 2536 |
2566 // Post the message at the given port. | 2537 // Post the message at the given port. |
2567 success = PortMap::PostMessage(new Message(main_port(), | 2538 success = PortMap::PostMessage(new Message( |
2568 buffer, | 2539 main_port(), buffer, writer.BytesWritten(), Message::kOOBPriority)); |
2569 writer.BytesWritten(), | |
2570 Message::kOOBPriority)); | |
2571 ASSERT(success); | 2540 ASSERT(success); |
2572 } | 2541 } |
2573 } | 2542 } |
2574 | 2543 |
2575 | 2544 |
2576 class IsolateKillerVisitor : public IsolateVisitor { | 2545 class IsolateKillerVisitor : public IsolateVisitor { |
2577 public: | 2546 public: |
2578 explicit IsolateKillerVisitor(Isolate::LibMsgId msg_id) | 2547 explicit IsolateKillerVisitor(Isolate::LibMsgId msg_id) |
2579 : target_(NULL), msg_id_(msg_id) {} | 2548 : target_(NULL), msg_id_(msg_id) {} |
2580 | 2549 |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2798 | 2767 |
2799 String& func_name = String::Handle(); | 2768 String& func_name = String::Handle(); |
2800 func_name ^= func.name(); | 2769 func_name ^= func.name(); |
2801 func_name ^= String::ScrubName(func_name); | 2770 func_name ^= String::ScrubName(func_name); |
2802 function_name_ = NewConstChar(func_name.ToCString()); | 2771 function_name_ = NewConstChar(func_name.ToCString()); |
2803 if (!cls.IsTopLevel()) { | 2772 if (!cls.IsTopLevel()) { |
2804 const String& class_name = String::Handle(cls.Name()); | 2773 const String& class_name = String::Handle(cls.Name()); |
2805 class_name_ = NewConstChar(class_name.ToCString()); | 2774 class_name_ = NewConstChar(class_name.ToCString()); |
2806 } | 2775 } |
2807 bool can_send_any_object = true; | 2776 bool can_send_any_object = true; |
2808 SerializeObject(message, | 2777 SerializeObject(message, &serialized_message_, &serialized_message_len_, |
2809 &serialized_message_, | |
2810 &serialized_message_len_, | |
2811 can_send_any_object); | 2778 can_send_any_object); |
2812 // Inherit flags from spawning isolate. | 2779 // Inherit flags from spawning isolate. |
2813 Isolate::Current()->FlagsCopyTo(isolate_flags()); | 2780 Isolate::Current()->FlagsCopyTo(isolate_flags()); |
2814 } | 2781 } |
2815 | 2782 |
2816 | 2783 |
2817 IsolateSpawnState::IsolateSpawnState(Dart_Port parent_port, | 2784 IsolateSpawnState::IsolateSpawnState(Dart_Port parent_port, |
2818 void* init_data, | 2785 void* init_data, |
2819 const char* script_url, | 2786 const char* script_url, |
2820 const char* package_root, | 2787 const char* package_root, |
(...skipping 22 matching lines...) Expand all Loading... |
2843 serialized_args_len_(0), | 2810 serialized_args_len_(0), |
2844 serialized_message_(NULL), | 2811 serialized_message_(NULL), |
2845 serialized_message_len_(0), | 2812 serialized_message_len_(0), |
2846 spawn_count_monitor_(spawn_count_monitor), | 2813 spawn_count_monitor_(spawn_count_monitor), |
2847 spawn_count_(spawn_count), | 2814 spawn_count_(spawn_count), |
2848 isolate_flags_(), | 2815 isolate_flags_(), |
2849 paused_(paused), | 2816 paused_(paused), |
2850 errors_are_fatal_(errors_are_fatal) { | 2817 errors_are_fatal_(errors_are_fatal) { |
2851 function_name_ = NewConstChar("main"); | 2818 function_name_ = NewConstChar("main"); |
2852 bool can_send_any_object = false; | 2819 bool can_send_any_object = false; |
2853 SerializeObject(args, | 2820 SerializeObject(args, &serialized_args_, &serialized_args_len_, |
2854 &serialized_args_, | |
2855 &serialized_args_len_, | |
2856 can_send_any_object); | 2821 can_send_any_object); |
2857 SerializeObject(message, | 2822 SerializeObject(message, &serialized_message_, &serialized_message_len_, |
2858 &serialized_message_, | |
2859 &serialized_message_len_, | |
2860 can_send_any_object); | 2823 can_send_any_object); |
2861 // By default inherit flags from spawning isolate. These can be overridden | 2824 // By default inherit flags from spawning isolate. These can be overridden |
2862 // from the calling code. | 2825 // from the calling code. |
2863 Isolate::Current()->FlagsCopyTo(isolate_flags()); | 2826 Isolate::Current()->FlagsCopyTo(isolate_flags()); |
2864 } | 2827 } |
2865 | 2828 |
2866 | 2829 |
2867 IsolateSpawnState::~IsolateSpawnState() { | 2830 IsolateSpawnState::~IsolateSpawnState() { |
2868 delete[] script_url_; | 2831 delete[] script_url_; |
2869 delete[] package_root_; | 2832 delete[] package_root_; |
2870 delete[] package_config_; | 2833 delete[] package_config_; |
2871 delete[] library_url_; | 2834 delete[] library_url_; |
2872 delete[] class_name_; | 2835 delete[] class_name_; |
2873 delete[] function_name_; | 2836 delete[] function_name_; |
2874 free(serialized_args_); | 2837 free(serialized_args_); |
2875 free(serialized_message_); | 2838 free(serialized_message_); |
2876 } | 2839 } |
2877 | 2840 |
2878 | 2841 |
2879 RawObject* IsolateSpawnState::ResolveFunction() { | 2842 RawObject* IsolateSpawnState::ResolveFunction() { |
2880 Thread* thread = Thread::Current(); | 2843 Thread* thread = Thread::Current(); |
2881 Zone* zone = thread->zone(); | 2844 Zone* zone = thread->zone(); |
2882 | 2845 |
2883 const String& func_name = String::Handle(zone, String::New(function_name())); | 2846 const String& func_name = String::Handle(zone, String::New(function_name())); |
2884 | 2847 |
2885 if (library_url() == NULL) { | 2848 if (library_url() == NULL) { |
2886 // Handle spawnUri lookup rules. | 2849 // Handle spawnUri lookup rules. |
2887 // Check whether the root library defines a main function. | 2850 // Check whether the root library defines a main function. |
2888 const Library& lib = Library::Handle(zone, | 2851 const Library& lib = |
2889 I->object_store()->root_library()); | 2852 Library::Handle(zone, I->object_store()->root_library()); |
2890 Function& func = Function::Handle(zone, lib.LookupLocalFunction(func_name)); | 2853 Function& func = Function::Handle(zone, lib.LookupLocalFunction(func_name)); |
2891 if (func.IsNull()) { | 2854 if (func.IsNull()) { |
2892 // Check whether main is reexported from the root library. | 2855 // Check whether main is reexported from the root library. |
2893 const Object& obj = Object::Handle(zone, lib.LookupReExport(func_name)); | 2856 const Object& obj = Object::Handle(zone, lib.LookupReExport(func_name)); |
2894 if (obj.IsFunction()) { | 2857 if (obj.IsFunction()) { |
2895 func ^= obj.raw(); | 2858 func ^= obj.raw(); |
2896 } | 2859 } |
2897 } | 2860 } |
2898 if (func.IsNull()) { | 2861 if (func.IsNull()) { |
2899 const String& msg = String::Handle(zone, String::NewFormatted( | 2862 const String& msg = String::Handle( |
2900 "Unable to resolve function '%s' in script '%s'.", | 2863 zone, String::NewFormatted( |
2901 function_name(), script_url())); | 2864 "Unable to resolve function '%s' in script '%s'.", |
| 2865 function_name(), script_url())); |
2902 return LanguageError::New(msg); | 2866 return LanguageError::New(msg); |
2903 } | 2867 } |
2904 return func.raw(); | 2868 return func.raw(); |
2905 } | 2869 } |
2906 | 2870 |
2907 // Lookup the to be spawned function for the Isolate.spawn implementation. | 2871 // Lookup the to be spawned function for the Isolate.spawn implementation. |
2908 // Resolve the library. | 2872 // Resolve the library. |
2909 const String& lib_url = String::Handle(zone, String::New(library_url())); | 2873 const String& lib_url = String::Handle(zone, String::New(library_url())); |
2910 const Library& lib = Library::Handle(zone, | 2874 const Library& lib = |
2911 Library::LookupLibrary(thread, lib_url)); | 2875 Library::Handle(zone, Library::LookupLibrary(thread, lib_url)); |
2912 if (lib.IsNull() || lib.IsError()) { | 2876 if (lib.IsNull() || lib.IsError()) { |
2913 const String& msg = String::Handle(zone, String::NewFormatted( | 2877 const String& msg = String::Handle( |
2914 "Unable to find library '%s'.", library_url())); | 2878 zone, |
| 2879 String::NewFormatted("Unable to find library '%s'.", library_url())); |
2915 return LanguageError::New(msg); | 2880 return LanguageError::New(msg); |
2916 } | 2881 } |
2917 | 2882 |
2918 // Resolve the function. | 2883 // Resolve the function. |
2919 if (class_name() == NULL) { | 2884 if (class_name() == NULL) { |
2920 const Function& func = Function::Handle(zone, | 2885 const Function& func = |
2921 lib.LookupLocalFunction(func_name)); | 2886 Function::Handle(zone, lib.LookupLocalFunction(func_name)); |
2922 if (func.IsNull()) { | 2887 if (func.IsNull()) { |
2923 const String& msg = String::Handle(zone, String::NewFormatted( | 2888 const String& msg = String::Handle( |
2924 "Unable to resolve function '%s' in library '%s'.", | 2889 zone, String::NewFormatted( |
2925 function_name(), library_url())); | 2890 "Unable to resolve function '%s' in library '%s'.", |
| 2891 function_name(), library_url())); |
2926 return LanguageError::New(msg); | 2892 return LanguageError::New(msg); |
2927 } | 2893 } |
2928 return func.raw(); | 2894 return func.raw(); |
2929 } | 2895 } |
2930 | 2896 |
2931 const String& cls_name = String::Handle(zone, String::New(class_name())); | 2897 const String& cls_name = String::Handle(zone, String::New(class_name())); |
2932 const Class& cls = Class::Handle(zone, lib.LookupLocalClass(cls_name)); | 2898 const Class& cls = Class::Handle(zone, lib.LookupLocalClass(cls_name)); |
2933 if (cls.IsNull()) { | 2899 if (cls.IsNull()) { |
2934 const String& msg = String::Handle(zone, String::NewFormatted( | 2900 const String& msg = String::Handle( |
2935 "Unable to resolve class '%s' in library '%s'.", | 2901 zone, String::NewFormatted( |
2936 class_name(), | 2902 "Unable to resolve class '%s' in library '%s'.", class_name(), |
2937 (library_url() != NULL ? library_url() : script_url()))); | 2903 (library_url() != NULL ? library_url() : script_url()))); |
2938 return LanguageError::New(msg); | 2904 return LanguageError::New(msg); |
2939 } | 2905 } |
2940 const Function& func = | 2906 const Function& func = |
2941 Function::Handle(zone, cls.LookupStaticFunctionAllowPrivate(func_name)); | 2907 Function::Handle(zone, cls.LookupStaticFunctionAllowPrivate(func_name)); |
2942 if (func.IsNull()) { | 2908 if (func.IsNull()) { |
2943 const String& msg = String::Handle(zone, String::NewFormatted( | 2909 const String& msg = String::Handle( |
2944 "Unable to resolve static method '%s.%s' in library '%s'.", | 2910 zone, String::NewFormatted( |
2945 class_name(), function_name(), | 2911 "Unable to resolve static method '%s.%s' in library '%s'.", |
2946 (library_url() != NULL ? library_url() : script_url()))); | 2912 class_name(), function_name(), |
| 2913 (library_url() != NULL ? library_url() : script_url()))); |
2947 return LanguageError::New(msg); | 2914 return LanguageError::New(msg); |
2948 } | 2915 } |
2949 return func.raw(); | 2916 return func.raw(); |
2950 } | 2917 } |
2951 | 2918 |
2952 | 2919 |
2953 RawInstance* IsolateSpawnState::BuildArgs(Thread* thread) { | 2920 RawInstance* IsolateSpawnState::BuildArgs(Thread* thread) { |
2954 return DeserializeObject(thread, serialized_args_, serialized_args_len_); | 2921 return DeserializeObject(thread, serialized_args_, serialized_args_len_); |
2955 } | 2922 } |
2956 | 2923 |
2957 | 2924 |
2958 RawInstance* IsolateSpawnState::BuildMessage(Thread* thread) { | 2925 RawInstance* IsolateSpawnState::BuildMessage(Thread* thread) { |
2959 return DeserializeObject(thread, | 2926 return DeserializeObject(thread, serialized_message_, |
2960 serialized_message_, serialized_message_len_); | 2927 serialized_message_len_); |
2961 } | 2928 } |
2962 | 2929 |
2963 | 2930 |
2964 void IsolateSpawnState::DecrementSpawnCount() { | 2931 void IsolateSpawnState::DecrementSpawnCount() { |
2965 ASSERT(spawn_count_monitor_ != NULL); | 2932 ASSERT(spawn_count_monitor_ != NULL); |
2966 ASSERT(spawn_count_ != NULL); | 2933 ASSERT(spawn_count_ != NULL); |
2967 MonitorLocker ml(spawn_count_monitor_); | 2934 MonitorLocker ml(spawn_count_monitor_); |
2968 ASSERT(*spawn_count_ > 0); | 2935 ASSERT(*spawn_count_ > 0); |
2969 *spawn_count_ = *spawn_count_ - 1; | 2936 *spawn_count_ = *spawn_count_ - 1; |
2970 ml.Notify(); | 2937 ml.Notify(); |
2971 } | 2938 } |
2972 | 2939 |
2973 } // namespace dart | 2940 } // namespace dart |
OLD | NEW |