| // Copyright (c) 2012 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 SHILL_PROCESS_KILLER_H_ |
| #define SHILL_PROCESS_KILLER_H_ |
| |
| #include <map> |
| |
| #include <base/callback.h> |
| #include <base/lazy_instance.h> |
| #include <glib.h> |
| #include <gtest/gtest_prod.h> // for FRIEND_TEST |
| |
| namespace shill { |
| |
| // The ProcessKiller singleton can be used to asynchronously and robustly |
| // terminate and reap child processes by their process IDs. |
| class ProcessKiller { |
| public: |
| virtual ~ProcessKiller(); |
| |
| // This is a singleton -- use ProcessKiller::GetInstance()->Foo(). |
| static ProcessKiller* GetInstance(); |
| |
| // Uses GLib to wait asynchronously for the process to exit and reap it. GLib |
| // supports only a single callback per process ID so there should be no other |
| // child watch callbacks registered for this |pid|. If |callback| is non-null, |
| // runs it when the process exits. Returns false if the process has already |
| // exited. |
| virtual bool Wait(int pid, const base::Closure& callback); |
| |
| // Terminates process |pid| and reaps it through Wait(pid, callback). |
| virtual void Kill(int pid, const base::Closure& callback); |
| |
| protected: |
| ProcessKiller(); |
| |
| private: |
| friend struct base::DefaultLazyInstanceTraits<ProcessKiller>; |
| FRIEND_TEST(ProcessKillerTest, OnProcessDied); |
| |
| static void OnProcessDied(GPid pid, gint status, gpointer data); |
| |
| std::map<int, base::Closure> callbacks_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ProcessKiller); |
| }; |
| |
| } // namespace shill |
| |
| #endif // SHILL_PROCESS_KILLER_H_ |