diff options
author | hclam@chromium.org <hclam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-11 03:46:18 +0000 |
---|---|---|
committer | hclam@chromium.org <hclam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-11 03:46:18 +0000 |
commit | 6d8a4fbb0aef29a45b3a660a017ac9ef44f7a9a5 (patch) | |
tree | 3b103267ec3ae3b3696b036fafd5c759a4750dcd /media | |
parent | d2d95aebafc2477ae93238e1c4aaec9b9b6d6bd1 (diff) | |
download | chromium_src-6d8a4fbb0aef29a45b3a660a017ac9ef44f7a9a5.zip chromium_src-6d8a4fbb0aef29a45b3a660a017ac9ef44f7a9a5.tar.gz chromium_src-6d8a4fbb0aef29a45b3a660a017ac9ef44f7a9a5.tar.bz2 |
Cast receiver hits a DCHECK if sending too fast
UdpTransport used by cast_receiver_app disregard the send callback.
If receiver is sending too fast it will send even if there is a pending
write. This will hit a DCHECK in UDPSocketLibevent.
The fix is to drop packets if there is a pending write.
BUG=b/12611188
Review URL: https://codereview.chromium.org/159053003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@250315 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media')
-rw-r--r-- | media/cast/transport/transport/udp_transport.cc | 9 | ||||
-rw-r--r-- | media/cast/transport/transport/udp_transport.h | 1 |
2 files changed, 10 insertions, 0 deletions
diff --git a/media/cast/transport/transport/udp_transport.cc b/media/cast/transport/transport/udp_transport.cc index 65962e2..39365a5 100644 --- a/media/cast/transport/transport/udp_transport.cc +++ b/media/cast/transport/transport/udp_transport.cc @@ -49,6 +49,7 @@ UdpTransport::UdpTransport( local_addr_(local_end_point), remote_addr_(remote_end_point), udp_socket_(new net::UDPServerSocket(NULL, net::NetLog::Source())), + send_pending_(false), recv_buf_(new net::IOBuffer(kMaxPacketSize)), status_callback_(status_callback), weak_factory_(this) { @@ -117,6 +118,11 @@ void UdpTransport::OnReceived(int result) { bool UdpTransport::SendPacket(const Packet& packet) { DCHECK(io_thread_proxy_->RunsTasksOnCurrentThread()); + if (send_pending_) { + VLOG(1) << "Cannot send because of pending IO."; + return false; + } + // TODO(hclam): This interface should take a net::IOBuffer to minimize // memcpy. scoped_refptr<net::IOBuffer> buf = new net::IOBuffer( @@ -127,6 +133,8 @@ bool UdpTransport::SendPacket(const Packet& packet) { static_cast<int>(packet.size()), remote_addr_, base::Bind(&UdpTransport::OnSent, weak_factory_.GetWeakPtr(), buf)); + if (ret == net::ERR_IO_PENDING) + send_pending_ = true; return ret == net::OK; } @@ -134,6 +142,7 @@ void UdpTransport::OnSent(const scoped_refptr<net::IOBuffer>& buf, int result) { DCHECK(io_thread_proxy_->RunsTasksOnCurrentThread()); + send_pending_ = false; if (result < 0) { LOG(ERROR) << "Failed to send packet: " << result << "."; status_callback_.Run(TRANSPORT_SOCKET_ERROR); diff --git a/media/cast/transport/transport/udp_transport.h b/media/cast/transport/transport/udp_transport.h index 1087c57..c4aa6e3 100644 --- a/media/cast/transport/transport/udp_transport.h +++ b/media/cast/transport/transport/udp_transport.h @@ -55,6 +55,7 @@ class UdpTransport : public PacketSender { net::IPEndPoint local_addr_; net::IPEndPoint remote_addr_; scoped_ptr<net::UDPServerSocket> udp_socket_; + bool send_pending_; scoped_refptr<net::IOBuffer> recv_buf_; net::IPEndPoint recv_addr_; PacketReceiverCallback packet_receiver_; |