| Index: runtime/vm/message.cc
 | 
| ===================================================================
 | 
| --- runtime/vm/message.cc	(revision 4816)
 | 
| +++ runtime/vm/message.cc	(working copy)
 | 
| @@ -54,21 +54,46 @@
 | 
|    }
 | 
|  
 | 
|    Message::Priority priority = message->priority();
 | 
| -  queue()->Enqueue(message);
 | 
| -  message = NULL;  // Do not access message.  May have been deleted.
 | 
| +  {
 | 
| +    MonitorLocker ml(&monitor_);
 | 
| +    queue_->Enqueue(message);
 | 
| +    monitor_.Notify();
 | 
| +    message = NULL;  // Do not access message.  May have been deleted.
 | 
| +  }
 | 
|  
 | 
|    // Invoke any custom message notification.
 | 
|    MessageNotify(priority);
 | 
|  }
 | 
|  
 | 
|  
 | 
| +Message* MessageHandler::DequeueNoWait() {
 | 
| +  MonitorLocker ml(&monitor_);
 | 
| +  return queue_->Dequeue();
 | 
| +}
 | 
| +
 | 
| +
 | 
| +Message* MessageHandler::Dequeue(int64_t millis) {
 | 
| +  ASSERT(millis >= 0);
 | 
| +  MonitorLocker ml(&monitor_);
 | 
| +  Message* result = queue_->Dequeue();
 | 
| +  if (result == NULL) {
 | 
| +    // No message available at any priority.
 | 
| +    monitor_.Wait(millis);
 | 
| +    result = queue_->Dequeue();
 | 
| +  }
 | 
| +  return result;
 | 
| +}
 | 
| +
 | 
| +
 | 
|  void MessageHandler::ClosePort(Dart_Port port) {
 | 
| -  queue()->Flush(port);
 | 
| +  MonitorLocker ml(&monitor_);
 | 
| +  queue_->Flush(port);
 | 
|  }
 | 
|  
 | 
|  
 | 
|  void MessageHandler::CloseAllPorts() {
 | 
| -  queue()->FlushAll();
 | 
| +  MonitorLocker ml(&monitor_);
 | 
| +  queue_->FlushAll();
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -91,7 +116,6 @@
 | 
|  
 | 
|  
 | 
|  void MessageQueue::Enqueue(Message* msg) {
 | 
| -  MonitorLocker ml(&monitor_);
 | 
|    Message::Priority p = msg->priority();
 | 
|    // Make sure messages are not reused.
 | 
|    ASSERT(msg->next_ == NULL);
 | 
| @@ -99,9 +123,6 @@
 | 
|      // Only element in the queue.
 | 
|      head_[p] = msg;
 | 
|      tail_[p] = msg;
 | 
| -
 | 
| -    // We only need to notify if the queue was empty.
 | 
| -    monitor_.Notify();
 | 
|    } else {
 | 
|      ASSERT(tail_[p] != NULL);
 | 
|      // Append at the tail.
 | 
| @@ -110,12 +131,8 @@
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -Message* MessageQueue::DequeueNoWait() {
 | 
| -  MonitorLocker ml(&monitor_);
 | 
| -  return DequeueNoWaitHoldsLock();
 | 
| -}
 | 
|  
 | 
| -Message* MessageQueue::DequeueNoWaitHoldsLock() {
 | 
| +Message* MessageQueue::Dequeue() {
 | 
|    // Look for the highest priority available message.
 | 
|    for (int p = Message::kNumPriorities-1; p >= Message::kFirstPriority; p--) {
 | 
|      Message* result = head_[p];
 | 
| @@ -135,21 +152,7 @@
 | 
|  }
 | 
|  
 | 
|  
 | 
| -Message* MessageQueue::Dequeue(int64_t millis) {
 | 
| -  ASSERT(millis >= 0);
 | 
| -  MonitorLocker ml(&monitor_);
 | 
| -  Message* result = DequeueNoWaitHoldsLock();
 | 
| -  if (result == NULL) {
 | 
| -    // No message available at any priority.
 | 
| -    monitor_.Wait(millis);
 | 
| -    result = DequeueNoWaitHoldsLock();
 | 
| -  }
 | 
| -  return result;
 | 
| -}
 | 
| -
 | 
| -
 | 
|  void MessageQueue::Flush(Dart_Port port) {
 | 
| -  MonitorLocker ml(&monitor_);
 | 
|    for (int p = Message::kFirstPriority; p < Message::kNumPriorities; p++) {
 | 
|      Message* cur = head_[p];
 | 
|      Message* prev = NULL;
 | 
| @@ -176,7 +179,6 @@
 | 
|  
 | 
|  
 | 
|  void MessageQueue::FlushAll() {
 | 
| -  MonitorLocker ml(&monitor_);
 | 
|    for (int p = Message::kFirstPriority; p < Message::kNumPriorities; p++) {
 | 
|      Message* cur = head_[p];
 | 
|      head_[p] = NULL;
 | 
| 
 |