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 #include <cstdarg>
21
22 #include "perfetto/public/te_category_macros.h"
23 #include "trace_categories.h"
24 #include "tracing_perfetto_internal.h"
25
26 namespace tracing_perfetto {
27
registerWithPerfetto(bool test)28 void registerWithPerfetto(bool test) {
29 internal::registerWithPerfetto(test);
30 }
31
traceBegin(uint64_t category,const char * name)32 void traceBegin(uint64_t category, const char* name) {
33 struct PerfettoTeCategory* perfettoTeCategory =
34 internal::toPerfettoCategory(category);
35
36 if (internal::shouldPreferAtrace(perfettoTeCategory, category)) {
37 atrace_begin(category, name);
38 } else if (internal::isPerfettoCategoryEnabled(perfettoTeCategory)) {
39 internal::perfettoTraceBegin(*perfettoTeCategory, name);
40 }
41 }
42
traceFormatBegin(uint64_t category,const char * fmt,...)43 void traceFormatBegin(uint64_t category, const char* fmt, ...) {
44 struct PerfettoTeCategory* perfettoTeCategory =
45 internal::toPerfettoCategory(category);
46 const bool preferAtrace = internal::shouldPreferAtrace(perfettoTeCategory, category);
47 const bool preferPerfetto = internal::isPerfettoCategoryEnabled(perfettoTeCategory);
48 if (CC_LIKELY(!(preferAtrace || preferPerfetto))) {
49 return;
50 }
51
52 const int BUFFER_SIZE = 256;
53 va_list ap;
54 char buf[BUFFER_SIZE];
55
56 va_start(ap, fmt);
57 vsnprintf(buf, BUFFER_SIZE, fmt, ap);
58 va_end(ap);
59
60
61 if (preferAtrace) {
62 atrace_begin(category, buf);
63 } else if (preferPerfetto) {
64 internal::perfettoTraceBegin(*perfettoTeCategory, buf);
65 }
66 }
67
traceEnd(uint64_t category)68 void traceEnd(uint64_t category) {
69 struct PerfettoTeCategory* perfettoTeCategory =
70 internal::toPerfettoCategory(category);
71
72 if (internal::shouldPreferAtrace(perfettoTeCategory, category)) {
73 atrace_end(category);
74 } else if (internal::isPerfettoCategoryEnabled(perfettoTeCategory)) {
75 internal::perfettoTraceEnd(*perfettoTeCategory);
76 }
77 }
78
traceAsyncBegin(uint64_t category,const char * name,int32_t cookie)79 void traceAsyncBegin(uint64_t category, const char* name, int32_t cookie) {
80 struct PerfettoTeCategory* perfettoTeCategory =
81 internal::toPerfettoCategory(category);
82
83 if (internal::shouldPreferAtrace(perfettoTeCategory, category)) {
84 atrace_async_begin(category, name, cookie);
85 } else if (internal::isPerfettoCategoryEnabled(perfettoTeCategory)) {
86 internal::perfettoTraceAsyncBegin(*perfettoTeCategory, name, cookie);
87 }
88 }
89
traceAsyncEnd(uint64_t category,const char * name,int32_t cookie)90 void traceAsyncEnd(uint64_t category, const char* name, int32_t cookie) {
91 struct PerfettoTeCategory* perfettoTeCategory =
92 internal::toPerfettoCategory(category);
93
94 if (internal::shouldPreferAtrace(perfettoTeCategory, category)) {
95 atrace_async_end(category, name, cookie);
96 } else if (internal::isPerfettoCategoryEnabled(perfettoTeCategory)) {
97 internal::perfettoTraceAsyncEnd(*perfettoTeCategory, name, cookie);
98 }
99 }
100
traceAsyncBeginForTrack(uint64_t category,const char * name,const char * trackName,int32_t cookie)101 void traceAsyncBeginForTrack(uint64_t category, const char* name,
102 const char* trackName, int32_t cookie) {
103 struct PerfettoTeCategory* perfettoTeCategory =
104 internal::toPerfettoCategory(category);
105
106 if (internal::shouldPreferAtrace(perfettoTeCategory, category)) {
107 atrace_async_for_track_begin(category, trackName, name, cookie);
108 } else if (internal::isPerfettoCategoryEnabled(perfettoTeCategory)) {
109 internal::perfettoTraceAsyncBeginForTrack(*perfettoTeCategory, name, trackName, cookie);
110 }
111 }
112
traceAsyncEndForTrack(uint64_t category,const char * trackName,int32_t cookie)113 void traceAsyncEndForTrack(uint64_t category, const char* trackName,
114 int32_t cookie) {
115 struct PerfettoTeCategory* perfettoTeCategory =
116 internal::toPerfettoCategory(category);
117
118 if (internal::shouldPreferAtrace(perfettoTeCategory, category)) {
119 atrace_async_for_track_end(category, trackName, cookie);
120 } else if (internal::isPerfettoCategoryEnabled(perfettoTeCategory)) {
121 internal::perfettoTraceAsyncEndForTrack(*perfettoTeCategory, trackName, cookie);
122 }
123 }
124
traceInstant(uint64_t category,const char * name)125 void traceInstant(uint64_t category, const char* name) {
126 struct PerfettoTeCategory* perfettoTeCategory =
127 internal::toPerfettoCategory(category);
128
129 if (internal::shouldPreferAtrace(perfettoTeCategory, category)) {
130 atrace_instant(category, name);
131 } else if (internal::isPerfettoCategoryEnabled(perfettoTeCategory)) {
132 internal::perfettoTraceInstant(*perfettoTeCategory, name);
133 }
134 }
135
traceFormatInstant(uint64_t category,const char * fmt,...)136 void traceFormatInstant(uint64_t category, const char* fmt, ...) {
137 struct PerfettoTeCategory* perfettoTeCategory =
138 internal::toPerfettoCategory(category);
139 const bool preferAtrace = internal::shouldPreferAtrace(perfettoTeCategory, category);
140 const bool preferPerfetto = internal::isPerfettoCategoryEnabled(perfettoTeCategory);
141 if (CC_LIKELY(!(preferAtrace || preferPerfetto))) {
142 return;
143 }
144
145 const int BUFFER_SIZE = 256;
146 va_list ap;
147 char buf[BUFFER_SIZE];
148
149 va_start(ap, fmt);
150 vsnprintf(buf, BUFFER_SIZE, fmt, ap);
151 va_end(ap);
152
153 if (preferAtrace) {
154 atrace_instant(category, buf);
155 } else if (preferPerfetto) {
156 internal::perfettoTraceInstant(*perfettoTeCategory, buf);
157 }
158 }
159
traceInstantForTrack(uint64_t category,const char * trackName,const char * name)160 void traceInstantForTrack(uint64_t category, const char* trackName,
161 const char* name) {
162 struct PerfettoTeCategory* perfettoTeCategory =
163 internal::toPerfettoCategory(category);
164
165 if (internal::shouldPreferAtrace(perfettoTeCategory, category)) {
166 atrace_instant_for_track(category, trackName, name);
167 } else if (internal::isPerfettoCategoryEnabled(perfettoTeCategory)) {
168 internal::perfettoTraceInstantForTrack(*perfettoTeCategory, trackName, name);
169 }
170 }
171
traceCounter(uint64_t category,const char * name,int64_t value)172 void traceCounter(uint64_t category, const char* name, int64_t value) {
173 struct PerfettoTeCategory* perfettoTeCategory =
174 internal::toPerfettoCategory(category);
175
176 if (internal::shouldPreferAtrace(perfettoTeCategory, category)) {
177 atrace_int64(category, name, value);
178 } else if (internal::isPerfettoCategoryEnabled(perfettoTeCategory)) {
179 internal::perfettoTraceCounter(*perfettoTeCategory, name, value);
180 }
181 }
182
traceCounter32(uint64_t category,const char * name,int32_t value)183 void traceCounter32(uint64_t category, const char* name, int32_t value) {
184 struct PerfettoTeCategory* perfettoTeCategory = internal::toPerfettoCategory(category);
185 if (internal::shouldPreferAtrace(perfettoTeCategory, category)) {
186 atrace_int(category, name, value);
187 } else if (internal::isPerfettoCategoryEnabled(perfettoTeCategory)) {
188 internal::perfettoTraceCounter(*perfettoTeCategory, name,
189 static_cast<int64_t>(value));
190 }
191 }
192
isTagEnabled(uint64_t category)193 bool isTagEnabled(uint64_t category) {
194 struct PerfettoTeCategory* perfettoTeCategory =
195 internal::toPerfettoCategory(category);
196 return internal::isPerfettoCategoryEnabled(perfettoTeCategory)
197 || atrace_is_tag_enabled(category);
198 }
199
200 } // namespace tracing_perfetto
201