Index: net/test/test_server_posix.cc |
diff --git a/net/test/test_server_posix.cc b/net/test/test_server_posix.cc |
index 707eb93180a9b91595fe8c8b6af24e15746d283d..9c0210b7d28429901ffec57384e7e3f6a7fc3c95 100644 |
--- a/net/test/test_server_posix.cc |
+++ b/net/test/test_server_posix.cc |
@@ -98,24 +98,45 @@ bool TestServer::LaunchPython(const FilePath& testserver_path) { |
} |
bool TestServer::WaitToStart() { |
- struct pollfd poll_fds[1]; |
- |
- poll_fds[0].fd = child_fd_; |
- poll_fds[0].events = POLLIN | POLLPRI; |
- poll_fds[0].revents = 0; |
+ uint16 port; |
+ uint8* buffer = reinterpret_cast<uint8*>(&port); |
+ ssize_t bytes_read = 0; |
+ ssize_t bytes_max = sizeof(port); |
+ base::TimeDelta remaining_time = base::TimeDelta::FromMilliseconds( |
+ TestTimeouts::action_max_timeout_ms()); |
+ base::Time previous_time = base::Time::Now(); |
+ while (bytes_read < bytes_max) { |
+ struct pollfd poll_fds[1]; |
+ |
+ poll_fds[0].fd = child_fd_; |
+ poll_fds[0].events = POLLIN | POLLPRI; |
+ poll_fds[0].revents = 0; |
+ |
+ int rv = HANDLE_EINTR(poll(poll_fds, 1, remaining_time.InMilliseconds())); |
+ if (rv != 1) { |
+ LOG(ERROR) << "Failed to poll for the child file descriptor."; |
+ return false; |
+ } |
- int rv = HANDLE_EINTR(poll(poll_fds, 1, |
- TestTimeouts::action_max_timeout_ms())); |
- if (rv != 1) { |
- LOG(ERROR) << "Failed to poll for the child file descriptor."; |
- return false; |
+ base::Time current_time = base::Time::Now(); |
+ base::TimeDelta elapsed_time_cycle = current_time - previous_time; |
+ DCHECK(elapsed_time_cycle.InMilliseconds() >= 0); |
+ remaining_time -= elapsed_time_cycle; |
+ previous_time = current_time; |
+ |
+ ssize_t num_bytes = HANDLE_EINTR(read(child_fd_, buffer + bytes_read, |
+ bytes_max - bytes_read)); |
+ if (num_bytes <= 0) |
+ break; |
+ bytes_read += num_bytes; |
} |
- char buf[8]; |
- ssize_t n = HANDLE_EINTR(read(child_fd_, buf, sizeof(buf))); |
// We don't need the FD anymore. |
child_fd_closer_.reset(NULL); |
- return n > 0; |
+ if (bytes_read < bytes_max) |
+ return false; |
+ host_port_pair_.set_port(port); |
+ return true; |
} |
bool TestServer::CheckCATrusted() { |