forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			90 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* -*- 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, double, size_t(LayoutSubsystem::Count)>;
 | |
| using LayoutFlushCount =
 | |
|     EnumeratedArray<FlushKind, SaturateUint8, size_t(FlushKind::Count)>;
 | |
| 
 | |
| 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
 | 
