Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/common/process_watcher.h" | 5 #include "chrome/common/process_watcher.h" |
| 6 | 6 |
| 7 #include <errno.h> | 7 #include <errno.h> |
| 8 #include <signal.h> | 8 #include <signal.h> |
| 9 #include <sys/types.h> | 9 #include <sys/types.h> |
| 10 #include <sys/wait.h> | 10 #include <sys/wait.h> |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 58 // Wait for 2 * timeout_ 500 milliseconds intervals. | 58 // Wait for 2 * timeout_ 500 milliseconds intervals. |
| 59 for (unsigned i = 0; i < 2 * timeout_; ++i) { | 59 for (unsigned i = 0; i < 2 * timeout_; ++i) { |
| 60 PlatformThread::Sleep(500); // 0.5 seconds | 60 PlatformThread::Sleep(500); // 0.5 seconds |
| 61 if (IsChildDead(child_)) | 61 if (IsChildDead(child_)) |
| 62 return; | 62 return; |
| 63 } | 63 } |
| 64 | 64 |
| 65 if (kill(child_, SIGKILL) == 0) { | 65 if (kill(child_, SIGKILL) == 0) { |
| 66 // SIGKILL is uncatchable. Since the signal was delivered, we can | 66 // SIGKILL is uncatchable. Since the signal was delivered, we can |
| 67 // just wait for the process to die now in a blocking manner. | 67 // just wait for the process to die now in a blocking manner. |
| 68 HANDLE_EINTR(waitpid(child_, NULL, 0)); | 68 if (HANDLE_EINTR(waitpid(child_, NULL, 0)) < 0) |
| 69 PLOG(WARNING) << "waitpid"; | |
|
willchan no longer on Chromium
2010/03/30 17:13:18
Hm, we should probably #include "base/logging.h" f
| |
| 69 } else { | 70 } else { |
| 70 LOG(ERROR) << "While waiting for " << child_ << " to terminate we" | 71 LOG(ERROR) << "While waiting for " << child_ << " to terminate we" |
| 71 << " failed to deliver a SIGKILL signal (" << errno << ")."; | 72 << " failed to deliver a SIGKILL signal (" << errno << ")."; |
| 72 } | 73 } |
| 73 } | 74 } |
| 74 | 75 |
| 75 private: | 76 private: |
| 76 const pid_t child_; | 77 const pid_t child_; |
| 77 // Number of seconds to wait, if 0 then wait forever and do not attempt to | 78 // Number of seconds to wait, if 0 then wait forever and do not attempt to |
| 78 // kill |child_|. | 79 // kill |child_|. |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 94 | 95 |
| 95 // static | 96 // static |
| 96 void ProcessWatcher::EnsureProcessGetsReaped(base::ProcessHandle process) { | 97 void ProcessWatcher::EnsureProcessGetsReaped(base::ProcessHandle process) { |
| 97 // If the child is already dead, then there's nothing to do. | 98 // If the child is already dead, then there's nothing to do. |
| 98 if (IsChildDead(process)) | 99 if (IsChildDead(process)) |
| 99 return; | 100 return; |
| 100 | 101 |
| 101 BackgroundReaper* reaper = new BackgroundReaper(process, 0); | 102 BackgroundReaper* reaper = new BackgroundReaper(process, 0); |
| 102 PlatformThread::CreateNonJoinable(0, reaper); | 103 PlatformThread::CreateNonJoinable(0, reaper); |
| 103 } | 104 } |
| OLD | NEW |