blob: 8a8189df9b3436b808b55fc9ec3652c89c6c4763 [file] [log] [blame]
Alex Deymo471776d2015-07-21 16:12:27 -07001// Copyright 2015 The Chromium OS 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 LIBCHROMEOS_CHROMEOS_PROCESS_REAPER_H_
6#define LIBCHROMEOS_CHROMEOS_PROCESS_REAPER_H_
7
8#include <sys/wait.h>
9
10#include <map>
11
12#include <base/callback.h>
13#include <base/location.h>
14#include <base/macros.h>
15#include <chromeos/asynchronous_signal_handler.h>
16#include <chromeos/daemons/daemon.h>
17
18namespace chromeos {
19
20class CHROMEOS_EXPORT ProcessReaper final {
21 public:
22 // The callback called when a child exits.
23 using ChildCallback = base::Callback<void(const siginfo_t&)>;
24
25 ProcessReaper() = default;
26 ~ProcessReaper();
27
Alex Deymo38c16332015-07-27 14:08:34 -070028 // Register the ProcessReaper using either the provided
29 // chromeos::AsynchronousSignalHandlerInterface. You can call Unregister() to
30 // remove this ProcessReapper or it will be called during shutdown.
31 // You can only register this ProcessReaper with one signal handler at a time.
32 void Register(AsynchronousSignalHandlerInterface* async_signal_handler);
Alex Deymo471776d2015-07-21 16:12:27 -070033
Alex Deymo38c16332015-07-27 14:08:34 -070034 // Unregisters the ProcessReaper from the
35 // chromeos::AsynchronousSignalHandlerInterface passed in Register(). It
36 // doesn't do anything if not registered.
Alex Deymo471776d2015-07-21 16:12:27 -070037 void Unregister();
38
39 // Watch for the child process |pid| to finish and call |callback| when the
40 // selected process exits or the process terminates for other reason. The
41 // |callback| receives the exit status and exit code of the terminated process
42 // as a siginfo_t. See wait(2) for details about siginfo_t.
43 bool WatchForChild(const tracked_objects::Location& from_here,
44 pid_t pid,
45 const ChildCallback& callback);
46
47 private:
48 // SIGCHLD handler for the AsynchronousSignalHandler. Always returns false
49 // (meaning that the signal handler should not be unregistered).
50 bool HandleSIGCHLD(const signalfd_siginfo& sigfd_info);
51
52 struct WatchedProcess {
53 tracked_objects::Location location;
54 ChildCallback callback;
55 };
56 std::map<pid_t, WatchedProcess> watched_processes_;
57
Alex Deymo38c16332015-07-27 14:08:34 -070058 // The |async_signal_handler_| is owned by the caller and is |nullptr| when
59 // not registered.
60 AsynchronousSignalHandlerInterface* async_signal_handler_{nullptr};
Alex Deymo471776d2015-07-21 16:12:27 -070061
62 DISALLOW_COPY_AND_ASSIGN(ProcessReaper);
63};
64
65} // namespace chromeos
66
67#endif // LIBCHROMEOS_CHROMEOS_PROCESS_REAPER_H_