diff options
author | jhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-12-08 23:51:15 +0000 |
---|---|---|
committer | jhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-12-08 23:51:15 +0000 |
commit | 293f154b854a3507de8ed4116e8529f633060810 (patch) | |
tree | 63cc680a578707f0188e2615ebcd407906040166 /net/udp | |
parent | 4c6df432834aa4541044a0890f774b25e15e7746 (diff) | |
download | chromium_src-293f154b854a3507de8ed4116e8529f633060810.zip chromium_src-293f154b854a3507de8ed4116e8529f633060810.tar.gz chromium_src-293f154b854a3507de8ed4116e8529f633060810.tar.bz2 |
base::Bind: Convert Socket::Write.
BUG=none
TEST=none
R=csilv
Review URL: http://codereview.chromium.org/8831001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@113699 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/udp')
-rw-r--r-- | net/udp/udp_client_socket.cc | 5 | ||||
-rw-r--r-- | net/udp/udp_client_socket.h | 2 | ||||
-rw-r--r-- | net/udp/udp_socket_libevent.cc | 58 | ||||
-rw-r--r-- | net/udp/udp_socket_libevent.h | 10 | ||||
-rw-r--r-- | net/udp/udp_socket_win.cc | 47 | ||||
-rw-r--r-- | net/udp/udp_socket_win.h | 8 |
6 files changed, 113 insertions, 17 deletions
diff --git a/net/udp/udp_client_socket.cc b/net/udp/udp_client_socket.cc index 4bb3885..08b2cbe 100644 --- a/net/udp/udp_client_socket.cc +++ b/net/udp/udp_client_socket.cc @@ -38,6 +38,11 @@ int UDPClientSocket::Write(IOBuffer* buf, OldCompletionCallback* callback) { return socket_.Write(buf, buf_len, callback); } +int UDPClientSocket::Write(IOBuffer* buf, + int buf_len, + const CompletionCallback& callback) { + return socket_.Write(buf, buf_len, callback); +} void UDPClientSocket::Close() { socket_.Close(); diff --git a/net/udp/udp_client_socket.h b/net/udp/udp_client_socket.h index b25df63..2fee21a 100644 --- a/net/udp/udp_client_socket.h +++ b/net/udp/udp_client_socket.h @@ -32,6 +32,8 @@ class NET_EXPORT_PRIVATE UDPClientSocket : public DatagramClientSocket { const CompletionCallback& callback) OVERRIDE; virtual int Write(IOBuffer* buf, int buf_len, OldCompletionCallback* callback) OVERRIDE; + virtual int Write(IOBuffer* buf, int buf_len, + const CompletionCallback& callback) OVERRIDE; virtual void Close() OVERRIDE; virtual int GetPeerAddress(IPEndPoint* address) const OVERRIDE; virtual int GetLocalAddress(IPEndPoint* address) const OVERRIDE; diff --git a/net/udp/udp_socket_libevent.cc b/net/udp/udp_socket_libevent.cc index a669c37..9777626 100644 --- a/net/udp/udp_socket_libevent.cc +++ b/net/udp/udp_socket_libevent.cc @@ -48,7 +48,7 @@ UDPSocketLibevent::UDPSocketLibevent( recv_from_address_(NULL), write_buf_len_(0), old_read_callback_(NULL), - write_callback_(NULL), + old_write_callback_(NULL), net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_UDP_SOCKET)) { scoped_refptr<NetLog::EventParameters> params; if (source.is_valid()) @@ -77,7 +77,8 @@ void UDPSocketLibevent::Close() { recv_from_address_ = NULL; write_buf_ = NULL; write_buf_len_ = 0; - write_callback_ = NULL; + old_write_callback_ = NULL; + write_callback_.Reset(); send_to_address_.reset(); bool ok = read_socket_watcher_.StopWatchingFileDescriptor(); @@ -212,6 +213,11 @@ int UDPSocketLibevent::Write(IOBuffer* buf, OldCompletionCallback* callback) { return SendToOrWrite(buf, buf_len, NULL, callback); } +int UDPSocketLibevent::Write(IOBuffer* buf, + int buf_len, + const CompletionCallback& callback) { + return SendToOrWrite(buf, buf_len, NULL, callback); +} int UDPSocketLibevent::SendTo(IOBuffer* buf, int buf_len, @@ -226,7 +232,7 @@ int UDPSocketLibevent::SendToOrWrite(IOBuffer* buf, OldCompletionCallback* callback) { DCHECK(CalledOnValidThread()); DCHECK_NE(kInvalidSocket, socket_); - DCHECK(!write_callback_); + DCHECK(!old_write_callback_ && write_callback_.is_null()); DCHECK(callback); // Synchronous operation not supported DCHECK_GT(buf_len, 0); @@ -249,6 +255,38 @@ int UDPSocketLibevent::SendToOrWrite(IOBuffer* buf, if (address) { send_to_address_.reset(new IPEndPoint(*address)); } + old_write_callback_ = callback; + return ERR_IO_PENDING; +} +int UDPSocketLibevent::SendToOrWrite(IOBuffer* buf, + int buf_len, + const IPEndPoint* address, + const CompletionCallback& callback) { + DCHECK(CalledOnValidThread()); + DCHECK_NE(kInvalidSocket, socket_); + DCHECK(!old_write_callback_ && write_callback_.is_null()); + DCHECK(!callback.is_null()); // Synchronous operation not supported + DCHECK_GT(buf_len, 0); + + int result = InternalSendTo(buf, buf_len, address); + if (result != ERR_IO_PENDING) + return result; + + if (!MessageLoopForIO::current()->WatchFileDescriptor( + socket_, true, MessageLoopForIO::WATCH_WRITE, + &write_socket_watcher_, &write_watcher_)) { + DVLOG(1) << "WatchFileDescriptor failed on write, errno " << errno; + int result = MapSystemError(errno); + LogWrite(result, NULL, NULL); + return result; + } + + write_buf_ = buf; + write_buf_len_ = buf_len; + DCHECK(!send_to_address_.get()); + if (address) { + send_to_address_.reset(new IPEndPoint(*address)); + } write_callback_ = callback; return ERR_IO_PENDING; } @@ -339,12 +377,18 @@ void UDPSocketLibevent::DoReadCallback(int rv) { void UDPSocketLibevent::DoWriteCallback(int rv) { DCHECK_NE(rv, ERR_IO_PENDING); - DCHECK(write_callback_); + DCHECK(old_write_callback_ || !write_callback_.is_null()); // since Run may result in Write being called, clear write_callback_ up front. - OldCompletionCallback* c = write_callback_; - write_callback_ = NULL; - c->Run(rv); + if (old_write_callback_) { + OldCompletionCallback* c = old_write_callback_; + old_write_callback_ = NULL; + c->Run(rv); + } else { + CompletionCallback c = write_callback_; + write_callback_.Reset(); + c.Run(rv); + } } void UDPSocketLibevent::DidCompleteRead() { diff --git a/net/udp/udp_socket_libevent.h b/net/udp/udp_socket_libevent.h index 6cef1c0..45ec1bb 100644 --- a/net/udp/udp_socket_libevent.h +++ b/net/udp/udp_socket_libevent.h @@ -61,6 +61,7 @@ class UDPSocketLibevent : public base::NonThreadSafe { // Only usable from the client-side of a UDP socket, after the socket // has been connected. int Write(IOBuffer* buf, int buf_len, OldCompletionCallback* callback); + int Write(IOBuffer* buf, int buf_len, const CompletionCallback& callback); // Read from a socket and receive sender address information. // |buf| is the buffer to read data into. @@ -140,7 +141,7 @@ class UDPSocketLibevent : public base::NonThreadSafe { virtual void OnFileCanReadWithoutBlocking(int /* fd */) OVERRIDE {} virtual void OnFileCanWriteWithoutBlocking(int /* fd */) OVERRIDE { - if (socket_->write_callback_) + if (socket_->old_write_callback_) socket_->DidCompleteWrite(); } @@ -173,6 +174,10 @@ class UDPSocketLibevent : public base::NonThreadSafe { int buf_len, const IPEndPoint* address, OldCompletionCallback* callback); + int SendToOrWrite(IOBuffer* buf, + int buf_len, + const IPEndPoint* address, + const CompletionCallback& callback); int InternalConnect(const IPEndPoint& address); int InternalRecvFrom(IOBuffer* buf, int buf_len, IPEndPoint* address); @@ -218,7 +223,8 @@ class UDPSocketLibevent : public base::NonThreadSafe { CompletionCallback read_callback_; // External callback; called when write is complete. - OldCompletionCallback* write_callback_; + OldCompletionCallback* old_write_callback_; + CompletionCallback write_callback_; BoundNetLog net_log_; diff --git a/net/udp/udp_socket_win.cc b/net/udp/udp_socket_win.cc index 88aa23b..6499444 100644 --- a/net/udp/udp_socket_win.cc +++ b/net/udp/udp_socket_win.cc @@ -52,7 +52,7 @@ UDPSocketWin::UDPSocketWin(DatagramSocket::BindType bind_type, ALLOW_THIS_IN_INITIALIZER_LIST(write_delegate_(this)), recv_from_address_(NULL), old_read_callback_(NULL), - write_callback_(NULL), + old_write_callback_(NULL), net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_UDP_SOCKET)) { EnsureWinsockInit(); scoped_refptr<NetLog::EventParameters> params; @@ -82,7 +82,8 @@ void UDPSocketWin::Close() { old_read_callback_ = NULL; read_callback_.Reset(); recv_from_address_ = NULL; - write_callback_ = NULL; + old_write_callback_ = NULL; + write_callback_.Reset(); read_watcher_.StopWatching(); write_watcher_.StopWatching(); @@ -192,6 +193,11 @@ int UDPSocketWin::Write(IOBuffer* buf, OldCompletionCallback* callback) { return SendToOrWrite(buf, buf_len, NULL, callback); } +int UDPSocketWin::Write(IOBuffer* buf, + int buf_len, + const CompletionCallback& callback) { + return SendToOrWrite(buf, buf_len, NULL, callback); +} int UDPSocketWin::SendTo(IOBuffer* buf, int buf_len, @@ -206,7 +212,7 @@ int UDPSocketWin::SendToOrWrite(IOBuffer* buf, OldCompletionCallback* callback) { DCHECK(CalledOnValidThread()); DCHECK_NE(INVALID_SOCKET, socket_); - DCHECK(!write_callback_); + DCHECK(!old_write_callback_ && write_callback_.is_null()); DCHECK(callback); // Synchronous operation not supported. DCHECK_GT(buf_len, 0); DCHECK(!send_to_address_.get()); @@ -218,6 +224,27 @@ int UDPSocketWin::SendToOrWrite(IOBuffer* buf, if (address) send_to_address_.reset(new IPEndPoint(*address)); write_iobuffer_ = buf; + old_write_callback_ = callback; + return ERR_IO_PENDING; +} +int UDPSocketWin::SendToOrWrite(IOBuffer* buf, + int buf_len, + const IPEndPoint* address, + const CompletionCallback& callback) { + DCHECK(CalledOnValidThread()); + DCHECK_NE(INVALID_SOCKET, socket_); + DCHECK(!old_write_callback_ && write_callback_.is_null()); + DCHECK(!callback.is_null()); // Synchronous operation not supported. + DCHECK_GT(buf_len, 0); + DCHECK(!send_to_address_.get()); + + int nwrite = InternalSendTo(buf, buf_len, address); + if (nwrite != ERR_IO_PENDING) + return nwrite; + + if (address) + send_to_address_.reset(new IPEndPoint(*address)); + write_iobuffer_ = buf; write_callback_ = callback; return ERR_IO_PENDING; } @@ -314,12 +341,18 @@ void UDPSocketWin::DoReadCallback(int rv) { void UDPSocketWin::DoWriteCallback(int rv) { DCHECK_NE(rv, ERR_IO_PENDING); - DCHECK(write_callback_); + DCHECK(old_write_callback_ && !write_callback_.is_null()); // since Run may result in Write being called, clear write_callback_ up front. - OldCompletionCallback* c = write_callback_; - write_callback_ = NULL; - c->Run(rv); + if (old_write_callback_) { + OldCompletionCallback* c = old_write_callback_; + old_write_callback_ = NULL; + c->Run(rv); + } else { + CompletionCallback c = write_callback_; + write_callback_.Reset(); + c.Run(rv); + } } void UDPSocketWin::DidCompleteRead() { diff --git a/net/udp/udp_socket_win.h b/net/udp/udp_socket_win.h index 6aace29..4436860 100644 --- a/net/udp/udp_socket_win.h +++ b/net/udp/udp_socket_win.h @@ -62,6 +62,7 @@ class UDPSocketWin : public base::NonThreadSafe { // Only usable from the client-side of a UDP socket, after the socket // has been connected. int Write(IOBuffer* buf, int buf_len, OldCompletionCallback* callback); + int Write(IOBuffer* buf, int buf_len, const CompletionCallback& callback); // Read from a socket and receive sender address information. // |buf| is the buffer to read data into. @@ -156,6 +157,10 @@ class UDPSocketWin : public base::NonThreadSafe { int buf_len, const IPEndPoint* address, OldCompletionCallback* callback); + int SendToOrWrite(IOBuffer* buf, + int buf_len, + const IPEndPoint* address, + const CompletionCallback& callback); int InternalConnect(const IPEndPoint& address); int InternalRecvFrom(IOBuffer* buf, int buf_len, IPEndPoint* address); @@ -212,7 +217,8 @@ class UDPSocketWin : public base::NonThreadSafe { CompletionCallback read_callback_; // External callback; called when write is complete. - OldCompletionCallback* write_callback_; + OldCompletionCallback* old_write_callback_; + CompletionCallback write_callback_; BoundNetLog net_log_; |