• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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 #include "bytrace_event_parser.h"
17 #include "app_start_filter.h"
18 #include "binder_filter.h"
19 #include "cpu_filter.h"
20 #include "filter_filter.h"
21 #include "irq_filter.h"
22 #include "measure_filter.h"
23 #include "parting_string.h"
24 #include "process_filter.h"
25 #include "slice_filter.h"
26 #include "stat_filter.h"
27 #include "string_to_numerical.h"
28 #include "thread_state_flag.h"
29 #include "ts_common.h"
30 namespace SysTuning {
31 namespace TraceStreamer {
32 namespace {
GetFunctionName(const std::string_view & text,const std::string_view & delimiter)33 std::string GetFunctionName(const std::string_view& text, const std::string_view& delimiter)
34 {
35     std::string str("");
36     if (delimiter.empty()) {
37         return str;
38     }
39 
40     std::size_t foundIndex = text.find(delimiter);
41     if (foundIndex != std::string::npos) {
42         std::size_t funIndex = foundIndex + delimiter.size();
43         str = std::string(text.substr(funIndex, text.size() - funIndex));
44     }
45     return str;
46 }
47 } // namespace
48 
BytraceEventParser(TraceDataCache * dataCache,const TraceStreamerFilters * filter)49 BytraceEventParser::BytraceEventParser(TraceDataCache* dataCache, const TraceStreamerFilters* filter)
50     : EventParserBase(dataCache, filter), printEventParser_(traceDataCache_, streamFilters_)
51 {
52     printEventParser_.SetTraceType(TRACE_FILETYPE_BY_TRACE);
53     eventToFunctionMap_ = {
54         {config_.eventNameMap_.at(TRACE_EVENT_SCHED_SWITCH),
55          bind(&BytraceEventParser::SchedSwitchEvent, this, std::placeholders::_1, std::placeholders::_2)},
56         {config_.eventNameMap_.at(TRACE_EVENT_SCHED_BLOCKED_REASON),
57          bind(&BytraceEventParser::BlockedReason, this, std::placeholders::_1, std::placeholders::_2)},
58         {config_.eventNameMap_.at(TRACE_EVENT_TASK_RENAME),
59          bind(&BytraceEventParser::TaskRenameEvent, this, std::placeholders::_1, std::placeholders::_2)},
60         {config_.eventNameMap_.at(TRACE_EVENT_TASK_NEWTASK),
61          bind(&BytraceEventParser::TaskNewtaskEvent, this, std::placeholders::_1, std::placeholders::_2)},
62         {config_.eventNameMap_.at(TRACE_EVENT_TRACING_MARK_WRITE),
63          bind(&BytraceEventParser::TracingMarkWriteOrPrintEvent, this, std::placeholders::_1, std::placeholders::_2)},
64         {config_.eventNameMap_.at(TRACE_EVENT_PRINT),
65          bind(&BytraceEventParser::TracingMarkWriteOrPrintEvent, this, std::placeholders::_1, std::placeholders::_2)},
66         {config_.eventNameMap_.at(TRACE_EVENT_SCHED_WAKEUP),
67          bind(&BytraceEventParser::SchedWakeupEvent, this, std::placeholders::_1, std::placeholders::_2)},
68         {config_.eventNameMap_.at(TRACE_EVENT_SCHED_WAKING),
69          bind(&BytraceEventParser::SchedWakingEvent, this, std::placeholders::_1, std::placeholders::_2)},
70         {config_.eventNameMap_.at(TRACE_EVENT_CPU_IDLE),
71          bind(&BytraceEventParser::CpuIdleEvent, this, std::placeholders::_1, std::placeholders::_2)},
72         {config_.eventNameMap_.at(TRACE_EVENT_CPU_FREQUENCY),
73          bind(&BytraceEventParser::CpuFrequencyEvent, this, std::placeholders::_1, std::placeholders::_2)},
74         {config_.eventNameMap_.at(TRACE_EVENT_CPU_FREQUENCY_LIMITS),
75          bind(&BytraceEventParser::CpuFrequencyLimitsEvent, this, std::placeholders::_1, std::placeholders::_2)},
76         {config_.eventNameMap_.at(TRACE_EVENT_WORKQUEUE_EXECUTE_START),
77          bind(&BytraceEventParser::WorkqueueExecuteStartEvent, this, std::placeholders::_1, std::placeholders::_2)},
78         {config_.eventNameMap_.at(TRACE_EVENT_WORKQUEUE_EXECUTE_END),
79          bind(&BytraceEventParser::WorkqueueExecuteEndEvent, this, std::placeholders::_1, std::placeholders::_2)},
80         {config_.eventNameMap_.at(TRACE_EVENT_CLOCK_SET_RATE),
81          bind(&BytraceEventParser::SetRateEvent, this, std::placeholders::_1, std::placeholders::_2)},
82         {config_.eventNameMap_.at(TRACE_EVENT_CLOCK_ENABLE),
83          bind(&BytraceEventParser::ClockEnableEvent, this, std::placeholders::_1, std::placeholders::_2)},
84         {config_.eventNameMap_.at(TRACE_EVENT_CLOCK_DISABLE),
85          bind(&BytraceEventParser::ClockDisableEvent, this, std::placeholders::_1, std::placeholders::_2)},
86         {config_.eventNameMap_.at(TRACE_EVENT_REGULATOR_SET_VOLTAGE),
87          bind(&BytraceEventParser::RegulatorSetVoltageEvent, this, std::placeholders::_1, std::placeholders::_2)},
88         {config_.eventNameMap_.at(TRACE_EVENT_REGULATOR_SET_VOLTAGE_COMPLETE),
89          bind(&BytraceEventParser::RegulatorSetVoltageCompleteEvent, this, std::placeholders::_1,
90               std::placeholders::_2)},
91         {config_.eventNameMap_.at(TRACE_EVENT_REGULATOR_DISABLE),
92          bind(&BytraceEventParser::RegulatorDisableEvent, this, std::placeholders::_1, std::placeholders::_2)},
93         {config_.eventNameMap_.at(TRACE_EVENT_REGULATOR_DISABLE_COMPLETE),
94          bind(&BytraceEventParser::RegulatorDisableCompleteEvent, this, std::placeholders::_1, std::placeholders::_2)},
95         {config_.eventNameMap_.at(TRACE_EVENT_IPI_ENTRY),
96          bind(&BytraceEventParser::IpiEntryEvent, this, std::placeholders::_1, std::placeholders::_2)},
97         {config_.eventNameMap_.at(TRACE_EVENT_IPI_EXIT),
98          bind(&BytraceEventParser::IpiExitEvent, this, std::placeholders::_1, std::placeholders::_2)},
99         {config_.eventNameMap_.at(TRACE_EVENT_IRQ_HANDLER_ENTRY),
100          bind(&BytraceEventParser::IrqHandlerEntryEvent, this, std::placeholders::_1, std::placeholders::_2)},
101         {config_.eventNameMap_.at(TRACE_EVENT_IRQ_HANDLER_EXIT),
102          bind(&BytraceEventParser::IrqHandlerExitEvent, this, std::placeholders::_1, std::placeholders::_2)},
103         {config_.eventNameMap_.at(TRACE_EVENT_SOFTIRQ_RAISE),
104          bind(&BytraceEventParser::SoftIrqRaiseEvent, this, std::placeholders::_1, std::placeholders::_2)},
105         {config_.eventNameMap_.at(TRACE_EVENT_SOFTIRQ_ENTRY),
106          bind(&BytraceEventParser::SoftIrqEntryEvent, this, std::placeholders::_1, std::placeholders::_2)},
107         {config_.eventNameMap_.at(TRACE_EVENT_SOFTIRQ_EXIT),
108          bind(&BytraceEventParser::SoftIrqExitEvent, this, std::placeholders::_1, std::placeholders::_2)},
109         {config_.eventNameMap_.at(TRACE_EVENT_BINDER_TRANSACTION),
110          bind(&BytraceEventParser::BinderTransaction, this, std::placeholders::_1, std::placeholders::_2)},
111         {config_.eventNameMap_.at(TRACE_EVENT_BINDER_TRANSACTION_RECEIVED),
112          bind(&BytraceEventParser::BinderTransactionReceived, this, std::placeholders::_1, std::placeholders::_2)},
113         {config_.eventNameMap_.at(TRACE_EVENT_BINDER_TRANSACTION_ALLOC_BUF),
114          bind(&BytraceEventParser::BinderTransactionAllocBufEvent, this, std::placeholders::_1, std::placeholders::_2)},
115         {config_.eventNameMap_.at(TRACE_EVENT_SCHED_WAKEUP_NEW),
116          bind(&BytraceEventParser::SchedWakeupEvent, this, std::placeholders::_1, std::placeholders::_2)},
117         {config_.eventNameMap_.at(TRACE_EVENT_PROCESS_EXIT),
118          bind(&BytraceEventParser::ProcessExitEvent, this, std::placeholders::_1, std::placeholders::_2)}};
119 }
120 
SchedSwitchEvent(const ArgsMap & args,const BytraceLine & line) const121 bool BytraceEventParser::SchedSwitchEvent(const ArgsMap& args, const BytraceLine& line) const
122 {
123     if (args.empty() || args.size() < MIN_SCHED_SWITCH_ARGS_COUNT) {
124         TS_LOGD("Failed to parse sched_switch event, no args or args size < 6");
125         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SCHED_SWITCH, STAT_EVENT_DATA_INVALID);
126         return false;
127     }
128     auto prevCommStr = std::string_view(args.at("prev_comm"));
129     auto nextCommStr = std::string_view(args.at("next_comm"));
130     auto prevPrioValue = base::StrToInt<int32_t>(args.at("prev_prio"));
131     auto nextPrioValue = base::StrToInt<int32_t>(args.at("next_prio"));
132     auto prevPidValue = base::StrToInt<uint32_t>(args.at("prev_pid"));
133     auto nextPidValue = base::StrToInt<uint32_t>(args.at("next_pid"));
134     DataIndex nextInfo = INVALID_DATAINDEX;
135     auto nextInfoIt = args.find("next_info");
136     if (nextInfoIt != args.end()) {
137         nextInfo = traceDataCache_->GetDataIndex(std::string_view(args.at("next_info")));
138     }
139     if (!(prevPidValue.has_value() && prevPrioValue.has_value() && nextPidValue.has_value() &&
140           nextPrioValue.has_value())) {
141         TS_LOGD("Failed to parse sched_switch event");
142         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SCHED_SWITCH, STAT_EVENT_DATA_INVALID);
143         return false;
144     }
145     auto prevStateStr = args.at("prev_state");
146     auto threadState = ThreadStateFlag(prevStateStr.c_str());
147     uint64_t prevState = threadState.State();
148     if (!threadState.IsValid()) {
149         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SCHED_SWITCH, STAT_EVENT_DATA_INVALID);
150     }
151     uint32_t nextInternalTid = 0;
152     uint32_t uprevtid = 0;
153     nextInternalTid =
154         streamFilters_->processFilter_->UpdateOrCreateThreadWithName(line.ts, nextPidValue.value(), nextCommStr);
155 
156     if (!prevCommStr.empty()) {
157         uprevtid =
158             streamFilters_->processFilter_->UpdateOrCreateThreadWithName(line.ts, prevPidValue.value(), prevCommStr);
159     } else {
160         uprevtid = streamFilters_->processFilter_->UpdateOrCreateThread(line.ts, prevPidValue.value());
161     }
162     streamFilters_->cpuFilter_->InsertSwitchEvent(
163         line.ts, line.cpu, uprevtid, static_cast<uint64_t>(prevPrioValue.value()), prevState, nextInternalTid,
164         static_cast<uint64_t>(nextPrioValue.value()), nextInfo);
165     streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SCHED_SWITCH, STAT_EVENT_RECEIVED);
166     return true;
167 }
BlockedReason(const ArgsMap & args,const BytraceLine & line) const168 bool BytraceEventParser::BlockedReason(const ArgsMap& args, const BytraceLine& line) const
169 {
170     if (args.empty() || args.size() < MIN_BLOCKED_REASON_ARGS_COUNT) {
171         TS_LOGD("Failed to parse blocked_reason event, no args or args size < %d", MIN_BLOCKED_REASON_ARGS_COUNT);
172         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SCHED_BLOCKED_REASON, STAT_EVENT_DATA_INVALID);
173         return false;
174     }
175     auto tid = base::StrToInt<int32_t>(args.at("pid"));
176     auto iowaitIt = args.find("iowait");
177     if (iowaitIt == args.end()) {
178         iowaitIt = args.find("io_wait");
179     }
180     auto iowait = base::StrToInt<int32_t>(iowaitIt->second);
181     uint32_t delayValue = INVALID_UINT32;
182     if (args.find("delay") != args.end()) {
183         auto delay = base::StrToInt<int32_t>(args.at("delay"));
184         delayValue = delay.has_value() ? delay.value() : INVALID_UINT32;
185     }
186     auto caller = traceDataCache_->GetDataIndex(std::string_view(args.at("caller")));
187     if (!(tid.has_value() && iowait.has_value())) {
188         TS_LOGD("Failed to parse blocked_reason event");
189         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SCHED_BLOCKED_REASON, STAT_EVENT_DATA_INVALID);
190         return false;
191     }
192     auto iTid = streamFilters_->processFilter_->UpdateOrCreateThread(line.ts, tid.value());
193 
194     if (streamFilters_->cpuFilter_->InsertBlockedReasonEvent(line.ts, line.cpu, iTid, iowait.value(), caller,
195                                                              delayValue)) {
196         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SCHED_BLOCKED_REASON, STAT_EVENT_RECEIVED);
197     } else {
198         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SCHED_BLOCKED_REASON, STAT_EVENT_NOTMATCH);
199     }
200     return true;
201 }
202 
TaskRenameEvent(const ArgsMap & args,const BytraceLine & line) const203 bool BytraceEventParser::TaskRenameEvent(const ArgsMap& args, const BytraceLine& line) const
204 {
205     if (args.empty() || args.size() < MIN_TASK_RENAME_ARGS_COUNT) {
206         TS_LOGD("Failed to parse task_rename event, no args or args size < 2");
207         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_TASK_RENAME, STAT_EVENT_DATA_INVALID);
208         return false;
209     }
210     auto prevCommStr = std::string_view(args.at("newcomm"));
211     auto pidValue = base::StrToInt<uint32_t>(args.at("pid"));
212     streamFilters_->processFilter_->UpdateOrCreateThreadWithName(line.ts, pidValue.value(), prevCommStr);
213     return true;
214 }
215 
TaskNewtaskEvent(const ArgsMap & args,const BytraceLine & line) const216 bool BytraceEventParser::TaskNewtaskEvent(const ArgsMap& args, const BytraceLine& line) const
217 {
218     streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_TASK_NEWTASK, STAT_EVENT_RECEIVED);
219     // the clone flag from txt trace from kernel original is HEX, but when it is converted from proto
220     // based trace, it will be OCT number, it is not stable, so we decide to ignore it
221     streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_TASK_NEWTASK, STAT_EVENT_NOTSUPPORTED);
222     return true;
223 }
224 
TracingMarkWriteOrPrintEvent(const ArgsMap & args,const BytraceLine & line)225 bool BytraceEventParser::TracingMarkWriteOrPrintEvent(const ArgsMap& args, const BytraceLine& line)
226 {
227     UNUSED(args);
228     return printEventParser_.ParsePrintEvent(line.task, line.ts, line.pid, line.argsStr.c_str(), line);
229 }
230 // prefer to use waking, unless no waking, can use wakeup
SchedWakeupEvent(const ArgsMap & args,const BytraceLine & line) const231 bool BytraceEventParser::SchedWakeupEvent(const ArgsMap& args, const BytraceLine& line) const
232 {
233     if (args.size() < MIN_SCHED_WAKEUP_ARGS_COUNT) {
234         TS_LOGD("Failed to parse SchedWakeupEvent event, no args or args size < 2");
235         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SCHED_WAKEUP, STAT_EVENT_DATA_INVALID);
236         return false;
237     }
238     std::optional<uint32_t> wakePidValue = base::StrToInt<uint32_t>(args.at("pid"));
239     if (!wakePidValue.has_value()) {
240         TS_LOGD("Failed to convert wake_pid");
241         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SCHED_WAKEUP, STAT_EVENT_DATA_INVALID);
242         return false;
243     }
244     auto instants = traceDataCache_->GetInstantsData();
245     InternalTid internalTid = streamFilters_->processFilter_->UpdateOrCreateThread(line.ts, wakePidValue.value_or(0));
246     streamFilters_->cpuFilter_->InsertWakeupEvent(line.ts, internalTid);
247 
248     InternalTid wakeupFromPid = streamFilters_->processFilter_->UpdateOrCreateThread(line.ts, line.pid);
249 
250     instants->AppendInstantEventData(line.ts, schedWakeupName_, internalTid, wakeupFromPid);
251     std::optional<uint32_t> targetCpu = base::StrToInt<uint32_t>(args.at("target_cpu"));
252     if (targetCpu.has_value()) {
253         traceDataCache_->GetRawData()->AppendRawData(0, line.ts, RAW_SCHED_WAKEUP, targetCpu.value(), wakeupFromPid);
254         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SCHED_WAKEUP, STAT_EVENT_RECEIVED);
255     }
256     return true;
257 }
258 
SchedWakingEvent(const ArgsMap & args,const BytraceLine & line) const259 bool BytraceEventParser::SchedWakingEvent(const ArgsMap& args, const BytraceLine& line) const
260 {
261     if (args.empty() || args.size() < MIN_SCHED_WAKING_ARGS_COUNT) {
262         TS_LOGD("Failed to parse sched_waking event, no args or args size < 4");
263         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SCHED_WAKING, STAT_EVENT_DATA_INVALID);
264         return false;
265     }
266     std::optional<uint32_t> wakePidValue = base::StrToInt<uint32_t>(args.at("pid"));
267     if (!wakePidValue.has_value()) {
268         TS_LOGD("Failed to convert wake_pid");
269         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SCHED_WAKING, STAT_EVENT_DATA_INVALID);
270         return false;
271     }
272     auto instants = traceDataCache_->GetInstantsData();
273     InternalTid internalTid = streamFilters_->processFilter_->UpdateOrCreateThread(line.ts, wakePidValue.value());
274     DataIndex wakeByPidStrIndex = traceDataCache_->GetDataIndex(line.task);
275     InternalTid internalTidWakeup =
276         streamFilters_->processFilter_->UpdateOrCreateThreadWithNameIndex(line.ts, line.pid, wakeByPidStrIndex);
277     InternalTid wakeupFromPid = streamFilters_->processFilter_->UpdateOrCreateThread(line.ts, line.pid);
278     streamFilters_->cpuFilter_->InsertWakeupEvent(line.ts, internalTid, true);
279     instants->AppendInstantEventData(line.ts, schedWakingName_, internalTid, wakeupFromPid);
280     std::optional<uint32_t> targetCpu = base::StrToInt<uint32_t>(args.at("target_cpu"));
281     if (targetCpu.has_value()) {
282         traceDataCache_->GetRawData()->AppendRawData(0, line.ts, RAW_SCHED_WAKING, targetCpu.value(),
283                                                      internalTidWakeup);
284         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SCHED_WAKING, STAT_EVENT_RECEIVED);
285     }
286 
287     return true;
288 }
289 
CpuIdleEvent(const ArgsMap & args,const BytraceLine & line) const290 bool BytraceEventParser::CpuIdleEvent(const ArgsMap& args, const BytraceLine& line) const
291 {
292     if (args.empty() || args.size() < MIN_CPU_IDLE_ARGS_COUNT) {
293         TS_LOGD("Failed to parse cpu_idle event, no args or args size < 2");
294         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_CPU_IDLE, STAT_EVENT_DATA_INVALID);
295         return false;
296     }
297     std::optional<uint32_t> eventCpuValue = base::StrToInt<uint32_t>(args.at("cpu_id"));
298     std::optional<int64_t> newStateValue = base::StrToInt<int64_t>(args.at("state"));
299     if (!eventCpuValue.has_value()) {
300         TS_LOGD("Failed to convert event cpu");
301         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_CPU_IDLE, STAT_EVENT_DATA_INVALID);
302         return false;
303     }
304     if (!newStateValue.has_value()) {
305         TS_LOGD("Failed to convert state");
306         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_CPU_IDLE, STAT_EVENT_DATA_INVALID);
307         return false;
308     }
309     // Add cpu_idle event to raw_data_table
310     auto cpuidleNameIndex = traceDataCache_->GetDataIndex(line.eventName.c_str());
311     streamFilters_->cpuMeasureFilter_->AppendNewMeasureData(eventCpuValue.value(), cpuidleNameIndex, line.ts,
312                                                             config_.GetStateValue(newStateValue.value()));
313     streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_CPU_IDLE, STAT_EVENT_RECEIVED);
314     return true;
315 }
316 
CpuFrequencyEvent(const ArgsMap & args,const BytraceLine & line) const317 bool BytraceEventParser::CpuFrequencyEvent(const ArgsMap& args, const BytraceLine& line) const
318 {
319     streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_CPU_FREQUENCY, STAT_EVENT_RECEIVED);
320     if (args.empty() || args.size() < MIN_CPU_FREQUENCY_ARGS_COUNT) {
321         TS_LOGD("Failed to parse cpu_frequency event, no args or args size < 2");
322         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_CPU_FREQUENCY, STAT_EVENT_DATA_INVALID);
323         return false;
324     }
325     std::optional<uint32_t> eventCpuValue = base::StrToInt<uint32_t>(args.at("cpu_id"));
326     std::optional<int64_t> newStateValue = base::StrToInt<int64_t>(args.at("state"));
327 
328     if (!newStateValue.has_value()) {
329         TS_LOGD("Failed to convert state");
330         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_CPU_FREQUENCY, STAT_EVENT_DATA_INVALID);
331         return false;
332     }
333     if (!eventCpuValue.has_value()) {
334         TS_LOGD("Failed to convert event cpu");
335         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_CPU_FREQUENCY, STAT_EVENT_DATA_INVALID);
336         return false;
337     }
338 
339     auto cpuidleNameIndex = traceDataCache_->GetDataIndex(line.eventName.c_str());
340     streamFilters_->cpuMeasureFilter_->AppendNewMeasureData(eventCpuValue.value(), cpuidleNameIndex, line.ts,
341                                                             newStateValue.value());
342     return true;
343 }
CpuFrequencyLimitsEvent(const ArgsMap & args,const BytraceLine & line) const344 bool BytraceEventParser::CpuFrequencyLimitsEvent(const ArgsMap& args, const BytraceLine& line) const
345 {
346     streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_CPU_FREQUENCY_LIMITS, STAT_EVENT_RECEIVED);
347     if (args.empty() || args.size() < MIN_CPU_FREQUENCY_ARGS_COUNT) {
348         TS_LOGD("Failed to parse cpu_frequency event, no args or args size < 2");
349         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_CPU_FREQUENCY_LIMITS, STAT_EVENT_DATA_INVALID);
350         return false;
351     }
352     std::optional<uint32_t> eventCpuValue = base::StrToInt<uint32_t>(args.at("cpu_id"));
353 
354     auto minIt = args.find("min");
355     if (minIt == args.end()) {
356         minIt = args.find("min_freq");
357     }
358     auto maxIt = args.find("max");
359     if (maxIt == args.end()) {
360         maxIt = args.find("max_freq");
361     }
362     std::optional<int64_t> minValue = base::StrToInt<int64_t>(minIt->second);
363     std::optional<int64_t> maxValue = base::StrToInt<int64_t>(maxIt->second);
364 
365     if (!minValue.has_value()) {
366         TS_LOGD("Failed to get frequency minValue");
367         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_CPU_FREQUENCY_LIMITS, STAT_EVENT_DATA_INVALID);
368         return false;
369     }
370     if (!maxValue.has_value()) {
371         TS_LOGD("Failed to get frequency maxValue");
372         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_CPU_FREQUENCY_LIMITS, STAT_EVENT_DATA_INVALID);
373         return false;
374     }
375     if (!eventCpuValue.has_value()) {
376         TS_LOGD("Failed to get frequency cpu");
377         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_CPU_FREQUENCY_LIMITS, STAT_EVENT_DATA_INVALID);
378         return false;
379     }
380 
381     streamFilters_->cpuMeasureFilter_->AppendNewMeasureData(eventCpuValue.value(), cpuFrequencyLimitMaxNameId, line.ts,
382                                                             maxValue.value());
383     streamFilters_->cpuMeasureFilter_->AppendNewMeasureData(eventCpuValue.value(), cpuFrequencyLimitMinNameId, line.ts,
384                                                             minValue.value());
385     return true;
386 }
387 
WorkqueueExecuteStartEvent(const ArgsMap & args,const BytraceLine & line) const388 bool BytraceEventParser::WorkqueueExecuteStartEvent(const ArgsMap& args, const BytraceLine& line) const
389 {
390     UNUSED(args);
391     auto splitStr = GetFunctionName(line.argsStr, "function ");
392     auto splitStrIndex = traceDataCache_->GetDataIndex(splitStr);
393     size_t result =
394         streamFilters_->sliceFilter_->BeginSlice(line.task, line.ts, line.pid, 0, workQueueId_, splitStrIndex);
395     traceDataCache_->GetInternalSlicesData()->AppendDistributeInfo();
396     if (result != INVALID_UINT32) {
397         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_WORKQUEUE_EXECUTE_START, STAT_EVENT_RECEIVED);
398         return true;
399     } else {
400         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_WORKQUEUE_EXECUTE_START, STAT_EVENT_DATA_LOST);
401         return false;
402     }
403 }
404 
WorkqueueExecuteEndEvent(const ArgsMap & args,const BytraceLine & line) const405 bool BytraceEventParser::WorkqueueExecuteEndEvent(const ArgsMap& args, const BytraceLine& line) const
406 {
407     UNUSED(args);
408     if (streamFilters_->sliceFilter_->EndSlice(line.ts, line.pid, 0, workQueueId_)) {
409         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_WORKQUEUE_EXECUTE_END, STAT_EVENT_RECEIVED);
410         return true;
411     } else {
412         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_WORKQUEUE_EXECUTE_END, STAT_EVENT_NOTMATCH);
413         return false;
414     }
415 }
416 
ProcessExitEvent(const ArgsMap & args,const BytraceLine & line) const417 bool BytraceEventParser::ProcessExitEvent(const ArgsMap& args, const BytraceLine& line) const
418 {
419     if (args.empty() || args.size() < MIN_PROCESS_EXIT_ARGS_COUNT) {
420         TS_LOGD("Failed to parse process_exit event, no args or args size < 2");
421         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_PROCESS_EXIT, STAT_EVENT_DATA_INVALID);
422         return false;
423     }
424     auto comm = std::string_view(args.at("comm"));
425     auto pid = base::StrToInt<uint32_t>(args.at("pid"));
426     if (!pid.has_value()) {
427         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_PROCESS_EXIT, STAT_EVENT_DATA_INVALID);
428         return false;
429     }
430     auto itid = streamFilters_->processFilter_->UpdateOrCreateThreadWithName(line.ts, pid.value(), comm);
431     streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_PROCESS_EXIT, STAT_EVENT_RECEIVED);
432     if (streamFilters_->cpuFilter_->InsertProcessExitEvent(line.ts, line.cpu, itid)) {
433         return true;
434     } else {
435         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_PROCESS_EXIT, STAT_EVENT_NOTMATCH);
436         return false;
437     }
438 }
439 
SetRateEvent(const ArgsMap & args,const BytraceLine & line) const440 bool BytraceEventParser::SetRateEvent(const ArgsMap& args, const BytraceLine& line) const
441 {
442     if (args.empty() || args.size() < MIN_CLOCK_SET_RATE_ARGS_COUNT) {
443         TS_LOGD("Failed to parse clock_set_rate event, no args or args size < 3");
444         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_CLOCK_SET_RATE, STAT_EVENT_DATA_INVALID);
445         return false;
446     }
447     auto name = std::string_view(args.at("name"));
448     auto state = base::StrToInt<int64_t>(args.at("state"));
449     auto cpu = base::StrToInt<uint64_t>(args.at("cpu_id"));
450     DataIndex nameIndex = traceDataCache_->GetDataIndex(name);
451     streamFilters_->clockRateFilter_->AppendNewMeasureData(cpu.value(), nameIndex, line.ts, state.value());
452     streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_CLOCK_SET_RATE, STAT_EVENT_RECEIVED);
453     return true;
454 }
455 
ClockEnableEvent(const ArgsMap & args,const BytraceLine & line) const456 bool BytraceEventParser::ClockEnableEvent(const ArgsMap& args, const BytraceLine& line) const
457 {
458     if (args.empty() || args.size() < MIN_CLOCK_ENABLE_ARGS_COUNT) {
459         TS_LOGD("Failed to parse clock_enable event, no args or args size < 3");
460         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_CLOCK_ENABLE, STAT_EVENT_DATA_INVALID);
461         return false;
462     }
463     auto name = std::string_view(args.at("name"));
464     auto state = base::StrToInt<int64_t>(args.at("state"));
465     auto cpuId = base::StrToInt<uint64_t>(args.at("cpu_id"));
466     DataIndex nameIndex = traceDataCache_->GetDataIndex(name);
467     streamFilters_->clockEnableFilter_->AppendNewMeasureData(cpuId.value(), nameIndex, line.ts, state.value());
468     streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_CLOCK_ENABLE, STAT_EVENT_RECEIVED);
469     return true;
470 }
ClockDisableEvent(const ArgsMap & args,const BytraceLine & line) const471 bool BytraceEventParser::ClockDisableEvent(const ArgsMap& args, const BytraceLine& line) const
472 {
473     if (args.empty() || args.size() < MIN_CLOCK_DISABLE_ARGS_COUNT) {
474         TS_LOGD("Failed to parse clock_disable event, no args or args size < 3");
475         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_CLOCK_DISABLE, STAT_EVENT_DATA_INVALID);
476         return false;
477     }
478     auto name = std::string_view(args.at("name"));
479     auto state = base::StrToInt<int64_t>(args.at("state"));
480     auto cpuId = base::StrToInt<uint64_t>(args.at("cpu_id"));
481     DataIndex nameIndex = traceDataCache_->GetDataIndex(name);
482     streamFilters_->clockDisableFilter_->AppendNewMeasureData(cpuId.value(), nameIndex, line.ts, state.value());
483     streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_CLOCK_DISABLE, STAT_EVENT_RECEIVED);
484     return true;
485 }
486 
RegulatorSetVoltageEvent(const ArgsMap & args,const BytraceLine & line) const487 bool BytraceEventParser::RegulatorSetVoltageEvent(const ArgsMap& args, const BytraceLine& line) const
488 {
489     UNUSED(args);
490     UNUSED(line);
491     traceDataCache_->GetStatAndInfo()->IncreaseStat(TRACE_EVENT_REGULATOR_SET_VOLTAGE, STAT_EVENT_RECEIVED);
492     traceDataCache_->GetStatAndInfo()->IncreaseStat(TRACE_EVENT_REGULATOR_SET_VOLTAGE, STAT_EVENT_NOTSUPPORTED);
493     return true;
494 }
RegulatorSetVoltageCompleteEvent(const ArgsMap & args,const BytraceLine & line) const495 bool BytraceEventParser::RegulatorSetVoltageCompleteEvent(const ArgsMap& args, const BytraceLine& line) const
496 {
497     UNUSED(args);
498     UNUSED(line);
499     traceDataCache_->GetStatAndInfo()->IncreaseStat(TRACE_EVENT_REGULATOR_SET_VOLTAGE_COMPLETE, STAT_EVENT_RECEIVED);
500     traceDataCache_->GetStatAndInfo()->IncreaseStat(TRACE_EVENT_REGULATOR_SET_VOLTAGE_COMPLETE,
501                                                     STAT_EVENT_NOTSUPPORTED);
502     return true;
503 }
RegulatorDisableEvent(const ArgsMap & args,const BytraceLine & line) const504 bool BytraceEventParser::RegulatorDisableEvent(const ArgsMap& args, const BytraceLine& line) const
505 {
506     UNUSED(args);
507     UNUSED(line);
508     traceDataCache_->GetStatAndInfo()->IncreaseStat(TRACE_EVENT_REGULATOR_DISABLE, STAT_EVENT_RECEIVED);
509     traceDataCache_->GetStatAndInfo()->IncreaseStat(TRACE_EVENT_REGULATOR_DISABLE, STAT_EVENT_NOTSUPPORTED);
510     return true;
511 }
RegulatorDisableCompleteEvent(const ArgsMap & args,const BytraceLine & line) const512 bool BytraceEventParser::RegulatorDisableCompleteEvent(const ArgsMap& args, const BytraceLine& line) const
513 {
514     UNUSED(args);
515     UNUSED(line);
516     traceDataCache_->GetStatAndInfo()->IncreaseStat(TRACE_EVENT_REGULATOR_DISABLE_COMPLETE, STAT_EVENT_RECEIVED);
517     traceDataCache_->GetStatAndInfo()->IncreaseStat(TRACE_EVENT_REGULATOR_DISABLE_COMPLETE, STAT_EVENT_NOTSUPPORTED);
518     return true;
519 }
520 
IpiEntryEvent(const ArgsMap & args,const BytraceLine & line) const521 bool BytraceEventParser::IpiEntryEvent(const ArgsMap& args, const BytraceLine& line) const
522 {
523     UNUSED(args);
524     traceDataCache_->GetStatAndInfo()->IncreaseStat(TRACE_EVENT_IPI_ENTRY, STAT_EVENT_RECEIVED);
525     streamFilters_->irqFilter_->IpiHandlerEntry(line.ts, line.cpu, traceDataCache_->GetDataIndex(line.argsStr));
526     return true;
527 }
IpiExitEvent(const ArgsMap & args,const BytraceLine & line) const528 bool BytraceEventParser::IpiExitEvent(const ArgsMap& args, const BytraceLine& line) const
529 {
530     UNUSED(args);
531     traceDataCache_->GetStatAndInfo()->IncreaseStat(TRACE_EVENT_IPI_EXIT, STAT_EVENT_RECEIVED);
532     streamFilters_->irqFilter_->IpiHandlerExit(line.ts, line.cpu);
533     return true;
534 }
IrqHandlerEntryEvent(const ArgsMap & args,const BytraceLine & line) const535 bool BytraceEventParser::IrqHandlerEntryEvent(const ArgsMap& args, const BytraceLine& line) const
536 {
537     if (args.empty() || args.size() < MIN_IRQ_HANDLER_ENTRY_ARGS_COUNT) {
538         TS_LOGD("Failed to parse irq_handler_entry event, no args or args size < 2");
539         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_IRQ_HANDLER_ENTRY, STAT_EVENT_DATA_INVALID);
540         return false;
541     }
542     traceDataCache_->GetStatAndInfo()->IncreaseStat(TRACE_EVENT_IRQ_HANDLER_ENTRY, STAT_EVENT_RECEIVED);
543     auto name = std::string_view(args.at("name"));
544     streamFilters_->irqFilter_->IrqHandlerEntry(line.ts, line.cpu, traceDataCache_->GetDataIndex(name));
545     return true;
546 }
IrqHandlerExitEvent(const ArgsMap & args,const BytraceLine & line) const547 bool BytraceEventParser::IrqHandlerExitEvent(const ArgsMap& args, const BytraceLine& line) const
548 {
549     if (args.empty() || args.size() < MIN_IRQ_HANDLER_EXIT_ARGS_COUNT) {
550         TS_LOGD("Failed to parse irq_handler_exit event, no args or args size < 2");
551         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_IRQ_HANDLER_EXIT, STAT_EVENT_DATA_INVALID);
552         return false;
553     }
554     traceDataCache_->GetStatAndInfo()->IncreaseStat(TRACE_EVENT_IRQ_HANDLER_EXIT, STAT_EVENT_RECEIVED);
555     uint32_t ret = (args.at("ret") == "handled") ? 1 : 0;
556     auto irq = base::StrToInt<uint32_t>(args.at("irq"));
557     streamFilters_->irqFilter_->IrqHandlerExit(line.ts, line.cpu, irq.value(), ret);
558     return true;
559 }
SoftIrqRaiseEvent(const ArgsMap & args,const BytraceLine & line) const560 bool BytraceEventParser::SoftIrqRaiseEvent(const ArgsMap& args, const BytraceLine& line) const
561 {
562     UNUSED(args);
563     UNUSED(line);
564     traceDataCache_->GetStatAndInfo()->IncreaseStat(TRACE_EVENT_SOFTIRQ_RAISE, STAT_EVENT_RECEIVED);
565     traceDataCache_->GetStatAndInfo()->IncreaseStat(TRACE_EVENT_SOFTIRQ_RAISE, STAT_EVENT_NOTSUPPORTED);
566     return true;
567 }
SoftIrqEntryEvent(const ArgsMap & args,const BytraceLine & line) const568 bool BytraceEventParser::SoftIrqEntryEvent(const ArgsMap& args, const BytraceLine& line) const
569 {
570     if (args.empty() || args.size() < MIN_SOFTIRQ_ENTRY_ARGS_COUNT) {
571         TS_LOGD("Failed to parse softirq_entry event, no args or args size < 2");
572         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SOFTIRQ_ENTRY, STAT_EVENT_DATA_INVALID);
573         return false;
574     }
575     traceDataCache_->GetStatAndInfo()->IncreaseStat(TRACE_EVENT_SOFTIRQ_ENTRY, STAT_EVENT_RECEIVED);
576     auto vec = base::StrToInt<uint32_t>(args.at("vec"));
577     streamFilters_->irqFilter_->SoftIrqEntry(line.ts, line.cpu, vec.value());
578     return true;
579 }
SoftIrqExitEvent(const ArgsMap & args,const BytraceLine & line) const580 bool BytraceEventParser::SoftIrqExitEvent(const ArgsMap& args, const BytraceLine& line) const
581 {
582     if (args.empty() || args.size() < MIN_SOFTIRQ_EXIT_ARGS_COUNT) {
583         TS_LOGD("Failed to parse softirq_exit event, no args or args size < 2");
584         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SOFTIRQ_EXIT, STAT_EVENT_DATA_INVALID);
585         return false;
586     }
587     traceDataCache_->GetStatAndInfo()->IncreaseStat(TRACE_EVENT_SOFTIRQ_EXIT, STAT_EVENT_RECEIVED);
588     auto vec = base::StrToInt<uint32_t>(args.at("vec"));
589     streamFilters_->irqFilter_->SoftIrqExit(line.ts, line.cpu, vec.value());
590     return true;
591 }
592 
BinderTransaction(const ArgsMap & args,const BytraceLine & line) const593 bool BytraceEventParser::BinderTransaction(const ArgsMap& args, const BytraceLine& line) const
594 {
595     if (args.empty() || args.size() < MIN_BINDER_TRANSACTION_ARGS_COUNT) {
596         TS_LOGD("Failed to parse binder_transaction event, no args or args size < 7");
597         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_BINDER_TRANSACTION, STAT_EVENT_DATA_INVALID);
598         return false;
599     }
600     streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_BINDER_TRANSACTION, STAT_EVENT_RECEIVED);
601     auto transactionId = base::StrToInt<int64_t>(args.at("transaction"));
602     auto destNode = base::StrToInt<uint32_t>(args.at("dest_node"));
603     auto destProc = base::StrToInt<uint32_t>(args.at("dest_proc"));
604     auto destThread = base::StrToInt<uint32_t>(args.at("dest_thread"));
605     auto isReply = base::StrToInt<uint32_t>(args.at("reply"));
606     auto flags = base::StrToInt<uint32_t>(args.at("flags"), base::INTEGER_RADIX_TYPE_HEX);
607     auto codeStr = base::StrToInt<uint32_t>(args.at("code"), base::INTEGER_RADIX_TYPE_HEX);
608     TS_LOGD("ts:%lu, pid:%u, destNode:%u, destTgid:%u, destTid:%u, transactionId:%lu, isReply:%u flags:%u, code:%u",
609             line.ts, line.pid, destNode.value(), destProc.value(), destThread.value(), transactionId.value(),
610             isReply.value(), flags.value(), codeStr.value());
611     streamFilters_->binderFilter_->SendTraction(line.ts, line.pid, transactionId.value(), destNode.value(),
612                                                 destProc.value(), destThread.value(), isReply.value(), flags.value(),
613                                                 codeStr.value());
614     return true;
615 }
BinderTransactionReceived(const ArgsMap & args,const BytraceLine & line) const616 bool BytraceEventParser::BinderTransactionReceived(const ArgsMap& args, const BytraceLine& line) const
617 {
618     if (args.empty() || args.size() < MIN_BINDER_TRANSACTION_RECEIVED_ARGS_COUNT) {
619         TS_LOGD("Failed to parse binder_transaction_received event, no args or args size < 1");
620         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_BINDER_TRANSACTION_RECEIVED, STAT_EVENT_DATA_INVALID);
621         return false;
622     }
623     streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_BINDER_TRANSACTION_RECEIVED, STAT_EVENT_RECEIVED);
624     auto transactionId = base::StrToInt<int64_t>(args.at("transaction"));
625     streamFilters_->binderFilter_->ReceiveTraction(line.ts, line.pid, transactionId.value());
626     TS_LOGD("ts:%lu, pid:%u, transactionId:%lu", line.ts, line.pid, transactionId.value());
627     return true;
628 }
BinderTransactionAllocBufEvent(const ArgsMap & args,const BytraceLine & line) const629 bool BytraceEventParser::BinderTransactionAllocBufEvent(const ArgsMap& args, const BytraceLine& line) const
630 {
631     if (args.empty() || args.size() < MIN_BINDER_TRANSACTION_ALLOC_BUF_ARGS_COUNT) {
632         TS_LOGD("Failed to parse binder_transaction_alloc_buf event, no args or args size < 3");
633         streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_BINDER_TRANSACTION_ALLOC_BUF, STAT_EVENT_DATA_INVALID);
634         return false;
635     }
636     streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_BINDER_TRANSACTION_ALLOC_BUF, STAT_EVENT_RECEIVED);
637     auto dataSize = base::StrToInt<uint64_t>(args.at("data_size"));
638     auto offsetsSize = base::StrToInt<uint64_t>(args.at("offsets_size"));
639     streamFilters_->binderFilter_->TransactionAllocBuf(line.ts, line.pid, dataSize.value(), offsetsSize.value());
640     TS_LOGD("dataSize:%lu, offsetSize:%lu", dataSize.value(), offsetsSize.value());
641     return true;
642 }
ParseDataItem(const BytraceLine & line)643 void BytraceEventParser::ParseDataItem(const BytraceLine& line)
644 {
645     eventList_.push_back(std::make_unique<EventInfo>(line.ts, std::move(line)));
646     return;
647 }
GetDataSegArgs(BytraceLine & bufLine,ArgsMap & args,uint32_t & tgid) const648 void BytraceEventParser::GetDataSegArgs(BytraceLine& bufLine, ArgsMap& args, uint32_t& tgid) const
649 {
650     if (bufLine.tGidStr.size() && bufLine.tGidStr.at(0) != '-') {
651         tgid = base::StrToInt<uint32_t>(bufLine.tGidStr).value_or(0);
652     } else {
653         tgid = 0;
654     }
655     bufLine.tgid = tgid;
656 
657     for (base::PartingString ss(bufLine.argsStr, ' '); ss.Next();) {
658         std::string key;
659         std::string value;
660         if (!(std::string(ss.GetCur()).find("=") != std::string::npos)) {
661             key = "name";
662             value = ss.GetCur();
663             args.emplace(std::move(key), std::move(value));
664             continue;
665         }
666         for (base::PartingString inner(ss.GetCur(), '='); inner.Next();) {
667             if (key.empty()) {
668                 key = inner.GetCur();
669             } else {
670                 value = inner.GetCur();
671             }
672         }
673         args.emplace(std::move(key), std::move(value));
674     }
675 }
FilterAllEventsTemp()676 void BytraceEventParser::FilterAllEventsTemp()
677 {
678     size_t maxBuffSize = 1000 * 1000;
679     size_t maxQueue = 2;
680     if (eventList_.size() < maxBuffSize * maxQueue) {
681         return;
682     }
683     auto cmp = [](const std::unique_ptr<EventInfo>& a, const std::unique_ptr<EventInfo>& b) {
684         return a->eventTimestamp < b->eventTimestamp;
685     };
686 #ifdef IS_WASM
687     std::sort(eventList_.begin(), eventList_.end(), cmp);
688 #else
689     std::stable_sort(eventList_.begin(), eventList_.end(), cmp);
690 #endif
691     auto endOfList = eventList_.begin() + maxBuffSize;
692     for (auto itor = eventList_.begin(); itor != endOfList; itor++) {
693         EventInfo* event = itor->get();
694         BeginFilterEvents(event);
695         itor->reset();
696     }
697     eventList_.erase(eventList_.begin(), endOfList);
698 }
699 
FilterAllEvents()700 void BytraceEventParser::FilterAllEvents()
701 {
702     auto cmp = [](const std::unique_ptr<EventInfo>& a, const std::unique_ptr<EventInfo>& b) {
703         return a->eventTimestamp < b->eventTimestamp;
704     };
705 #ifdef IS_WASM
706     std::sort(eventList_.begin(), eventList_.end(), cmp);
707 #else
708     std::stable_sort(eventList_.begin(), eventList_.end(), cmp);
709 #endif
710     size_t maxBuffSize = 1000 * 1000;
711     while (eventList_.size()) {
712         int32_t size = std::min(maxBuffSize, eventList_.size());
713         auto endOfList = eventList_.begin() + size;
714         for (auto itor = eventList_.begin(); itor != endOfList; itor++) {
715             EventInfo* event = itor->get();
716             BeginFilterEvents(event);
717             itor->reset();
718         }
719         eventList_.erase(eventList_.begin(), endOfList);
720     }
721     eventList_.clear();
722     streamFilters_->cpuFilter_->Finish();
723     traceDataCache_->dataDict_.Finish();
724     traceDataCache_->UpdataZeroThreadInfo();
725     if (traceDataCache_->AppStartTraceEnabled()) {
726         streamFilters_->appStartupFilter_->FilterAllAPPStartupData();
727     }
728 }
729 
BeginFilterEvents(EventInfo * event)730 void BytraceEventParser::BeginFilterEvents(EventInfo* event)
731 {
732     auto it = eventToFunctionMap_.find(event->line.eventName);
733     if (it != eventToFunctionMap_.end()) {
734         uint32_t tgid;
735         ArgsMap args;
736         GetDataSegArgs(event->line, args, tgid);
737         if (tgid) {
738             streamFilters_->processFilter_->UpdateOrCreateThreadWithPidAndName(event->line.pid, tgid, event->line.task);
739         } else {
740             // When tgid is zero, only use tid create thread
741             streamFilters_->processFilter_->GetOrCreateThreadWithPid(event->line.pid, tgid);
742         }
743         if (it->second(args, event->line)) {
744             traceDataCache_->UpdateTraceTime(event->line.ts);
745         }
746     } else {
747         traceDataCache_->GetStatAndInfo()->IncreaseStat(TRACE_EVENT_OTHER, STAT_EVENT_NOTSUPPORTED);
748         TS_LOGD("UnRecognizable event name:%s", event->line.eventName.c_str());
749     }
750 }
751 
Clear()752 void BytraceEventParser::Clear()
753 {
754     const_cast<TraceStreamerFilters*>(streamFilters_)->FilterClear();
755     printEventParser_.Finish();
756 }
757 } // namespace TraceStreamer
758 } // namespace SysTuning
759