Index: mojo/edk/system/data_pipe_producer_dispatcher.h |
diff --git a/third_party/mojo/src/mojo/edk/system/data_pipe_producer_dispatcher.h b/mojo/edk/system/data_pipe_producer_dispatcher.h |
similarity index 61% |
copy from third_party/mojo/src/mojo/edk/system/data_pipe_producer_dispatcher.h |
copy to mojo/edk/system/data_pipe_producer_dispatcher.h |
index 7ce51566001a4aad9d421dadee2d9f43bb0fe53e..f19085f0dc392ec9d43050b7e84bf4f845ced286 100644 |
--- a/third_party/mojo/src/mojo/edk/system/data_pipe_producer_dispatcher.h |
+++ b/mojo/edk/system/data_pipe_producer_dispatcher.h |
@@ -6,27 +6,28 @@ |
#define MOJO_EDK_SYSTEM_DATA_PIPE_PRODUCER_DISPATCHER_H_ |
#include "base/memory/ref_counted.h" |
+#include "mojo/edk/system/awakable_list.h" |
#include "mojo/edk/system/dispatcher.h" |
+#include "mojo/edk/system/raw_channel.h" |
#include "mojo/edk/system/system_impl_export.h" |
#include "mojo/public/cpp/system/macros.h" |
namespace mojo { |
-namespace system { |
- |
-class DataPipe; |
+namespace edk { |
// This is the |Dispatcher| implementation for the producer handle for data |
// pipes (created by the Mojo primitive |MojoCreateDataPipe()|). This class is |
// thread-safe. |
class MOJO_SYSTEM_IMPL_EXPORT DataPipeProducerDispatcher final |
- : public Dispatcher { |
+ : public Dispatcher, public RawChannel::Delegate { |
public: |
- static scoped_refptr<DataPipeProducerDispatcher> Create() { |
- return make_scoped_refptr(new DataPipeProducerDispatcher()); |
+ static scoped_refptr<DataPipeProducerDispatcher> Create( |
+ const MojoCreateDataPipeOptions& options) { |
+ return make_scoped_refptr(new DataPipeProducerDispatcher(options)); |
} |
// Must be called before any other methods. |
- void Init(scoped_refptr<DataPipe> data_pipe) MOJO_NOT_THREAD_SAFE; |
+ void Init(ScopedPlatformHandle message_pipe); |
// |Dispatcher| public methods: |
Type GetType() const override; |
@@ -34,15 +35,17 @@ class MOJO_SYSTEM_IMPL_EXPORT DataPipeProducerDispatcher final |
// The "opposite" of |SerializeAndClose()|. (Typically this is called by |
// |Dispatcher::Deserialize()|.) |
static scoped_refptr<DataPipeProducerDispatcher> |
- Deserialize(Channel* channel, const void* source, size_t size); |
- |
- // Get access to the |DataPipe| for testing. |
- DataPipe* GetDataPipeForTest(); |
+ Deserialize(const void* source, |
+ size_t size, |
+ PlatformHandleVector* platform_handles); |
private: |
- DataPipeProducerDispatcher(); |
+ DataPipeProducerDispatcher(const MojoCreateDataPipeOptions& options); |
~DataPipeProducerDispatcher() override; |
+ void InitOnIO(); |
+ void CloseOnIO(); |
+ |
// |Dispatcher| protected methods: |
void CancelAllAwakablesNoLock() override; |
void CloseImplNoLock() override; |
@@ -62,25 +65,47 @@ class MOJO_SYSTEM_IMPL_EXPORT DataPipeProducerDispatcher final |
HandleSignalsState* signals_state) override; |
void RemoveAwakableImplNoLock(Awakable* awakable, |
HandleSignalsState* signals_state) override; |
- void StartSerializeImplNoLock(Channel* channel, |
- size_t* max_size, |
- size_t* max_platform_handles) override |
- MOJO_NOT_THREAD_SAFE; |
+ void StartSerializeImplNoLock(size_t* max_size, |
+ size_t* max_platform_handles) override; |
bool EndSerializeAndCloseImplNoLock( |
- Channel* channel, |
void* destination, |
size_t* actual_size, |
- embedder::PlatformHandleVector* platform_handles) override |
- MOJO_NOT_THREAD_SAFE; |
+ PlatformHandleVector* platform_handles) override; |
+ void TransportStarted() override; |
+ void TransportEnded() override; |
bool IsBusyNoLock() const override; |
- // This will be null if closed. |
- scoped_refptr<DataPipe> data_pipe_ MOJO_GUARDED_BY(mutex()); |
+ // |RawChannel::Delegate methods: |
+ void OnReadMessage( |
+ const MessageInTransit::View& message_view, |
+ ScopedPlatformHandleVectorPtr platform_handles) override; |
+ void OnError(Error error) override; |
+ |
+ bool InTwoPhaseWrite() const; |
+ bool WriteDataIntoMessages(UserPointer<const void> elements, |
+ size_t num_bytes); |
+ |
+ MojoCreateDataPipeOptions options_; |
+ |
+ // Protected by |lock()|: |
+ RawChannel* channel_; // This will be null if closed. |
+ |
+ AwakableList awakable_list_; |
+ |
+ // if DispatcherTransport crated. must be set before lock() is called to avoid |
+ // deadlocks with RawChannel calling us. |
+ base::Lock started_transport_; |
+ |
+ bool error_; |
+ |
+ ScopedPlatformHandle serialized_platform_handle_; |
+ |
+ std::vector<char> two_phase_data_; |
MOJO_DISALLOW_COPY_AND_ASSIGN(DataPipeProducerDispatcher); |
}; |
-} // namespace system |
+} // namespace edk |
} // namespace mojo |
#endif // MOJO_EDK_SYSTEM_DATA_PIPE_PRODUCER_DISPATCHER_H_ |