Index: mojo/edk/system/ports/message_queue.h |
diff --git a/mojo/edk/system/ports/message_queue.h b/mojo/edk/system/ports/message_queue.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f1e37fb6f2463bce60eb5d30b8f46d37ff2c4576 |
--- /dev/null |
+++ b/mojo/edk/system/ports/message_queue.h |
@@ -0,0 +1,70 @@ |
+// 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 <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 = 0xFFFFFFFF; |
+ |
+// 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. The selector may be null. |
+ void GetNextMessageIf(std::function<bool(const Message&)> selector, |
+ ScopedMessage* message); |
+ |
+ // 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_ |