Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(443)

Unified Diff: base/process/kill_posix.cc

Issue 319703007: Cleanup WaitpidWithTimeout (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/process/kill_posix.cc
diff --git a/base/process/kill_posix.cc b/base/process/kill_posix.cc
index 8187c38926cd2ce0551861f0e6a09d24db84f8b6..18c14fd3a77c6acabdccb705515fb99301af6ac0 100644
--- a/base/process/kill_posix.cc
+++ b/base/process/kill_posix.cc
@@ -22,11 +22,11 @@ namespace base {
namespace {
-int WaitpidWithTimeout(ProcessHandle handle,
- int64 wait_milliseconds,
- bool* success) {
+bool WaitpidWithTimeout(ProcessHandle handle,
+ int* status,
+ base::TimeDelta wait) {
// This POSIX version of this function only guarantees that we wait no less
- // than |wait_milliseconds| for the process to exit. The child process may
+ // than |wait| for the process to exit. The child process may
// exit sometime before the timeout has ended but we may still block for up
// to 256 milliseconds after the fact.
//
@@ -37,7 +37,7 @@ int WaitpidWithTimeout(ProcessHandle handle,
// affect other parts of the application and would be difficult to debug.
//
// Our strategy is to call waitpid() once up front to check if the process
- // has already exited, otherwise to loop for wait_milliseconds, sleeping for
+ // has already exited, otherwise to loop for |wait|, sleeping for
// at most 256 milliseconds each time using usleep() and then calling
// waitpid(). The amount of time we sleep starts out at 1 milliseconds, and
// we double it every 4 sleep cycles.
@@ -48,15 +48,18 @@ int WaitpidWithTimeout(ProcessHandle handle,
//
// This function is used primarily for unit tests, if we want to use it in
// the application itself it would probably be best to examine other routes.
- int status = -1;
- pid_t ret_pid = HANDLE_EINTR(waitpid(handle, &status, WNOHANG));
+
+ if (wait.InMilliseconds() == base::kNoTimeout) {
+ return HANDLE_EINTR(waitpid(handle, status, 0)) > 0;
+ }
+
+ pid_t ret_pid = HANDLE_EINTR(waitpid(handle, status, WNOHANG));
static const int64 kMaxSleepInMicroseconds = 1 << 18; // ~256 milliseconds.
int64 max_sleep_time_usecs = 1 << 10; // ~1 milliseconds.
int64 double_sleep_time = 0;
// If the process hasn't exited yet, then sleep and try again.
- TimeTicks wakeup_time = TimeTicks::Now() +
- TimeDelta::FromMilliseconds(wait_milliseconds);
+ TimeTicks wakeup_time = TimeTicks::Now() + wait;
while (ret_pid == 0) {
TimeTicks now = TimeTicks::Now();
if (now > wakeup_time)
@@ -70,7 +73,7 @@ int WaitpidWithTimeout(ProcessHandle handle,
// usleep() will return 0 and set errno to EINTR on receipt of a signal
// such as SIGCHLD.
usleep(sleep_time_usecs);
- ret_pid = HANDLE_EINTR(waitpid(handle, &status, WNOHANG));
+ ret_pid = HANDLE_EINTR(waitpid(handle, status, WNOHANG));
if ((max_sleep_time_usecs < kMaxSleepInMicroseconds) &&
(double_sleep_time++ % 4 == 0)) {
@@ -78,10 +81,7 @@ int WaitpidWithTimeout(ProcessHandle handle,
}
}
- if (success)
- *success = (ret_pid != -1);
-
- return status;
+ return ret_pid > 0;
}
TerminationStatus GetTerminationStatusImpl(ProcessHandle handle,
@@ -226,12 +226,8 @@ bool WaitForExitCode(ProcessHandle handle, int* exit_code) {
bool WaitForExitCodeWithTimeout(ProcessHandle handle,
int* exit_code,
base::TimeDelta timeout) {
- bool waitpid_success = false;
- int status = WaitpidWithTimeout(handle, timeout.InMilliseconds(),
- &waitpid_success);
- if (status == -1)
- return false;
- if (!waitpid_success)
+ int status;
+ if (!WaitpidWithTimeout(handle, &status, timeout))
return false;
if (WIFSIGNALED(status)) {
*exit_code = -1;
@@ -369,21 +365,10 @@ bool WaitForSingleProcess(ProcessHandle handle, base::TimeDelta wait) {
#endif // OS_MACOSX
}
- bool waitpid_success;
- int status = -1;
- if (wait.InMilliseconds() == base::kNoTimeout) {
- waitpid_success = (HANDLE_EINTR(waitpid(handle, &status, 0)) != -1);
- } else {
- status = WaitpidWithTimeout(
- handle, wait.InMilliseconds(), &waitpid_success);
- }
-
- if (status != -1) {
- DCHECK(waitpid_success);
- return WIFEXITED(status);
- } else {
+ int status;
+ if (!WaitpidWithTimeout(handle, &status, wait))
return false;
- }
+ return WIFEXITED(status);
}
bool CleanupProcesses(const FilePath::StringType& executable_name,
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698