| 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 <stddef.h> | 8 #include <stddef.h> |
| 9 #include <stdint.h> | 9 #include <stdint.h> |
| 10 | 10 |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 86 size_t size, | 86 size_t size, |
| 87 PlatformHandleVector* platform_handles); | 87 PlatformHandleVector* platform_handles); |
| 88 | 88 |
| 89 private: | 89 private: |
| 90 // See MOJO_CREATE_MESSAGE_PIPE_OPTIONS_FLAG_TRANSFERABLE's definition for an | 90 // See MOJO_CREATE_MESSAGE_PIPE_OPTIONS_FLAG_TRANSFERABLE's definition for an |
| 91 // explanation of what is a transferable pipe. | 91 // explanation of what is a transferable pipe. |
| 92 explicit MessagePipeDispatcher(bool transferable); | 92 explicit MessagePipeDispatcher(bool transferable); |
| 93 ~MessagePipeDispatcher() override; | 93 ~MessagePipeDispatcher() override; |
| 94 | 94 |
| 95 void InitOnIO(); | 95 void InitOnIO(); |
| 96 void CloseOnIOAndRelease(); |
| 96 void CloseOnIO(); | 97 void CloseOnIO(); |
| 97 | 98 |
| 98 // |Dispatcher| protected methods: | 99 // |Dispatcher| protected methods: |
| 99 void CancelAllAwakablesNoLock() override; | 100 void CancelAllAwakablesNoLock() override; |
| 100 void CloseImplNoLock() override; | 101 void CloseImplNoLock() override; |
| 101 scoped_refptr<Dispatcher> CreateEquivalentDispatcherAndCloseImplNoLock() | 102 scoped_refptr<Dispatcher> CreateEquivalentDispatcherAndCloseImplNoLock() |
| 102 override; | 103 override; |
| 103 MojoResult WriteMessageImplNoLock( | 104 MojoResult WriteMessageImplNoLock( |
| 104 const void* bytes, | 105 const void* bytes, |
| 105 uint32_t num_bytes, | 106 uint32_t num_bytes, |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 164 size_t serialized_message_fds_length_; | 165 size_t serialized_message_fds_length_; |
| 165 ScopedPlatformHandle serialized_platform_handle_; | 166 ScopedPlatformHandle serialized_platform_handle_; |
| 166 | 167 |
| 167 // The following members are only used when transferable_ is false; | 168 // The following members are only used when transferable_ is false; |
| 168 | 169 |
| 169 // The unique id shared by both ends of a non-transferable message pipe. This | 170 // The unique id shared by both ends of a non-transferable message pipe. This |
| 170 // is held on until a read or write are done, and at that point it's used to | 171 // is held on until a read or write are done, and at that point it's used to |
| 171 // get a RawChannel. | 172 // get a RawChannel. |
| 172 uint64_t pipe_id_; | 173 uint64_t pipe_id_; |
| 173 enum NonTransferableState { | 174 enum NonTransferableState { |
| 175 // The pipe_id hasn't been bound to this object yet until it's read, |
| 176 // written, or waited on. |
| 174 WAITING_FOR_READ_OR_WRITE, | 177 WAITING_FOR_READ_OR_WRITE, |
| 178 // This object was interacted with, so the pipe_id has been bound and we are |
| 179 // waiting for the broker to connect both sides. |
| 175 CONNECT_CALLED, | 180 CONNECT_CALLED, |
| 181 // We have a connection to the other end of the message pipe. |
| 176 CONNECTED, | 182 CONNECTED, |
| 183 // This object has been closed before it's connected. To ensure that the |
| 184 // other end receives a closed message from this end, we've initiated |
| 185 // connecting and will close after it succeeds. |
| 177 WAITING_FOR_CONNECT_TO_CLOSE, | 186 WAITING_FOR_CONNECT_TO_CLOSE, |
| 187 // The message pipe is closed. |
| 178 CLOSED, | 188 CLOSED, |
| 189 // The message pipe has been transferred. |
| 179 SERIALISED, | 190 SERIALISED, |
| 180 }; | 191 }; |
| 181 | 192 |
| 182 NonTransferableState non_transferable_state_; | 193 NonTransferableState non_transferable_state_; |
| 183 // Messages that were written while we were waiting to get a RawChannel. | 194 // Messages that were written while we were waiting to get a RawChannel. |
| 184 MessageInTransitQueue non_transferable_outgoing_message_queue_; | 195 MessageInTransitQueue non_transferable_outgoing_message_queue_; |
| 185 scoped_ptr<base::debug::StackTrace> non_transferable_bound_stack_; | 196 scoped_ptr<base::debug::StackTrace> non_transferable_bound_stack_; |
| 186 | 197 |
| 187 | 198 |
| 188 // The following members are used for both modes of transferable_. | 199 // The following members are used for both modes of transferable_. |
| 189 | 200 |
| 190 AwakableList awakable_list_; | 201 AwakableList awakable_list_; |
| 191 | 202 |
| 192 // If DispatcherTransport is created. Must be set before lock() is called to | 203 // If DispatcherTransport is created. Must be set before lock() is called to |
| 193 // avoid deadlocks with RawChannel calling us. | 204 // avoid deadlocks with RawChannel calling us. |
| 194 base::Lock started_transport_; | 205 base::Lock started_transport_; |
| 195 | 206 |
| 196 bool serialized_; | 207 bool serialized_; |
| 197 bool calling_init_; | 208 bool calling_init_; |
| 198 bool write_error_; | 209 bool write_error_; |
| 199 // Whether it can be sent after read or write. | 210 // Whether it can be sent after read or write. |
| 200 bool transferable_; | 211 bool transferable_; |
| 212 // When this object is closed, it has to wait to flush any pending messages |
| 213 // from the other side to ensure that any in-queue message pipes are closed. |
| 214 // If this is true, we have already sent the other side the request. |
| 215 bool close_requested_; |
| 201 | 216 |
| 202 MOJO_DISALLOW_COPY_AND_ASSIGN(MessagePipeDispatcher); | 217 MOJO_DISALLOW_COPY_AND_ASSIGN(MessagePipeDispatcher); |
| 203 }; | 218 }; |
| 204 | 219 |
| 205 } // namespace edk | 220 } // namespace edk |
| 206 } // namespace mojo | 221 } // namespace mojo |
| 207 | 222 |
| 208 #endif // MOJO_EDK_SYSTEM_MESSAGE_PIPE_DISPATCHER_H_ | 223 #endif // MOJO_EDK_SYSTEM_MESSAGE_PIPE_DISPATCHER_H_ |
| OLD | NEW |