Chromium Code Reviews| Index: runtime/vm/message_handler.cc |
| diff --git a/runtime/vm/message_handler.cc b/runtime/vm/message_handler.cc |
| index 68344cb35db67ad979f96ade6edb381ee91f2d2d..58018858076d468e1f29470d79abc0a4ed21a7b6 100644 |
| --- a/runtime/vm/message_handler.cc |
| +++ b/runtime/vm/message_handler.cc |
| @@ -34,6 +34,7 @@ class MessageHandlerTask : public ThreadPool::Task { |
| MessageHandler::MessageHandler() |
| : queue_(new MessageQueue()), |
| oob_queue_(new MessageQueue()), |
| + oob_message_handling_allowed_(true), |
| live_ports_(0), |
| paused_(0), |
| pause_on_start_(false), |
| @@ -208,6 +209,9 @@ bool MessageHandler::HandleNextMessage() { |
| bool MessageHandler::HandleOOBMessages() { |
| + if (!oob_message_handling_allowed_) { |
| + return true; |
| + } |
| MonitorLocker ml(&monitor_); |
| #if defined(DEBUG) |
| CheckAccess(); |
| @@ -333,4 +337,39 @@ void MessageHandler::decrement_live_ports() { |
| live_ports_--; |
| } |
| + |
| +MessageHandler::AcquiredQueues::AcquiredQueues() |
| + : handler_(NULL) { |
| +} |
| + |
| + |
| +MessageHandler::AcquiredQueues::~AcquiredQueues() { |
| + if (handler_ != NULL) { |
| + // Release ownership. |
| + handler_->oob_message_handling_allowed_ = true; |
| + handler_->monitor_.Exit(); |
| + } |
|
turnidge
2015/05/04 17:47:13
Move the bulk of this into Reset.
Cutch
2015/05/04 19:56:51
Done.
|
| + Reset(NULL); |
| +} |
| + |
| + |
| +void MessageHandler::AcquiredQueues::Reset(MessageHandler* handler) { |
| + handler_ = handler; |
| + if (handler_ == NULL) { |
| + return; |
| + } |
| + ASSERT(handler_ != NULL); |
| + // Take ownership. |
| + handler_->monitor_.Enter(); |
| + handler_->oob_message_handling_allowed_ = false; |
|
turnidge
2015/05/04 17:47:13
Does this need to be done under the monitor here?
Cutch
2015/05/04 19:56:51
Done.
|
| +} |
| + |
| + |
| +void MessageHandler::AcquireQueues(AcquiredQueues* acquired_queues) { |
| + ASSERT(acquired_queues != NULL); |
| + // No double dipping. |
| + ASSERT(acquired_queues->handler_ == NULL); |
| + acquired_queues->Reset(this); |
| +} |
| + |
| } // namespace dart |