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