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_COMMON_CHILD_PROCESS_HOST_IMPL_H_ 6 #define CONTENT_COMMON_CHILD_PROCESS_HOST_IMPL_H_ 7 8 #include <string> 9 #include <vector> 10 11 #include "build/build_config.h" 12 13 #include "base/basictypes.h" 14 #include "base/memory/scoped_ptr.h" 15 #include "base/memory/shared_memory.h" 16 #include "base/memory/singleton.h" 17 #include "base/strings/string16.h" 18 #include "content/public/common/child_process_host.h" 19 #include "ipc/ipc_listener.h" 20 21 namespace base { 22 class FilePath; 23 } 24 25 namespace gfx { 26 struct GpuMemoryBufferHandle; 27 } 28 29 namespace content { 30 class ChildProcessHostDelegate; 31 32 // Provides common functionality for hosting a child process and processing IPC 33 // messages between the host and the child process. Users are responsible 34 // for the actual launching and terminating of the child processes. 35 class CONTENT_EXPORT ChildProcessHostImpl : public ChildProcessHost, 36 public IPC::Listener { 37 public: 38 virtual ~ChildProcessHostImpl(); 39 40 // This value is guaranteed to never be returned by 41 // GenerateChildProcessUniqueId() below. 42 static int kInvalidChildProcessId; 43 44 // Public and static for reuse by RenderMessageFilter. 45 static void AllocateSharedMemory( 46 size_t buffer_size, base::ProcessHandle child_process, 47 base::SharedMemoryHandle* handle); 48 49 // Returns a unique ID to identify a child process. On construction, this 50 // function will be used to generate the id_, but it is also used to generate 51 // IDs for the RenderProcessHost, which doesn't inherit from us, and whose IDs 52 // must be unique for all child processes. 53 // 54 // This function is threadsafe since RenderProcessHost is on the UI thread, 55 // but normally this will be used on the IO thread. 56 static int GenerateChildProcessUniqueId(); 57 58 // ChildProcessHost implementation 59 virtual bool Send(IPC::Message* message) OVERRIDE; 60 virtual void ForceShutdown() OVERRIDE; 61 virtual std::string CreateChannel() OVERRIDE; 62 virtual bool IsChannelOpening() OVERRIDE; 63 virtual void AddFilter(IPC::ChannelProxy::MessageFilter* filter) OVERRIDE; 64 #if defined(OS_POSIX) 65 virtual int TakeClientFileDescriptor() OVERRIDE; 66 #endif 67 68 private: 69 friend class ChildProcessHost; 70 71 explicit ChildProcessHostImpl(ChildProcessHostDelegate* delegate); 72 73 // IPC::Listener methods: 74 virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE; 75 virtual void OnChannelConnected(int32 peer_pid) OVERRIDE; 76 virtual void OnChannelError() OVERRIDE; 77 78 // Message handlers: 79 void OnShutdownRequest(); 80 void OnAllocateSharedMemory(uint32 buffer_size, 81 base::SharedMemoryHandle* handle); 82 void OnAllocateGpuMemoryBuffer(uint32 width, 83 uint32 height, 84 uint32 internalformat, 85 gfx::GpuMemoryBufferHandle* handle); 86 87 ChildProcessHostDelegate* delegate_; 88 base::ProcessHandle peer_handle_; 89 bool opening_channel_; // True while we're waiting the channel to be opened. 90 scoped_ptr<IPC::Channel> channel_; 91 std::string channel_id_; 92 93 // Holds all the IPC message filters. Since this object lives on the IO 94 // thread, we don't have a IPC::ChannelProxy and so we manage filters 95 // manually. 96 std::vector<scoped_refptr<IPC::ChannelProxy::MessageFilter> > filters_; 97 98 DISALLOW_COPY_AND_ASSIGN(ChildProcessHostImpl); 99 }; 100 101 } // namespace content 102 103 #endif // CONTENT_COMMON_CHILD_PROCESS_HOST_IMPL_H_ 104