Index: media/cast/net/pacing/paced_sender.cc |
diff --git a/media/cast/net/pacing/paced_sender.cc b/media/cast/net/pacing/paced_sender.cc |
index 3dc21b831848433346e1e7e179acfca65dd74b43..6b39f07408ccfbebd7e197b2d8d834a377949f4b 100644 |
--- a/media/cast/net/pacing/paced_sender.cc |
+++ b/media/cast/net/pacing/paced_sender.cc |
@@ -6,6 +6,7 @@ |
#include "base/big_endian.h" |
#include "base/bind.h" |
+#include "base/debug/dump_without_crashing.h" |
#include "base/message_loop/message_loop.h" |
#include "media/cast/logging/logging_impl.h" |
@@ -20,6 +21,12 @@ static const int64 kPacingIntervalMs = 10; |
static const size_t kPacingMaxBurstsPerFrame = 3; |
static const size_t kMaxDedupeWindowMs = 500; |
+// "Impossible" upper-bound on the maximum number of packets that should ever be |
+// enqueued in the pacer. This is used to detect bugs, reported as crash dumps. |
+static const size_t kHugeQueueLengthSeconds = 10; |
+static const size_t kRidiculousNumberOfPackets = |
+ kHugeQueueLengthSeconds * (kMaxBurstSize * 1000 / kPacingIntervalMs); |
+ |
} // namespace |
DedupInfo::DedupInfo() : last_byte_acked_for_audio(0) {} |
@@ -54,6 +61,7 @@ PacedSender::PacedSender( |
next_next_max_burst_size_(target_burst_size_), |
current_burst_size_(0), |
state_(State_Unblocked), |
+ has_reached_upper_bound_once_(false), |
weak_factory_(this) { |
} |
@@ -222,6 +230,15 @@ void PacedSender::SendStoredPackets() { |
return; |
} |
+ // If the queue ever becomes impossibly long, send a crash dump without |
+ // actually crashing the process. |
+ if (size() > kRidiculousNumberOfPackets && !has_reached_upper_bound_once_) { |
+ NOTREACHED(); |
+ // Please use Cr=Internals-Cast label in bug reports: |
+ base::debug::DumpWithoutCrashing(); |
+ has_reached_upper_bound_once_ = true; |
+ } |
+ |
base::TimeTicks now = clock_->NowTicks(); |
// I don't actually trust that PostDelayTask(x - now) will mean that |
// now >= x when the call happens, so check if the previous state was |
@@ -244,14 +261,6 @@ void PacedSender::SendStoredPackets() { |
size_t max_burst_size = std::min( |
max_burst_size_, |
std::max(target_burst_size_, size() / kPacingMaxBurstsPerFrame)); |
- |
- // If the queue is long, issue a warning. Try to limit the number of |
- // warnings issued by only issuing the warning when the burst size |
- // grows. Otherwise we might get 100 warnings per second. |
- if (max_burst_size > next_next_max_burst_size_ && size() > 100) { |
- LOG(WARNING) << "Packet queue is very long:" << size(); |
- } |
- |
current_max_burst_size_ = std::max(next_max_burst_size_, max_burst_size); |
next_max_burst_size_ = std::max(next_next_max_burst_size_, max_burst_size); |
next_next_max_burst_size_ = max_burst_size; |