diff options
author | jhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-12-07 02:03:33 +0000 |
---|---|---|
committer | jhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-12-07 02:03:33 +0000 |
commit | 3f55aa10587b3eaa629d7e95de87998b399fe3e2 (patch) | |
tree | 0f407a7e7fc837bed337a9a5af787edbd9473ef6 /net/socket/tcp_client_socket_libevent.cc | |
parent | b456003a580041d83e7f5a998c15f62ce380560f (diff) | |
download | chromium_src-3f55aa10587b3eaa629d7e95de87998b399fe3e2.zip chromium_src-3f55aa10587b3eaa629d7e95de87998b399fe3e2.tar.gz chromium_src-3f55aa10587b3eaa629d7e95de87998b399fe3e2.tar.bz2 |
base::Bind: Convert Socket::Read.
BUG=none
TEST=none
R=csilv
Review URL: http://codereview.chromium.org/8801005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@113326 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/socket/tcp_client_socket_libevent.cc')
-rw-r--r-- | net/socket/tcp_client_socket_libevent.cc | 57 |
1 files changed, 51 insertions, 6 deletions
diff --git a/net/socket/tcp_client_socket_libevent.cc b/net/socket/tcp_client_socket_libevent.cc index 7c8af80..3c99ae5 100644 --- a/net/socket/tcp_client_socket_libevent.cc +++ b/net/socket/tcp_client_socket_libevent.cc @@ -130,7 +130,7 @@ TCPClientSocketLibevent::TCPClientSocketLibevent( current_ai_(NULL), read_watcher_(this), write_watcher_(this), - read_callback_(NULL), + old_read_callback_(NULL), old_write_callback_(NULL), next_connect_state_(CONNECT_STATE_NONE), connect_os_error_(0), @@ -465,7 +465,7 @@ int TCPClientSocketLibevent::Read(IOBuffer* buf, DCHECK(CalledOnValidThread()); DCHECK_NE(kInvalidSocket, socket_); DCHECK(!waiting_connect()); - DCHECK(!read_callback_); + DCHECK(!old_read_callback_ && read_callback_.is_null()); // Synchronous operation not supported DCHECK(callback); DCHECK_GT(buf_len, 0); @@ -495,6 +495,45 @@ int TCPClientSocketLibevent::Read(IOBuffer* buf, read_buf_ = buf; read_buf_len_ = buf_len; + old_read_callback_ = callback; + return ERR_IO_PENDING; +} +int TCPClientSocketLibevent::Read(IOBuffer* buf, + int buf_len, + const CompletionCallback& callback) { + DCHECK(CalledOnValidThread()); + DCHECK_NE(kInvalidSocket, socket_); + DCHECK(!waiting_connect()); + DCHECK(!old_read_callback_ && read_callback_.is_null()); + // Synchronous operation not supported + DCHECK(!callback.is_null()); + DCHECK_GT(buf_len, 0); + + int nread = HANDLE_EINTR(read(socket_, buf->data(), buf_len)); + if (nread >= 0) { + base::StatsCounter read_bytes("tcp.read_bytes"); + read_bytes.Add(nread); + num_bytes_read_ += static_cast<int64>(nread); + if (nread > 0) + use_history_.set_was_used_to_convey_data(); + net_log_.AddByteTransferEvent(NetLog::TYPE_SOCKET_BYTES_RECEIVED, nread, + buf->data()); + return nread; + } + if (errno != EAGAIN && errno != EWOULDBLOCK) { + DVLOG(1) << "read failed, errno " << errno; + return MapSystemError(errno); + } + + if (!MessageLoopForIO::current()->WatchFileDescriptor( + socket_, true, MessageLoopForIO::WATCH_READ, + &read_socket_watcher_, &read_watcher_)) { + DVLOG(1) << "WatchFileDescriptor failed on read, errno " << errno; + return MapSystemError(errno); + } + + read_buf_ = buf; + read_buf_len_ = buf_len; read_callback_ = callback; return ERR_IO_PENDING; } @@ -618,12 +657,18 @@ void TCPClientSocketLibevent::LogConnectCompletion(int net_error) { void TCPClientSocketLibevent::DoReadCallback(int rv) { DCHECK_NE(rv, ERR_IO_PENDING); - DCHECK(read_callback_); + DCHECK(old_read_callback_ || !read_callback_.is_null()); // since Run may result in Read being called, clear read_callback_ up front. - OldCompletionCallback* c = read_callback_; - read_callback_ = NULL; - c->Run(rv); + if (old_read_callback_) { + OldCompletionCallback* c = old_read_callback_; + old_read_callback_ = NULL; + c->Run(rv); + } else { + CompletionCallback c = read_callback_; + read_callback_.Reset(); + c.Run(rv); + } } void TCPClientSocketLibevent::DoWriteCallback(int rv) { |