Index: mojo/system/message_pipe.h |
diff --git a/mojo/system/message_pipe.h b/mojo/system/message_pipe.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c02f29e65e2859a9f4bdbd59d11866aa7a53b794 |
--- /dev/null |
+++ b/mojo/system/message_pipe.h |
@@ -0,0 +1,79 @@ |
+// Copyright 2013 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_SYSTEM_MESSAGE_PIPE_H_ |
+#define MOJO_SYSTEM_MESSAGE_PIPE_H_ |
+ |
+#include <list> |
+#include <string> |
+ |
+#include "base/basictypes.h" |
+#include "base/memory/ref_counted.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/synchronization/lock.h" |
+#include "mojo/public/system/core.h" |
+#include "mojo/system/waiter_list.h" |
+ |
+namespace mojo { |
+namespace system { |
+ |
+class Waiter; |
+ |
+// |MessagePipe| is the secondary object implementing a message pipe (see the |
+// explanatory comment in core_impl.cc), and is jointly owned by the two |
+// dispatchers passed in to the constructor. This class is thread-safe. |
+class MessagePipe : public base::RefCountedThreadSafe<MessagePipe> { |
+ public: |
+ MessagePipe(); |
+ |
+ // These are called by the dispatcher to implement its methods of |
+ // corresponding names. In all cases, the port |port| must be open. |
+ void CancelAllWaiters(unsigned port); |
+ void Close(unsigned port); |
+ MojoResult WriteMessage(unsigned port, |
+ const void* bytes, uint32_t num_bytes, |
+ const MojoHandle* handles, uint32_t num_handles, |
+ MojoWriteMessageFlags flags); |
+ MojoResult ReadMessage(unsigned port, |
+ void* bytes, uint32_t* num_bytes, |
+ MojoHandle* handles, uint32_t* num_handles, |
+ MojoReadMessageFlags flags); |
+ MojoResult AddWaiter(unsigned port, |
+ Waiter* waiter, |
+ MojoWaitFlags flags, |
+ MojoResult wake_result); |
+ void RemoveWaiter(unsigned port, Waiter* waiter); |
+ |
+ private: |
+ struct MessageInTransit { |
+ MessageInTransit(const void* bytes, uint32_t num_bytes) |
+ : data(static_cast<const char*>(bytes), num_bytes) {} |
+ |
+ // TODO(vtl): Replace with something more efficient. |
+ std::string data; |
+ }; |
+ |
+ friend class base::RefCountedThreadSafe<MessagePipe>; |
+ virtual ~MessagePipe(); |
+ |
+ MojoWaitFlags SatisfiedFlagsNoLock(unsigned port); |
+ MojoWaitFlags SatisfiableFlagsNoLock(unsigned port); |
+ |
+ base::Lock lock_; // Protects the following members. |
+ bool is_open_[2]; |
+ // These are *incoming* queues for their corresponding ports. It owns its |
+ // contents. |
+ // TODO(vtl): When possible (with C++11), convert the plain pointers to |
+ // scoped_ptr/unique_ptr. (Then we'll be able to use an |std::queue| instead |
+ // of an |std::list|.) |
+ std::list<MessageInTransit*> message_queues_[2]; |
+ WaiterList waiter_lists_[2]; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(MessagePipe); |
+}; |
+ |
+} // namespace system |
+} // namespace mojo |
+ |
+#endif // MOJO_SYSTEM_MESSAGE_PIPE_H_ |