1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_COMMON_SERVICE_PROCESS_UTIL_POSIX_H_
6#define CHROME_COMMON_SERVICE_PROCESS_UTIL_POSIX_H_
7
8#include "service_process_util.h"
9
10#include <signal.h>
11
12#include "base/basictypes.h"
13#include "base/callback.h"
14#include "base/memory/scoped_ptr.h"
15#include "base/message_loop/message_loop.h"
16
17#if defined(OS_POSIX) && !defined(OS_MACOSX)
18#include "chrome/common/multi_process_lock.h"
19MultiProcessLock* TakeServiceRunningLock(bool waiting);
20#endif
21
22#if defined(OS_MACOSX)
23#include "base/files/file_path_watcher.h"
24#include "base/mac/scoped_cftyperef.h"
25
26namespace base {
27class CommandLine;
28}
29
30CFDictionaryRef CreateServiceProcessLaunchdPlist(base::CommandLine* cmd_line,
31                                                 bool for_auto_launch);
32#endif  // OS_MACOSX
33
34namespace base {
35class WaitableEvent;
36}
37
38// Watches for |kTerminateMessage| to be written to the file descriptor it is
39// watching. When it reads |kTerminateMessage|, it performs |terminate_task_|.
40// Used here to monitor the socket listening to g_signal_socket.
41class ServiceProcessTerminateMonitor : public base::MessageLoopForIO::Watcher {
42 public:
43
44  enum {
45    kTerminateMessage = 0xdecea5e
46  };
47
48  explicit ServiceProcessTerminateMonitor(const base::Closure& terminate_task);
49  virtual ~ServiceProcessTerminateMonitor();
50
51  // MessageLoopForIO::Watcher overrides
52  virtual void OnFileCanReadWithoutBlocking(int fd) OVERRIDE;
53  virtual void OnFileCanWriteWithoutBlocking(int fd) OVERRIDE;
54
55 private:
56  base::Closure terminate_task_;
57};
58
59struct ServiceProcessState::StateData
60    : public base::RefCountedThreadSafe<ServiceProcessState::StateData> {
61  StateData();
62
63  // WatchFileDescriptor needs to be set up by the thread that is going
64  // to be monitoring it.
65  void SignalReady(base::WaitableEvent* signal, bool* success);
66
67
68  // TODO(jhawkins): Either make this a class or rename these public member
69  // variables to remove the trailing underscore.
70
71#if defined(OS_MACOSX)
72  bool WatchExecutable();
73
74  base::ScopedCFTypeRef<CFDictionaryRef> launchd_conf_;
75  base::FilePathWatcher executable_watcher_;
76#endif  // OS_MACOSX
77#if defined(OS_POSIX) && !defined(OS_MACOSX)
78  scoped_ptr<MultiProcessLock> initializing_lock_;
79  scoped_ptr<MultiProcessLock> running_lock_;
80#endif
81  scoped_ptr<ServiceProcessTerminateMonitor> terminate_monitor_;
82  base::MessageLoopForIO::FileDescriptorWatcher watcher_;
83  int sockets_[2];
84  struct sigaction old_action_;
85  bool set_action_;
86
87 protected:
88  friend class base::RefCountedThreadSafe<ServiceProcessState::StateData>;
89  virtual ~StateData();
90};
91
92#endif  // CHROME_COMMON_SERVICE_PROCESS_UTIL_POSIX_H_
93