• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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