| Index: base/process_util_posix.cc
|
| ===================================================================
|
| --- base/process_util_posix.cc (revision 52612)
|
| +++ base/process_util_posix.cc (working copy)
|
| @@ -5,7 +5,6 @@
|
| #include <dirent.h>
|
| #include <errno.h>
|
| #include <fcntl.h>
|
| -#include <poll.h>
|
| #include <signal.h>
|
| #include <stdlib.h>
|
| #include <sys/resource.h>
|
| @@ -738,10 +737,8 @@
|
| return ret;
|
| }
|
|
|
| -// Executes the application specified by |cl| and waits for it to exit, but
|
| -// at most |timeout_milliseconds| (use kNoTimeout for no timeout). Stores
|
| -// the output (stdout) in |output|, and whether or not the timeout
|
| -// triggered in |timed_out|. If |do_search_path| is set, it searches the
|
| +// Executes the application specified by |cl| and wait for it to exit. Stores
|
| +// the output (stdout) in |output|. If |do_search_path| is set, it searches the
|
| // path for the application; in that case, |envp| must be null, and it will use
|
| // the current environment. If |do_search_path| is false, |cl| should fully
|
| // specify the path of the application, and |envp| will be used as the
|
| @@ -749,8 +746,7 @@
|
| // (application launched and exited cleanly, with exit code indicating success).
|
| static bool GetAppOutputInternal(const CommandLine& cl, char* const envp[],
|
| std::string* output, size_t max_output,
|
| - bool do_search_path, bool* timed_out,
|
| - int timeout_milliseconds) {
|
| + bool do_search_path) {
|
| int pipe_fd[2];
|
| pid_t pid;
|
| InjectiveMultimap fd_shuffle1, fd_shuffle2;
|
| @@ -792,7 +788,7 @@
|
| fd_shuffle1.push_back(InjectionArc(pipe_fd[1], STDOUT_FILENO, true));
|
| fd_shuffle1.push_back(InjectionArc(dev_null, STDERR_FILENO, true));
|
| fd_shuffle1.push_back(InjectionArc(dev_null, STDIN_FILENO, true));
|
| - // Adding another element here? Remember to increase the argument to
|
| + // Adding another element here? Remeber to increase the argument to
|
| // reserve(), above.
|
|
|
| std::copy(fd_shuffle1.begin(), fd_shuffle1.end(),
|
| @@ -825,50 +821,19 @@
|
| ssize_t bytes_read = 1; // A lie to properly handle |max_output == 0|
|
| // case in the logic below.
|
|
|
| - *timed_out = false;
|
| - const Time timeout_time = Time::Now() +
|
| - TimeDelta::FromMilliseconds(timeout_milliseconds);
|
| - int remaining_ms = timeout_milliseconds;
|
| while (output_buf_left > 0) {
|
| - struct pollfd poll_struct = { pipe_fd[0], POLLIN, 0 };
|
| - const int poll_ret_code = poll(&poll_struct, 1, remaining_ms);
|
| -
|
| - // poll() should only fail due to interrupt.
|
| - DCHECK(poll_ret_code != -1 || errno == EINTR);
|
| - if (poll_ret_code == 0) {
|
| - *timed_out = true;
|
| - break;
|
| - }
|
| -
|
| bytes_read = HANDLE_EINTR(read(pipe_fd[0], buffer,
|
| std::min(output_buf_left, sizeof(buffer))));
|
| if (bytes_read <= 0)
|
| break;
|
| output->append(buffer, bytes_read);
|
| output_buf_left -= static_cast<size_t>(bytes_read);
|
| -
|
| - // Update remaining_ms if we're not using an infinite timeout.
|
| - if (timeout_milliseconds >= 0) {
|
| - remaining_ms = (timeout_time - Time::Now()).InMilliseconds();
|
| - if (remaining_ms < 0) {
|
| - *timed_out = true;
|
| - break;
|
| - }
|
| - }
|
| }
|
| close(pipe_fd[0]);
|
|
|
| - bool success = false;
|
| - int exit_code = PROCESS_END_PROCESS_WAS_HUNG;
|
| - if (*timed_out) {
|
| - KillProcess(pid, exit_code, true);
|
| - // This waits up to 60 seconds for process to actually be dead
|
| - // which means this may overrun the timeout.
|
| - LOG(ERROR) << "Process "<< pid << " killed by timeout (waited "
|
| - << timeout_milliseconds << " ms).";
|
| - } else {
|
| - success = WaitForExitCode(pid, &exit_code);
|
| - }
|
| + // Always wait for exit code (even if we know we'll declare success).
|
| + int exit_code = EXIT_FAILURE;
|
| + bool success = WaitForExitCode(pid, &exit_code);
|
|
|
| // If we stopped because we read as much as we wanted, we always declare
|
| // success (because the child may exit due to |SIGPIPE|).
|
| @@ -884,26 +849,17 @@
|
|
|
| bool GetAppOutput(const CommandLine& cl, std::string* output) {
|
| // Run |execve()| with the current environment and store "unlimited" data.
|
| - bool timed_out;
|
| return GetAppOutputInternal(cl, NULL, output,
|
| - std::numeric_limits<std::size_t>::max(), true,
|
| - &timed_out, base::kNoTimeout);
|
| + std::numeric_limits<std::size_t>::max(), true);
|
| }
|
|
|
| -bool GetAppOutputWithTimeout(const CommandLine& cl, std::string* output,
|
| - bool* timed_out, int timeout_milliseconds) {
|
| - return GetAppOutputInternal(cl, NULL, output,
|
| - std::numeric_limits<std::size_t>::max(), true,
|
| - timed_out, timeout_milliseconds);
|
| -}
|
| -
|
| +// TODO(viettrungluu): Conceivably, we should have a timeout as well, so we
|
| +// don't hang if what we're calling hangs.
|
| bool GetAppOutputRestricted(const CommandLine& cl,
|
| std::string* output, size_t max_output) {
|
| // Run |execve()| with the empty environment.
|
| char* const empty_environ = NULL;
|
| - bool timed_out;
|
| - return GetAppOutputInternal(cl, &empty_environ, output, max_output, false,
|
| - &timed_out, base::kNoTimeout);
|
| + return GetAppOutputInternal(cl, &empty_environ, output, max_output, false);
|
| }
|
|
|
| bool WaitForProcessesToExit(const std::wstring& executable_name,
|
|
|