1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 23345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Use of this source code is governed by a BSD-style license that can be 33345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// found in the LICENSE file. 43345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 53345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#ifndef CHROME_COMMON_SERVICE_PROCESS_UTIL_H_ 63345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#define CHROME_COMMON_SERVICE_PROCESS_UTIL_H_ 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include <string> 93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/basictypes.h" 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 12731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/process.h" 13731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/shared_memory.h" 14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "ipc/ipc_channel_handle.h" 1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass Task; 17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass CommandLine; 1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace base { 2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen class MessageLoopProxy; 2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Return the IPC channel to connect to the service process. 24dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenIPC::ChannelHandle GetServiceProcessChannel(); 253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if !defined(OS_MACOSX) 27731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Return a name that is scoped to this instance of the service process. We 28731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// use the user-data-dir as a scoping prefix. 29731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstd::string GetServiceProcessScopedName(const std::string& append_str); 30731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 31731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Return a name that is scoped to this instance of the service process. We 32731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// use the user-data-dir and the version as a scoping prefix. 33731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstd::string GetServiceProcessScopedVersionedName(const std::string& append_str); 34dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif // OS_MACOSX 35731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// The following methods are used in a process that acts as a client to the 37731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// service process (typically the browser process). 38731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// -------------------------------------------------------------------------- 39731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// This method checks that if the service process is ready to receive 40731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// IPC commands. 41731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool CheckServiceProcessReady(); 42731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Returns the process id and version of the currently running service process. 44731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Note: DO NOT use this check whether the service process is ready because 4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// a true return value only means that some process shared data was available, 4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// and not that the process is ready to receive IPC commands, or even running. 4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// This method is only exposed for testing. 48dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool GetServiceProcessData(std::string* version, base::ProcessId* pid); 49731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// -------------------------------------------------------------------------- 50731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 51731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Forces a service process matching the specified version to shut down. 5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool ForceServiceProcessShutdown(const std::string& version, 5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen base::ProcessId process_id); 54731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 55731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// This is a class that is used by the service process to signal events and 56731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// share data with external clients. This class lives in this file because the 57731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// internal data structures and mechanisms used by the utility methods above 58731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// and this class are shared. 59731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass ServiceProcessState { 60731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public: 61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ServiceProcessState(); 62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ~ServiceProcessState(); 63731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 64731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Tries to become the sole service process for the current user data dir. 6521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Returns false if another service process is already running. 66731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool Initialize(); 67731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 68731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Signal that the service process is ready. 69731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // This method is called when the service process is running and initialized. 70731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // |shutdown_task| is invoked when we get a shutdown request from another 71731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // process (in the same thread that called SignalReady). It can be NULL. 7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // |message_loop_proxy| must be of type IO and is the loop that POSIX uses 7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // to monitor the service process. 7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool SignalReady( 7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen base::MessageLoopProxy* message_loop_proxy, Task* shutdown_task); 763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 77731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Signal that the service process is stopped. 78731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void SignalStopped(); 793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 80731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Register the service process to run on startup. 81731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool AddToAutoRun(); 82731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 83731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Unregister the service process to run on startup. 84731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool RemoveFromAutoRun(); 8521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 86dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Return the channel handle used for communicating with the service. 87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen IPC::ChannelHandle GetServiceProcessChannel(); 88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 89731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick private: 90731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if !defined(OS_MACOSX) 92731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Create the shared memory data for the service process. 93731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool CreateSharedData(); 94731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 95731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // If an older version of the service process running, it should be shutdown. 96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Returns false if this process needs to exit. 97731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool HandleOtherVersion(); 98731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 99731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Acquires a singleton lock for the service process. A return value of false 100731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // means that a service process instance is already running. 101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool TakeSingletonLock(); 102dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif // !OS_MACOSX 103731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Creates the platform specific state. 105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void CreateState(); 106731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 107731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Tear down the platform specific state. 108731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void TearDownState(); 109731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Initializes the command-line that can be used to autorun the service 111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // process. 112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void CreateAutoRunCommandLine(); 113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // An opaque object that maintains state. The actual definition of this is 115731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // platform dependent. 116731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick struct StateData; 117731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick StateData* state_; 118731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick scoped_ptr<base::SharedMemory> shared_mem_service_data_; 119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen scoped_ptr<CommandLine> autorun_command_line_; 120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 1213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif // CHROME_COMMON_SERVICE_PROCESS_UTIL_H_ 123