Support perfetto track_event prefer
Trace.java now supports per-category tracing to perfetto if specified
in the config. When we trace to perfetto, the event will be missing from
the ftrace buffer. This means that a concurrent session that has the
same category enabled for atrace will be missing the atrace event.
To avoid this, the config can specify that the perfetto event can be
preferred. This means that despite the category being enabled for
atrace, we will trace to perfetto if the category is enabled there.
By default, the perfetto event is not preferred, but it can be preferred
explicitly in the config with atrace_categories_prefer_track_event.
Bug: 303199244
Test: atest libtracing_perfetto_tests
Flag: android.os.flags.perfetto_sdk_tracing
Change-Id: Idf7cfc7c7f9c8ac4191cabff3d958926606f564b
diff --git a/libs/tracing_perfetto/tracing_perfetto.cpp b/libs/tracing_perfetto/tracing_perfetto.cpp
index 6f716ee..fc5336d 100644
--- a/libs/tracing_perfetto/tracing_perfetto.cpp
+++ b/libs/tracing_perfetto/tracing_perfetto.cpp
@@ -28,116 +28,112 @@
internal::registerWithPerfetto(test);
}
-Result traceBegin(uint64_t category, const char* name) {
+void traceBegin(uint64_t category, const char* name) {
struct PerfettoTeCategory* perfettoTeCategory =
internal::toPerfettoCategory(category);
- if (perfettoTeCategory != nullptr) {
- return internal::perfettoTraceBegin(*perfettoTeCategory, name);
- } else {
+
+ if (internal::shouldPreferAtrace(perfettoTeCategory, category)) {
atrace_begin(category, name);
- return Result::SUCCESS;
+ } else if (internal::isPerfettoCategoryEnabled(perfettoTeCategory)) {
+ internal::perfettoTraceBegin(*perfettoTeCategory, name);
}
}
-Result traceEnd(uint64_t category) {
+void traceEnd(uint64_t category) {
struct PerfettoTeCategory* perfettoTeCategory =
internal::toPerfettoCategory(category);
- if (perfettoTeCategory != nullptr) {
- return internal::perfettoTraceEnd(*perfettoTeCategory);
- } else {
+
+ if (internal::shouldPreferAtrace(perfettoTeCategory, category)) {
atrace_end(category);
- return Result::SUCCESS;
+ } else if (internal::isPerfettoCategoryEnabled(perfettoTeCategory)) {
+ internal::perfettoTraceEnd(*perfettoTeCategory);
}
}
-Result traceAsyncBegin(uint64_t category, const char* name, int32_t cookie) {
+void traceAsyncBegin(uint64_t category, const char* name, int32_t cookie) {
struct PerfettoTeCategory* perfettoTeCategory =
internal::toPerfettoCategory(category);
- if (perfettoTeCategory != nullptr) {
- return internal::perfettoTraceAsyncBegin(*perfettoTeCategory, name, cookie);
- } else {
+
+ if (internal::shouldPreferAtrace(perfettoTeCategory, category)) {
atrace_async_begin(category, name, cookie);
- return Result::SUCCESS;
+ } else if (internal::isPerfettoCategoryEnabled(perfettoTeCategory)) {
+ internal::perfettoTraceAsyncBegin(*perfettoTeCategory, name, cookie);
}
}
-Result traceAsyncEnd(uint64_t category, const char* name, int32_t cookie) {
+void traceAsyncEnd(uint64_t category, const char* name, int32_t cookie) {
struct PerfettoTeCategory* perfettoTeCategory =
internal::toPerfettoCategory(category);
- if (perfettoTeCategory != nullptr) {
- return internal::perfettoTraceAsyncEnd(*perfettoTeCategory, name, cookie);
- } else {
+
+ if (internal::shouldPreferAtrace(perfettoTeCategory, category)) {
atrace_async_end(category, name, cookie);
- return Result::SUCCESS;
+ } else if (internal::isPerfettoCategoryEnabled(perfettoTeCategory)) {
+ internal::perfettoTraceAsyncEnd(*perfettoTeCategory, name, cookie);
}
}
-Result traceAsyncBeginForTrack(uint64_t category, const char* name,
+void traceAsyncBeginForTrack(uint64_t category, const char* name,
const char* trackName, int32_t cookie) {
struct PerfettoTeCategory* perfettoTeCategory =
internal::toPerfettoCategory(category);
- if (perfettoTeCategory != nullptr) {
- return internal::perfettoTraceAsyncBeginForTrack(*perfettoTeCategory, name, trackName, cookie);
- } else {
+
+ if (internal::shouldPreferAtrace(perfettoTeCategory, category)) {
atrace_async_for_track_begin(category, trackName, name, cookie);
- return Result::SUCCESS;
+ } else if (internal::isPerfettoCategoryEnabled(perfettoTeCategory)) {
+ internal::perfettoTraceAsyncBeginForTrack(*perfettoTeCategory, name, trackName, cookie);
}
}
-Result traceAsyncEndForTrack(uint64_t category, const char* trackName,
+void traceAsyncEndForTrack(uint64_t category, const char* trackName,
int32_t cookie) {
struct PerfettoTeCategory* perfettoTeCategory =
internal::toPerfettoCategory(category);
- if (perfettoTeCategory != nullptr) {
- return internal::perfettoTraceAsyncEndForTrack(*perfettoTeCategory, trackName, cookie);
- } else {
+
+ if (internal::shouldPreferAtrace(perfettoTeCategory, category)) {
atrace_async_for_track_end(category, trackName, cookie);
- return Result::SUCCESS;
+ } else if (internal::isPerfettoCategoryEnabled(perfettoTeCategory)) {
+ internal::perfettoTraceAsyncEndForTrack(*perfettoTeCategory, trackName, cookie);
}
}
-Result traceInstant(uint64_t category, const char* name) {
+void traceInstant(uint64_t category, const char* name) {
struct PerfettoTeCategory* perfettoTeCategory =
internal::toPerfettoCategory(category);
- if (perfettoTeCategory != nullptr) {
- return internal::perfettoTraceInstant(*perfettoTeCategory, name);
- } else {
+
+ if (internal::shouldPreferAtrace(perfettoTeCategory, category)) {
atrace_instant(category, name);
- return Result::SUCCESS;
+ } else if (internal::isPerfettoCategoryEnabled(perfettoTeCategory)) {
+ internal::perfettoTraceInstant(*perfettoTeCategory, name);
}
}
-Result traceInstantForTrack(uint64_t category, const char* trackName,
+void traceInstantForTrack(uint64_t category, const char* trackName,
const char* name) {
struct PerfettoTeCategory* perfettoTeCategory =
internal::toPerfettoCategory(category);
- if (perfettoTeCategory != nullptr) {
- return internal::perfettoTraceInstantForTrack(*perfettoTeCategory, trackName, name);
- } else {
+
+ if (internal::shouldPreferAtrace(perfettoTeCategory, category)) {
atrace_instant_for_track(category, trackName, name);
- return Result::SUCCESS;
+ } else if (internal::isPerfettoCategoryEnabled(perfettoTeCategory)) {
+ internal::perfettoTraceInstantForTrack(*perfettoTeCategory, trackName, name);
}
}
-Result traceCounter(uint64_t category, const char* name, int64_t value) {
+void traceCounter(uint64_t category, const char* name, int64_t value) {
struct PerfettoTeCategory* perfettoTeCategory =
internal::toPerfettoCategory(category);
- if (perfettoTeCategory != nullptr) {
- return internal::perfettoTraceCounter(*perfettoTeCategory, name, value);
- } else {
+
+ if (internal::shouldPreferAtrace(perfettoTeCategory, category)) {
atrace_int64(category, name, value);
- return Result::SUCCESS;
+ } else if (internal::isPerfettoCategoryEnabled(perfettoTeCategory)) {
+ internal::perfettoTraceCounter(*perfettoTeCategory, name, value);
}
}
bool isTagEnabled(uint64_t category) {
struct PerfettoTeCategory* perfettoTeCategory =
internal::toPerfettoCategory(category);
- if (perfettoTeCategory != nullptr) {
- return true;
- } else {
- return (atrace_get_enabled_tags() & category) != 0;
- }
+ return internal::isPerfettoCategoryEnabled(perfettoTeCategory)
+ || atrace_is_tag_enabled(category);
}
-
} // namespace tracing_perfetto