OLD | NEW |
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 #pragma once | 7 #pragma once |
8 | 8 |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
11 #include "base/memory/ref_counted.h" | 11 #include "base/memory/ref_counted.h" |
12 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
13 #include "base/message_loop_proxy.h" | |
14 #include "base/synchronization/lock.h" | 13 #include "base/synchronization/lock.h" |
15 #include "ipc/ipc_channel.h" | 14 #include "ipc/ipc_channel.h" |
16 #include "ipc/ipc_channel_handle.h" | 15 #include "ipc/ipc_channel_handle.h" |
17 #include "ipc/ipc_listener.h" | 16 #include "ipc/ipc_listener.h" |
18 #include "ipc/ipc_sender.h" | 17 #include "ipc/ipc_sender.h" |
19 | 18 |
| 19 namespace base { |
| 20 class SingleThreadTaskRunner; |
| 21 } |
| 22 |
20 namespace IPC { | 23 namespace IPC { |
21 | 24 |
22 class SendCallbackHelper; | 25 class SendCallbackHelper; |
23 | 26 |
24 //----------------------------------------------------------------------------- | 27 //----------------------------------------------------------------------------- |
25 // IPC::ChannelProxy | 28 // IPC::ChannelProxy |
26 // | 29 // |
27 // This class is a helper class that is useful when you wish to run an IPC | 30 // This class is a helper class that is useful when you wish to run an IPC |
28 // channel on a background thread. It provides you with the option of either | 31 // channel on a background thread. It provides you with the option of either |
29 // handling IPC messages on that background thread or having them dispatched to | 32 // handling IPC messages on that background thread or having them dispatched to |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 // original unchanged if no rewrite indicated. | 117 // original unchanged if no rewrite indicated. |
115 virtual Message *Rewrite(Message *message) = 0; | 118 virtual Message *Rewrite(Message *message) = 0; |
116 }; | 119 }; |
117 | 120 |
118 // Initializes a channel proxy. The channel_handle and mode parameters are | 121 // Initializes a channel proxy. The channel_handle and mode parameters are |
119 // passed directly to the underlying IPC::Channel. The listener is called on | 122 // passed directly to the underlying IPC::Channel. The listener is called on |
120 // the thread that creates the ChannelProxy. The filter's OnMessageReceived | 123 // the thread that creates the ChannelProxy. The filter's OnMessageReceived |
121 // method is called on the thread where the IPC::Channel is running. The | 124 // method is called on the thread where the IPC::Channel is running. The |
122 // filter may be null if the consumer is not interested in handling messages | 125 // filter may be null if the consumer is not interested in handling messages |
123 // on the background thread. Any message not handled by the filter will be | 126 // on the background thread. Any message not handled by the filter will be |
124 // dispatched to the listener. The given message loop indicates where the | 127 // dispatched to the listener. The given task runner correspond to a thread |
125 // IPC::Channel should be created. | 128 // on which IPC::Channel is created and used (e.g. IO thread). |
126 ChannelProxy(const IPC::ChannelHandle& channel_handle, | 129 ChannelProxy(const IPC::ChannelHandle& channel_handle, |
127 Channel::Mode mode, | 130 Channel::Mode mode, |
128 Listener* listener, | 131 Listener* listener, |
129 base::MessageLoopProxy* ipc_thread_loop); | 132 base::SingleThreadTaskRunner* ipc_task_runner); |
130 | 133 |
131 virtual ~ChannelProxy(); | 134 virtual ~ChannelProxy(); |
132 | 135 |
133 // Initializes the channel proxy. Only call this once to initialize a channel | 136 // Initializes the channel proxy. Only call this once to initialize a channel |
134 // proxy that was not initialized in its constructor. If create_pipe_now is | 137 // proxy that was not initialized in its constructor. If create_pipe_now is |
135 // true, the pipe is created synchronously. Otherwise it's created on the IO | 138 // true, the pipe is created synchronously. Otherwise it's created on the IO |
136 // thread. | 139 // thread. |
137 void Init(const IPC::ChannelHandle& channel_handle, Channel::Mode mode, | 140 void Init(const IPC::ChannelHandle& channel_handle, Channel::Mode mode, |
138 bool create_pipe_now); | 141 bool create_pipe_now); |
139 | 142 |
(...skipping 20 matching lines...) Expand all Loading... |
160 // guaranteed to not miss any messages. But if you call this anytime after, | 163 // guaranteed to not miss any messages. But if you call this anytime after, |
161 // then some messages might be missed since the filter is added internally on | 164 // then some messages might be missed since the filter is added internally on |
162 // the IO thread. | 165 // the IO thread. |
163 void AddFilter(MessageFilter* filter); | 166 void AddFilter(MessageFilter* filter); |
164 void RemoveFilter(MessageFilter* filter); | 167 void RemoveFilter(MessageFilter* filter); |
165 | 168 |
166 void set_outgoing_message_filter(OutgoingMessageFilter* filter) { | 169 void set_outgoing_message_filter(OutgoingMessageFilter* filter) { |
167 outgoing_message_filter_ = filter; | 170 outgoing_message_filter_ = filter; |
168 } | 171 } |
169 | 172 |
170 // Called to clear the pointer to the IPC message loop when it's going away. | 173 // Called to clear the pointer to the IPC task runner when it's going away. |
171 void ClearIPCMessageLoop(); | 174 void ClearIPCTaskRunner(); |
172 | 175 |
173 // Get the process ID for the connected peer. | 176 // Get the process ID for the connected peer. |
174 // Returns base::kNullProcessId if the peer is not connected yet. | 177 // Returns base::kNullProcessId if the peer is not connected yet. |
175 base::ProcessId peer_pid() const { return context_->peer_pid_; } | 178 base::ProcessId peer_pid() const { return context_->peer_pid_; } |
176 | 179 |
177 #if defined(OS_POSIX) && !defined(OS_NACL) | 180 #if defined(OS_POSIX) && !defined(OS_NACL) |
178 // Calls through to the underlying channel's methods. | 181 // Calls through to the underlying channel's methods. |
179 int GetClientFileDescriptor(); | 182 int GetClientFileDescriptor(); |
180 int TakeClientFileDescriptor(); | 183 int TakeClientFileDescriptor(); |
181 bool GetClientEuid(uid_t* client_euid) const; | 184 bool GetClientEuid(uid_t* client_euid) const; |
182 #endif // defined(OS_POSIX) | 185 #endif // defined(OS_POSIX) |
183 | 186 |
184 protected: | 187 protected: |
185 class Context; | 188 class Context; |
186 // A subclass uses this constructor if it needs to add more information | 189 // A subclass uses this constructor if it needs to add more information |
187 // to the internal state. | 190 // to the internal state. |
188 ChannelProxy(Context* context); | 191 ChannelProxy(Context* context); |
189 | 192 |
190 // Used internally to hold state that is referenced on the IPC thread. | 193 // Used internally to hold state that is referenced on the IPC thread. |
191 class Context : public base::RefCountedThreadSafe<Context>, | 194 class Context : public base::RefCountedThreadSafe<Context>, |
192 public Listener { | 195 public Listener { |
193 public: | 196 public: |
194 Context(Listener* listener, base::MessageLoopProxy* ipc_thread); | 197 Context(Listener* listener, base::SingleThreadTaskRunner* ipc_thread); |
195 void ClearIPCMessageLoop() { ipc_message_loop_ = NULL; } | 198 void ClearIPCTaskRunner(); |
196 base::MessageLoopProxy* ipc_message_loop() const { | 199 base::SingleThreadTaskRunner* ipc_task_runner() const { |
197 return ipc_message_loop_.get(); | 200 return ipc_task_runner_; |
198 } | 201 } |
199 const std::string& channel_id() const { return channel_id_; } | 202 const std::string& channel_id() const { return channel_id_; } |
200 | 203 |
201 // Dispatches a message on the listener thread. | 204 // Dispatches a message on the listener thread. |
202 void OnDispatchMessage(const Message& message); | 205 void OnDispatchMessage(const Message& message); |
203 | 206 |
204 protected: | 207 protected: |
205 friend class base::RefCountedThreadSafe<Context>; | 208 friend class base::RefCountedThreadSafe<Context>; |
206 virtual ~Context(); | 209 virtual ~Context(); |
207 | 210 |
(...skipping 29 matching lines...) Expand all Loading... |
237 // Methods called on the IO thread. | 240 // Methods called on the IO thread. |
238 void OnSendMessage(scoped_ptr<Message> message_ptr); | 241 void OnSendMessage(scoped_ptr<Message> message_ptr); |
239 void OnAddFilter(); | 242 void OnAddFilter(); |
240 void OnRemoveFilter(MessageFilter* filter); | 243 void OnRemoveFilter(MessageFilter* filter); |
241 | 244 |
242 // Methods called on the listener thread. | 245 // Methods called on the listener thread. |
243 void AddFilter(MessageFilter* filter); | 246 void AddFilter(MessageFilter* filter); |
244 void OnDispatchConnected(); | 247 void OnDispatchConnected(); |
245 void OnDispatchError(); | 248 void OnDispatchError(); |
246 | 249 |
247 scoped_refptr<base::MessageLoopProxy> listener_message_loop_; | 250 scoped_refptr<base::SingleThreadTaskRunner> listener_task_runner_; |
248 Listener* listener_; | 251 Listener* listener_; |
249 | 252 |
250 // List of filters. This is only accessed on the IPC thread. | 253 // List of filters. This is only accessed on the IPC thread. |
251 std::vector<scoped_refptr<MessageFilter> > filters_; | 254 std::vector<scoped_refptr<MessageFilter> > filters_; |
252 scoped_refptr<base::MessageLoopProxy> ipc_message_loop_; | 255 scoped_refptr<base::SingleThreadTaskRunner> ipc_task_runner_; |
253 scoped_ptr<Channel> channel_; | 256 scoped_ptr<Channel> channel_; |
254 std::string channel_id_; | 257 std::string channel_id_; |
255 bool channel_connected_called_; | 258 bool channel_connected_called_; |
256 | 259 |
257 // Holds filters between the AddFilter call on the listerner thread and the | 260 // Holds filters between the AddFilter call on the listerner thread and the |
258 // IPC thread when they're added to filters_. | 261 // IPC thread when they're added to filters_. |
259 std::vector<scoped_refptr<MessageFilter> > pending_filters_; | 262 std::vector<scoped_refptr<MessageFilter> > pending_filters_; |
260 // Lock for pending_filters_. | 263 // Lock for pending_filters_. |
261 base::Lock pending_filters_lock_; | 264 base::Lock pending_filters_lock_; |
262 | 265 |
(...skipping 18 matching lines...) Expand all Loading... |
281 | 284 |
282 OutgoingMessageFilter* outgoing_message_filter_; | 285 OutgoingMessageFilter* outgoing_message_filter_; |
283 | 286 |
284 // Whether the channel has been initialized. | 287 // Whether the channel has been initialized. |
285 bool did_init_; | 288 bool did_init_; |
286 }; | 289 }; |
287 | 290 |
288 } // namespace IPC | 291 } // namespace IPC |
289 | 292 |
290 #endif // IPC_IPC_CHANNEL_PROXY_H_ | 293 #endif // IPC_IPC_CHANNEL_PROXY_H_ |
OLD | NEW |