/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "src/tracing/test/tracing_module.h" #include "protos/perfetto/trace/track_event/log_message.pbzero.h" #include "src/tracing/test/tracing_module_categories.h" #include // This file is for checking that multiple sets of trace event categories can be // combined into the same program. PERFETTO_TRACK_EVENT_STATIC_STORAGE_IN_NAMESPACE(tracing_module); PERFETTO_TRACK_EVENT_STATIC_STORAGE_IN_NAMESPACE_WITH_ATTRS(tracing_extra, [[maybe_unused]]); namespace tracing_extra { namespace { void EmitEventFromExtraNamespace() { TRACE_EVENT_BEGIN("extra", "ExtraNamespaceFromModule"); TRACE_EVENT_BEGIN("extra2", "ExtraNamespaceFromModuleNotEnabled"); } } // namespace } // namespace tracing_extra namespace tracing_module { // The following two functions test selecting the category set on a // per-namespace level. namespace test_ns1 { PERFETTO_USE_CATEGORIES_FROM_NAMESPACE(tracing_extra); void EmitEvent(); void EmitEvent() { TRACE_EVENT_BEGIN("extra", "DefaultNamespace"); } } // namespace test_ns1 namespace test_ns2 { PERFETTO_USE_CATEGORIES_FROM_NAMESPACE(tracing_module); void EmitEvent(); void EmitEvent() { TRACE_EVENT_BEGIN("cat1", "DefaultNamespace"); } } // namespace test_ns2 void InitializeCategories() { TrackEvent::Register(); tracing_extra::TrackEvent::Register(); } void AddSessionObserver(perfetto::TrackEventSessionObserver* observer) { TrackEvent::AddSessionObserver(observer); } void RemoveSessionObserver(perfetto::TrackEventSessionObserver* observer) { TrackEvent::RemoveSessionObserver(observer); } bool IsEnabled() { return TrackEvent::IsEnabled(); } void EmitTrackEvents() { TRACE_EVENT_BEGIN("cat1", "DisabledEventFromModule"); TRACE_EVENT_END("cat1"); TRACE_EVENT_BEGIN("cat4", "DisabledEventFromModule"); TRACE_EVENT_END("cat4"); TRACE_EVENT_BEGIN("cat9", "DisabledEventFromModule"); TRACE_EVENT_END("cat9"); TRACE_EVENT_BEGIN("foo", "FooEventFromModule"); TRACE_EVENT_END("foo"); } void EmitTrackEventsFromAllNamespaces() { // Since we're in the `tracing_module` namespace, that registry is used by // default. TRACE_EVENT_BEGIN("cat1", "DefaultNamespaceFromModule"); // Emit an event from the other namespace. tracing_extra::EmitEventFromExtraNamespace(); // Make the other namespace the default. PERFETTO_USE_CATEGORIES_FROM_NAMESPACE_SCOPED(tracing_extra); TRACE_EVENT_BEGIN("extra", "OverrideNamespaceFromModule"); test_ns1::EmitEvent(); test_ns2::EmitEvent(); } perfetto::internal::TrackEventIncrementalState* GetIncrementalState() { perfetto::internal::TrackEventIncrementalState* state = nullptr; TrackEvent::Trace([&state](TrackEvent::TraceContext ctx) { state = ctx.GetIncrementalState(); }); return state; } void FunctionWithOneTrackEvent() { TRACE_EVENT_BEGIN("cat1", "DisabledEventFromModule"); // Simulates the non-tracing work of this function, which should take priority // over the above trace event in terms of instruction scheduling. puts("Hello"); } void FunctionWithOneTrackEventWithTypedArgument() { TRACE_EVENT_BEGIN("cat1", "EventWithArg", [](perfetto::EventContext ctx) { auto log = ctx.event()->set_log_message(); log->set_body_iid(0x42); }); // Simulates the non-tracing work of this function, which should take priority // over the above trace event in terms of instruction scheduling. puts("Hello"); } void FunctionWithOneScopedTrackEvent() { TRACE_EVENT("cat1", "ScopedEventFromModule"); // Simulates the non-tracing work of this function, which should take priority // over the above trace event in terms of instruction scheduling. puts("Hello"); } void FunctionWithOneTrackEventWithDebugAnnotations() { TRACE_EVENT_BEGIN("cat1", "EventWithAnnotations", "p1", 42, "p2", .5f); // Simulates the non-tracing work of this function, which should take priority // over the above trace event in terms of instruction scheduling. puts("Hello"); } void FunctionWithOneTrackEventWithCustomTrack() { TRACE_EVENT_BEGIN("cat1", "EventWithTrack", perfetto::Track(8086)); // Simulates the non-tracing work of this function, which should take priority // over the above trace event in terms of instruction scheduling. puts("Hello"); } void FunctionWithOneLegacyEvent() { TRACE_EVENT_BEGIN("cat1", "LegacyEventWithArgs", "arg1", 42, "arg2", .5f); // Simulates the non-tracing work of this function, which should take priority // over the above trace event in terms of instruction scheduling. puts("Hello"); } void FunctionWithOneScopedLegacyEvent() { TRACE_EVENT("cat1", "ScopedLegacyEventWithArgs", "arg1", 42, "arg2", .5f); // Simulates the non-tracing work of this function, which should take priority // over the above trace event in terms of instruction scheduling. puts("Hello"); } void FunctionWithOneCounterEvent() { TRACE_COUNTER("cat1", "CounterName", 4096); // Simulates the non-tracing work of this function, which should take priority // over the above trace event in terms of instruction scheduling. puts("Hello"); } } // namespace tracing_module