1 /* 2 * Copyright (C) 2025 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef TRACE_DUMP_EXECUTOR_H 17 #define TRACE_DUMP_EXECUTOR_H 18 19 #include <atomic> 20 #include <mutex> 21 #include <queue> 22 #include <string> 23 #include <vector> 24 #include <condition_variable> 25 26 #include "hitrace_define.h" 27 #include "nocopyable.h" 28 #include "trace_dump_pipe.h" 29 #include "trace_file_utils.h" 30 #include "trace_source.h" 31 32 namespace OHOS { 33 namespace HiviewDFX { 34 namespace Hitrace { 35 struct TraceDumpParam { 36 TraceDumpType type; 37 std::string outputFile; 38 int fileLimit; 39 int fileSize; 40 uint64_t traceStartTime = 0; 41 uint64_t traceEndTime = 0; 42 }; 43 44 struct TraceDumpRet { 45 TraceErrorCode code = TraceErrorCode::UNSET; 46 char outputFile[TRACE_FILE_LEN] = { 0 }; 47 int64_t fileSize = 0; 48 uint64_t traceStartTime = 0; 49 uint64_t traceEndTime = 0; 50 }; 51 52 struct TraceContentPtr { 53 std::shared_ptr<ITraceFileHdrContent> fileHdr; 54 std::shared_ptr<TraceBaseInfoContent> baseInfo; 55 std::shared_ptr<TraceEventFmtContent> eventFmt; 56 std::shared_ptr<ITraceCpuRawContent> cpuRaw; 57 std::shared_ptr<TraceCmdLinesContent> cmdLines; 58 std::shared_ptr<TraceTgidsContent> tgids; 59 std::shared_ptr<ITraceHeaderPageContent> headerPage; 60 std::shared_ptr<ITracePrintkFmtContent> printkFmt; 61 }; 62 63 struct TraceProcessResult { 64 TraceErrorCode code; 65 std::string traceFile; 66 uint64_t traceStartTime; 67 uint64_t traceEndTime; 68 }; 69 70 class ITraceDumpStrategy { 71 public: 72 virtual ~ITraceDumpStrategy() = default; 73 virtual TraceDumpRet Execute(std::shared_ptr<ITraceSource> traceSource, const TraceDumpRequest& request) = 0; 74 bool CreateTraceContentPtr(std::shared_ptr<ITraceSource> traceSource, const TraceDumpRequest& request, 75 TraceContentPtr& contentPtr); 76 }; 77 78 class SnapshotTraceDumpStrategy : public ITraceDumpStrategy { 79 public: 80 TraceDumpRet Execute(std::shared_ptr<ITraceSource> traceSource, const TraceDumpRequest& request) override; 81 }; 82 83 class RecordTraceDumpStrategy : public ITraceDumpStrategy { 84 public: 85 TraceDumpRet Execute(std::shared_ptr<ITraceSource> traceSource, const TraceDumpRequest& request) override; 86 private: 87 bool ProcessTraceContent(std::shared_ptr<ITraceSource> traceSource, const TraceDumpRequest& request, 88 TraceContentPtr& traceContentPtr, TraceProcessResult& result); 89 }; 90 91 class CacheTraceDumpStrategy : public ITraceDumpStrategy { 92 public: 93 TraceDumpRet Execute(std::shared_ptr<ITraceSource> traceSource, const TraceDumpRequest& request) override; 94 private: 95 bool ProcessTraceContent(std::shared_ptr<ITraceSource> traceSource, const TraceDumpRequest& request, 96 TraceContentPtr& traceContentPtr, TraceProcessResult& result, uint64_t& sliceDuration); 97 }; 98 99 class AsyncTraceReadStrategy : public ITraceDumpStrategy { 100 public: 101 TraceDumpRet Execute(std::shared_ptr<ITraceSource> traceSource, const TraceDumpRequest& request) override; 102 }; 103 104 class AsyncTraceWriteStrategy : public ITraceDumpStrategy { 105 public: 106 TraceDumpRet Execute(std::shared_ptr<ITraceSource> traceSource, const TraceDumpRequest& request) override; 107 }; 108 109 class TraceDumpExecutor final { 110 public: GetInstance()111 static TraceDumpExecutor& GetInstance() 112 { 113 static TraceDumpExecutor instance; 114 return instance; 115 } 116 117 bool PreCheckDumpTraceLoopStatus(); 118 // attention: StartXXXTraceLoop and StopXXXTraceLoop should be called in different threads. 119 bool StartDumpTraceLoop(const TraceDumpParam& param); 120 std::vector<std::string> StopDumpTraceLoop(); 121 bool StartCacheTraceLoop(const TraceDumpParam& param, uint64_t totalFileSize, uint64_t sliceMaxDuration); 122 void StopCacheTraceLoop(); 123 TraceDumpRet DumpTrace(const TraceDumpParam& param); 124 125 std::vector<TraceFileInfo> GetCacheTraceFiles(); 126 127 // attention: ReadRawTraceLoop, WriteTraceLoop and TraceDumpTaskMonitor should be called in different threads. 128 void ReadRawTraceLoop(); 129 void WriteTraceLoop(); 130 void TraceDumpTaskMonitor(); 131 132 void RemoveTraceDumpTask(const uint64_t time); 133 bool UpdateTraceDumpTask(const TraceDumpTask& task); 134 void AddTraceDumpTask(const TraceDumpTask& task); 135 void ClearTraceDumpTask(); 136 bool IsTraceDumpTaskEmpty(); 137 size_t GetTraceDumpTaskCount(); 138 139 #ifdef HITRACE_UNITTEST 140 void ClearCacheTraceFiles(); 141 #endif 142 143 private: 144 TraceDumpExecutor(); 145 DISALLOW_COPY_AND_MOVE(TraceDumpExecutor); 146 void SetTraceDumpStrategy(std::unique_ptr<ITraceDumpStrategy> strategy); 147 TraceDumpRet ExecuteDumpTrace(std::shared_ptr<ITraceSource> traceSource, const TraceDumpRequest& request); 148 bool DoDumpTraceLoop(const TraceDumpParam& param, std::string& traceFile, bool isLimited); 149 TraceDumpRet DumpTraceInner(const TraceDumpParam& param, const std::string& traceFile); 150 bool DoReadRawTrace(TraceDumpTask& task); 151 bool DoWriteRawTrace(TraceDumpTask& task); 152 153 // New helper functions for TraceDumpTaskMonitor 154 void DoProcessTraceDumpTask(std::shared_ptr<HitraceDumpPipe>& dumpPipe, TraceDumpTask& task, 155 std::vector<TraceDumpTask>& completedTasks); 156 void ProcessNewTask(std::shared_ptr<HitraceDumpPipe>& dumpPipe, int& sleepCnt); 157 158 std::string tracefsDir_ = ""; 159 std::vector<TraceFileInfo> loopTraceFiles_ = {}; 160 std::vector<TraceFileInfo> cacheTraceFiles_ = {}; 161 std::vector<TraceDumpTask> traceDumpTaskVec_ = {}; 162 std::mutex traceFileMutex_; 163 std::mutex taskQueueMutex_; 164 std::condition_variable readCondVar_; 165 std::condition_variable writeCondVar_; 166 std::unique_ptr<ITraceDumpStrategy> dumpStrategy_; 167 }; 168 } // namespace Hitrace 169 } // namespace HiviewDFX 170 } // namespace OHOS 171 #endif