diff --git a/quic/api/QuicTransportBase.cpp b/quic/api/QuicTransportBase.cpp index 13e513207..3f1468e7e 100644 --- a/quic/api/QuicTransportBase.cpp +++ b/quic/api/QuicTransportBase.cpp @@ -8,6 +8,7 @@ #include +#include #include #include #include @@ -448,7 +449,7 @@ void QuicTransportBase::closeImpl( DCHECK(!drainTimeout_.isScheduled()); getEventBase()->timer().scheduleTimeout( &drainTimeout_, - std::chrono::duration_cast( + folly::chrono::ceil( kDrainFactor * calculatePTO(*conn_))); } else { drainTimeoutExpired(); @@ -2413,8 +2414,7 @@ void QuicTransportBase::scheduleAckTimeout() { std::chrono::duration_cast( wheelTimer.getTickInterval()), timeMin(kMaxAckTimeout, factoredRtt)); - auto timeoutMs = - std::chrono::duration_cast(timeout); + auto timeoutMs = folly::chrono::ceil(timeout); VLOG(10) << __func__ << " timeout=" << timeoutMs.count() << "ms" << " factoredRtt=" << factoredRtt.count() << "us" << " " << *this; @@ -2459,8 +2459,8 @@ void QuicTransportBase::schedulePathValidationTimeout() { auto validationTimeout = std::max(3 * pto, 6 * conn_->transportSettings.initialRtt); - auto timeoutMs = std::chrono::duration_cast( - validationTimeout); + auto timeoutMs = + folly::chrono::ceil(validationTimeout); VLOG(10) << __func__ << " timeout=" << timeoutMs.count() << "ms " << *this; getEventBase()->timer().scheduleTimeout(&pathValidationTimeout_, timeoutMs); } diff --git a/quic/congestion_control/QuicCubic.cpp b/quic/congestion_control/QuicCubic.cpp index a7fb893ef..96ffe0b62 100644 --- a/quic/congestion_control/QuicCubic.cpp +++ b/quic/congestion_control/QuicCubic.cpp @@ -11,6 +11,8 @@ #include #include +#include + namespace quic { Cubic::Cubic( @@ -174,11 +176,11 @@ void Cubic::setAppIdle(bool idle, TimePoint eventTime) noexcept { cubic_appidle, conn_, idle, - std::chrono::duration_cast( + folly::chrono::ceil( eventTime.time_since_epoch()) .count(), steadyState_.lastReductionTime - ? std::chrono::duration_cast( + ? folly::chrono::ceil( steadyState_.lastReductionTime->time_since_epoch()) .count() : -1); @@ -192,7 +194,7 @@ void Cubic::setAppIdle(bool idle, TimePoint eventTime) noexcept { if (!idle && currentAppIdle && *quiescenceStart_ <= eventTime && steadyState_.lastReductionTime) { *steadyState_.lastReductionTime += - std::chrono::duration_cast( + folly::chrono::ceil( eventTime - *quiescenceStart_); } if (!idle) { @@ -261,7 +263,7 @@ int64_t Cubic::calculateCubicCwndDelta(TimePoint ackTime) noexcept { LOG(WARNING) << "Cubic ackTime earlier than reduction time"; return 0; } - auto timeElapsed = std::chrono::duration_cast( + auto timeElapsed = folly::chrono::ceil( ackTime - *steadyState_.lastReductionTime); int64_t delta = 0; double timeElapsedCount = static_cast(timeElapsed.count()); diff --git a/quic/loss/QuicLossFunctions.h b/quic/loss/QuicLossFunctions.h index 90e17b6ed..348ccdce6 100644 --- a/quic/loss/QuicLossFunctions.h +++ b/quic/loss/QuicLossFunctions.h @@ -18,6 +18,7 @@ #include #include +#include #include #include @@ -85,9 +86,8 @@ calculateAlarmDuration(const QuicConnectionStateBase& conn) { // The alarm duration is calculated based on the last packet that was sent // rather than the current time. if (lastSentPacketTime + alarmDuration > now) { - adjustedAlarmDuration = - std::chrono::duration_cast( - lastSentPacketTime + alarmDuration - now); + adjustedAlarmDuration = folly::chrono::ceil( + lastSentPacketTime + alarmDuration - now); } else { auto lastSentPacketNum = conn.outstandings.packets.back().packet.header.getPacketSequenceNum(); diff --git a/quic/loss/test/QuicLossFunctionsTest.cpp b/quic/loss/test/QuicLossFunctionsTest.cpp index 6097315e7..25f8d09af 100644 --- a/quic/loss/test/QuicLossFunctionsTest.cpp +++ b/quic/loss/test/QuicLossFunctionsTest.cpp @@ -1014,8 +1014,7 @@ TEST_F(QuicLossFunctionsTest, LossTimePreemptsCryptoTimer) { MockClock::mockNow = [=]() { return sendTime; }; auto alarm = calculateAlarmDuration(*conn); EXPECT_EQ( - std::chrono::duration_cast( - expectedDelayUntilLost), + folly::chrono::ceil(expectedDelayUntilLost), alarm.first); EXPECT_EQ(LossState::AlarmMethod::EarlyRetransmitOrReordering, alarm.second); // Manual set lossState. Calling setLossDetectionAlarm requries a Timeout