| // Copyright 2016 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef MOJO_EDK_SYSTEM_PORTS_MESSAGE_QUEUE_H_ |
| #define MOJO_EDK_SYSTEM_PORTS_MESSAGE_QUEUE_H_ |
| |
| #include <stdint.h> |
| |
| #include <deque> |
| #include <functional> |
| #include <limits> |
| #include <vector> |
| |
| #include "base/macros.h" |
| #include "mojo/edk/system/ports/message.h" |
| |
| namespace mojo { |
| namespace edk { |
| namespace ports { |
| |
| const uint64_t kInitialSequenceNum = 1; |
| const uint64_t kInvalidSequenceNum = std::numeric_limits<uint64_t>::max(); |
| |
| class MessageFilter; |
| |
| // An incoming message queue for a port. MessageQueue keeps track of the highest |
| // known sequence number and can indicate whether the next sequential message is |
| // available. Thus the queue enforces message ordering for the consumer without |
| // enforcing it for the producer (see AcceptMessage() below.) |
| class MessageQueue { |
| public: |
| explicit MessageQueue(); |
| explicit MessageQueue(uint64_t next_sequence_num); |
| ~MessageQueue(); |
| |
| void set_signalable(bool value) { signalable_ = value; } |
| |
| uint64_t next_sequence_num() const { return next_sequence_num_; } |
| |
| bool HasNextMessage() const; |
| |
| // Gives ownership of the message. If |filter| is non-null, the next message |
| // will only be retrieved if the filter successfully matches it. |
| void GetNextMessage(ScopedMessage* message, MessageFilter* filter); |
| |
| // Takes ownership of the message. Note: Messages are ordered, so while we |
| // have added a message to the queue, we may still be waiting on a message |
| // ahead of this one before we can let any of the messages be returned by |
| // GetNextMessage. |
| // |
| // Furthermore, once has_next_message is set to true, it will remain false |
| // until GetNextMessage is called enough times to return a null message. |
| // In other words, has_next_message acts like an edge trigger. |
| // |
| void AcceptMessage(ScopedMessage message, bool* has_next_message); |
| |
| // Returns all of the ports referenced by messages in this message queue. |
| void GetReferencedPorts(std::deque<PortName>* ports); |
| |
| private: |
| std::vector<ScopedMessage> heap_; |
| uint64_t next_sequence_num_; |
| bool signalable_ = true; |
| |
| DISALLOW_COPY_AND_ASSIGN(MessageQueue); |
| }; |
| |
| } // namespace ports |
| } // namespace edk |
| } // namespace mojo |
| |
| #endif // MOJO_EDK_SYSTEM_PORTS_MESSAGE_QUEUE_H_ |