summaryrefslogtreecommitdiffstats
path: root/layout/base/LayoutTelemetryTools.h
diff options
context:
space:
mode:
Diffstat (limited to 'layout/base/LayoutTelemetryTools.h')
-rw-r--r--layout/base/LayoutTelemetryTools.h90
1 files changed, 90 insertions, 0 deletions
diff --git a/layout/base/LayoutTelemetryTools.h b/layout/base/LayoutTelemetryTools.h
new file mode 100644
index 0000000000..25c80dcc2c
--- /dev/null
+++ b/layout/base/LayoutTelemetryTools.h
@@ -0,0 +1,90 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/* Tools for collecting and reporting layout and style telemetry */
+
+#ifndef mozilla_LayoutTelemetryTools_h
+#define mozilla_LayoutTelemetryTools_h
+
+#include "mozilla/EnumeratedArray.h"
+#include "mozilla/EnumeratedRange.h"
+#include "mozilla/FlushType.h"
+#include "mozilla/Saturate.h"
+#include "mozilla/TimeStamp.h"
+
+#define LAYOUT_TELEMETRY_RECORD(subsystem) \
+ layout_telemetry::AutoRecord a(layout_telemetry::LayoutSubsystem::subsystem)
+
+#define LAYOUT_TELEMETRY_RECORD_BASE(subsystem) \
+ layout_telemetry::AutoRecord a(&mLayoutTelemetry, \
+ layout_telemetry::LayoutSubsystem::subsystem)
+
+namespace mozilla {
+namespace layout_telemetry {
+
+enum class FlushKind : uint8_t { Style, Layout, Count };
+
+enum class LayoutSubsystem : uint8_t {
+ Restyle,
+ Reflow,
+ ReflowFlex,
+ ReflowGrid,
+ ReflowTable,
+ ReflowText,
+ Count
+};
+
+using LayoutSubsystemDurations =
+ EnumeratedArray<LayoutSubsystem, LayoutSubsystem::Count, double>;
+using LayoutFlushCount =
+ EnumeratedArray<FlushKind, FlushKind::Count, SaturateUint8>;
+
+struct Data {
+ Data();
+
+ void IncReqsPerFlush(FlushType aFlushType);
+ void IncFlushesPerTick(FlushType aFlushType);
+
+ void PingTelemetry();
+
+ // Send the current number of flush requests for aFlushType to telemetry and
+ // reset the count.
+ void PingReqsPerFlushTelemetry(FlushType aFlushType);
+
+ // Send the current non-zero number of style and layout flushes to telemetry
+ // and reset the count.
+ void PingFlushPerTickTelemetry(FlushType aFlushType);
+
+ // Send the current non-zero time spent under style and layout processing this
+ // tick to telemetry and reset the total.
+ void PingTotalMsPerTickTelemetry(FlushType aFlushType);
+
+ // Send the current per-tick telemetry for `aFlushType`.
+ void PingPerTickTelemetry(FlushType aFlushType);
+
+ LayoutFlushCount mReqsPerFlush;
+ LayoutFlushCount mFlushesPerTick;
+ LayoutSubsystemDurations mLayoutSubsystemDurationMs;
+};
+
+class AutoRecord {
+ public:
+ explicit AutoRecord(LayoutSubsystem aSubsystem);
+ AutoRecord(Data* aLayoutTelemetry, LayoutSubsystem aSubsystem);
+ ~AutoRecord();
+
+ private:
+ AutoRecord* mParentRecord;
+ Data* mLayoutTelemetry;
+ LayoutSubsystem mSubsystem;
+ TimeStamp mStartTime;
+ double mDurationMs;
+};
+
+} // namespace layout_telemetry
+} // namespace mozilla
+
+#endif // !mozilla_LayoutTelemetryTools_h