// 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 { DECLARE_FLAG(bool, trace_isolates); MessageQueue::MessageQueue() { head_ = NULL; tail_ = NULL; } MessageQueue::~MessageQueue() { // Ensure that all pending messages have been released. #if defined(DEBUG) ASSERT(head_ == NULL); #endif } 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::Flush(Dart_Port port) { Message* cur = head_; Message* prev = NULL; while (cur != NULL) { Message* next = cur->next_; // If the message matches, then remove it from the queue and delete it. if (cur->dest_port() == port) { if (prev != NULL) { prev->next_ = next; } else { head_ = next; } delete cur; } else { // Move prev forward. prev = cur; } // Advance to the next message in the queue. cur = next; } tail_ = prev; } void MessageQueue::FlushAll() { Message* cur = head_; head_ = NULL; tail_ = NULL; while (cur != NULL) { Message* next = cur->next_; delete cur; cur = next; } } } // namespace dart