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