Index: chrome/browser/chromeos/process_proxy/process_output_watcher.cc |
diff --git a/chrome/browser/chromeos/process_proxy/process_output_watcher.cc b/chrome/browser/chromeos/process_proxy/process_output_watcher.cc |
deleted file mode 100644 |
index b89537aa1d4cf8e0f659c40b6ccde0c870e70512..0000000000000000000000000000000000000000 |
--- a/chrome/browser/chromeos/process_proxy/process_output_watcher.cc |
+++ /dev/null |
@@ -1,116 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/chromeos/process_proxy/process_output_watcher.h" |
- |
-#include <algorithm> |
-#include <cstdio> |
-#include <cstring> |
- |
-#include <sys/ioctl.h> |
-#include <sys/select.h> |
-#include <unistd.h> |
- |
-#include "base/logging.h" |
-#include "base/posix/eintr_wrapper.h" |
- |
-namespace { |
- |
-void InitReadFdSet(int out_fd, int stop_fd, fd_set* set) { |
- FD_ZERO(set); |
- if (out_fd != -1) |
- FD_SET(out_fd, set); |
- FD_SET(stop_fd, set); |
-} |
- |
-void CloseFd(int* fd) { |
- if (*fd >= 0) { |
- if (HANDLE_EINTR(close(*fd)) != 0) |
- DPLOG(WARNING) << "close fd " << *fd << " failed."; |
- } |
- *fd = -1; |
-} |
- |
-} // namespace |
- |
-ProcessOutputWatcher::ProcessOutputWatcher(int out_fd, int stop_fd, |
- const ProcessOutputCallback& callback) |
- : out_fd_(out_fd), |
- stop_fd_(stop_fd), |
- on_read_callback_(callback) { |
- VerifyFileDescriptor(out_fd_); |
- VerifyFileDescriptor(stop_fd_); |
- max_fd_ = std::max(out_fd_, stop_fd_); |
- // We want to be sure we will be able to add 0 at the end of the input, so -1. |
- read_buffer_size_ = arraysize(read_buffer_) - 1; |
-} |
- |
-void ProcessOutputWatcher::Start() { |
- WatchProcessOutput(); |
- OnStop(); |
-} |
- |
-ProcessOutputWatcher::~ProcessOutputWatcher() { |
- CloseFd(&out_fd_); |
- CloseFd(&stop_fd_); |
-} |
- |
-void ProcessOutputWatcher::WatchProcessOutput() { |
- while (true) { |
- // This has to be reset with every watch cycle. |
- fd_set rfds; |
- DCHECK(stop_fd_ >= 0); |
- InitReadFdSet(out_fd_, stop_fd_, &rfds); |
- |
- int select_result = |
- HANDLE_EINTR(select(max_fd_ + 1, &rfds, NULL, NULL, NULL)); |
- |
- if (select_result < 0) { |
- DPLOG(WARNING) << "select failed"; |
- return; |
- } |
- |
- // Check if we were stopped. |
- if (FD_ISSET(stop_fd_, &rfds)) { |
- return; |
- } |
- |
- if (out_fd_ != -1 && FD_ISSET(out_fd_, &rfds)) { |
- ReadFromFd(PROCESS_OUTPUT_TYPE_OUT, &out_fd_); |
- } |
- } |
-} |
- |
-void ProcessOutputWatcher::VerifyFileDescriptor(int fd) { |
- CHECK_LE(0, fd); |
- CHECK_GT(FD_SETSIZE, fd); |
-} |
- |
-void ProcessOutputWatcher::ReadFromFd(ProcessOutputType type, int* fd) { |
- // We don't want to necessary read pipe until it is empty so we don't starve |
- // other streams in case data is written faster than we read it. If there is |
- // more than read_buffer_size_ bytes in pipe, it will be read in the next |
- // iteration. |
- ssize_t bytes_read = HANDLE_EINTR(read(*fd, read_buffer_, read_buffer_size_)); |
- if (bytes_read < 0) |
- DPLOG(WARNING) << "read from buffer failed"; |
- |
- if (bytes_read > 0) { |
- on_read_callback_.Run(type, std::string(read_buffer_, bytes_read)); |
- } |
- |
- // If there is nothing on the output the watched process has exited (slave end |
- // of pty is closed). |
- if (bytes_read <= 0) { |
- // Slave pseudo terminal has been closed, we won't need master fd anymore. |
- CloseFd(fd); |
- |
- // We have lost contact with the process, so report it. |
- on_read_callback_.Run(PROCESS_OUTPUT_TYPE_EXIT, ""); |
- } |
-} |
- |
-void ProcessOutputWatcher::OnStop() { |
- delete this; |
-} |