|  | // Copyright (c) 2011 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_SERVICE_PROCESS_UTIL_POSIX_H_ | 
|  | #define CHROME_COMMON_SERVICE_PROCESS_UTIL_POSIX_H_ | 
|  |  | 
|  | #include "chrome/common/service_process_util.h" | 
|  |  | 
|  | #include <signal.h> | 
|  |  | 
|  | #include <memory> | 
|  |  | 
|  | #include "base/callback.h" | 
|  | #include "base/memory/ref_counted.h" | 
|  | #include "base/message_loop/message_pump_for_io.h" | 
|  | #include "base/single_thread_task_runner.h" | 
|  | #include "build/build_config.h" | 
|  |  | 
|  | #if defined(OS_POSIX) && !defined(OS_MACOSX) | 
|  | #include "chrome/common/multi_process_lock.h" | 
|  | MultiProcessLock* TakeServiceRunningLock(bool waiting); | 
|  | #endif | 
|  |  | 
|  | #if defined(OS_MACOSX) | 
|  | #include "base/files/file_path_watcher.h" | 
|  | #include "base/mac/scoped_cftyperef.h" | 
|  | #include "chrome/common/mac/service_management.h" | 
|  |  | 
|  | namespace base { | 
|  | class CommandLine; | 
|  | } | 
|  |  | 
|  | mac::services::JobOptions GetServiceProcessJobOptions( | 
|  | base::CommandLine* cmd_line, | 
|  | bool for_auto_launch); | 
|  | #endif  // OS_MACOSX | 
|  |  | 
|  | namespace base { | 
|  | class WaitableEvent; | 
|  | } | 
|  |  | 
|  | // Watches for |kTerminateMessage| to be written to the file descriptor it is | 
|  | // watching. When it reads |kTerminateMessage|, it performs |terminate_task_|. | 
|  | // Used here to monitor the socket listening to g_signal_socket. | 
|  | class ServiceProcessTerminateMonitor | 
|  | : public base::MessagePumpForIO::FdWatcher { | 
|  | public: | 
|  |  | 
|  | enum { | 
|  | kTerminateMessage = 0xdecea5e | 
|  | }; | 
|  |  | 
|  | explicit ServiceProcessTerminateMonitor(const base::Closure& terminate_task); | 
|  | ~ServiceProcessTerminateMonitor() override; | 
|  |  | 
|  | // MessagePumpForIO::FdWatcher overrides | 
|  | void OnFileCanReadWithoutBlocking(int fd) override; | 
|  | void OnFileCanWriteWithoutBlocking(int fd) override; | 
|  |  | 
|  | private: | 
|  | base::Closure terminate_task_; | 
|  | }; | 
|  |  | 
|  | struct ServiceProcessState::StateData { | 
|  | StateData(); | 
|  | ~StateData(); | 
|  |  | 
|  | // WatchFileDescriptor needs to be set up by the thread that is going | 
|  | // to be monitoring it. | 
|  | void SignalReady(base::WaitableEvent* signal, bool* success); | 
|  |  | 
|  | #if defined(OS_MACOSX) | 
|  | bool WatchExecutable(); | 
|  |  | 
|  | mac::services::JobCheckinInfo job_info; | 
|  | base::FilePathWatcher executable_watcher; | 
|  | #else | 
|  | std::unique_ptr<MultiProcessLock> initializing_lock; | 
|  | std::unique_ptr<MultiProcessLock> running_lock; | 
|  | #endif | 
|  | std::unique_ptr<ServiceProcessTerminateMonitor> terminate_monitor; | 
|  | base::MessagePumpForIO::FdWatchController watcher; | 
|  | int sockets[2]; | 
|  | struct sigaction old_action; | 
|  | bool set_action; | 
|  |  | 
|  | // The SingleThreadTaskRunner on which SignalReady and the destructor are | 
|  | // invoked. | 
|  | scoped_refptr<base::SingleThreadTaskRunner> task_runner; | 
|  | }; | 
|  |  | 
|  | #endif  // CHROME_COMMON_SERVICE_PROCESS_UTIL_POSIX_H_ |