Index: net/base/tcp_client_socket_libevent.cc |
diff --git a/net/base/tcp_client_socket_libevent.cc b/net/base/tcp_client_socket_libevent.cc |
index 79909c20776f728e8600b453785e898d59081b92..7a9084be09edc838e6de0b88ce2feb4404273654 100644 |
--- a/net/base/tcp_client_socket_libevent.cc |
+++ b/net/base/tcp_client_socket_libevent.cc |
@@ -68,7 +68,6 @@ TCPClientSocket::TCPClientSocket(const AddressList& addresses) |
addresses_(addresses), |
current_ai_(addresses_.head()), |
waiting_connect_(false), |
- event_(new event), |
write_callback_(NULL), |
callback_(NULL) { |
} |
@@ -106,12 +105,17 @@ int TCPClientSocket::Connect(CompletionCallback* callback) { |
return MapPosixError(errno); |
} |
- // Initialize event_ and link it to our MessagePump. |
+ // Initialize socket_watcher_ and link it to our MessagePump. |
// POLLOUT is set if the connection is established. |
- // POLLIN is set if the connection fails, |
- // so select for both read and write. |
- MessageLoopForIO::current()->WatchSocket( |
- socket_, EV_READ|EV_WRITE|EV_PERSIST, event_.get(), this); |
+ // POLLIN is set if the connection fails. |
+ if (!MessageLoopForIO::current()->WatchFileDescriptor( |
+ socket_, true, MessageLoopForIO::WATCH_WRITE, &socket_watcher_, |
+ this)) { |
+ DLOG(INFO) << "WatchFileDescriptor failed: " << errno; |
+ close(socket_); |
+ socket_ = kInvalidSocket; |
+ return MapPosixError(errno); |
+ } |
waiting_connect_ = true; |
callback_ = callback; |
@@ -127,7 +131,7 @@ void TCPClientSocket::Disconnect() { |
if (socket_ == kInvalidSocket) |
return; |
- MessageLoopForIO::current()->UnwatchSocket(event_.get()); |
+ socket_watcher_.StopWatchingFileDescriptor(); |
close(socket_); |
socket_ = kInvalidSocket; |
waiting_connect_ = false; |
@@ -170,8 +174,12 @@ int TCPClientSocket::Read(char* buf, |
return MapPosixError(errno); |
} |
- MessageLoopForIO::current()->WatchSocket( |
- socket_, EV_READ|EV_PERSIST, event_.get(), this); |
+ if (!MessageLoopForIO::current()->WatchFileDescriptor( |
+ socket_, true, MessageLoopForIO::WATCH_READ, &socket_watcher_, this)) |
+ { |
+ DLOG(INFO) << "WatchFileDescriptor failed on read, errno " << errno; |
+ return MapPosixError(errno); |
+ } |
buf_ = buf; |
buf_len_ = buf_len; |
@@ -196,8 +204,13 @@ int TCPClientSocket::Write(const char* buf, |
if (errno != EAGAIN && errno != EWOULDBLOCK) |
return MapPosixError(errno); |
- MessageLoopForIO::current()->WatchSocket( |
- socket_, EV_WRITE|EV_PERSIST, event_.get(), this); |
+ if (!MessageLoopForIO::current()->WatchFileDescriptor( |
+ socket_, true, MessageLoopForIO::WATCH_WRITE, &socket_watcher_, this)) |
+ { |
+ DLOG(INFO) << "WatchFileDescriptor failed on write, errno " << errno; |
+ return MapPosixError(errno); |
+ } |
+ |
write_buf_ = buf; |
write_buf_len_ = buf_len; |
@@ -263,12 +276,13 @@ void TCPClientSocket::DidCompleteConnect() { |
result = Connect(callback_); |
} else { |
result = MapPosixError(error_code); |
- MessageLoopForIO::current()->UnwatchSocket(event_.get()); |
+ socket_watcher_.StopWatchingFileDescriptor(); |
waiting_connect_ = false; |
} |
- if (result != ERR_IO_PENDING) |
+ if (result != ERR_IO_PENDING) { |
DoCallback(result); |
+ } |
} |
void TCPClientSocket::DidCompleteRead() { |
@@ -285,7 +299,7 @@ void TCPClientSocket::DidCompleteRead() { |
if (result != ERR_IO_PENDING) { |
buf_ = NULL; |
buf_len_ = 0; |
- MessageLoopForIO::current()->UnwatchSocket(event_.get()); |
+ socket_watcher_.StopWatchingFileDescriptor(); |
DoCallback(result); |
} |
} |
@@ -304,21 +318,24 @@ void TCPClientSocket::DidCompleteWrite() { |
if (result != ERR_IO_PENDING) { |
write_buf_ = NULL; |
write_buf_len_ = 0; |
- MessageLoopForIO::current()->UnwatchSocket(event_.get()); |
+ socket_watcher_.StopWatchingFileDescriptor(); |
DoWriteCallback(result); |
} |
} |
-void TCPClientSocket::OnSocketReady(short flags) { |
- // the only used bits of flags are EV_READ and EV_WRITE |
+void TCPClientSocket::OnFileCanReadWithoutBlocking(int fd) { |
+ // When a socket connects it signals both Read and Write, we handle |
+ // DidCompleteConnect() in the write handler. |
+ if (!waiting_connect_ && callback_) { |
+ DidCompleteRead(); |
+ } |
+} |
+void TCPClientSocket::OnFileCanWriteWithoutBlocking(int fd) { |
if (waiting_connect_) { |
DidCompleteConnect(); |
- } else { |
- if ((flags & EV_WRITE) && write_callback_) |
- DidCompleteWrite(); |
- if ((flags & EV_READ) && callback_) |
- DidCompleteRead(); |
+ } else if (write_callback_) { |
+ DidCompleteWrite(); |
} |
} |