Chromium Code Reviews| 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 #include "vm/thread_interrupter.h" | 10 #include "vm/thread_interrupter.h" |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 235 ASSERT(Isolate::Current() == NULL); | 235 ASSERT(Isolate::Current() == NULL); |
| 236 bool ok = true; | 236 bool ok = true; |
| 237 bool run_end_callback = false; | 237 bool run_end_callback = false; |
| 238 { | 238 { |
| 239 MonitorLocker ml(&monitor_); | 239 MonitorLocker ml(&monitor_); |
| 240 // Initialize the message handler by running its start function, | 240 // Initialize the message handler by running its start function, |
| 241 // if we have one. For an isolate, this will run the isolate's | 241 // if we have one. For an isolate, this will run the isolate's |
| 242 // main() function. | 242 // main() function. |
| 243 if (pause_on_start()) { | 243 if (pause_on_start()) { |
| 244 if (!paused_on_start_) { | 244 if (!paused_on_start_) { |
| 245 // Temporarily drop the lock when calling out to NotifyPauseOnStart. | |
| 246 // This avoids a dead lock that can occur when this message handler | |
| 247 // tries to post a message while a message is being posted to it. | |
| 248 monitor_.Exit(); | |
| 245 NotifyPauseOnStart(); | 249 NotifyPauseOnStart(); |
| 250 monitor_.Enter(); | |
| 246 paused_on_start_ = true; | 251 paused_on_start_ = true; |
| 247 } | 252 } |
| 248 HandleMessages(false, false); | 253 HandleMessages(false, false); |
| 249 if (pause_on_start()) { | 254 if (pause_on_start()) { |
| 250 // Still paused. | 255 // Still paused. |
| 251 task_ = NULL; // No task in queue. | 256 task_ = NULL; // No task in queue. |
| 252 return; | 257 return; |
| 253 } else { | 258 } else { |
| 254 paused_on_start_ = false; | 259 paused_on_start_ = false; |
| 255 } | 260 } |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 271 } | 276 } |
| 272 task_ = NULL; // No task in queue. | 277 task_ = NULL; // No task in queue. |
| 273 | 278 |
| 274 if (!ok || !HasLivePorts()) { | 279 if (!ok || !HasLivePorts()) { |
| 275 if (pause_on_exit()) { | 280 if (pause_on_exit()) { |
| 276 if (!paused_on_exit_) { | 281 if (!paused_on_exit_) { |
| 277 if (FLAG_trace_service_pause_events) { | 282 if (FLAG_trace_service_pause_events) { |
| 278 OS::PrintErr("Isolate %s paused before exiting. " | 283 OS::PrintErr("Isolate %s paused before exiting. " |
| 279 "Use the Observatory to release it.\n", name()); | 284 "Use the Observatory to release it.\n", name()); |
| 280 } | 285 } |
| 286 // Temporarily drop the lock when calling out to NotifyPauseOnExit. | |
| 287 // This avoids a dead lock that can occur when this message handler | |
| 288 // tries to post a message while a message is being posted to it. | |
| 289 monitor_.Exit(); | |
| 281 NotifyPauseOnExit(); | 290 NotifyPauseOnExit(); |
|
turnidge
2015/08/24 17:39:55
Handle this like run_end_callback as discussed off
| |
| 291 monitor_.Enter(); | |
| 282 paused_on_exit_ = true; | 292 paused_on_exit_ = true; |
| 283 } | 293 } |
| 284 } else { | 294 } else { |
| 285 if (FLAG_trace_isolates) { | 295 if (FLAG_trace_isolates) { |
| 286 OS::Print("[-] Stopping message handler (%s):\n" | 296 OS::Print("[-] Stopping message handler (%s):\n" |
| 287 "\thandler: %s\n", | 297 "\thandler: %s\n", |
| 288 (ok ? "no live ports" : "error"), | 298 (ok ? "no live ports" : "error"), |
| 289 name()); | 299 name()); |
| 290 } | 300 } |
| 291 pool_ = NULL; | 301 pool_ = NULL; |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 371 | 381 |
| 372 | 382 |
| 373 void MessageHandler::AcquireQueues(AcquiredQueues* acquired_queues) { | 383 void MessageHandler::AcquireQueues(AcquiredQueues* acquired_queues) { |
| 374 ASSERT(acquired_queues != NULL); | 384 ASSERT(acquired_queues != NULL); |
| 375 // No double dipping. | 385 // No double dipping. |
| 376 ASSERT(acquired_queues->handler_ == NULL); | 386 ASSERT(acquired_queues->handler_ == NULL); |
| 377 acquired_queues->Reset(this); | 387 acquired_queues->Reset(this); |
| 378 } | 388 } |
| 379 | 389 |
| 380 } // namespace dart | 390 } // namespace dart |
| OLD | NEW |