summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorhclam@chromium.org <hclam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-11 03:46:18 +0000
committerhclam@chromium.org <hclam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-11 03:46:18 +0000
commit6d8a4fbb0aef29a45b3a660a017ac9ef44f7a9a5 (patch)
tree3b103267ec3ae3b3696b036fafd5c759a4750dcd /media
parentd2d95aebafc2477ae93238e1c4aaec9b9b6d6bd1 (diff)
downloadchromium_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.cc9
-rw-r--r--media/cast/transport/transport/udp_transport.h1
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_;