Index: mojo/system/data_pipe.h |
diff --git a/mojo/system/data_pipe.h b/mojo/system/data_pipe.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..44dc592ad0575f92b055da9f8beb8b8d06ee4db6 |
--- /dev/null |
+++ b/mojo/system/data_pipe.h |
@@ -0,0 +1,100 @@ |
+// 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_DATA_PIPE_H_ |
+#define MOJO_SYSTEM_DATA_PIPE_H_ |
+ |
+#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/system_impl_export.h" |
+ |
+namespace mojo { |
+namespace system { |
+ |
+class Waiter; |
+class WaiterList; |
+ |
+// |DataPipe| is a base class for secondary objects implementing data pipes, |
+// similar to |MessagePipe| (see the explanatory comment in core_impl.cc). It is |
+// typically owned by the dispatcher(s) corresponding to the local endpoints. |
+// Its subclasses implement the three cases: local producer and consumer, local |
+// producer and remote consumer, and remote producer and local consumer. This |
+// class is thread-safe. |
+class MOJO_SYSTEM_IMPL_EXPORT DataPipe : |
+ public base::RefCountedThreadSafe<DataPipe> { |
+ public: |
+ // These are called by the producer dispatcher to implement its methods of |
+ // corresponding names. |
+ void ProducerCancelAllWaiters(); |
+ void ProducerClose(); |
+ // This does not validate |elements| or |num_elements| (or |*num_elements|). |
+ MojoResult ProducerWriteData(const void* elements, |
+ uint32_t* num_elements, |
+ MojoWriteDataFlags flags); |
+ // This does not validate |buffer| or |buffer_num_elements|. |
+ MojoResult ProducerBeginWriteData(void** buffer, |
+ uint32_t* buffer_num_elements, |
+ MojoWriteDataFlags flags); |
+ MojoResult ProducerEndWriteData(uint32_t num_elements_written); |
+ MojoResult ProducerAddWaiter(Waiter* waiter, |
+ MojoWaitFlags flags, |
+ MojoResult wake_result); |
+ void ProducerRemoveWaiter(Waiter* waiter); |
+ |
+/* TODO(vtl) |
+ void ConsumerCancelAllWaiters(); |
+ void ConsumerClose(); |
+... |
+ MojoResult ConsumerAddWaiter(Waiter* waiter, |
+ MojoWaitFlags flags, |
+ MojoResult wake_result); |
+ void ConsumerRemoveWaiter(Waiter* waiter); |
+*/ |
+ |
+ // Thread-safe and fast (doesn't take the lock). |
+ size_t element_size() const { return element_size_; } |
+ |
+ protected: |
+ DataPipe(bool has_local_producer, bool has_local_consumer); |
+ |
+ void Init(size_t element_size); |
+ |
+ virtual void ProducerCloseImplNoLock() = 0; |
+ virtual MojoResult ProducerBeginWriteDataImplNoLock( |
+ void** buffer, |
+ uint32_t* buffer_num_elements, |
+ MojoWriteDataFlags flags) = 0; |
+ virtual MojoResult ProducerEndWriteDataImplNoLock( |
+ uint32_t num_elements_written) = 0; |
+ virtual MojoWaitFlags ProducerSatisfiedFlagsNoLock() = 0; |
+ virtual MojoWaitFlags ProducerSatisfiableFlagsNoLock() = 0; |
+ |
+ private: |
+ friend class base::RefCountedThreadSafe<DataPipe>; |
+ virtual ~DataPipe(); |
+ |
+ bool has_local_producer_no_lock() const { |
+ return !!producer_waiter_list_.get(); |
+ } |
+ bool has_local_consumer_no_lock() const { |
+ return !!consumer_waiter_list_.get(); |
+ } |
+ |
+ // Set by |Init()| and never changed afterwards. |
+ size_t element_size_; |
+ |
+ base::Lock lock_; // Protects the following members. |
+ scoped_ptr<WaiterList> producer_waiter_list_; |
+ scoped_ptr<WaiterList> consumer_waiter_list_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(DataPipe); |
+}; |
+ |
+} // namespace system |
+} // namespace mojo |
+ |
+#endif // MOJO_SYSTEM_DATA_PIPE_H_ |