15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_COMMON_SERVICE_PROCESS_UTIL_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_COMMON_SERVICE_PROCESS_UTIL_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback_forward.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/memory/shared_memory.h"
14a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/process/process.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_channel_handle.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MultiProcessLock;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef __OBJC__
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class NSString;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NSString;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class CommandLine;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MessageLoopProxy;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return the IPC channel to connect to the service process.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IPC::ChannelHandle GetServiceProcessChannel();
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return a name that is scoped to this instance of the service process. We
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// use the user-data-dir as a scoping prefix.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetServiceProcessScopedName(const std::string& append_str);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return a name that is scoped to this instance of the service process. We
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// use the user-data-dir and the version as a scoping prefix.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetServiceProcessScopedVersionedName(const std::string& append_str);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // OS_MACOSX
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return the name that is used to extract the socket path out of the
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dictionary provided by launchd.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NSString* GetServiceProcessLaunchDSocketEnvVar();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Attempts to take a lock named |name|. If |waiting| is true then this will
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// make multiple attempts to acquire the lock.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Caller is responsible for ownership of the MultiProcessLock.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MultiProcessLock* TakeNamedLock(const std::string& name, bool waiting);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following methods are used in a process that acts as a client to the
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// service process (typically the browser process).
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// --------------------------------------------------------------------------
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This method checks that if the service process is ready to receive
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IPC commands.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CheckServiceProcessReady();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the process id and version of the currently running service process.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note: DO NOT use this check whether the service process is ready because
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a true return value only means that some process shared data was available,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and not that the process is ready to receive IPC commands, or even running.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This method is only exposed for testing.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetServiceProcessData(std::string* version, base::ProcessId* pid);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// --------------------------------------------------------------------------
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Forces a service process matching the specified version to shut down.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ForceServiceProcessShutdown(const std::string& version,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 base::ProcessId process_id);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Creates command-line to run the service process.
786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)scoped_ptr<base::CommandLine> CreateServiceProcessCommandLine();
796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is a class that is used by the service process to signal events and
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// share data with external clients. This class lives in this file because the
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// internal data structures and mechanisms used by the utility methods above
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and this class are shared.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ServiceProcessState {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ServiceProcessState();
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ServiceProcessState();
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tries to become the sole service process for the current user data dir.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns false if another service process is already running.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Initialize();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Signal that the service process is ready.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This method is called when the service process is running and initialized.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |terminate_task| is invoked when we get a terminate request from another
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // process (in the same thread that called SignalReady). It can be NULL.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |message_loop_proxy| must be of type IO and is the loop that POSIX uses
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to monitor the service process.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool SignalReady(
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::MessageLoopProxy* message_loop_proxy,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::Closure& terminate_task);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Signal that the service process is stopped.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SignalStopped();
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Register the service process to run on startup.
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool AddToAutoRun();
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unregister the service process to run on startup.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool RemoveFromAutoRun();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return the channel handle used for communicating with the service.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC::ChannelHandle GetServiceProcessChannel();
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create the shared memory data for the service process.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CreateSharedData();
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If an older version of the service process running, it should be shutdown.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns false if this process needs to exit.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HandleOtherVersion();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Acquires a singleton lock for the service process. A return value of false
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // means that a service process instance is already running.
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool TakeSingletonLock();
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // !OS_MACOSX
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates the platform specific state.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CreateState();
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tear down the platform specific state.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TearDownState();
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An opaque object that maintains state. The actual definition of this is
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // platform dependent.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct StateData;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StateData* state_;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::SharedMemory> shared_mem_service_data_;
140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<base::CommandLine> autorun_command_line_;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_COMMON_SERVICE_PROCESS_UTIL_H_
144