1 /*
2 * Copyright 2024 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include "tracing_perfetto.h"
18
19 #include <cutils/trace.h>
20
21 #include <cstdarg>
22
23 #include "perfetto/public/te_category_macros.h"
24 #include "trace_categories.h"
25 #include "tracing_perfetto_internal.h"
26
27 namespace tracing_perfetto {
28
registerWithPerfetto(bool test)29 void registerWithPerfetto(bool test) {
30 internal::registerWithPerfetto(test);
31 }
32
traceBegin(uint64_t category,const char * name)33 void traceBegin(uint64_t category, const char* name) {
34 struct PerfettoTeCategory* perfettoTeCategory =
35 internal::toPerfettoCategory(category);
36
37 if (internal::shouldPreferAtrace(perfettoTeCategory, category)) {
38 atrace_begin(category, name);
39 } else if (internal::isPerfettoCategoryEnabled(perfettoTeCategory)) {
40 internal::perfettoTraceBegin(*perfettoTeCategory, name);
41 }
42 }
43
traceFormatBegin(uint64_t category,const char * fmt,...)44 void traceFormatBegin(uint64_t category, const char* fmt, ...) {
45 struct PerfettoTeCategory* perfettoTeCategory =
46 internal::toPerfettoCategory(category);
47 const bool preferAtrace =
48 internal::shouldPreferAtrace(perfettoTeCategory, category);
49 const bool preferPerfetto =
50 internal::isPerfettoCategoryEnabled(perfettoTeCategory);
51 if (CC_LIKELY(!(preferAtrace || preferPerfetto))) {
52 return;
53 }
54
55 const int BUFFER_SIZE = 256;
56 va_list ap;
57 char buf[BUFFER_SIZE];
58
59 va_start(ap, fmt);
60 vsnprintf(buf, BUFFER_SIZE, fmt, ap);
61 va_end(ap);
62
63 if (preferAtrace) {
64 atrace_begin(category, buf);
65 } else if (preferPerfetto) {
66 internal::perfettoTraceBegin(*perfettoTeCategory, buf);
67 }
68 }
69
traceEnd(uint64_t category)70 void traceEnd(uint64_t category) {
71 struct PerfettoTeCategory* perfettoTeCategory =
72 internal::toPerfettoCategory(category);
73
74 if (internal::shouldPreferAtrace(perfettoTeCategory, category)) {
75 atrace_end(category);
76 } else if (internal::isPerfettoCategoryEnabled(perfettoTeCategory)) {
77 internal::perfettoTraceEnd(*perfettoTeCategory);
78 }
79 }
80
traceAsyncBegin(uint64_t category,const char * name,int32_t cookie)81 void traceAsyncBegin(uint64_t category, const char* name, int32_t cookie) {
82 struct PerfettoTeCategory* perfettoTeCategory =
83 internal::toPerfettoCategory(category);
84
85 if (internal::shouldPreferAtrace(perfettoTeCategory, category)) {
86 atrace_async_begin(category, name, cookie);
87 } else if (internal::isPerfettoCategoryEnabled(perfettoTeCategory)) {
88 internal::perfettoTraceAsyncBegin(*perfettoTeCategory, name, cookie);
89 }
90 }
91
traceAsyncEnd(uint64_t category,const char * name,int32_t cookie)92 void traceAsyncEnd(uint64_t category, const char* name, int32_t cookie) {
93 struct PerfettoTeCategory* perfettoTeCategory =
94 internal::toPerfettoCategory(category);
95
96 if (internal::shouldPreferAtrace(perfettoTeCategory, category)) {
97 atrace_async_end(category, name, cookie);
98 } else if (internal::isPerfettoCategoryEnabled(perfettoTeCategory)) {
99 internal::perfettoTraceAsyncEnd(*perfettoTeCategory, name, cookie);
100 }
101 }
102
traceAsyncBeginForTrack(uint64_t category,const char * name,const char * trackName,int32_t cookie)103 void traceAsyncBeginForTrack(uint64_t category, const char* name,
104 const char* trackName, int32_t cookie) {
105 struct PerfettoTeCategory* perfettoTeCategory =
106 internal::toPerfettoCategory(category);
107
108 if (internal::shouldPreferAtrace(perfettoTeCategory, category)) {
109 atrace_async_for_track_begin(category, trackName, name, cookie);
110 } else if (internal::isPerfettoCategoryEnabled(perfettoTeCategory)) {
111 internal::perfettoTraceAsyncBeginForTrack(*perfettoTeCategory, name,
112 trackName, cookie);
113 }
114 }
115
traceAsyncEndForTrack(uint64_t category,const char * trackName,int32_t cookie)116 void traceAsyncEndForTrack(uint64_t category, const char* trackName,
117 int32_t cookie) {
118 struct PerfettoTeCategory* perfettoTeCategory =
119 internal::toPerfettoCategory(category);
120
121 if (internal::shouldPreferAtrace(perfettoTeCategory, category)) {
122 atrace_async_for_track_end(category, trackName, cookie);
123 } else if (internal::isPerfettoCategoryEnabled(perfettoTeCategory)) {
124 internal::perfettoTraceAsyncEndForTrack(*perfettoTeCategory, trackName,
125 cookie);
126 }
127 }
128
traceInstant(uint64_t category,const char * name)129 void traceInstant(uint64_t category, const char* name) {
130 struct PerfettoTeCategory* perfettoTeCategory =
131 internal::toPerfettoCategory(category);
132
133 if (internal::shouldPreferAtrace(perfettoTeCategory, category)) {
134 atrace_instant(category, name);
135 } else if (internal::isPerfettoCategoryEnabled(perfettoTeCategory)) {
136 internal::perfettoTraceInstant(*perfettoTeCategory, name);
137 }
138 }
139
traceFormatInstant(uint64_t category,const char * fmt,...)140 void traceFormatInstant(uint64_t category, const char* fmt, ...) {
141 struct PerfettoTeCategory* perfettoTeCategory =
142 internal::toPerfettoCategory(category);
143 const bool preferAtrace =
144 internal::shouldPreferAtrace(perfettoTeCategory, category);
145 const bool preferPerfetto =
146 internal::isPerfettoCategoryEnabled(perfettoTeCategory);
147 if (CC_LIKELY(!(preferAtrace || preferPerfetto))) {
148 return;
149 }
150
151 const int BUFFER_SIZE = 256;
152 va_list ap;
153 char buf[BUFFER_SIZE];
154
155 va_start(ap, fmt);
156 vsnprintf(buf, BUFFER_SIZE, fmt, ap);
157 va_end(ap);
158
159 if (preferAtrace) {
160 atrace_instant(category, buf);
161 } else if (preferPerfetto) {
162 internal::perfettoTraceInstant(*perfettoTeCategory, buf);
163 }
164 }
165
traceInstantForTrack(uint64_t category,const char * trackName,const char * name)166 void traceInstantForTrack(uint64_t category, const char* trackName,
167 const char* name) {
168 struct PerfettoTeCategory* perfettoTeCategory =
169 internal::toPerfettoCategory(category);
170
171 if (internal::shouldPreferAtrace(perfettoTeCategory, category)) {
172 atrace_instant_for_track(category, trackName, name);
173 } else if (internal::isPerfettoCategoryEnabled(perfettoTeCategory)) {
174 internal::perfettoTraceInstantForTrack(*perfettoTeCategory, trackName, name);
175 }
176 }
177
traceCounter(uint64_t category,const char * name,int64_t value)178 void traceCounter(uint64_t category, const char* name, int64_t value) {
179 struct PerfettoTeCategory* perfettoTeCategory =
180 internal::toPerfettoCategory(category);
181
182 if (internal::shouldPreferAtrace(perfettoTeCategory, category)) {
183 atrace_int64(category, name, value);
184 } else if (internal::isPerfettoCategoryEnabled(perfettoTeCategory)) {
185 internal::perfettoTraceCounter(*perfettoTeCategory, name, value);
186 }
187 }
188
traceCounter32(uint64_t category,const char * name,int32_t value)189 void traceCounter32(uint64_t category, const char* name, int32_t value) {
190 struct PerfettoTeCategory* perfettoTeCategory =
191 internal::toPerfettoCategory(category);
192 if (internal::shouldPreferAtrace(perfettoTeCategory, category)) {
193 atrace_int(category, name, value);
194 } else if (internal::isPerfettoCategoryEnabled(perfettoTeCategory)) {
195 internal::perfettoTraceCounter(*perfettoTeCategory, name,
196 static_cast<int64_t>(value));
197 }
198 }
199
isTagEnabled(uint64_t category)200 bool isTagEnabled(uint64_t category) {
201 struct PerfettoTeCategory* perfettoTeCategory =
202 internal::toPerfettoCategory(category);
203 return internal::isPerfettoCategoryEnabled(perfettoTeCategory) ||
204 atrace_is_tag_enabled(category);
205 }
206
207 } // namespace tracing_perfetto
208