| // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| #include "vm/message.h" |
| |
| namespace dart { |
| |
| MessageQueue::MessageQueue() { |
| head_ = NULL; |
| tail_ = NULL; |
| } |
| |
| |
| MessageQueue::~MessageQueue() { |
| // Ensure that all pending messages have been released. |
| Clear(); |
| ASSERT(head_ == NULL); |
| } |
| |
| |
| void MessageQueue::Enqueue(Message* msg) { |
| // Make sure messages are not reused. |
| ASSERT(msg->next_ == NULL); |
| if (head_ == NULL) { |
| // Only element in the queue. |
| ASSERT(tail_ == NULL); |
| head_ = msg; |
| tail_ = msg; |
| } else { |
| ASSERT(tail_ != NULL); |
| // Append at the tail. |
| tail_->next_ = msg; |
| tail_ = msg; |
| } |
| } |
| |
| |
| Message* MessageQueue::Dequeue() { |
| Message* result = head_; |
| if (result != NULL) { |
| head_ = result->next_; |
| // The following update to tail_ is not strictly needed. |
| if (head_ == NULL) { |
| tail_ = NULL; |
| } |
| #if defined(DEBUG) |
| result->next_ = result; // Make sure to trigger ASSERT in Enqueue. |
| #endif // DEBUG |
| return result; |
| } |
| return NULL; |
| } |
| |
| |
| void MessageQueue::Clear() { |
| Message* cur = head_; |
| head_ = NULL; |
| tail_ = NULL; |
| while (cur != NULL) { |
| Message* next = cur->next_; |
| delete cur; |
| cur = next; |
| } |
| } |
| |
| |
| } // namespace dart |