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_SOURCE_H 17 #define TRACE_SOURCE_H 18 19 #include <memory> 20 #include <string> 21 22 #include "trace_content.h" 23 24 namespace OHOS { 25 namespace HiviewDFX { 26 namespace Hitrace { 27 /** 28 * @brief ITraceSource is the interface for trace source. 29 * @note The trace source is responsible for providing the trace data to the trace dump executor. 30 */ 31 class ITraceSource { 32 public: ITraceSource()33 ITraceSource() {} ~ITraceSource()34 virtual ~ITraceSource() {} 35 36 virtual std::shared_ptr<ITraceFileHdrContent> GetTraceFileHeader() = 0; 37 virtual std::shared_ptr<TraceBaseInfoContent> GetTraceBaseInfo() = 0; 38 virtual std::shared_ptr<ITraceCpuRawContent> GetTraceCpuRaw(const TraceDumpRequest& request) = 0; 39 virtual std::shared_ptr<ITraceHeaderPageContent> GetTraceHeaderPage() = 0; 40 virtual std::shared_ptr<ITracePrintkFmtContent> GetTracePrintkFmt() = 0; 41 virtual std::shared_ptr<TraceEventFmtContent> GetTraceEventFmt() = 0; 42 virtual std::shared_ptr<TraceCmdLinesContent> GetTraceCmdLines() = 0; 43 virtual std::shared_ptr<TraceTgidsContent> GetTraceTgids() = 0; 44 virtual std::shared_ptr<ITraceCpuRawRead> GetTraceCpuRawRead(const TraceDumpRequest& request) = 0; 45 virtual std::shared_ptr<ITraceCpuRawWrite> GetTraceCpuRawWrite(const uint64_t taskId) = 0; 46 virtual std::string GetTraceFilePath() = 0; 47 virtual bool UpdateTraceFile(const std::string& traceFilePath) = 0; 48 }; 49 50 struct LinuxTraceSourceStrategy { CreateFileHdrLinuxTraceSourceStrategy51 static std::shared_ptr<ITraceFileHdrContent> CreateFileHdr(int fd, const std::string& fs, const std::string& file) 52 { 53 return std::make_shared<TraceFileHdrLinux>(fd, fs, file); 54 } 55 CreateBaseInfoLinuxTraceSourceStrategy56 static std::shared_ptr<TraceBaseInfoContent> CreateBaseInfo(int fd, const std::string& fs, const std::string& file) 57 { 58 return std::make_shared<TraceBaseInfoContent>(fd, fs, file, false); 59 } 60 CreateCpuRawLinuxTraceSourceStrategy61 static std::shared_ptr<ITraceCpuRawContent> CreateCpuRaw(int fd, const std::string& fs, const std::string& file, 62 const TraceDumpRequest& req) 63 { 64 return std::make_shared<TraceCpuRawLinux>(fd, fs, file, req); 65 } 66 CreateHeaderPageLinuxTraceSourceStrategy67 static std::shared_ptr<ITraceHeaderPageContent> CreateHeaderPage(int fd, const std::string& fs, 68 const std::string& file) 69 { 70 return std::make_shared<TraceHeaderPageLinux>(fd, fs, file); 71 } 72 CreatePrintkFmtLinuxTraceSourceStrategy73 static std::shared_ptr<ITracePrintkFmtContent> CreatePrintkFmt(int fd, const std::string& fs, 74 const std::string& file) 75 { 76 return std::make_shared<TracePrintkFmtLinux>(fd, fs, file); 77 } 78 CreateEventFmtLinuxTraceSourceStrategy79 static std::shared_ptr<TraceEventFmtContent> CreateEventFmt(int fd, const std::string& fs, const std::string& file) 80 { 81 return std::make_shared<TraceEventFmtContent>(fd, fs, file, false); 82 } 83 CreateCmdLinesLinuxTraceSourceStrategy84 static std::shared_ptr<TraceCmdLinesContent> CreateCmdLines(int fd, const std::string& fs, const std::string& file) 85 { 86 return std::make_shared<TraceCmdLinesContent>(fd, fs, file, false); 87 } 88 CreateTgidsLinuxTraceSourceStrategy89 static std::shared_ptr<TraceTgidsContent> CreateTgids(int fd, const std::string& fs, const std::string& file) 90 { 91 return std::make_shared<TraceTgidsContent>(fd, fs, file, false); 92 } 93 CreateCpuRawReadLinuxTraceSourceStrategy94 static std::shared_ptr<ITraceCpuRawRead> CreateCpuRawRead(const std::string& fs, const TraceDumpRequest& req) 95 { 96 return std::make_shared<TraceCpuRawReadLinux>(fs, req); 97 } 98 CreateCpuRawWriteLinuxTraceSourceStrategy99 static std::shared_ptr<ITraceCpuRawWrite> CreateCpuRawWrite(int fd, const std::string& file, uint64_t taskId) 100 { 101 return std::make_shared<TraceCpuRawWriteLinux>(fd, file, taskId); 102 } 103 }; 104 105 struct HMTraceSourceStrategy { CreateFileHdrHMTraceSourceStrategy106 static std::shared_ptr<ITraceFileHdrContent> CreateFileHdr(int fd, const std::string& fs, const std::string& file) 107 { 108 return std::make_shared<TraceFileHdrHM>(fd, fs, file); 109 } 110 CreateBaseInfoHMTraceSourceStrategy111 static std::shared_ptr<TraceBaseInfoContent> CreateBaseInfo(int fd, const std::string& fs, const std::string& file) 112 { 113 return std::make_shared<TraceBaseInfoContent>(fd, fs, file, true); 114 } 115 CreateCpuRawHMTraceSourceStrategy116 static std::shared_ptr<ITraceCpuRawContent> CreateCpuRaw(int fd, const std::string& fs, const std::string& file, 117 const TraceDumpRequest& req) 118 { 119 return std::make_shared<TraceCpuRawHM>(fd, fs, file, req); 120 } 121 CreateHeaderPageHMTraceSourceStrategy122 static std::shared_ptr<ITraceHeaderPageContent> CreateHeaderPage(int fd, const std::string& fs, 123 const std::string& file) 124 { 125 return std::make_shared<TraceHeaderPageHM>(fd, fs, file); 126 } 127 CreatePrintkFmtHMTraceSourceStrategy128 static std::shared_ptr<ITracePrintkFmtContent> CreatePrintkFmt(int fd, const std::string& fs, 129 const std::string& file) 130 { 131 return std::make_shared<TracePrintkFmtHM>(fd, fs, file); 132 } 133 CreateEventFmtHMTraceSourceStrategy134 static std::shared_ptr<TraceEventFmtContent> CreateEventFmt(int fd, const std::string& fs, const std::string& file) 135 { 136 return std::make_shared<TraceEventFmtContent>(fd, fs, file, true); 137 } 138 CreateCmdLinesHMTraceSourceStrategy139 static std::shared_ptr<TraceCmdLinesContent> CreateCmdLines(int fd, const std::string& fs, const std::string& file) 140 { 141 return std::make_shared<TraceCmdLinesContent>(fd, fs, file, true); 142 } 143 CreateTgidsHMTraceSourceStrategy144 static std::shared_ptr<TraceTgidsContent> CreateTgids(int fd, const std::string& fs, const std::string& file) 145 { 146 return std::make_shared<TraceTgidsContent>(fd, fs, file, true); 147 } 148 CreateCpuRawReadHMTraceSourceStrategy149 static std::shared_ptr<ITraceCpuRawRead> CreateCpuRawRead(const std::string& fs, const TraceDumpRequest& req) 150 { 151 return std::make_shared<TraceCpuRawReadHM>(fs, req); 152 } 153 CreateCpuRawWriteHMTraceSourceStrategy154 static std::shared_ptr<ITraceCpuRawWrite> CreateCpuRawWrite(int fd, const std::string& file, uint64_t taskId) 155 { 156 return std::make_shared<TraceCpuRawWriteHM>(fd, file, taskId); 157 } 158 }; 159 160 template <typename Strategy> 161 class TraceSource : public ITraceSource { 162 public: 163 TraceSource() = delete; 164 TraceSource(const std::string& tracefsPath, const std::string& traceFilePath); 165 ~TraceSource() override; 166 167 std::shared_ptr<ITraceFileHdrContent> GetTraceFileHeader() override; 168 std::shared_ptr<TraceBaseInfoContent> GetTraceBaseInfo() override; 169 std::shared_ptr<ITraceCpuRawContent> GetTraceCpuRaw(const TraceDumpRequest& request) override; 170 std::shared_ptr<ITraceHeaderPageContent> GetTraceHeaderPage() override; 171 std::shared_ptr<ITracePrintkFmtContent> GetTracePrintkFmt() override; 172 std::shared_ptr<TraceEventFmtContent> GetTraceEventFmt() override; 173 std::shared_ptr<TraceCmdLinesContent> GetTraceCmdLines() override; 174 std::shared_ptr<TraceTgidsContent> GetTraceTgids() override; 175 std::shared_ptr<ITraceCpuRawRead> GetTraceCpuRawRead(const TraceDumpRequest& request) override; 176 std::shared_ptr<ITraceCpuRawWrite> GetTraceCpuRawWrite(const uint64_t taskId) override; 177 std::string GetTraceFilePath() override; 178 bool UpdateTraceFile(const std::string& traceFilePath) override; 179 180 private: 181 int traceFileFd_ = -1; 182 std::string tracefsPath_; 183 std::string traceFilePath_; 184 }; 185 186 using TraceSourceLinux = TraceSource<LinuxTraceSourceStrategy>; 187 using TraceSourceHM = TraceSource<HMTraceSourceStrategy>; 188 } // namespace Hitrace 189 } // namespace HiviewDFX 190 } // namespace OHOS 191 #endif // TRACE_SOURCE_H