Index: tools/android/forwarder2/socket.cc |
diff --git a/tools/android/forwarder2/socket.cc b/tools/android/forwarder2/socket.cc |
index 12729b406c04f3adff767914a55a51638b2a4da1..6a2dd2aa57b0ede065a8c9072b4ce8fcb72ce30b 100644 |
--- a/tools/android/forwarder2/socket.cc |
+++ b/tools/android/forwarder2/socket.cc |
@@ -73,9 +73,7 @@ Socket::Socket() |
socket_error_(false), |
family_(AF_INET), |
addr_ptr_(reinterpret_cast<sockaddr*>(&addr_.addr4)), |
- addr_len_(sizeof(sockaddr)), |
- exit_notifier_fd_(-1), |
- exited_(false) { |
+ addr_len_(sizeof(sockaddr)) { |
memset(&addr_, 0, sizeof(addr_)); |
} |
@@ -330,6 +328,27 @@ int Socket::WriteString(const std::string& buffer) { |
return WriteNumBytes(buffer.c_str(), buffer.size()); |
} |
+void Socket::AddEventFd(int event_fd) { |
+ Event event; |
+ event.fd = event_fd; |
+ event.was_fired = false; |
+ events_.push_back(event); |
+} |
+ |
+bool Socket::DidReceiveEventOnFd(int fd) const { |
+ for (int i = 0; i < events_.size(); ++i) |
digit1
2013/05/15 10:13:46
better use size_t.
Also please check with clang-fo
Philippe
2013/05/15 11:40:50
Done.
|
+ if (events_[i].fd == fd) |
+ return events_[i].was_fired; |
+ return false; |
+} |
+ |
+bool Socket::DidReceiveEvent() const { |
+ for (int i = 0; i < events_.size(); ++i) |
+ if (events_[i].was_fired) |
+ return true; |
+ return false; |
+} |
+ |
int Socket::WriteNumBytes(const void* buffer, size_t num_bytes) { |
int bytes_written = 0; |
int ret = 1; |
@@ -343,9 +362,13 @@ int Socket::WriteNumBytes(const void* buffer, size_t num_bytes) { |
} |
bool Socket::WaitForEvent(EventType type, int timeout_secs) { |
- if (exit_notifier_fd_ == -1 || socket_ == -1) |
+ if (events_.empty() || socket_ == -1) |
return true; |
- const int nfds = std::max(socket_, exit_notifier_fd_) + 1; |
+ int max_event_fd = -1; |
digit1
2013/05/15 10:13:46
suggestion: initialize this to socket_ to avoid th
Philippe
2013/05/15 11:40:50
Good point.
|
+ for (int i = 0; i < events_.size(); ++i) |
+ if (events_[i].fd > max_event_fd) |
+ max_event_fd = events_[i].fd; |
+ const int nfds = std::max(socket_, max_event_fd) + 1; |
fd_set read_fds; |
fd_set write_fds; |
FD_ZERO(&read_fds); |
@@ -354,8 +377,8 @@ bool Socket::WaitForEvent(EventType type, int timeout_secs) { |
FD_SET(socket_, &read_fds); |
else |
FD_SET(socket_, &write_fds); |
- FD_SET(exit_notifier_fd_, &read_fds); |
- |
+ for (int i = 0; i < events_.size(); ++i) |
+ FD_SET(events_[i].fd, &read_fds); |
timeval tv = {}; |
timeval* tv_ptr = NULL; |
if (timeout_secs > 0) { |
@@ -365,11 +388,14 @@ bool Socket::WaitForEvent(EventType type, int timeout_secs) { |
} |
if (HANDLE_EINTR(select(nfds, &read_fds, &write_fds, NULL, tv_ptr)) <= 0) |
return false; |
- if (FD_ISSET(exit_notifier_fd_, &read_fds)) { |
- exited_ = true; |
- return false; |
+ bool event_was_fired = false; |
+ for (int i = 0; i < events_.size(); ++i) { |
+ if (FD_ISSET(events_[i].fd, &read_fds)) { |
+ events_[i].was_fired = true; |
+ event_was_fired = true; |
+ } |
} |
- return true; |
+ return !event_was_fired; |
} |
// static |