Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(36)

Side by Side Diff: mojo/edk/system/channel_endpoint.h

Issue 782693004: Update mojo sdk to rev f6c8ec07c01deebc13178d516225fd12695c3dc2 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: hack mojo_system_impl gypi for android :| Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "base/macros.h" 8 #include "base/macros.h"
9 #include "base/memory/ref_counted.h" 9 #include "base/memory/ref_counted.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 unsigned client_port, 123 unsigned client_port,
124 MessageInTransitQueue* message_queue = nullptr); 124 MessageInTransitQueue* message_queue = nullptr);
125 125
126 // Methods called by |ChannelEndpointClient|: 126 // Methods called by |ChannelEndpointClient|:
127 127
128 // Called to enqueue an outbound message. (If |AttachAndRun()| has not yet 128 // Called to enqueue an outbound message. (If |AttachAndRun()| has not yet
129 // been called, the message will be enqueued and sent when |AttachAndRun()| is 129 // been called, the message will be enqueued and sent when |AttachAndRun()| is
130 // called.) 130 // called.)
131 bool EnqueueMessage(scoped_ptr<MessageInTransit> message); 131 bool EnqueueMessage(scoped_ptr<MessageInTransit> message);
132 132
133 // Called to *replace* current client with a new client (which must differ
134 // from the existing client). This must not be called after
135 // |DetachFromClient()| has been called.
136 //
137 // 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 // its (new) client's |OnDetachFromChannel()|.
140 bool ReplaceClient(ChannelEndpointClient* client, unsigned client_port);
141
133 // Called before the |ChannelEndpointClient| gives up its reference to this 142 // Called before the |ChannelEndpointClient| gives up its reference to this
134 // object. 143 // object.
135 void DetachFromClient(); 144 void DetachFromClient();
136 145
137 // Methods called by |Channel|: 146 // Methods called by |Channel|:
138 147
139 // Called when the |Channel| takes a reference to this object. This will send 148 // Called when the |Channel| takes a reference to this object. This will send
140 // all queue messages (in |channel_message_queue_|). 149 // all queue messages (in |channel_message_queue_|).
141 // TODO(vtl): Maybe rename this "OnAttach"? 150 // TODO(vtl): Maybe rename this "OnAttach"?
142 void AttachAndRun(Channel* channel, 151 void AttachAndRun(Channel* channel,
143 ChannelEndpointId local_id, 152 ChannelEndpointId local_id,
144 ChannelEndpointId remote_id); 153 ChannelEndpointId remote_id);
145 154
146 // Called when the |Channel| receives a message for the |ChannelEndpoint|. 155 // Called when the |Channel| receives a message for the |ChannelEndpoint|.
147 void OnReadMessage(scoped_ptr<MessageInTransit> message); 156 void OnReadMessage(scoped_ptr<MessageInTransit> message);
148 157
149 // Called before the |Channel| gives up its reference to this object. 158 // Called before the |Channel| gives up its reference to this object.
150 void DetachFromChannel(); 159 void DetachFromChannel();
151 160
152 private: 161 private:
153 friend class base::RefCountedThreadSafe<ChannelEndpoint>; 162 friend class base::RefCountedThreadSafe<ChannelEndpoint>;
154 ~ChannelEndpoint(); 163 ~ChannelEndpoint();
155 164
156 // Must be called with |lock_| held. 165 // Must be called with |lock_| held.
157 bool WriteMessageNoLock(scoped_ptr<MessageInTransit> message); 166 bool WriteMessageNoLock(scoped_ptr<MessageInTransit> message);
158 167
168 // Resets |channel_| to null (and sets |is_detached_from_channel_|). This may
169 // only be called if |channel_| is non-null. Must be called with |lock_| held.
170 void ResetChannelNoLock();
171
159 // Protects the members below. 172 // Protects the members below.
160 base::Lock lock_; 173 base::Lock lock_;
161 174
162 // |client_| must be valid whenever it is non-null. Before |*client_| gives up 175 // |client_| must be valid whenever it is non-null. Before |*client_| gives up
163 // its reference to this object, it must call |DetachFromClient()|. 176 // its reference to this object, it must call |DetachFromClient()|.
164 // NOTE: This is a |scoped_refptr<>|, rather than a raw pointer, since the 177 // NOTE: This is a |scoped_refptr<>|, rather than a raw pointer, since the
165 // |Channel| needs to keep the |MessagePipe| alive for the "proxy-proxy" case. 178 // |Channel| needs to keep the |MessagePipe| alive for the "proxy-proxy" case.
166 // Possibly we'll be able to eliminate that case when we have full 179 // Possibly we'll be able to eliminate that case when we have full
167 // multiprocess support. 180 // multiprocess support.
168 // WARNING: |ChannelEndpointClient| methods must not be called under |lock_|. 181 // WARNING: |ChannelEndpointClient| methods must not be called under |lock_|.
169 // Thus to make such a call, a reference must first be taken under |lock_| and 182 // Thus to make such a call, a reference must first be taken under |lock_| and
170 // the lock released. 183 // the lock released.
184 // WARNING: Beware of interactions with |ReplaceClient()|. By the time the
185 // call is made, the client may have changed. This must be detected and dealt
186 // with.
171 scoped_refptr<ChannelEndpointClient> client_; 187 scoped_refptr<ChannelEndpointClient> client_;
172 unsigned client_port_; 188 unsigned client_port_;
173 189
174 // |channel_| must be valid whenever it is non-null. Before |*channel_| gives 190 // |channel_| must be valid whenever it is non-null. Before |*channel_| gives
175 // up its reference to this object, it must call |DetachFromChannel()|. 191 // up its reference to this object, it must call |DetachFromChannel()|.
176 // |local_id_| and |remote_id_| are valid if and only |channel_| is non-null. 192 // |local_id_| and |remote_id_| are valid if and only |channel_| is non-null.
177 Channel* channel_; 193 Channel* channel_;
178 ChannelEndpointId local_id_; 194 ChannelEndpointId local_id_;
179 ChannelEndpointId remote_id_; 195 ChannelEndpointId remote_id_;
196 // This distinguishes the two cases of |channel| being null: not yet attached
197 // versus detached.
198 bool is_detached_from_channel_;
180 199
181 // This queue is used before we're running on a channel and ready to send 200 // This queue is used before we're running on a channel and ready to send
182 // messages to the channel. 201 // messages to the channel.
183 MessageInTransitQueue channel_message_queue_; 202 MessageInTransitQueue channel_message_queue_;
184 203
185 DISALLOW_COPY_AND_ASSIGN(ChannelEndpoint); 204 DISALLOW_COPY_AND_ASSIGN(ChannelEndpoint);
186 }; 205 };
187 206
188 } // namespace system 207 } // namespace system
189 } // namespace mojo 208 } // namespace mojo
190 209
191 #endif // MOJO_EDK_SYSTEM_CHANNEL_ENDPOINT_H_ 210 #endif // MOJO_EDK_SYSTEM_CHANNEL_ENDPOINT_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698