dcsctp: Use InfiniteDuration for no max duration
Before this change, a timer could have an optional max duration. Either that value was present, and that limited the max duration of the timer, or it was absl::nullopt, which represented "no limit". To simplify the interface, this CL makes that value "not optional" by having it always present. The previous "no limit" is now represented by DurationMs::InfiniteDuration. This is just a refactoring of internal interfaces - public interfaces are left untouched. Bug: webrtc:15593 Change-Id: I80df1d9b2f4d208411ce6cb5045db0a57865e3b4 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/325280 Reviewed-by: Florent Castelli <orphis@webrtc.org> Commit-Queue: Victor Boivie <boivie@webrtc.org> Cr-Commit-Position: refs/heads/main@{#41040}
This commit is contained in:
parent
e677c7937e
commit
f3e9db9e17
@ -25,6 +25,7 @@
|
||||
#include "net/dcsctp/packet/chunk/sack_chunk.h"
|
||||
#include "net/dcsctp/packet/sctp_packet.h"
|
||||
#include "net/dcsctp/public/dcsctp_options.h"
|
||||
#include "net/dcsctp/public/types.h"
|
||||
#include "net/dcsctp/rx/data_tracker.h"
|
||||
#include "net/dcsctp/rx/reassembly_queue.h"
|
||||
#include "net/dcsctp/socket/capabilities.h"
|
||||
@ -63,7 +64,9 @@ TransmissionControlBlock::TransmissionControlBlock(
|
||||
TimerOptions(options.rto_initial,
|
||||
TimerBackoffAlgorithm::kExponential,
|
||||
/*max_restarts=*/absl::nullopt,
|
||||
options.max_timer_backoff_duration))),
|
||||
options.max_timer_backoff_duration.has_value()
|
||||
? *options.max_timer_backoff_duration
|
||||
: DurationMs::InfiniteDuration()))),
|
||||
delayed_ack_timer_(timer_manager_.CreateTimer(
|
||||
"delayed-ack",
|
||||
absl::bind_front(&TransmissionControlBlock::OnDelayedAckTimerExpiry,
|
||||
@ -71,7 +74,7 @@ TransmissionControlBlock::TransmissionControlBlock(
|
||||
TimerOptions(options.delayed_ack_max_timeout,
|
||||
TimerBackoffAlgorithm::kExponential,
|
||||
/*max_restarts=*/0,
|
||||
/*max_backoff_duration=*/absl::nullopt,
|
||||
/*max_backoff_duration=*/DurationMs::InfiniteDuration(),
|
||||
webrtc::TaskQueueBase::DelayPrecision::kHigh))),
|
||||
my_verification_tag_(my_verification_tag),
|
||||
my_initial_tsn_(my_initial_tsn),
|
||||
|
||||
@ -33,19 +33,18 @@ DurationMs GetBackoffDuration(const TimerOptions& options,
|
||||
case TimerBackoffAlgorithm::kFixed:
|
||||
return base_duration;
|
||||
case TimerBackoffAlgorithm::kExponential: {
|
||||
int32_t duration_ms = *base_duration;
|
||||
DurationMs duration = base_duration;
|
||||
|
||||
while (expiration_count > 0 && duration_ms < *Timer::kMaxTimerDuration) {
|
||||
duration_ms *= 2;
|
||||
while (expiration_count > 0 && duration < Timer::kMaxTimerDuration) {
|
||||
duration *= 2;
|
||||
--expiration_count;
|
||||
|
||||
if (options.max_backoff_duration.has_value() &&
|
||||
duration_ms > **options.max_backoff_duration) {
|
||||
return *options.max_backoff_duration;
|
||||
if (duration > options.max_backoff_duration) {
|
||||
return options.max_backoff_duration;
|
||||
}
|
||||
}
|
||||
|
||||
return DurationMs(std::min(duration_ms, *Timer::kMaxTimerDuration));
|
||||
return DurationMs(std::min(duration, Timer::kMaxTimerDuration));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -47,12 +47,14 @@ struct TimerOptions {
|
||||
TimerOptions(DurationMs duration,
|
||||
TimerBackoffAlgorithm backoff_algorithm,
|
||||
absl::optional<int> max_restarts)
|
||||
: TimerOptions(duration, backoff_algorithm, max_restarts, absl::nullopt) {
|
||||
}
|
||||
: TimerOptions(duration,
|
||||
backoff_algorithm,
|
||||
max_restarts,
|
||||
DurationMs::InfiniteDuration()) {}
|
||||
TimerOptions(DurationMs duration,
|
||||
TimerBackoffAlgorithm backoff_algorithm,
|
||||
absl::optional<int> max_restarts,
|
||||
absl::optional<DurationMs> max_backoff_duration)
|
||||
DurationMs max_backoff_duration)
|
||||
: TimerOptions(duration,
|
||||
backoff_algorithm,
|
||||
max_restarts,
|
||||
@ -61,7 +63,7 @@ struct TimerOptions {
|
||||
TimerOptions(DurationMs duration,
|
||||
TimerBackoffAlgorithm backoff_algorithm,
|
||||
absl::optional<int> max_restarts,
|
||||
absl::optional<DurationMs> max_backoff_duration,
|
||||
DurationMs max_backoff_duration,
|
||||
webrtc::TaskQueueBase::DelayPrecision precision)
|
||||
: duration(duration),
|
||||
backoff_algorithm(backoff_algorithm),
|
||||
@ -78,7 +80,7 @@ struct TimerOptions {
|
||||
// or absl::nullopt if there is no limit.
|
||||
const absl::optional<int> max_restarts;
|
||||
// The maximum timeout value for exponential backoff.
|
||||
const absl::optional<DurationMs> max_backoff_duration;
|
||||
const DurationMs max_backoff_duration;
|
||||
// The precision of the webrtc::TaskQueueBase used for scheduling.
|
||||
const webrtc::TaskQueueBase::DelayPrecision precision;
|
||||
};
|
||||
|
||||
@ -442,7 +442,7 @@ TEST(TimerManagerTest, TimerManagerPassesPrecisionToCreateTimeoutMethod) {
|
||||
manager.CreateTimer(
|
||||
"test_timer", []() { return absl::optional<DurationMs>(); },
|
||||
TimerOptions(DurationMs(123), TimerBackoffAlgorithm::kExponential,
|
||||
absl::nullopt, absl::nullopt,
|
||||
absl::nullopt, DurationMs::InfiniteDuration(),
|
||||
webrtc::TaskQueueBase::DelayPrecision::kHigh));
|
||||
EXPECT_EQ(create_timer_precison,
|
||||
webrtc::TaskQueueBase::DelayPrecision::kHigh);
|
||||
@ -450,7 +450,7 @@ TEST(TimerManagerTest, TimerManagerPassesPrecisionToCreateTimeoutMethod) {
|
||||
manager.CreateTimer(
|
||||
"test_timer", []() { return absl::optional<DurationMs>(); },
|
||||
TimerOptions(DurationMs(123), TimerBackoffAlgorithm::kExponential,
|
||||
absl::nullopt, absl::nullopt,
|
||||
absl::nullopt, DurationMs::InfiniteDuration(),
|
||||
webrtc::TaskQueueBase::DelayPrecision::kLow));
|
||||
EXPECT_EQ(create_timer_precison, webrtc::TaskQueueBase::DelayPrecision::kLow);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user