OLD | NEW |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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/message_handler.h" | 5 #include "vm/message_handler.h" |
6 | 6 |
7 #include "vm/dart.h" | 7 #include "vm/dart.h" |
8 #include "vm/lockers.h" | 8 #include "vm/lockers.h" |
9 #include "vm/port.h" | 9 #include "vm/port.h" |
10 | 10 |
(...skipping 20 matching lines...) Expand all Loading... |
31 }; | 31 }; |
32 | 32 |
33 | 33 |
34 MessageHandler::MessageHandler() | 34 MessageHandler::MessageHandler() |
35 : queue_(new MessageQueue()), | 35 : queue_(new MessageQueue()), |
36 oob_queue_(new MessageQueue()), | 36 oob_queue_(new MessageQueue()), |
37 live_ports_(0), | 37 live_ports_(0), |
38 paused_(0), | 38 paused_(0), |
39 pause_on_start_(false), | 39 pause_on_start_(false), |
40 pause_on_exit_(false), | 40 pause_on_exit_(false), |
| 41 paused_on_start_(false), |
41 paused_on_exit_(false), | 42 paused_on_exit_(false), |
42 pool_(NULL), | 43 pool_(NULL), |
43 task_(NULL), | 44 task_(NULL), |
44 start_callback_(NULL), | 45 start_callback_(NULL), |
45 end_callback_(NULL), | 46 end_callback_(NULL), |
46 callback_data_(0) { | 47 callback_data_(0) { |
47 ASSERT(queue_ != NULL); | 48 ASSERT(queue_ != NULL); |
48 ASSERT(oob_queue_ != NULL); | 49 ASSERT(oob_queue_ != NULL); |
49 } | 50 } |
50 | 51 |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
218 void MessageHandler::TaskCallback() { | 219 void MessageHandler::TaskCallback() { |
219 ASSERT(Isolate::Current() == NULL); | 220 ASSERT(Isolate::Current() == NULL); |
220 bool ok = true; | 221 bool ok = true; |
221 bool run_end_callback = false; | 222 bool run_end_callback = false; |
222 { | 223 { |
223 MonitorLocker ml(&monitor_); | 224 MonitorLocker ml(&monitor_); |
224 // Initialize the message handler by running its start function, | 225 // Initialize the message handler by running its start function, |
225 // if we have one. For an isolate, this will run the isolate's | 226 // if we have one. For an isolate, this will run the isolate's |
226 // main() function. | 227 // main() function. |
227 if (pause_on_start()) { | 228 if (pause_on_start()) { |
| 229 if (!paused_on_start_) { |
| 230 NotifyPauseOnStart(); |
| 231 paused_on_start_ = true; |
| 232 } |
228 HandleMessages(false, false); | 233 HandleMessages(false, false); |
229 if (pause_on_start()) { | 234 if (pause_on_start()) { |
230 // Still paused. | 235 // Still paused. |
231 task_ = NULL; // No task in queue. | 236 task_ = NULL; // No task in queue. |
232 return; | 237 return; |
| 238 } else { |
| 239 paused_on_start_ = false; |
233 } | 240 } |
234 } | 241 } |
235 | 242 |
236 if (start_callback_) { | 243 if (start_callback_) { |
237 // Release the monitor_ temporarily while we call the start callback. | 244 // Release the monitor_ temporarily while we call the start callback. |
238 // The monitor was acquired with the MonitorLocker above. | 245 // The monitor was acquired with the MonitorLocker above. |
239 monitor_.Exit(); | 246 monitor_.Exit(); |
240 ok = start_callback_(callback_data_); | 247 ok = start_callback_(callback_data_); |
241 ASSERT(Isolate::Current() == NULL); | 248 ASSERT(Isolate::Current() == NULL); |
242 start_callback_ = NULL; | 249 start_callback_ = NULL; |
243 monitor_.Enter(); | 250 monitor_.Enter(); |
244 } | 251 } |
245 | 252 |
246 // Handle any pending messages for this message handler. | 253 // Handle any pending messages for this message handler. |
247 if (ok) { | 254 if (ok) { |
248 ok = HandleMessages(true, true); | 255 ok = HandleMessages(true, true); |
249 } | 256 } |
250 task_ = NULL; // No task in queue. | 257 task_ = NULL; // No task in queue. |
251 | 258 |
252 if (!ok || !HasLivePorts()) { | 259 if (!ok || !HasLivePorts()) { |
253 if (pause_on_exit()) { | 260 if (pause_on_exit()) { |
254 if (FLAG_trace_service_pause_events && !paused_on_exit_) { | 261 if (!paused_on_exit_) { |
255 OS::PrintErr("Isolate %s paused before exiting. " | 262 if (FLAG_trace_service_pause_events) { |
| 263 OS::PrintErr("Isolate %s paused before exiting. " |
256 "Use the Observatory to release it.\n", name()); | 264 "Use the Observatory to release it.\n", name()); |
| 265 } |
| 266 NotifyPauseOnExit(); |
| 267 paused_on_exit_ = true; |
257 } | 268 } |
258 paused_on_exit_ = true; | |
259 } else { | 269 } else { |
260 if (FLAG_trace_isolates) { | 270 if (FLAG_trace_isolates) { |
261 OS::Print("[-] Stopping message handler (%s):\n" | 271 OS::Print("[-] Stopping message handler (%s):\n" |
262 "\thandler: %s\n", | 272 "\thandler: %s\n", |
263 (ok ? "no live ports" : "error"), | 273 (ok ? "no live ports" : "error"), |
264 name()); | 274 name()); |
265 } | 275 } |
266 pool_ = NULL; | 276 pool_ = NULL; |
267 run_end_callback = true; | 277 run_end_callback = true; |
268 paused_on_exit_ = false; | 278 paused_on_exit_ = false; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
311 | 321 |
312 void MessageHandler::decrement_live_ports() { | 322 void MessageHandler::decrement_live_ports() { |
313 MonitorLocker ml(&monitor_); | 323 MonitorLocker ml(&monitor_); |
314 #if defined(DEBUG) | 324 #if defined(DEBUG) |
315 CheckAccess(); | 325 CheckAccess(); |
316 #endif | 326 #endif |
317 live_ports_--; | 327 live_ports_--; |
318 } | 328 } |
319 | 329 |
320 } // namespace dart | 330 } // namespace dart |
OLD | NEW |