1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #ifndef mozilla_AutoProfilerStyleMarker_h
8 #define mozilla_AutoProfilerStyleMarker_h
10 #include "mozilla/Attributes.h"
11 #include "mozilla/ProfilerMarkers.h"
12 #include "mozilla/ServoTraversalStatistics.h"
13 #include "mozilla/TimeStamp.h"
17 class MOZ_RAII AutoProfilerStyleMarker
{
19 explicit AutoProfilerStyleMarker(UniquePtr
<ProfileChunkedBuffer
> aCause
,
20 const Maybe
<uint64_t>& aInnerWindowID
)
21 : mActive(profiler_thread_is_being_profiled_for_markers()),
22 mCause(std::move(aCause
)),
23 mInnerWindowID(aInnerWindowID
) {
27 MOZ_ASSERT(!ServoTraversalStatistics::sActive
,
28 "Nested AutoProfilerStyleMarker");
29 ServoTraversalStatistics::sSingleton
= ServoTraversalStatistics();
30 ServoTraversalStatistics::sActive
= true;
32 mStartTime
= TimeStamp::Now();
35 ~AutoProfilerStyleMarker() {
41 static constexpr mozilla::Span
<const char> MarkerTypeName() {
42 return mozilla::MakeStringSpan("Styles");
44 static void StreamJSONMarkerData(
45 baseprofiler::SpliceableJSONWriter
& aWriter
,
46 uint32_t aElementsTraversed
, uint32_t aElementsStyled
,
47 uint32_t aElementsMatched
, uint32_t aStylesShared
,
48 uint32_t aStylesReused
) {
49 aWriter
.IntProperty("elementsTraversed", aElementsTraversed
);
50 aWriter
.IntProperty("elementsStyled", aElementsStyled
);
51 aWriter
.IntProperty("elementsMatched", aElementsMatched
);
52 aWriter
.IntProperty("stylesShared", aStylesShared
);
53 aWriter
.IntProperty("stylesReused", aStylesReused
);
55 static MarkerSchema
MarkerTypeDisplay() {
56 using MS
= MarkerSchema
;
57 MS schema
{MS::Location::MarkerChart
, MS::Location::MarkerTable
,
58 MS::Location::TimelineOverview
};
59 schema
.AddKeyLabelFormat("elementsTraversed", "Elements traversed",
61 schema
.AddKeyLabelFormat("elementsStyled", "Elements styled",
63 schema
.AddKeyLabelFormat("elementsMatched", "Elements matched",
65 schema
.AddKeyLabelFormat("stylesShared", "Styles shared",
67 schema
.AddKeyLabelFormat("stylesReused", "Styles reused",
73 ServoTraversalStatistics::sActive
= false;
74 profiler_add_marker("Styles", geckoprofiler::category::LAYOUT
,
75 {MarkerTiming::IntervalUntilNowFrom(mStartTime
),
76 MarkerStack::TakeBacktrace(std::move(mCause
)),
77 MarkerInnerWindowId(mInnerWindowID
)},
79 ServoTraversalStatistics::sSingleton
.mElementsTraversed
,
80 ServoTraversalStatistics::sSingleton
.mElementsStyled
,
81 ServoTraversalStatistics::sSingleton
.mElementsMatched
,
82 ServoTraversalStatistics::sSingleton
.mStylesShared
,
83 ServoTraversalStatistics::sSingleton
.mStylesReused
);
89 UniquePtr
<ProfileChunkedBuffer
> mCause
;
90 Maybe
<uint64_t> mInnerWindowID
;
93 } // namespace mozilla
95 #endif // mozilla_AutoProfilerStyleMarker_h