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 16 matching lines...) Expand all Loading... |
27 private: | 27 private: |
28 MessageHandler* handler_; | 28 MessageHandler* handler_; |
29 | 29 |
30 DISALLOW_COPY_AND_ASSIGN(MessageHandlerTask); | 30 DISALLOW_COPY_AND_ASSIGN(MessageHandlerTask); |
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 oob_message_handling_allowed_(true), |
37 live_ports_(0), | 38 live_ports_(0), |
38 paused_(0), | 39 paused_(0), |
39 pause_on_start_(false), | 40 pause_on_start_(false), |
40 pause_on_exit_(false), | 41 pause_on_exit_(false), |
41 paused_on_start_(false), | 42 paused_on_start_(false), |
42 paused_on_exit_(false), | 43 paused_on_exit_(false), |
43 pool_(NULL), | 44 pool_(NULL), |
44 task_(NULL), | 45 task_(NULL), |
45 start_callback_(NULL), | 46 start_callback_(NULL), |
46 end_callback_(NULL), | 47 end_callback_(NULL), |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
201 MonitorLocker ml(&monitor_); | 202 MonitorLocker ml(&monitor_); |
202 ASSERT(pool_ == NULL); | 203 ASSERT(pool_ == NULL); |
203 #if defined(DEBUG) | 204 #if defined(DEBUG) |
204 CheckAccess(); | 205 CheckAccess(); |
205 #endif | 206 #endif |
206 return HandleMessages(true, false); | 207 return HandleMessages(true, false); |
207 } | 208 } |
208 | 209 |
209 | 210 |
210 bool MessageHandler::HandleOOBMessages() { | 211 bool MessageHandler::HandleOOBMessages() { |
| 212 if (!oob_message_handling_allowed_) { |
| 213 return true; |
| 214 } |
211 MonitorLocker ml(&monitor_); | 215 MonitorLocker ml(&monitor_); |
212 #if defined(DEBUG) | 216 #if defined(DEBUG) |
213 CheckAccess(); | 217 CheckAccess(); |
214 #endif | 218 #endif |
215 return HandleMessages(false, false); | 219 return HandleMessages(false, false); |
216 } | 220 } |
217 | 221 |
218 | 222 |
219 bool MessageHandler::HasOOBMessages() { | 223 bool MessageHandler::HasOOBMessages() { |
220 MonitorLocker ml(&monitor_); | 224 MonitorLocker ml(&monitor_); |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
326 | 330 |
327 | 331 |
328 void MessageHandler::decrement_live_ports() { | 332 void MessageHandler::decrement_live_ports() { |
329 MonitorLocker ml(&monitor_); | 333 MonitorLocker ml(&monitor_); |
330 #if defined(DEBUG) | 334 #if defined(DEBUG) |
331 CheckAccess(); | 335 CheckAccess(); |
332 #endif | 336 #endif |
333 live_ports_--; | 337 live_ports_--; |
334 } | 338 } |
335 | 339 |
| 340 |
| 341 MessageHandler::AcquiredQueues::AcquiredQueues() |
| 342 : handler_(NULL) { |
| 343 } |
| 344 |
| 345 |
| 346 MessageHandler::AcquiredQueues::~AcquiredQueues() { |
| 347 Reset(NULL); |
| 348 } |
| 349 |
| 350 |
| 351 void MessageHandler::AcquiredQueues::Reset(MessageHandler* handler) { |
| 352 if (handler_ != NULL) { |
| 353 // Release ownership. The OOB flag is set without holding the monitor. |
| 354 handler_->monitor_.Exit(); |
| 355 handler_->oob_message_handling_allowed_ = true; |
| 356 } |
| 357 handler_ = handler; |
| 358 if (handler_ == NULL) { |
| 359 return; |
| 360 } |
| 361 ASSERT(handler_ != NULL); |
| 362 // Take ownership. The OOB flag is set without holding the monitor. |
| 363 handler_->oob_message_handling_allowed_ = false; |
| 364 handler_->monitor_.Enter(); |
| 365 } |
| 366 |
| 367 |
| 368 void MessageHandler::AcquireQueues(AcquiredQueues* acquired_queues) { |
| 369 ASSERT(acquired_queues != NULL); |
| 370 // No double dipping. |
| 371 ASSERT(acquired_queues->handler_ == NULL); |
| 372 acquired_queues->Reset(this); |
| 373 } |
| 374 |
336 } // namespace dart | 375 } // namespace dart |
OLD | NEW |