• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
3 // found in the LICENSE file.
4 
5 #ifndef CONTENT_CHILD_CHILD_THREAD_H_
6 #define CONTENT_CHILD_CHILD_THREAD_H_
7 
8 #include <string>
9 
10 #include "base/basictypes.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "base/memory/shared_memory.h"
13 #include "base/memory/weak_ptr.h"
14 #include "base/power_monitor/power_monitor.h"
15 #include "base/tracked_objects.h"
16 #include "content/common/content_export.h"
17 #include "content/common/message_router.h"
18 #include "ipc/ipc_message.h"  // For IPC_MESSAGE_LOG_ENABLED.
19 #include "mojo/public/interfaces/service_provider/service_provider.mojom.h"
20 
21 namespace base {
22 class MessageLoop;
23 
24 namespace debug {
25 class TraceMemoryController;
26 }  // namespace debug
27 }  // namespace base
28 
29 namespace IPC {
30 class SyncChannel;
31 class SyncMessageFilter;
32 }  // namespace IPC
33 
34 namespace blink {
35 class WebFrame;
36 }  // namespace blink
37 
38 namespace webkit_glue {
39 class ResourceLoaderBridge;
40 }  // namespace webkit_glue
41 
42 namespace content {
43 class ChildHistogramMessageFilter;
44 class ChildResourceMessageFilter;
45 class ChildSharedBitmapManager;
46 class FileSystemDispatcher;
47 class MojoApplication;
48 class ServiceWorkerDispatcher;
49 class ServiceWorkerMessageFilter;
50 class QuotaDispatcher;
51 class QuotaMessageFilter;
52 class ResourceDispatcher;
53 class SocketStreamDispatcher;
54 class ThreadSafeSender;
55 class WebSocketDispatcher;
56 struct RequestInfo;
57 
58 // The main thread of a child process derives from this class.
59 class CONTENT_EXPORT ChildThread
60     : public IPC::Listener,
61       public IPC::Sender,
62       public NON_EXPORTED_BASE(mojo::ServiceProvider) {
63  public:
64   // Creates the thread.
65   ChildThread();
66   // Used for single-process mode and for in process gpu mode.
67   explicit ChildThread(const std::string& channel_name);
68   // ChildProcess::main_thread() is reset after Shutdown(), and before the
69   // destructor, so any subsystem that relies on ChildProcess::main_thread()
70   // must be terminated before Shutdown returns. In particular, if a subsystem
71   // has a thread that post tasks to ChildProcess::main_thread(), that thread
72   // should be joined in Shutdown().
73   virtual ~ChildThread();
74   virtual void Shutdown();
75 
76   // IPC::Sender implementation:
77   virtual bool Send(IPC::Message* msg) OVERRIDE;
78 
channel()79   IPC::SyncChannel* channel() { return channel_.get(); }
80 
81   MessageRouter* GetRouter();
82 
83   // Allocates a block of shared memory of the given size and
84   // maps in into the address space. Returns NULL of failure.
85   // Note: On posix, this requires a sync IPC to the browser process,
86   // but on windows the child process directly allocates the block.
87   base::SharedMemory* AllocateSharedMemory(size_t buf_size);
88 
89   // A static variant that can be called on background threads provided
90   // the |sender| passed in is safe to use on background threads.
91   static base::SharedMemory* AllocateSharedMemory(size_t buf_size,
92                                                   IPC::Sender* sender);
93 
shared_bitmap_manager()94   ChildSharedBitmapManager* shared_bitmap_manager() const {
95     return shared_bitmap_manager_.get();
96   }
97 
resource_dispatcher()98   ResourceDispatcher* resource_dispatcher() const {
99     return resource_dispatcher_.get();
100   }
101 
socket_stream_dispatcher()102   SocketStreamDispatcher* socket_stream_dispatcher() const {
103     return socket_stream_dispatcher_.get();
104   }
105 
websocket_dispatcher()106   WebSocketDispatcher* websocket_dispatcher() const {
107     return websocket_dispatcher_.get();
108   }
109 
file_system_dispatcher()110   FileSystemDispatcher* file_system_dispatcher() const {
111     return file_system_dispatcher_.get();
112   }
113 
service_worker_dispatcher()114   ServiceWorkerDispatcher* service_worker_dispatcher() const {
115     return service_worker_dispatcher_.get();
116   }
117 
quota_dispatcher()118   QuotaDispatcher* quota_dispatcher() const {
119     return quota_dispatcher_.get();
120   }
121 
sync_message_filter()122   IPC::SyncMessageFilter* sync_message_filter() const {
123     return sync_message_filter_.get();
124   }
125 
126   // The getter should only be called on the main thread, however the
127   // IPC::Sender it returns may be safely called on any thread including
128   // the main thread.
thread_safe_sender()129   ThreadSafeSender* thread_safe_sender() const {
130     return thread_safe_sender_.get();
131   }
132 
child_histogram_message_filter()133   ChildHistogramMessageFilter* child_histogram_message_filter() const {
134     return histogram_message_filter_.get();
135   }
136 
service_worker_message_filter()137   ServiceWorkerMessageFilter* service_worker_message_filter() const {
138     return service_worker_message_filter_.get();
139   }
140 
quota_message_filter()141   QuotaMessageFilter* quota_message_filter() const {
142     return quota_message_filter_.get();
143   }
144 
message_loop()145   base::MessageLoop* message_loop() const { return message_loop_; }
146 
147   // Returns the one child thread. Can only be called on the main thread.
148   static ChildThread* current();
149 
150 #if defined(OS_ANDROID)
151   // Called on Android's service thread to shutdown the main thread of this
152   // process.
153   static void ShutdownThread();
154 #endif
155 
156  protected:
157   friend class ChildProcess;
158 
159   // Called when the process refcount is 0.
160   void OnProcessFinalRelease();
161 
162   virtual bool OnControlMessageReceived(const IPC::Message& msg);
163 
set_on_channel_error_called(bool on_channel_error_called)164   void set_on_channel_error_called(bool on_channel_error_called) {
165     on_channel_error_called_ = on_channel_error_called;
166   }
167 
168   // IPC::Listener implementation:
169   virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE;
170   virtual void OnChannelConnected(int32 peer_pid) OVERRIDE;
171   virtual void OnChannelError() OVERRIDE;
172 
173   // mojo::ServiceProvider implementation:
174   virtual void ConnectToService(
175       const mojo::String& service_url,
176       const mojo::String& service_name,
177       mojo::ScopedMessagePipeHandle message_pipe,
178       const mojo::String& requestor_url) OVERRIDE;
179 
180  private:
181   class ChildThreadMessageRouter : public MessageRouter {
182    public:
183     // |sender| must outlive this object.
184     explicit ChildThreadMessageRouter(IPC::Sender* sender);
185     virtual bool Send(IPC::Message* msg) OVERRIDE;
186 
187    private:
188     IPC::Sender* const sender_;
189   };
190 
191   void Init();
192 
193   // IPC message handlers.
194   void OnShutdown();
195   void OnSetProfilerStatus(tracked_objects::ThreadData::Status status);
196   void OnGetChildProfilerData(int sequence_number);
197   void OnDumpHandles();
198   void OnProcessBackgrounded(bool background);
199 #ifdef IPC_MESSAGE_LOG_ENABLED
200   void OnSetIPCLoggingEnabled(bool enable);
201 #endif
202 #if defined(USE_TCMALLOC)
203   void OnGetTcmallocStats();
204 #endif
205 
206   void EnsureConnected();
207 
208   scoped_ptr<MojoApplication> mojo_application_;
209 
210   std::string channel_name_;
211   scoped_ptr<IPC::SyncChannel> channel_;
212 
213   // Allows threads other than the main thread to send sync messages.
214   scoped_refptr<IPC::SyncMessageFilter> sync_message_filter_;
215 
216   scoped_refptr<ThreadSafeSender> thread_safe_sender_;
217 
218   // Implements message routing functionality to the consumers of ChildThread.
219   ChildThreadMessageRouter router_;
220 
221   // Handles resource loads for this process.
222   scoped_ptr<ResourceDispatcher> resource_dispatcher_;
223 
224   // Handles SocketStream for this process.
225   scoped_ptr<SocketStreamDispatcher> socket_stream_dispatcher_;
226 
227   scoped_ptr<WebSocketDispatcher> websocket_dispatcher_;
228 
229   // The OnChannelError() callback was invoked - the channel is dead, don't
230   // attempt to communicate.
231   bool on_channel_error_called_;
232 
233   base::MessageLoop* message_loop_;
234 
235   scoped_ptr<FileSystemDispatcher> file_system_dispatcher_;
236 
237   scoped_ptr<ServiceWorkerDispatcher> service_worker_dispatcher_;
238 
239   scoped_ptr<QuotaDispatcher> quota_dispatcher_;
240 
241   scoped_refptr<ChildHistogramMessageFilter> histogram_message_filter_;
242 
243   scoped_refptr<ChildResourceMessageFilter> resource_message_filter_;
244 
245   scoped_refptr<ServiceWorkerMessageFilter> service_worker_message_filter_;
246 
247   scoped_refptr<QuotaMessageFilter> quota_message_filter_;
248 
249   scoped_ptr<ChildSharedBitmapManager> shared_bitmap_manager_;
250 
251   base::WeakPtrFactory<ChildThread> channel_connected_factory_;
252 
253   // Observes the trace event system. When tracing is enabled, optionally
254   // starts profiling the tcmalloc heap.
255   scoped_ptr<base::debug::TraceMemoryController> trace_memory_controller_;
256 
257   scoped_ptr<base::PowerMonitor> power_monitor_;
258 
259   bool in_browser_process_;
260 
261   DISALLOW_COPY_AND_ASSIGN(ChildThread);
262 };
263 
264 }  // namespace content
265 
266 #endif  // CONTENT_CHILD_CHILD_THREAD_H_
267