1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
/* -*- Mode: C++; tab-width: 2; 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/. */
#ifndef ProfileBufferEntryKinds_h
#define ProfileBufferEntryKinds_h
#include "mozilla/BaseProfilerUtils.h"
#include <cstdint>
namespace mozilla {
// This is equal to sizeof(double), which is the largest non-char variant in
// |u|.
static constexpr size_t ProfileBufferEntryNumChars = 8;
// NOTE! If you add entries, you need to verify if they need to be added to the
// switch statement in DuplicateLastSample!
// This will evaluate the MACRO with (KIND, TYPE, SIZE)
#define FOR_EACH_PROFILE_BUFFER_ENTRY_KIND(MACRO) \
MACRO(CategoryPair, int, sizeof(int)) \
MACRO(CollectionStart, double, sizeof(double)) \
MACRO(CollectionEnd, double, sizeof(double)) \
MACRO(Label, const char*, sizeof(const char*)) \
MACRO(FrameFlags, uint64_t, sizeof(uint64_t)) \
MACRO(DynamicStringFragment, char*, ProfileBufferEntryNumChars) \
MACRO(JitReturnAddr, void*, sizeof(void*)) \
MACRO(InnerWindowID, uint64_t, sizeof(uint64_t)) \
MACRO(LineNumber, int, sizeof(int)) \
MACRO(ColumnNumber, int, sizeof(int)) \
MACRO(NativeLeafAddr, void*, sizeof(void*)) \
MACRO(Pause, double, sizeof(double)) \
MACRO(Resume, double, sizeof(double)) \
MACRO(PauseSampling, double, sizeof(double)) \
MACRO(ResumeSampling, double, sizeof(double)) \
MACRO(Responsiveness, double, sizeof(double)) \
MACRO(ThreadId, ::mozilla::baseprofiler::BaseProfilerThreadId, \
sizeof(::mozilla::baseprofiler::BaseProfilerThreadId)) \
MACRO(Time, double, sizeof(double)) \
MACRO(TimeBeforeCompactStack, double, sizeof(double)) \
MACRO(TimeBeforeSameSample, double, sizeof(double)) \
MACRO(CounterId, void*, sizeof(void*)) \
MACRO(CounterKey, uint64_t, sizeof(uint64_t)) \
MACRO(Number, uint64_t, sizeof(uint64_t)) \
MACRO(Count, int64_t, sizeof(int64_t)) \
MACRO(ProfilerOverheadTime, double, sizeof(double)) \
MACRO(ProfilerOverheadDuration, double, sizeof(double))
// The `Kind` is a single byte identifying the type of data that is actually
// stored in a `ProfileBufferEntry`, as per the list in
// `FOR_EACH_PROFILE_BUFFER_ENTRY_KIND`.
//
// This byte is also used to identify entries in ProfileChunkedBuffer blocks,
// for both "legacy" entries that do contain a `ProfileBufferEntry`, and for
// new types of entries that may carry more data of different types.
// TODO: Eventually each type of "legacy" entry should be replaced with newer,
// more efficient kinds of entries (e.g., stack frames could be stored in one
// bigger entry, instead of multiple `ProfileBufferEntry`s); then we could
// discard `ProfileBufferEntry` and move this enum to a more appropriate spot.
using ProfileBufferEntryKindUnderlyingType = uint8_t;
enum class ProfileBufferEntryKind : ProfileBufferEntryKindUnderlyingType {
INVALID = 0,
#define KIND(KIND, TYPE, SIZE) KIND,
FOR_EACH_PROFILE_BUFFER_ENTRY_KIND(KIND)
#undef KIND
// Any value under `LEGACY_LIMIT` represents a `ProfileBufferEntry`.
LEGACY_LIMIT,
// Any value starting here does *not* represent a `ProfileBufferEntry` and
// requires separate decoding and handling.
// Markers and their data.
Marker = LEGACY_LIMIT,
// Entry with "running times", such as CPU usage measurements.
// Optional between TimeBeforeX and X.
RunningTimes,
// Optional between TimeBeforeX and X.
UnresponsiveDurationMs,
// Collection of legacy stack entries, must follow a ThreadId and
// TimeBeforeCompactStack (which are not included in the CompactStack;
// TimeBeforeCompactStack is equivalent to Time, but indicates that a
// CompactStack follows shortly afterwards).
CompactStack,
// Indicates that this sample is identical to the previous one, must follow a
// ThreadId and TimeBeforeSameSample.
SameSample,
MODERN_LIMIT
};
using MarkerPayloadTypeUnderlyingType = uint8_t;
enum class MarkerPayloadType : MarkerPayloadTypeUnderlyingType {
Cpp,
Rust,
};
} // namespace mozilla
#endif // ProfileBufferEntryKinds_h
|