diff options
Diffstat (limited to 'toolkit/components/glean/bindings/private/TimingDistribution.cpp')
-rw-r--r-- | toolkit/components/glean/bindings/private/TimingDistribution.cpp | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/toolkit/components/glean/bindings/private/TimingDistribution.cpp b/toolkit/components/glean/bindings/private/TimingDistribution.cpp index 036db5f9db..7273d3fd2f 100644 --- a/toolkit/components/glean/bindings/private/TimingDistribution.cpp +++ b/toolkit/components/glean/bindings/private/TimingDistribution.cpp @@ -106,7 +106,7 @@ extern "C" NS_EXPORT void GIFFT_TimingDistributionStart( uint32_t aMetricId, mozilla::glean::TimerId aTimerId) { auto mirrorId = mozilla::glean::HistogramIdForMetric(aMetricId); if (mirrorId) { - mozilla::glean::GetTimerIdToStartsLock().apply([&](auto& lock) { + mozilla::glean::GetTimerIdToStartsLock().apply([&](const auto& lock) { auto tuple = mozilla::glean::MetricTimerTuple{aMetricId, aTimerId}; // It should be all but impossible for anyone to have already inserted // this timer for this metric given the monotonicity of timer ids. @@ -121,7 +121,7 @@ extern "C" NS_EXPORT void GIFFT_TimingDistributionStopAndAccumulate( uint32_t aMetricId, mozilla::glean::TimerId aTimerId) { auto mirrorId = mozilla::glean::HistogramIdForMetric(aMetricId); if (mirrorId) { - mozilla::glean::GetTimerIdToStartsLock().apply([&](auto& lock) { + mozilla::glean::GetTimerIdToStartsLock().apply([&](const auto& lock) { auto tuple = mozilla::glean::MetricTimerTuple{aMetricId, aTimerId}; auto optStart = lock.ref()->Extract(tuple); // The timer might not be in the map to be removed if it's already been @@ -147,7 +147,7 @@ extern "C" NS_EXPORT void GIFFT_TimingDistributionCancel( uint32_t aMetricId, mozilla::glean::TimerId aTimerId) { auto mirrorId = mozilla::glean::HistogramIdForMetric(aMetricId); if (mirrorId) { - mozilla::glean::GetTimerIdToStartsLock().apply([&](auto& lock) { + mozilla::glean::GetTimerIdToStartsLock().apply([&](const auto& lock) { // The timer might not be in the map to be removed if it's already been // cancelled or stop_and_accumulate'd. auto tuple = mozilla::glean::MetricTimerTuple{aMetricId, aTimerId}; @@ -172,8 +172,20 @@ void TimingDistributionMetric::StopAndAccumulate(const TimerId&& aId) const { // type. void TimingDistributionMetric::AccumulateRawDuration( const TimeDuration& aDuration) const { + // `* 1000.0` is an acceptable overflow risk as durations are unlikely to be + // on the order of (-)10^282 years. + double durationNs = aDuration.ToMicroseconds() * 1000.0; + double roundedDurationNs = std::round(durationNs); + if (MOZ_UNLIKELY( + roundedDurationNs < + static_cast<double>(std::numeric_limits<uint64_t>::min()) || + roundedDurationNs > + static_cast<double>(std::numeric_limits<uint64_t>::max()))) { + // TODO(bug 1691073): Instrument this error. + return; + } fog_timing_distribution_accumulate_raw_nanos( - mId, uint64_t(aDuration.ToMicroseconds() * 1000.00)); + mId, static_cast<uint64_t>(roundedDurationNs)); } void TimingDistributionMetric::Cancel(const TimerId&& aId) const { |