|  | /* | 
|  | * Copyright (C) 2023 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 "perfetto/public/abi/track_event_abi.h" | 
|  | #include "perfetto/public/producer.h" | 
|  | #include "perfetto/public/te_category_macros.h" | 
|  | #include "perfetto/public/te_macros.h" | 
|  | #include "perfetto/public/track_event.h" | 
|  |  | 
|  | #include <stdio.h> | 
|  | #include <unistd.h> | 
|  |  | 
|  | #define EXAMPLE_CATEGORIES(C)                                   \ | 
|  | C(rendering, "rendering", "Rendering events", "tag1", "tag2") \ | 
|  | C(physics, "physics", "Physics events", "tag1")               \ | 
|  | C(cat, "cat", "Sample category")                              \ | 
|  | C(c3, "c3", "c3", "tag1", "tag2", "tag3")                     \ | 
|  | C(c4, "c4", "c4", "tag1", "tag2", "tag3", "tag4") | 
|  |  | 
|  | PERFETTO_TE_CATEGORIES_DEFINE(EXAMPLE_CATEGORIES) | 
|  |  | 
|  | static struct PerfettoTeRegisteredTrack mytrack; | 
|  | static struct PerfettoTeRegisteredTrack mycounter; | 
|  |  | 
|  | static void EnabledCb(struct PerfettoTeCategoryImpl* c, | 
|  | PerfettoDsInstanceIndex inst_id, | 
|  | bool enabled, | 
|  | bool global_state_changed, | 
|  | void* user_arg) { | 
|  | printf("Callback: %p id: %u on: %d, global_state_changed: %d, user_arg:%p\n", | 
|  | PERFETTO_STATIC_CAST(void*, c), inst_id, | 
|  | PERFETTO_STATIC_CAST(int, enabled), | 
|  | PERFETTO_STATIC_CAST(int, global_state_changed), user_arg); | 
|  | if (enabled) { | 
|  | PERFETTO_TE(physics, PERFETTO_TE_INSTANT("callback"), PERFETTO_TE_FLUSH()); | 
|  | } | 
|  | } | 
|  |  | 
|  | int main(void) { | 
|  | uint64_t flow_counter = 0; | 
|  | struct PerfettoProducerInitArgs args = {0}; | 
|  | args.backends = PERFETTO_BACKEND_SYSTEM; | 
|  | PerfettoProducerInit(args); | 
|  | PerfettoTeInit(); | 
|  | PERFETTO_TE_REGISTER_CATEGORIES(EXAMPLE_CATEGORIES); | 
|  | PerfettoTeNamedTrackRegister(&mytrack, "mytrack", 0, | 
|  | PerfettoTeProcessTrackUuid()); | 
|  | PerfettoTeCounterTrackRegister(&mycounter, "mycounter", | 
|  | PerfettoTeProcessTrackUuid()); | 
|  | PerfettoTeCategorySetCallback(&physics, EnabledCb, PERFETTO_NULL); | 
|  | for (;;) { | 
|  | PERFETTO_TE(rendering, PERFETTO_TE_INSTANT("name1")); | 
|  | PERFETTO_TE(physics, PERFETTO_TE_INSTANT("name2"), | 
|  | PERFETTO_TE_ARG_BOOL("dbg_arg", false), | 
|  | PERFETTO_TE_ARG_STRING("dbg_arg2", "mystring")); | 
|  | PERFETTO_TE(cat, PERFETTO_TE_SLICE_BEGIN("name")); | 
|  | PERFETTO_TE(cat, PERFETTO_TE_SLICE_END()); | 
|  | flow_counter++; | 
|  | PERFETTO_TE(physics, PERFETTO_TE_SLICE_BEGIN("name4"), | 
|  | PERFETTO_TE_REGISTERED_TRACK(&mytrack), | 
|  | PERFETTO_TE_FLOW(PerfettoTeProcessScopedFlow(flow_counter))); | 
|  | PERFETTO_TE(physics, PERFETTO_TE_SLICE_END(), | 
|  | PERFETTO_TE_REGISTERED_TRACK(&mytrack)); | 
|  | PERFETTO_TE(cat, PERFETTO_TE_INSTANT("name5"), | 
|  | PERFETTO_TE_TIMESTAMP(PerfettoTeGetTimestamp())); | 
|  | PERFETTO_TE(PERFETTO_TE_DYNAMIC_CATEGORY, PERFETTO_TE_INSTANT("name6"), | 
|  | PERFETTO_TE_DYNAMIC_CATEGORY_STRING("physics"), | 
|  | PERFETTO_TE_TERMINATING_FLOW( | 
|  | PerfettoTeProcessScopedFlow(flow_counter))); | 
|  | PERFETTO_TE(physics, PERFETTO_TE_COUNTER(), | 
|  | PERFETTO_TE_REGISTERED_TRACK(&mycounter), | 
|  | PERFETTO_TE_INT_COUNTER(79)); | 
|  | PERFETTO_TE(physics, PERFETTO_TE_INSTANT("name8"), | 
|  | PERFETTO_TE_NAMED_TRACK("dynamictrack", 2, | 
|  | PerfettoTeProcessTrackUuid()), | 
|  | PERFETTO_TE_TIMESTAMP(PerfettoTeGetTimestamp())); | 
|  | PERFETTO_TE(PERFETTO_TE_DYNAMIC_CATEGORY, PERFETTO_TE_COUNTER(), | 
|  | PERFETTO_TE_DOUBLE_COUNTER(3.14), | 
|  | PERFETTO_TE_REGISTERED_TRACK(&mycounter), | 
|  | PERFETTO_TE_DYNAMIC_CATEGORY_STRING("physics")); | 
|  | sleep(1); | 
|  | } | 
|  | } |