xref: /aosp_15_r20/external/perfetto/src/android_internal/atrace_hal.cc (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker /*
2*6dbdd20aSAndroid Build Coastguard Worker  * Copyright (C) 2019 The Android Open Source Project
3*6dbdd20aSAndroid Build Coastguard Worker  *
4*6dbdd20aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*6dbdd20aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*6dbdd20aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*6dbdd20aSAndroid Build Coastguard Worker  *
8*6dbdd20aSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*6dbdd20aSAndroid Build Coastguard Worker  *
10*6dbdd20aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*6dbdd20aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*6dbdd20aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6dbdd20aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*6dbdd20aSAndroid Build Coastguard Worker  * limitations under the License.
15*6dbdd20aSAndroid Build Coastguard Worker  */
16*6dbdd20aSAndroid Build Coastguard Worker 
17*6dbdd20aSAndroid Build Coastguard Worker #include "src/android_internal/atrace_hal.h"
18*6dbdd20aSAndroid Build Coastguard Worker 
19*6dbdd20aSAndroid Build Coastguard Worker #include <android/hardware/atrace/1.0/IAtraceDevice.h>
20*6dbdd20aSAndroid Build Coastguard Worker #include <iostream>
21*6dbdd20aSAndroid Build Coastguard Worker 
22*6dbdd20aSAndroid Build Coastguard Worker #include <string.h>
23*6dbdd20aSAndroid Build Coastguard Worker 
24*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto {
25*6dbdd20aSAndroid Build Coastguard Worker namespace android_internal {
26*6dbdd20aSAndroid Build Coastguard Worker 
27*6dbdd20aSAndroid Build Coastguard Worker using android::hardware::hidl_string;
28*6dbdd20aSAndroid Build Coastguard Worker using android::hardware::hidl_vec;
29*6dbdd20aSAndroid Build Coastguard Worker using android::hardware::Return;
30*6dbdd20aSAndroid Build Coastguard Worker using android::hardware::atrace::V1_0::IAtraceDevice;
31*6dbdd20aSAndroid Build Coastguard Worker using android::hardware::atrace::V1_0::TracingCategory;
32*6dbdd20aSAndroid Build Coastguard Worker 
33*6dbdd20aSAndroid Build Coastguard Worker namespace {
34*6dbdd20aSAndroid Build Coastguard Worker 
35*6dbdd20aSAndroid Build Coastguard Worker android::sp<IAtraceDevice> g_atraceHal;
36*6dbdd20aSAndroid Build Coastguard Worker 
GetService()37*6dbdd20aSAndroid Build Coastguard Worker bool GetService() {
38*6dbdd20aSAndroid Build Coastguard Worker   if (!g_atraceHal)
39*6dbdd20aSAndroid Build Coastguard Worker     g_atraceHal = IAtraceDevice::getService();
40*6dbdd20aSAndroid Build Coastguard Worker 
41*6dbdd20aSAndroid Build Coastguard Worker   return g_atraceHal != nullptr;
42*6dbdd20aSAndroid Build Coastguard Worker }
43*6dbdd20aSAndroid Build Coastguard Worker 
44*6dbdd20aSAndroid Build Coastguard Worker }  // namespace
45*6dbdd20aSAndroid Build Coastguard Worker 
ListCategories(TracingVendorCategory * categories,size_t * size_of_arr)46*6dbdd20aSAndroid Build Coastguard Worker bool ListCategories(TracingVendorCategory* categories, size_t* size_of_arr) {
47*6dbdd20aSAndroid Build Coastguard Worker   const size_t in_array_size = *size_of_arr;
48*6dbdd20aSAndroid Build Coastguard Worker   *size_of_arr = 0;
49*6dbdd20aSAndroid Build Coastguard Worker   if (!GetService())
50*6dbdd20aSAndroid Build Coastguard Worker     return false;
51*6dbdd20aSAndroid Build Coastguard Worker 
52*6dbdd20aSAndroid Build Coastguard Worker   auto category_cb = [categories, size_of_arr,
53*6dbdd20aSAndroid Build Coastguard Worker                       &in_array_size](hidl_vec<TracingCategory> r) {
54*6dbdd20aSAndroid Build Coastguard Worker     *size_of_arr = std::min(in_array_size, r.size());
55*6dbdd20aSAndroid Build Coastguard Worker     for (int i = 0; i < *size_of_arr; ++i) {
56*6dbdd20aSAndroid Build Coastguard Worker       const TracingCategory& cat = r[i];
57*6dbdd20aSAndroid Build Coastguard Worker       TracingVendorCategory& result = categories[i];
58*6dbdd20aSAndroid Build Coastguard Worker       strlcpy(result.name, cat.name.c_str(), sizeof(result.name));
59*6dbdd20aSAndroid Build Coastguard Worker       strlcpy(result.description, cat.description.c_str(),
60*6dbdd20aSAndroid Build Coastguard Worker               sizeof(result.description));
61*6dbdd20aSAndroid Build Coastguard Worker     }
62*6dbdd20aSAndroid Build Coastguard Worker   };
63*6dbdd20aSAndroid Build Coastguard Worker 
64*6dbdd20aSAndroid Build Coastguard Worker   g_atraceHal->listCategories(category_cb);
65*6dbdd20aSAndroid Build Coastguard Worker   return true;
66*6dbdd20aSAndroid Build Coastguard Worker }
67*6dbdd20aSAndroid Build Coastguard Worker 
EnableCategories(const char ** categories,size_t categories_count)68*6dbdd20aSAndroid Build Coastguard Worker bool EnableCategories(const char** categories, size_t categories_count) {
69*6dbdd20aSAndroid Build Coastguard Worker   if (!GetService())
70*6dbdd20aSAndroid Build Coastguard Worker     return false;
71*6dbdd20aSAndroid Build Coastguard Worker   std::vector<hidl_string> args;
72*6dbdd20aSAndroid Build Coastguard Worker   args.resize(categories_count);
73*6dbdd20aSAndroid Build Coastguard Worker   for (size_t i = 0; i < categories_count; ++i) {
74*6dbdd20aSAndroid Build Coastguard Worker     args[i] = categories[i];
75*6dbdd20aSAndroid Build Coastguard Worker   }
76*6dbdd20aSAndroid Build Coastguard Worker   g_atraceHal->enableCategories(args);
77*6dbdd20aSAndroid Build Coastguard Worker   // TODO(hjd): Check status.
78*6dbdd20aSAndroid Build Coastguard Worker   return true;
79*6dbdd20aSAndroid Build Coastguard Worker }
80*6dbdd20aSAndroid Build Coastguard Worker 
DisableAllCategories()81*6dbdd20aSAndroid Build Coastguard Worker bool DisableAllCategories() {
82*6dbdd20aSAndroid Build Coastguard Worker   if (!GetService())
83*6dbdd20aSAndroid Build Coastguard Worker     return false;
84*6dbdd20aSAndroid Build Coastguard Worker   g_atraceHal->disableAllCategories();
85*6dbdd20aSAndroid Build Coastguard Worker   // TODO(hjd): Check status.
86*6dbdd20aSAndroid Build Coastguard Worker   return true;
87*6dbdd20aSAndroid Build Coastguard Worker }
88*6dbdd20aSAndroid Build Coastguard Worker 
ForgetService()89*6dbdd20aSAndroid Build Coastguard Worker void ForgetService() {
90*6dbdd20aSAndroid Build Coastguard Worker   g_atraceHal = nullptr;
91*6dbdd20aSAndroid Build Coastguard Worker }
92*6dbdd20aSAndroid Build Coastguard Worker 
93*6dbdd20aSAndroid Build Coastguard Worker }  // namespace android_internal
94*6dbdd20aSAndroid Build Coastguard Worker }  // namespace perfetto
95