/* * Copyright (c) Huawei Technologies Co., Ltd. 2021-2023. All rights reserved. * 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. * * Description: FlowController define */ #ifndef FLOW_CONTROLLER_H #define FLOW_CONTROLLER_H #include "ftrace_data_reader.h" #include "ftrace_namespace.h" #include "ftrace_parser.h" #include "kernel_symbols_parser.h" #include "paged_mem_pool.h" #include "plugin_module_api.h" #include "result_transporter.h" #include "trace_collector.h" #include "trace_plugin_config.pb.h" #include #include #include #include #include using WriterStructPtr = std::unique_ptr::pointer; FTRACE_NS_BEGIN class FlowController { public: FlowController(void); ~FlowController(void); int SetWriter(const WriterStructPtr& writer); int LoadConfig(const uint8_t configData[], uint32_t size); int StartCapture(void); int StopCapture(void); void SetReportBasicData(bool isReportBasicData); bool ParseBasicData(void); private: DISALLOW_COPY_AND_MOVE(FlowController); bool CreateRawDataReaders(); bool CreatePagedMemoryPool(); bool CreateRawDataBuffers(); bool CreateRawDataCaches(); void SetupTraceBufferSize(uint32_t sizeKb); void SetupTransporterFlushParams(uint32_t intervalMs, uint32_t thresholdKb); void GenerateRawDataFileNames(const std::string& prefix); void SetupTraceReadPeriod(uint32_t periodMs); void CaptureWorkOnNomalModeInner(); void HmCaptureWorkOnNomalModeInner(); void CaptureWorkOnNomalMode(); void CaptureWorkOnDelayMode(); long ReadEventData(int cpuid); long HmReadEventData(); bool ParseEventDataOnNomalMode(int cpuid, long dataSize); bool HmParseEventDataOnNomalMode(long dataSize); bool ParseEventDataOnDelayMode(); bool ParseEventData(int cpuid, uint8_t* page); template bool HmParseEventData(T* tracePluginResult, uint8_t* &data, E* ftraceEvent); bool AddPlatformEventsToParser(void); void EnableTraceEvents(void); void DisableTraceEvents(void); void DisableAllCategories(void); template bool ReportClockTimes(T& tracePluginResult); template bool ParseKernelSymbols(T& tracePluginResult); template bool ParsePerCpuStatus(T& tracePluginResult, int stage); template bool ParseFtraceEvent(T* tracePluginResult, int cpuid, uint8_t page[], E* ftraceEvent); std::string ReloadTraceArgs(); // for UT void SetTestInfo(int cpuNum, std::string path) { platformCpuNum_ = cpuNum; fakePath_ = path; } using EventTypeName = std::pair; std::vector supportedEvents_ = {}; std::vector enabledEvents_ = {}; std::unique_ptr memPool_ = nullptr; std::unique_ptr ksymsParser_ = nullptr; std::unique_ptr ftraceParser_ = nullptr; std::unique_ptr tansporter_ = nullptr; std::shared_ptr traceCollector_ = nullptr; std::shared_ptr rawDataFile_ = nullptr; std::vector> ftraceReaders_ = {}; std::vector> ftraceBuffers_; std::atomic keepRunning_ = false; std::thread pollThread_ = {}; // for trace plugin config fields std::vector requestEvents_ = {}; // 1 std::vector traceCategories_ = {}; // 2 std::vector traceApps_ = {}; // 3 std::vector rawDataDumpPath_ = {}; // 13 uint32_t tracePeriodMs_ = 0; // 10 uint32_t bufferSizeKb_ = 0; // 6 bool parseKsyms_ = false; // 7 TracePluginConfig_ParseMode parseMode_ = TracePluginConfig_ParseMode_NORMAL; WriterStructPtr resultWriter_ = nullptr; int platformCpuNum_ = 0; bool getClockTimes_ = true; bool ftraceSupported_ = false; bool flushCacheData_ = false; unsigned int hitraceTime_ = 0; std::string traceClock_; std::atomic isReportBasicData_ = false; std::string fakePath_ = ""; }; FTRACE_NS_END #endif // FLOW_CONTROLLER_H