/* * 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/traced/probes/ftrace/atrace_hal_wrapper.h" #include "perfetto/base/build_config.h" #include "src/android_internal/atrace_hal.h" #include "src/android_internal/lazy_library_loader.h" namespace perfetto { namespace { constexpr size_t kMaxNumCategories = 64; } struct AtraceHalWrapper::DynamicLibLoader { PERFETTO_LAZY_LOAD(android_internal::ForgetService, forget_service_); PERFETTO_LAZY_LOAD(android_internal::ListCategories, list_categories_); PERFETTO_LAZY_LOAD(android_internal::EnableCategories, enable_categories_); PERFETTO_LAZY_LOAD(android_internal::DisableAllCategories, disable_all_categories_); std::vector ListCategories() { std::vector results; if (!list_categories_) return results; std::vector categories( kMaxNumCategories); size_t num_cat = categories.size(); bool success = list_categories_(&categories[0], &num_cat); if (!success) return results; categories.resize(num_cat); for (const auto& category : categories) { results.push_back(category.name); } return results; } bool EnableCategories(const std::vector& categories) { if (!enable_categories_) return false; std::vector args; args.reserve(categories.size()); for (const std::string& category : categories) { args.push_back(category.c_str()); } return enable_categories_(&args[0], args.size()); } bool DisableAllCategories() { if (!disable_all_categories_) return false; return disable_all_categories_(); } void ForgetService() { if (!forget_service_) return; forget_service_(); } }; AtraceHalWrapper::AtraceHalWrapper() { #if PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) lib_.reset(new DynamicLibLoader()); #endif } AtraceHalWrapper::~AtraceHalWrapper() { if (lib_) lib_->ForgetService(); } std::vector AtraceHalWrapper::ListCategories() { if (!lib_) return {}; return lib_->ListCategories(); } bool AtraceHalWrapper::EnableCategories( const std::vector& categories) { if (!lib_) return true; return lib_->EnableCategories(categories); } bool AtraceHalWrapper::DisableAllCategories() { if (!lib_) return true; return lib_->DisableAllCategories(); } } // namespace perfetto