Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef MOJO_EDK_SYSTEM_MESSAGE_PIPE_DISPATCHER_H_ | 5 #ifndef MOJO_EDK_SYSTEM_MESSAGE_PIPE_DISPATCHER_H_ |
| 6 #define MOJO_EDK_SYSTEM_MESSAGE_PIPE_DISPATCHER_H_ | 6 #define MOJO_EDK_SYSTEM_MESSAGE_PIPE_DISPATCHER_H_ |
| 7 | 7 |
| 8 #include "base/memory/ref_counted.h" | 8 #include "base/memory/ref_counted.h" |
| 9 #include "mojo/edk/embedder/platform_channel_pair.h" | 9 #include "mojo/edk/embedder/platform_channel_pair.h" |
| 10 #include "mojo/edk/system/awakable_list.h" | 10 #include "mojo/edk/system/awakable_list.h" |
| 11 #include "mojo/edk/system/dispatcher.h" | 11 #include "mojo/edk/system/dispatcher.h" |
| 12 #include "mojo/edk/system/message_in_transit_queue.h" | |
| 12 #include "mojo/edk/system/raw_channel.h" | 13 #include "mojo/edk/system/raw_channel.h" |
| 13 #include "mojo/edk/system/system_impl_export.h" | 14 #include "mojo/edk/system/system_impl_export.h" |
| 14 #include "mojo/public/cpp/system/macros.h" | 15 #include "mojo/public/cpp/system/macros.h" |
| 15 | 16 |
| 16 namespace mojo { | 17 namespace mojo { |
| 17 namespace edk { | 18 namespace edk { |
| 18 | 19 |
| 19 // This is the |Dispatcher| implementation for message pipes (created by the | 20 // This is the |Dispatcher| implementation for message pipes (created by the |
| 20 // Mojo primitive |MojoCreateMessagePipe()|). This class is thread-safe. | 21 // Mojo primitive |MojoCreateMessagePipe()|). This class is thread-safe. |
| 21 class MOJO_SYSTEM_IMPL_EXPORT MessagePipeDispatcher final | 22 class MOJO_SYSTEM_IMPL_EXPORT MessagePipeDispatcher final |
| 22 : public Dispatcher, public RawChannel::Delegate { | 23 : public Dispatcher, public RawChannel::Delegate { |
| 23 public: | 24 public: |
| 24 // The default options to use for |MojoCreateMessagePipe()|. (Real uses | 25 // The default options to use for |MojoCreateMessagePipe()|. (Real uses |
| 25 // should obtain this via |ValidateCreateOptions()| with a null |in_options|; | 26 // should obtain this via |ValidateCreateOptions()| with a null |in_options|; |
| 26 // this is exposed directly for testing convenience.) | 27 // this is exposed directly for testing convenience.) |
| 27 static const MojoCreateMessagePipeOptions kDefaultCreateOptions; | 28 static const MojoCreateMessagePipeOptions kDefaultCreateOptions; |
| 28 | 29 |
| 29 static scoped_refptr<MessagePipeDispatcher> Create( | 30 static scoped_refptr<MessagePipeDispatcher> Create( |
| 30 const MojoCreateMessagePipeOptions& /*validated_options*/) { | 31 const MojoCreateMessagePipeOptions& validated_options) { |
| 31 return make_scoped_refptr(new MessagePipeDispatcher()); | 32 return make_scoped_refptr(new MessagePipeDispatcher( |
| 33 validated_options.flags & | |
|
Tom Sepez
2015/12/04 17:59:43
nit: maybe !!(validated_options.flags & MOJO_CREAT
jam
2015/12/05 00:09:34
Done.
| |
| 34 MOJO_CREATE_MESSAGE_PIPE_OPTIONS_FLAG_TRANSFERABLE)); | |
| 32 } | 35 } |
| 33 | 36 |
| 34 // Validates and/or sets default options for |MojoCreateMessagePipeOptions|. | 37 // Validates and/or sets default options for |MojoCreateMessagePipeOptions|. |
| 35 // If non-null, |in_options| must point to a struct of at least | 38 // If non-null, |in_options| must point to a struct of at least |
| 36 // |in_options->struct_size| bytes. |out_options| must point to a (current) | 39 // |in_options->struct_size| bytes. |out_options| must point to a (current) |
| 37 // |MojoCreateMessagePipeOptions| and will be entirely overwritten on success | 40 // |MojoCreateMessagePipeOptions| and will be entirely overwritten on success |
| 38 // (it may be partly overwritten on failure). | 41 // (it may be partly overwritten on failure). |
| 39 static MojoResult ValidateCreateOptions( | 42 static MojoResult ValidateCreateOptions( |
| 40 const MojoCreateMessagePipeOptions* in_options, | 43 const MojoCreateMessagePipeOptions* in_options, |
| 41 MojoCreateMessagePipeOptions* out_options); | 44 MojoCreateMessagePipeOptions* out_options); |
| 42 | 45 |
| 46 // Initializes a transferable message pipe. | |
| 43 // Must be called before any other methods. (This method is not thread-safe.) | 47 // Must be called before any other methods. (This method is not thread-safe.) |
| 44 void Init( | 48 void Init( |
| 45 ScopedPlatformHandle message_pipe, | 49 ScopedPlatformHandle message_pipe, |
| 46 char* serialized_read_buffer, size_t serialized_read_buffer_size, | 50 char* serialized_read_buffer, size_t serialized_read_buffer_size, |
| 47 char* serialized_write_buffer, size_t serialized_write_buffer_size, | 51 char* serialized_write_buffer, size_t serialized_write_buffer_size, |
| 48 std::vector<int>* serialized_read_fds, | 52 std::vector<int>* serialized_read_fds, |
| 49 std::vector<int>* serialized_write_fds); | 53 std::vector<int>* serialized_write_fds); |
| 50 | 54 |
| 55 // Initializes a nontransferable message pipe. | |
| 56 void InitNonTransferable(uint64_t pipe_id); | |
| 57 | |
| 51 // |Dispatcher| public methods: | 58 // |Dispatcher| public methods: |
| 52 Type GetType() const override; | 59 Type GetType() const override; |
| 53 | 60 |
| 61 // RawChannel::Delegate methods: | |
| 62 void OnReadMessage( | |
| 63 const MessageInTransit::View& message_view, | |
| 64 ScopedPlatformHandleVectorPtr platform_handles) override; | |
| 65 void OnError(Error error) override; | |
| 66 | |
| 67 // Called by broker when a route is established between this | |
| 68 // MessagePipeDispatcher and another one. This object will receive messages | |
| 69 // sent to its pipe_id. It should tag all outgoing messages by calling | |
| 70 // MessageInTransit::set_route_id with pipe_id_. | |
| 71 void GotNonTransferableChannel(RawChannel* channel); | |
| 72 | |
| 54 // The "opposite" of |SerializeAndClose()|. (Typically this is called by | 73 // The "opposite" of |SerializeAndClose()|. (Typically this is called by |
| 55 // |Dispatcher::Deserialize()|.) | 74 // |Dispatcher::Deserialize()|.) |
| 56 static scoped_refptr<MessagePipeDispatcher> Deserialize( | 75 static scoped_refptr<MessagePipeDispatcher> Deserialize( |
| 57 const void* source, | 76 const void* source, |
| 58 size_t size, | 77 size_t size, |
| 59 PlatformHandleVector* platform_handles); | 78 PlatformHandleVector* platform_handles); |
| 60 | 79 |
| 61 private: | 80 private: |
| 62 MessagePipeDispatcher(); | 81 // See MOJO_CREATE_MESSAGE_PIPE_OPTIONS_FLAG_TRANSFERABLE's definition for an |
| 82 // explanation of what is a transferable pipe. | |
| 83 explicit MessagePipeDispatcher(bool transferable); | |
| 63 ~MessagePipeDispatcher() override; | 84 ~MessagePipeDispatcher() override; |
| 64 | 85 |
| 65 void InitOnIO(); | 86 void InitOnIO(); |
| 66 void CloseOnIO(); | 87 void CloseOnIO(); |
| 67 | 88 |
| 68 // |Dispatcher| protected methods: | 89 // |Dispatcher| protected methods: |
| 69 void CancelAllAwakablesNoLock() override; | 90 void CancelAllAwakablesNoLock() override; |
| 70 void CloseImplNoLock() override; | 91 void CloseImplNoLock() override; |
| 71 scoped_refptr<Dispatcher> CreateEquivalentDispatcherAndCloseImplNoLock() | 92 scoped_refptr<Dispatcher> CreateEquivalentDispatcherAndCloseImplNoLock() |
| 72 override; | 93 override; |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 89 HandleSignalsState* signals_state) override; | 110 HandleSignalsState* signals_state) override; |
| 90 void StartSerializeImplNoLock(size_t* max_size, | 111 void StartSerializeImplNoLock(size_t* max_size, |
| 91 size_t* max_platform_handles) override; | 112 size_t* max_platform_handles) override; |
| 92 bool EndSerializeAndCloseImplNoLock( | 113 bool EndSerializeAndCloseImplNoLock( |
| 93 void* destination, | 114 void* destination, |
| 94 size_t* actual_size, | 115 size_t* actual_size, |
| 95 PlatformHandleVector* platform_handles) override; | 116 PlatformHandleVector* platform_handles) override; |
| 96 void TransportStarted() override; | 117 void TransportStarted() override; |
| 97 void TransportEnded() override; | 118 void TransportEnded() override; |
| 98 | 119 |
| 99 // |RawChannel::Delegate methods: | |
| 100 void OnReadMessage( | |
| 101 const MessageInTransit::View& message_view, | |
| 102 ScopedPlatformHandleVectorPtr platform_handles) override; | |
| 103 void OnError(Error error) override; | |
| 104 | |
| 105 // Calls ReleaseHandle and serializes the raw channel. This is split into a | 120 // Calls ReleaseHandle and serializes the raw channel. This is split into a |
| 106 // function because it's called in two different ways: | 121 // function because it's called in two different ways: |
| 107 // 1) When serializing "live" dispatchers that are passed to MojoWriteMessage, | 122 // 1) When serializing "live" dispatchers that are passed to MojoWriteMessage, |
| 108 // CreateEquivalentDispatcherAndCloseImplNoLock calls this. | 123 // CreateEquivalentDispatcherAndCloseImplNoLock calls this. |
| 109 // 2) When serializing dispatchers that are attached to deserialized messages | 124 // 2) When serializing dispatchers that are attached to deserialized messages |
| 110 // which haven't been consumed by MojoReadMessage, StartSerializeImplNoLock | 125 // which haven't been consumed by MojoReadMessage, StartSerializeImplNoLock |
| 111 // calls this. | 126 // calls this. |
| 112 void SerializeInternal(); | 127 void SerializeInternal(); |
| 113 | 128 |
| 114 MojoResult AttachTransportsNoLock( | 129 MojoResult AttachTransportsNoLock( |
| 115 MessageInTransit* message, | 130 MessageInTransit* message, |
| 116 std::vector<DispatcherTransport>* transports); | 131 std::vector<DispatcherTransport>* transports); |
| 117 | 132 |
| 133 // Called whenever a read or write is done on a non-transferable pipe, which | |
| 134 // "binds" the pipe id to this object. | |
| 135 void RequestNontransferableChannel(); | |
| 136 | |
| 118 // Protected by |lock()|: | 137 // Protected by |lock()|: |
| 119 RawChannel* channel_; | 138 RawChannel* channel_; |
| 120 | 139 |
| 121 // Queue of incoming messages that we read from RawChannel but haven't been | 140 // Queue of incoming messages that we read from RawChannel but haven't been |
| 122 // consumed through MojoReadMessage yet. | 141 // consumed through MojoReadMessage yet. |
| 123 MessageInTransitQueue message_queue_; | 142 MessageInTransitQueue message_queue_; |
| 143 | |
| 144 // The following members are only used when transferable_ is false; | |
| 145 | |
| 124 // When sending MP, contains serialized message_queue_. | 146 // When sending MP, contains serialized message_queue_. |
| 125 bool serialized_; | |
| 126 std::vector<char> serialized_message_queue_; | 147 std::vector<char> serialized_message_queue_; |
| 127 std::vector<char> serialized_read_buffer_; | 148 std::vector<char> serialized_read_buffer_; |
| 128 std::vector<char> serialized_write_buffer_; | 149 std::vector<char> serialized_write_buffer_; |
| 129 // Contains FDs from (in this order): the read buffer, the write buffer, and | 150 // Contains FDs from (in this order): the read buffer, the write buffer, and |
| 130 // message queue. | 151 // message queue. |
| 131 std::vector<int> serialized_fds_; | 152 std::vector<int> serialized_fds_; |
| 132 size_t serialized_read_fds_length_; | 153 size_t serialized_read_fds_length_; |
| 133 size_t serialized_write_fds_length_; | 154 size_t serialized_write_fds_length_; |
| 134 size_t serialized_message_fds_length_; | 155 size_t serialized_message_fds_length_; |
| 135 ScopedPlatformHandle serialized_platform_handle_; | 156 ScopedPlatformHandle serialized_platform_handle_; |
| 157 | |
| 158 // The following members are only used when transferable_ is true; | |
| 159 | |
| 160 // The unique id shared by both ends of a non-transferable message pipe. This | |
| 161 // is held on until a read or write are done, and at that point it's used to | |
| 162 // get a RawChannel. | |
| 163 uint64_t pipe_id_; | |
| 164 enum NonTransferableState { | |
| 165 WAITING_FOR_READ_OR_WRITE, | |
| 166 CONNECT_CALLED, | |
| 167 CONNECTED, | |
| 168 CLOSED, | |
| 169 }; | |
| 170 | |
| 171 NonTransferableState non_transferable_state_; | |
| 172 // Messages that were written while we were waiting to get a RawChannel. | |
| 173 MessageInTransitQueue non_transferable_outgoing_message_queue_; | |
| 174 | |
| 175 | |
| 176 // The following members are used for both modes of transferable_. | |
| 177 | |
| 136 AwakableList awakable_list_; | 178 AwakableList awakable_list_; |
| 137 | 179 |
| 138 // If DispatcherTransport is created. Must be set before lock() is called to | 180 // If DispatcherTransport is created. Must be set before lock() is called to |
| 139 // avoid deadlocks with RawChannel calling us. | 181 // avoid deadlocks with RawChannel calling us. |
| 140 base::Lock started_transport_; | 182 base::Lock started_transport_; |
| 141 | 183 |
| 184 bool serialized_; | |
| 142 bool calling_init_; | 185 bool calling_init_; |
| 143 bool write_error_; | 186 bool write_error_; |
| 187 // Whether it can be sent after read or write. | |
| 188 bool transferable_; | |
| 144 | 189 |
| 145 MOJO_DISALLOW_COPY_AND_ASSIGN(MessagePipeDispatcher); | 190 MOJO_DISALLOW_COPY_AND_ASSIGN(MessagePipeDispatcher); |
| 146 }; | 191 }; |
| 147 | 192 |
| 148 } // namespace edk | 193 } // namespace edk |
| 149 } // namespace mojo | 194 } // namespace mojo |
| 150 | 195 |
| 151 #endif // MOJO_EDK_SYSTEM_MESSAGE_PIPE_DISPATCHER_H_ | 196 #endif // MOJO_EDK_SYSTEM_MESSAGE_PIPE_DISPATCHER_H_ |
| OLD | NEW |