Avoids potential rounding of -inf time delta in TaskQueuePacedSender.
This rounding triggers a dcheck that crashes debug builds.
Furtunately, in release mode this does not matter as the resulting
value is anyway capped to 0.
Unfortunately, it is almost impossible to write a test for this even
with simulated time as the conditions needed to trigger this condition
includes thread scheduling being slightly off in such a way that an
unscheduled process call preempts a scheduled one at a time when
sending a sufficiently large padding packet becomes possible - and
right after starting a new probe cluster.
We should consider updating this class to make unit testing easier.
Bug: webrtc:10809
Change-Id: I533e6e716bddc106d11e82a9e3edb4e0035fd21c
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/192786
Reviewed-by: Per Kjellander <perkj@webrtc.org>
Commit-Queue: Erik Språng <sprang@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#32589}
diff --git a/modules/pacing/task_queue_paced_sender.cc b/modules/pacing/task_queue_paced_sender.cc
index eb8b11b..69ec545 100644
--- a/modules/pacing/task_queue_paced_sender.cc
+++ b/modules/pacing/task_queue_paced_sender.cc
@@ -224,9 +224,13 @@
// If we're probing and there isn't already a wakeup scheduled for the next
// process time, always post a task and just round sleep time down to
// nearest millisecond.
- time_to_next_process =
- std::max(TimeDelta::Zero(),
- (next_process_time - now).RoundDownTo(TimeDelta::Millis(1)));
+ if (next_process_time.IsMinusInfinity()) {
+ time_to_next_process = TimeDelta::Zero();
+ } else {
+ time_to_next_process =
+ std::max(TimeDelta::Zero(),
+ (next_process_time - now).RoundDownTo(TimeDelta::Millis(1)));
+ }
} else if (next_process_time_.IsMinusInfinity() ||
next_process_time <= next_process_time_ - hold_back_window_) {
// Schedule a new task since there is none currently scheduled