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