aboutsummaryrefslogtreecommitdiffstats
path: root/brillo/process_reaper.h
diff options
context:
space:
mode:
Diffstat (limited to 'brillo/process_reaper.h')
-rw-r--r--brillo/process_reaper.h67
1 files changed, 67 insertions, 0 deletions
diff --git a/brillo/process_reaper.h b/brillo/process_reaper.h
new file mode 100644
index 0000000..4d28f4e
--- /dev/null
+++ b/brillo/process_reaper.h
@@ -0,0 +1,67 @@
+// Copyright 2015 The Chromium OS 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 LIBCHROMEOS_BRILLO_PROCESS_REAPER_H_
+#define LIBCHROMEOS_BRILLO_PROCESS_REAPER_H_
+
+#include <sys/wait.h>
+
+#include <map>
+
+#include <base/callback.h>
+#include <base/location.h>
+#include <base/macros.h>
+#include <brillo/asynchronous_signal_handler.h>
+#include <brillo/daemons/daemon.h>
+
+namespace brillo {
+
+class BRILLO_EXPORT ProcessReaper final {
+ public:
+ // The callback called when a child exits.
+ using ChildCallback = base::Callback<void(const siginfo_t&)>;
+
+ ProcessReaper() = default;
+ ~ProcessReaper();
+
+ // Register the ProcessReaper using either the provided
+ // brillo::AsynchronousSignalHandlerInterface. You can call Unregister() to
+ // remove this ProcessReapper or it will be called during shutdown.
+ // You can only register this ProcessReaper with one signal handler at a time.
+ void Register(AsynchronousSignalHandlerInterface* async_signal_handler);
+
+ // Unregisters the ProcessReaper from the
+ // brillo::AsynchronousSignalHandlerInterface passed in Register(). It
+ // doesn't do anything if not registered.
+ void Unregister();
+
+ // Watch for the child process |pid| to finish and call |callback| when the
+ // selected process exits or the process terminates for other reason. The
+ // |callback| receives the exit status and exit code of the terminated process
+ // as a siginfo_t. See wait(2) for details about siginfo_t.
+ bool WatchForChild(const tracked_objects::Location& from_here,
+ pid_t pid,
+ const ChildCallback& callback);
+
+ private:
+ // SIGCHLD handler for the AsynchronousSignalHandler. Always returns false
+ // (meaning that the signal handler should not be unregistered).
+ bool HandleSIGCHLD(const signalfd_siginfo& sigfd_info);
+
+ struct WatchedProcess {
+ tracked_objects::Location location;
+ ChildCallback callback;
+ };
+ std::map<pid_t, WatchedProcess> watched_processes_;
+
+ // The |async_signal_handler_| is owned by the caller and is |nullptr| when
+ // not registered.
+ AsynchronousSignalHandlerInterface* async_signal_handler_{nullptr};
+
+ DISALLOW_COPY_AND_ASSIGN(ProcessReaper);
+};
+
+} // namespace brillo
+
+#endif // LIBCHROMEOS_BRILLO_PROCESS_REAPER_H_