| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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_CHANNEL_ENDPOINT_H_ | 5 #ifndef MOJO_EDK_SYSTEM_CHANNEL_ENDPOINT_H_ |
| 6 #define MOJO_EDK_SYSTEM_CHANNEL_ENDPOINT_H_ | 6 #define MOJO_EDK_SYSTEM_CHANNEL_ENDPOINT_H_ |
| 7 | 7 |
| 8 #include <memory> |
| 9 |
| 8 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
| 9 #include "base/memory/scoped_ptr.h" | |
| 10 #include "mojo/edk/system/channel_endpoint_id.h" | 11 #include "mojo/edk/system/channel_endpoint_id.h" |
| 11 #include "mojo/edk/system/message_in_transit_queue.h" | 12 #include "mojo/edk/system/message_in_transit_queue.h" |
| 12 #include "mojo/edk/system/mutex.h" | 13 #include "mojo/edk/system/mutex.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 system { | 18 namespace system { |
| 18 | 19 |
| 19 class Channel; | 20 class Channel; |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 121 // |Channel| and immediately detach itself. | 122 // |Channel| and immediately detach itself. |
| 122 ChannelEndpoint(ChannelEndpointClient* client, | 123 ChannelEndpoint(ChannelEndpointClient* client, |
| 123 unsigned client_port, | 124 unsigned client_port, |
| 124 MessageInTransitQueue* message_queue = nullptr); | 125 MessageInTransitQueue* message_queue = nullptr); |
| 125 | 126 |
| 126 // Methods called by |ChannelEndpointClient|: | 127 // Methods called by |ChannelEndpointClient|: |
| 127 | 128 |
| 128 // Called to enqueue an outbound message. (If |AttachAndRun()| has not yet | 129 // Called to enqueue an outbound message. (If |AttachAndRun()| has not yet |
| 129 // been called, the message will be enqueued and sent when |AttachAndRun()| is | 130 // been called, the message will be enqueued and sent when |AttachAndRun()| is |
| 130 // called.) | 131 // called.) |
| 131 bool EnqueueMessage(scoped_ptr<MessageInTransit> message); | 132 bool EnqueueMessage(std::unique_ptr<MessageInTransit> message); |
| 132 | 133 |
| 133 // Called to *replace* current client with a new client (which must differ | 134 // Called to *replace* current client with a new client (which must differ |
| 134 // from the existing client). This must not be called after | 135 // from the existing client). This must not be called after |
| 135 // |DetachFromClient()| has been called. | 136 // |DetachFromClient()| has been called. |
| 136 // | 137 // |
| 137 // This returns true in the typical case, and false if this endpoint has been | 138 // This returns true in the typical case, and false if this endpoint has been |
| 138 // detached from the channel, in which case the caller should probably call | 139 // detached from the channel, in which case the caller should probably call |
| 139 // its (new) client's |OnDetachFromChannel()|. | 140 // its (new) client's |OnDetachFromChannel()|. |
| 140 bool ReplaceClient(ChannelEndpointClient* client, unsigned client_port); | 141 bool ReplaceClient(ChannelEndpointClient* client, unsigned client_port); |
| 141 | 142 |
| 142 // Called before the |ChannelEndpointClient| gives up its reference to this | 143 // Called before the |ChannelEndpointClient| gives up its reference to this |
| 143 // object. | 144 // object. |
| 144 void DetachFromClient(); | 145 void DetachFromClient(); |
| 145 | 146 |
| 146 // Methods called by |Channel|: | 147 // Methods called by |Channel|: |
| 147 | 148 |
| 148 // Called when the |Channel| takes a reference to this object. This will send | 149 // Called when the |Channel| takes a reference to this object. This will send |
| 149 // all queue messages (in |channel_message_queue_|). | 150 // all queue messages (in |channel_message_queue_|). |
| 150 // TODO(vtl): Maybe rename this "OnAttach"? | 151 // TODO(vtl): Maybe rename this "OnAttach"? |
| 151 void AttachAndRun(Channel* channel, | 152 void AttachAndRun(Channel* channel, |
| 152 ChannelEndpointId local_id, | 153 ChannelEndpointId local_id, |
| 153 ChannelEndpointId remote_id); | 154 ChannelEndpointId remote_id); |
| 154 | 155 |
| 155 // Called when the |Channel| receives a message for the |ChannelEndpoint|. | 156 // Called when the |Channel| receives a message for the |ChannelEndpoint|. |
| 156 void OnReadMessage(scoped_ptr<MessageInTransit> message); | 157 void OnReadMessage(std::unique_ptr<MessageInTransit> message); |
| 157 | 158 |
| 158 // Called before the |Channel| gives up its reference to this object. | 159 // Called before the |Channel| gives up its reference to this object. |
| 159 void DetachFromChannel(); | 160 void DetachFromChannel(); |
| 160 | 161 |
| 161 private: | 162 private: |
| 162 friend class base::RefCountedThreadSafe<ChannelEndpoint>; | 163 friend class base::RefCountedThreadSafe<ChannelEndpoint>; |
| 163 ~ChannelEndpoint(); | 164 ~ChannelEndpoint(); |
| 164 | 165 |
| 165 bool WriteMessageNoLock(scoped_ptr<MessageInTransit> message) | 166 bool WriteMessageNoLock(std::unique_ptr<MessageInTransit> message) |
| 166 MOJO_EXCLUSIVE_LOCKS_REQUIRED(mutex_); | 167 MOJO_EXCLUSIVE_LOCKS_REQUIRED(mutex_); |
| 167 | 168 |
| 168 // Helper for |OnReadMessage()|, handling messages for the client. | 169 // Helper for |OnReadMessage()|, handling messages for the client. |
| 169 void OnReadMessageForClient(scoped_ptr<MessageInTransit> message); | 170 void OnReadMessageForClient(std::unique_ptr<MessageInTransit> message); |
| 170 | 171 |
| 171 // Moves |state_| from |RUNNING| to |DEAD|. |channel_| must be non-null, but | 172 // Moves |state_| from |RUNNING| to |DEAD|. |channel_| must be non-null, but |
| 172 // this does not call |channel_->DetachEndpoint()|. | 173 // this does not call |channel_->DetachEndpoint()|. |
| 173 void DieNoLock() MOJO_EXCLUSIVE_LOCKS_REQUIRED(mutex_); | 174 void DieNoLock() MOJO_EXCLUSIVE_LOCKS_REQUIRED(mutex_); |
| 174 | 175 |
| 175 Mutex mutex_; | 176 Mutex mutex_; |
| 176 | 177 |
| 177 enum class State { | 178 enum class State { |
| 178 // |AttachAndRun()| has not been called yet (|channel_| is null). | 179 // |AttachAndRun()| has not been called yet (|channel_| is null). |
| 179 PAUSED, | 180 PAUSED, |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 214 // messages to the channel. | 215 // messages to the channel. |
| 215 MessageInTransitQueue channel_message_queue_ MOJO_GUARDED_BY(mutex_); | 216 MessageInTransitQueue channel_message_queue_ MOJO_GUARDED_BY(mutex_); |
| 216 | 217 |
| 217 MOJO_DISALLOW_COPY_AND_ASSIGN(ChannelEndpoint); | 218 MOJO_DISALLOW_COPY_AND_ASSIGN(ChannelEndpoint); |
| 218 }; | 219 }; |
| 219 | 220 |
| 220 } // namespace system | 221 } // namespace system |
| 221 } // namespace mojo | 222 } // namespace mojo |
| 222 | 223 |
| 223 #endif // MOJO_EDK_SYSTEM_CHANNEL_ENDPOINT_H_ | 224 #endif // MOJO_EDK_SYSTEM_CHANNEL_ENDPOINT_H_ |
| OLD | NEW |