106f6ba60Sopenharmony_ci/* 206f6ba60Sopenharmony_ci * Copyright (c) Huawei Technologies Co., Ltd. 2021. All rights reserved. 306f6ba60Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 406f6ba60Sopenharmony_ci * you may not use this file except in compliance with the License. 506f6ba60Sopenharmony_ci * You may obtain a copy of the License at 606f6ba60Sopenharmony_ci * 706f6ba60Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 806f6ba60Sopenharmony_ci * 906f6ba60Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1006f6ba60Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1106f6ba60Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1206f6ba60Sopenharmony_ci * See the License for the specific language governing permissions and 1306f6ba60Sopenharmony_ci * limitations under the License. 1406f6ba60Sopenharmony_ci * 1506f6ba60Sopenharmony_ci * Description: ftrace plugin module implements 1606f6ba60Sopenharmony_ci */ 1706f6ba60Sopenharmony_ci#include "ftrace_module.h" 1806f6ba60Sopenharmony_ci#include <memory> 1906f6ba60Sopenharmony_ci#include <mutex> 2006f6ba60Sopenharmony_ci 2106f6ba60Sopenharmony_ci#include "flow_controller.h" 2206f6ba60Sopenharmony_ci#include "logging.h" 2306f6ba60Sopenharmony_ci 2406f6ba60Sopenharmony_cinamespace { 2506f6ba60Sopenharmony_ciconstexpr uint32_t MAX_BUFFER_SIZE = 4 * 1024 * 1024; 2606f6ba60Sopenharmony_ci 2706f6ba60Sopenharmony_cistd::mutex g_mutex; 2806f6ba60Sopenharmony_cistd::unique_ptr<FTRACE_NS::FlowController> g_mainController; 2906f6ba60Sopenharmony_ci} // namespace 3006f6ba60Sopenharmony_ci 3106f6ba60Sopenharmony_ciint TracePluginRegisterWriter(const WriterStruct* writer) 3206f6ba60Sopenharmony_ci{ 3306f6ba60Sopenharmony_ci std::unique_lock<std::mutex> lock(g_mutex); 3406f6ba60Sopenharmony_ci g_mainController = std::make_unique<FTRACE_NS::FlowController>(); 3506f6ba60Sopenharmony_ci 3606f6ba60Sopenharmony_ci int result = g_mainController->SetWriter(const_cast<WriterStructPtr>(writer)); 3706f6ba60Sopenharmony_ci PROFILER_LOG_INFO(LOG_CORE, "%s: %d", __func__, __LINE__); 3806f6ba60Sopenharmony_ci return result; 3906f6ba60Sopenharmony_ci} 4006f6ba60Sopenharmony_ci 4106f6ba60Sopenharmony_ciint TracePluginStartSession(const uint8_t configData[], const uint32_t configSize) 4206f6ba60Sopenharmony_ci{ 4306f6ba60Sopenharmony_ci std::unique_lock<std::mutex> lock(g_mutex); 4406f6ba60Sopenharmony_ci CHECK_NOTNULL(g_mainController, -1, "%s: no FlowController created!", __func__); 4506f6ba60Sopenharmony_ci 4606f6ba60Sopenharmony_ci PROFILER_LOG_INFO(LOG_CORE, "%s: %d", __func__, __LINE__); 4706f6ba60Sopenharmony_ci int retval = g_mainController->LoadConfig(configData, configSize); 4806f6ba60Sopenharmony_ci CHECK_TRUE(retval == 0, retval, "LoadConfig failed!"); 4906f6ba60Sopenharmony_ci 5006f6ba60Sopenharmony_ci PROFILER_LOG_INFO(LOG_CORE, "%s: %d", __func__, __LINE__); 5106f6ba60Sopenharmony_ci int result = g_mainController->StartCapture(); 5206f6ba60Sopenharmony_ci PROFILER_LOG_INFO(LOG_CORE, "%s: %d", __func__, __LINE__); 5306f6ba60Sopenharmony_ci return result; 5406f6ba60Sopenharmony_ci} 5506f6ba60Sopenharmony_ci 5606f6ba60Sopenharmony_ciint TracePluginReportBasicData() 5706f6ba60Sopenharmony_ci{ 5806f6ba60Sopenharmony_ci std::unique_lock<std::mutex> lock(g_mutex); 5906f6ba60Sopenharmony_ci CHECK_NOTNULL(g_mainController, -1, "%s: no FlowController created!", __func__); 6006f6ba60Sopenharmony_ci 6106f6ba60Sopenharmony_ci PROFILER_LOG_INFO(LOG_CORE, "%s: %d", __func__, __LINE__); 6206f6ba60Sopenharmony_ci g_mainController->SetReportBasicData(true); 6306f6ba60Sopenharmony_ci PROFILER_LOG_INFO(LOG_CORE, "%s: %d", __func__, __LINE__); 6406f6ba60Sopenharmony_ci return 0; 6506f6ba60Sopenharmony_ci} 6606f6ba60Sopenharmony_ci 6706f6ba60Sopenharmony_ciint TracePluginStopSession() 6806f6ba60Sopenharmony_ci{ 6906f6ba60Sopenharmony_ci std::unique_lock<std::mutex> lock(g_mutex); 7006f6ba60Sopenharmony_ci CHECK_NOTNULL(g_mainController, -1, "%s: no FlowController created!", __func__); 7106f6ba60Sopenharmony_ci 7206f6ba60Sopenharmony_ci PROFILER_LOG_INFO(LOG_CORE, "%s: %d", __func__, __LINE__); 7306f6ba60Sopenharmony_ci int result = g_mainController->StopCapture(); 7406f6ba60Sopenharmony_ci PROFILER_LOG_INFO(LOG_CORE, "%s: %d", __func__, __LINE__); 7506f6ba60Sopenharmony_ci 7606f6ba60Sopenharmony_ci g_mainController.reset(); 7706f6ba60Sopenharmony_ci return result; 7806f6ba60Sopenharmony_ci} 7906f6ba60Sopenharmony_ci 8006f6ba60Sopenharmony_cistatic PluginModuleCallbacks moduleCallbacks = { 8106f6ba60Sopenharmony_ci .onPluginSessionStart = TracePluginStartSession, 8206f6ba60Sopenharmony_ci .onPluginReportResult = 0, 8306f6ba60Sopenharmony_ci .onPluginSessionStop = TracePluginStopSession, 8406f6ba60Sopenharmony_ci .onRegisterWriterStruct = TracePluginRegisterWriter, 8506f6ba60Sopenharmony_ci .onReportBasicDataCallback = TracePluginReportBasicData, // report ftrace_plugin basic data 8606f6ba60Sopenharmony_ci}; 8706f6ba60Sopenharmony_ci 8806f6ba60Sopenharmony_ciEXPORT_API PluginModuleStruct g_pluginModule = { 8906f6ba60Sopenharmony_ci .callbacks = &moduleCallbacks, 9006f6ba60Sopenharmony_ci .name = "ftrace-plugin", 9106f6ba60Sopenharmony_ci .version = "1.02", 9206f6ba60Sopenharmony_ci .resultBufferSizeHint = MAX_BUFFER_SIZE, 9306f6ba60Sopenharmony_ci}; 94