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