Upstream version 8.37.180.0
[platform/framework/web/crosswalk.git] / src / content / child / child_thread.h
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
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
94   ChildSharedBitmapManager* shared_bitmap_manager() const {
95     return shared_bitmap_manager_.get();
96   }
97
98   ResourceDispatcher* resource_dispatcher() const {
99     return resource_dispatcher_.get();
100   }
101
102   SocketStreamDispatcher* socket_stream_dispatcher() const {
103     return socket_stream_dispatcher_.get();
104   }
105
106   WebSocketDispatcher* websocket_dispatcher() const {
107     return websocket_dispatcher_.get();
108   }
109
110   FileSystemDispatcher* file_system_dispatcher() const {
111     return file_system_dispatcher_.get();
112   }
113
114   ServiceWorkerDispatcher* service_worker_dispatcher() const {
115     return service_worker_dispatcher_.get();
116   }
117
118   QuotaDispatcher* quota_dispatcher() const {
119     return quota_dispatcher_.get();
120   }
121
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.
129   ThreadSafeSender* thread_safe_sender() const {
130     return thread_safe_sender_.get();
131   }
132
133   ChildHistogramMessageFilter* child_histogram_message_filter() const {
134     return histogram_message_filter_.get();
135   }
136
137   ServiceWorkerMessageFilter* service_worker_message_filter() const {
138     return service_worker_message_filter_.get();
139   }
140
141   QuotaMessageFilter* quota_message_filter() const {
142     return quota_message_filter_.get();
143   }
144
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
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_