bug 1431868 Handle AutoTimer users passing us future values for start. r?Dexter
UBSan found some cases where people are setting the Telemetry AutoTimer values
of `start` that are in the future. Not a problem if the value for `end` is
further in the future... which it isn't always.
Let's normalize those cases to 0, shall we?
MozReview-Commit-ID: 7AdTMf2rss6
--- a/toolkit/components/telemetry/Telemetry.h
+++ b/toolkit/components/telemetry/Telemetry.h
@@ -179,30 +179,46 @@ struct AccumulateDelta_impl
static void compute(HistogramID id, TimeStamp start, TimeStamp end = TimeStamp::Now());
static void compute(HistogramID id, const nsCString& key, TimeStamp start, TimeStamp end = TimeStamp::Now());
};
template<>
struct AccumulateDelta_impl<Millisecond>
{
static void compute(HistogramID id, TimeStamp start, TimeStamp end = TimeStamp::Now()) {
+ if (start > end) {
+ Accumulate(id, 0);
+ return;
+ }
Accumulate(id, static_cast<uint32_t>((end - start).ToMilliseconds()));
}
static void compute(HistogramID id, const nsCString& key, TimeStamp start, TimeStamp end = TimeStamp::Now()) {
+ if (start > end) {
+ Accumulate(id, key, 0);
+ return;
+ }
Accumulate(id, key, static_cast<uint32_t>((end - start).ToMilliseconds()));
}
};
template<>
struct AccumulateDelta_impl<Microsecond>
{
static void compute(HistogramID id, TimeStamp start, TimeStamp end = TimeStamp::Now()) {
+ if (start > end) {
+ Accumulate(id, 0);
+ return;
+ }
Accumulate(id, static_cast<uint32_t>((end - start).ToMicroseconds()));
}
static void compute(HistogramID id, const nsCString& key, TimeStamp start, TimeStamp end = TimeStamp::Now()) {
+ if (start > end) {
+ Accumulate(id, key, 0);
+ return;
+ }
Accumulate(id, key, static_cast<uint32_t>((end - start).ToMicroseconds()));
}
};
template<HistogramID id, TimerResolution res = Millisecond>
class MOZ_RAII AutoTimer {
public: