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

Side by Side Diff: ipc/ipc_channel_proxy.h

Issue 2147493006: Adds Channel-associated interface support on ChannelProxy's thread (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: . Created 4 years, 5 months 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
« no previous file with comments | « ipc/ipc_channel_mojo_unittest.cc ('k') | ipc/ipc_channel_proxy.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 IPC_IPC_CHANNEL_PROXY_H_ 5 #ifndef IPC_IPC_CHANNEL_PROXY_H_
6 #define IPC_IPC_CHANNEL_PROXY_H_ 6 #define IPC_IPC_CHANNEL_PROXY_H_
7 7
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <map>
10 #include <memory> 11 #include <memory>
12 #include <string>
11 #include <vector> 13 #include <vector>
12 14
15 #include "base/callback.h"
13 #include "base/memory/ref_counted.h" 16 #include "base/memory/ref_counted.h"
14 #include "base/synchronization/lock.h" 17 #include "base/synchronization/lock.h"
15 #include "base/threading/non_thread_safe.h" 18 #include "base/threading/non_thread_safe.h"
16 #include "build/build_config.h" 19 #include "build/build_config.h"
17 #include "ipc/ipc_channel.h" 20 #include "ipc/ipc_channel.h"
18 #include "ipc/ipc_channel_handle.h" 21 #include "ipc/ipc_channel_handle.h"
19 #include "ipc/ipc_endpoint.h" 22 #include "ipc/ipc_endpoint.h"
20 #include "ipc/ipc_listener.h" 23 #include "ipc/ipc_listener.h"
21 #include "ipc/ipc_sender.h" 24 #include "ipc/ipc_sender.h"
25 #include "mojo/public/cpp/bindings/associated_group.h"
26 #include "mojo/public/cpp/bindings/associated_interface_request.h"
27 #include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
22 28
23 namespace base { 29 namespace base {
24 class SingleThreadTaskRunner; 30 class SingleThreadTaskRunner;
25 } 31 }
26 32
27 namespace IPC { 33 namespace IPC {
28 34
29 class ChannelFactory; 35 class ChannelFactory;
30 class MessageFilter; 36 class MessageFilter;
31 class MessageFilterRouter; 37 class MessageFilterRouter;
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
132 // Ordinarily, messages sent to the ChannelProxy are routed to the matching 138 // Ordinarily, messages sent to the ChannelProxy are routed to the matching
133 // listener on the worker thread. This API allows code to intercept messages 139 // listener on the worker thread. This API allows code to intercept messages
134 // before they are sent to the worker thread. 140 // before they are sent to the worker thread.
135 // If you call this before the target process is launched, then you're 141 // If you call this before the target process is launched, then you're
136 // guaranteed to not miss any messages. But if you call this anytime after, 142 // guaranteed to not miss any messages. But if you call this anytime after,
137 // then some messages might be missed since the filter is added internally on 143 // then some messages might be missed since the filter is added internally on
138 // the IO thread. 144 // the IO thread.
139 void AddFilter(MessageFilter* filter); 145 void AddFilter(MessageFilter* filter);
140 void RemoveFilter(MessageFilter* filter); 146 void RemoveFilter(MessageFilter* filter);
141 147
148 using GenericAssociatedInterfaceFactory =
149 base::Callback<void(mojo::ScopedInterfaceEndpointHandle)>;
150
151 // Adds a generic associated interface factory to bind incoming interface
152 // requests directly on the IO thread. MUST be called before Init().
153 void AddGenericAssociatedInterfaceForIOThread(
154 const std::string& name,
155 const GenericAssociatedInterfaceFactory& factory);
156
157 // Adds a generic associated interface factory to bind incoming interface
158 // requests on the ChannelProxy's thread. MUST be called before Init().
159 void AddGenericAssociatedInterface(
160 const std::string& name,
161 const GenericAssociatedInterfaceFactory& factory);
162
163 template <typename Interface>
164 using AssociatedInterfaceFactory =
165 base::Callback<void(mojo::AssociatedInterfaceRequest<Interface>)>;
166
167 // Helper to bind an IO-thread associated interface factory, inferring the
168 // interface name from the callback argument's type. MUST be called before
169 // Init().
170 template <typename Interface>
171 void AddAssociatedInterfaceForIOThread(
172 const AssociatedInterfaceFactory<Interface>& factory) {
173 AddGenericAssociatedInterfaceForIOThread(
174 Interface::Name_,
175 base::Bind(&ChannelProxy::BindAssociatedInterfaceRequest<Interface>,
176 factory));
177 }
178
179 // Helper to bind a ChannelProxy-thread associated interface factory,
180 // inferring the interface name from the callback argument's type. MUST be
181 // called before Init().
182 template <typename Interface>
183 void AddAssociatedInterface(
184 const AssociatedInterfaceFactory<Interface>& factory) {
185 AddGenericAssociatedInterface(
186 Interface::Name_,
187 base::Bind(&ChannelProxy::BindAssociatedInterfaceRequest<Interface>,
188 factory));
189 }
190
191 // Gets the AssociatedGroup used to create new associated endpoints on this
192 // ChannelProxy. This must only be called after the listener's
193 // OnChannelConnected is called.
194 mojo::AssociatedGroup* GetAssociatedGroup();
195
196 // Requests an associated interface from the remote endpoint.
197 void GetGenericRemoteAssociatedInterface(
198 const std::string& name,
199 mojo::ScopedInterfaceEndpointHandle handle);
200
201 // Template helper to request associated interfaces from the remote endpoint.
202 // Must only be called after the listener's OnChannelConnected is called.
203 template <typename Interface>
204 void GetRemoteAssociatedInterface(
205 mojo::AssociatedInterfacePtr<Interface>* proxy) {
206 mojo::AssociatedInterfaceRequest<Interface> request =
207 mojo::GetProxy(proxy, GetAssociatedGroup());
208 GetGenericRemoteAssociatedInterface(Interface::Name_, request.PassHandle());
209 }
210
142 #if defined(ENABLE_IPC_FUZZER) 211 #if defined(ENABLE_IPC_FUZZER)
143 void set_outgoing_message_filter(OutgoingMessageFilter* filter) { 212 void set_outgoing_message_filter(OutgoingMessageFilter* filter) {
144 outgoing_message_filter_ = filter; 213 outgoing_message_filter_ = filter;
145 } 214 }
146 #endif 215 #endif
147 216
148 // Called to clear the pointer to the IPC task runner when it's going away. 217 // Called to clear the pointer to the IPC task runner when it's going away.
149 void ClearIPCTaskRunner(); 218 void ClearIPCTaskRunner();
150 219
151 // Endpoint overrides. 220 // Endpoint overrides.
(...skipping 27 matching lines...) Expand all
179 248
180 // Dispatches a message on the listener thread. 249 // Dispatches a message on the listener thread.
181 void OnDispatchMessage(const Message& message); 250 void OnDispatchMessage(const Message& message);
182 251
183 // Sends |message| from appropriate thread. 252 // Sends |message| from appropriate thread.
184 void Send(Message* message); 253 void Send(Message* message);
185 254
186 // Indicates if the underlying channel's Send is thread-safe. 255 // Indicates if the underlying channel's Send is thread-safe.
187 bool IsChannelSendThreadSafe() const; 256 bool IsChannelSendThreadSafe() const;
188 257
258 // Requests a remote associated interface on the IPC thread.
259 void GetRemoteAssociatedInterface(
260 const std::string& name,
261 mojo::ScopedInterfaceEndpointHandle handle);
262
189 protected: 263 protected:
190 friend class base::RefCountedThreadSafe<Context>; 264 friend class base::RefCountedThreadSafe<Context>;
191 ~Context() override; 265 ~Context() override;
192 266
193 // IPC::Listener methods: 267 // IPC::Listener methods:
194 bool OnMessageReceived(const Message& message) override; 268 bool OnMessageReceived(const Message& message) override;
195 void OnChannelConnected(int32_t peer_pid) override; 269 void OnChannelConnected(int32_t peer_pid) override;
196 void OnChannelError() override; 270 void OnChannelError() override;
197 271
198 // Like OnMessageReceived but doesn't try the filters. 272 // Like OnMessageReceived but doesn't try the filters.
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
270 // Lock for pending_filters_. 344 // Lock for pending_filters_.
271 base::Lock pending_filters_lock_; 345 base::Lock pending_filters_lock_;
272 346
273 // Cached copy of the peer process ID. Set on IPC but read on both IPC and 347 // Cached copy of the peer process ID. Set on IPC but read on both IPC and
274 // listener threads. 348 // listener threads.
275 base::ProcessId peer_pid_; 349 base::ProcessId peer_pid_;
276 350
277 // Whether this channel is used as an endpoint for sending and receiving 351 // Whether this channel is used as an endpoint for sending and receiving
278 // brokerable attachment messages to/from the broker process. 352 // brokerable attachment messages to/from the broker process.
279 bool attachment_broker_endpoint_; 353 bool attachment_broker_endpoint_;
354
355 // Modified only on the listener's thread before Init() is called.
356 std::map<std::string, GenericAssociatedInterfaceFactory>
357 io_thread_interfaces_;
358 std::map<std::string, GenericAssociatedInterfaceFactory>
359 proxy_thread_interfaces_;
360
361 // Valid and constant any time after the ChannelProxy's Listener receives
362 // OnChannelConnected on its own thread.
363 std::unique_ptr<mojo::AssociatedGroup> channel_associated_group_;
280 }; 364 };
281 365
282 Context* context() { return context_.get(); } 366 Context* context() { return context_.get(); }
283 367
284 #if defined(ENABLE_IPC_FUZZER) 368 #if defined(ENABLE_IPC_FUZZER)
285 OutgoingMessageFilter* outgoing_message_filter() const { 369 OutgoingMessageFilter* outgoing_message_filter() const {
286 return outgoing_message_filter_; 370 return outgoing_message_filter_;
287 } 371 }
288 #endif 372 #endif
289 373
290 protected: 374 protected:
291 bool did_init() const { return did_init_; } 375 bool did_init() const { return did_init_; }
292 376
293 private: 377 private:
294 friend class IpcSecurityTestUtil; 378 friend class IpcSecurityTestUtil;
295 379
380 template <typename Interface>
381 static void BindAssociatedInterfaceRequest(
382 const AssociatedInterfaceFactory<Interface>& factory,
383 mojo::ScopedInterfaceEndpointHandle handle) {
384 mojo::AssociatedInterfaceRequest<Interface> request;
385 request.Bind(std::move(handle));
386 factory.Run(std::move(request));
387 }
388
296 // Always called once immediately after Init. 389 // Always called once immediately after Init.
297 virtual void OnChannelInit(); 390 virtual void OnChannelInit();
298 391
299 // By maintaining this indirection (ref-counted) to our internal state, we 392 // By maintaining this indirection (ref-counted) to our internal state, we
300 // can safely be destroyed while the background thread continues to do stuff 393 // can safely be destroyed while the background thread continues to do stuff
301 // that involves this data. 394 // that involves this data.
302 scoped_refptr<Context> context_; 395 scoped_refptr<Context> context_;
303 396
304 // Whether the channel has been initialized. 397 // Whether the channel has been initialized.
305 bool did_init_; 398 bool did_init_;
306 399
307 #if defined(ENABLE_IPC_FUZZER) 400 #if defined(ENABLE_IPC_FUZZER)
308 OutgoingMessageFilter* outgoing_message_filter_; 401 OutgoingMessageFilter* outgoing_message_filter_;
309 #endif 402 #endif
310 }; 403 };
311 404
312 } // namespace IPC 405 } // namespace IPC
313 406
314 #endif // IPC_IPC_CHANNEL_PROXY_H_ 407 #endif // IPC_IPC_CHANNEL_PROXY_H_
OLDNEW
« no previous file with comments | « ipc/ipc_channel_mojo_unittest.cc ('k') | ipc/ipc_channel_proxy.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698