diff options
author | sanjeevr@chromium.org <sanjeevr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-03 05:47:42 +0000 |
---|---|---|
committer | sanjeevr@chromium.org <sanjeevr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-03 05:47:42 +0000 |
commit | d27893f65dbd01a0d88dcda2a69f518e4b8a636d (patch) | |
tree | 7b0573f1158681243b6605bd9f67521c9ee3193c /chrome/common/child_process_host.h | |
parent | dfe7f3288af471067ecd9117049e96aa39778da9 (diff) | |
download | chromium_src-d27893f65dbd01a0d88dcda2a69f518e4b8a636d.zip chromium_src-d27893f65dbd01a0d88dcda2a69f518e4b8a636d.tar.gz chromium_src-d27893f65dbd01a0d88dcda2a69f518e4b8a636d.tar.bz2 |
Moved common parts of ChildProcessHost into chrome/common and created a BrowserChildProcessHost with browser-specific implementation. This is in preparation of creating a ServiceChildProcessHost.
BUG=None
TEST=Test for regressions .
Review URL: http://codereview.chromium.org/2885017
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@51593 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/common/child_process_host.h')
-rw-r--r-- | chrome/common/child_process_host.h | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/chrome/common/child_process_host.h b/chrome/common/child_process_host.h new file mode 100644 index 0000000..980ad7d --- /dev/null +++ b/chrome/common/child_process_host.h @@ -0,0 +1,111 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_COMMON_CHILD_PROCESS_HOST_H_ +#define CHROME_COMMON_CHILD_PROCESS_HOST_H_ + +#include <list> +#include <string> + +// Must be included early (e.g. before chrome/common/plugin_messages.h) +#include "ipc/ipc_logging.h" + +#include "base/basictypes.h" +#include "base/file_path.h" +#include "base/scoped_ptr.h" +#include "chrome/common/notification_type.h" +#include "ipc/ipc_channel.h" + +class CommandLine; + +// Provides common functionality for hosting a child process and processing IPC +// messages between the host and the child process. Subclasses are responsible +// for the actual launching and terminating of the child processes. +// +class ChildProcessHost : public IPC::Channel::Listener { + public: + virtual ~ChildProcessHost(); + + // Returns the pathname to be used for a child process. If a subprocess + // pathname was specified on the command line, that will be used. Otherwise, + // the default child process pathname will be returned. On most platforms, + // this will be the same as the currently-executing process. + // + // The argument allow_self is used on Linux to indicate that we allow us to + // fork from /proc/self/exe rather than using the "real" app path. This + // prevents autoupdate from confusing us if it changes the file out from + // under us. You will generally want to set this to true, except when there + // is an override to the command line (for example, we're forking a renderer + // in gdb). In this case, you'd use GetChildPath to get the real executable + // file name, and then prepend the GDB command to the command line. + // + // On failure, returns an empty FilePath. + static FilePath GetChildPath(bool allow_self); + + protected: + ChildProcessHost(); + + // A helper method to send an IPC message to the child on the channel. + // It behavies just like IPC::Message::Sender::Send. The implementor takes + // ownership of the given Message regardless of whether or not this method + // succeeds. This class does not implement IPC::Message::Sender to prevent + // conflicts with subclasses which indirectly could inherit from + // IPC::Message::Sender. + bool SendOnChannel(IPC::Message* msg); + + // Derived classes return true if it's ok to shut down the child process. + virtual bool CanShutdown() = 0; + + // Send the shutdown message to the child process. + // Does not check if CanShutdown is true. + virtual void ForceShutdown(); + + // Creates the IPC channel. Returns true iff it succeeded. + virtual bool CreateChannel(); + + // Notifies us that an instance has been created on this child process. + virtual void InstanceCreated(); + + // IPC::Channel::Listener implementation: + virtual void OnMessageReceived(const IPC::Message& msg) { } + virtual void OnChannelConnected(int32 peer_pid) { } + virtual void OnChannelError() { } + + bool opening_channel() { return opening_channel_; } + const std::string& channel_id() { return channel_id_; } + IPC::Channel* channel() { return channel_.get(); } + + // Called when the child process goes away. + virtual void OnChildDied(); + // Allows the derived implementation to intercept a message before it is + // handed to the IPC::Channel::Listener::OnMessageReceived implementation. + virtual bool InterceptMessageFromChild(const IPC::Message& msg) { + return false; + } + // Subclasses can implement specific notification methods. + virtual void Notify(NotificationType type) { } + + private: + // By using an internal class as the IPC::Channel::Listener, we can intercept + // OnMessageReceived/OnChannelConnected and do our own processing before + // calling the subclass' implementation. + class ListenerHook : public IPC::Channel::Listener { + public: + explicit ListenerHook(ChildProcessHost* host); + virtual void OnMessageReceived(const IPC::Message& msg); + virtual void OnChannelConnected(int32 peer_pid); + virtual void OnChannelError(); + private: + ChildProcessHost* host_; + }; + + ListenerHook listener_; + + bool opening_channel_; // True while we're waiting the channel to be opened. + scoped_ptr<IPC::Channel> channel_; + std::string channel_id_; +}; + +#endif // CHROME_COMMON_CHILD_PROCESS_HOST_H_ + |