1 /*
2 * Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved.
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 #include "pbreader_ffrt_parser.h"
16 #include "ffrt_profiler_config.pbreader.h"
17 #include "clock_filter_ex.h"
18 namespace SysTuning {
19 namespace TraceStreamer {
PbreaderFfrtDetailParser(TraceDataCache * dataCache,const TraceStreamerFilters * ctx,HtraceEventParser * eventParser)20 PbreaderFfrtDetailParser::PbreaderFfrtDetailParser(TraceDataCache *dataCache,
21 const TraceStreamerFilters *ctx,
22 HtraceEventParser *eventParser)
23 : EventParserBase(dataCache, ctx), eventParser_(eventParser), taskNameIndexMap_(INVALID_UINT64)
24 {
25 }
~PbreaderFfrtDetailParser()26 PbreaderFfrtDetailParser::~PbreaderFfrtDetailParser() {}
PaserCommData(bool & haveSplitSeg,std::unique_ptr<ProtoReader::FfrtProfilerEvent_Reader> & ffrtEventPtr)27 void PbreaderFfrtDetailParser::PaserCommData(bool &haveSplitSeg,
28 std::unique_ptr<ProtoReader::FfrtProfilerEvent_Reader> &ffrtEventPtr)
29 {
30 if (traceDataCache_->isSplitFile_) {
31 haveSplitSeg = true;
32 return;
33 }
34 auto processName = ffrtEventPtr->process_name().ToStdString();
35 auto threadName = ffrtEventPtr->thread_name().ToStdString();
36 auto taskName = processName.empty() ? threadName : processName;
37 taskNameIndexMap_.Insert(ffrtEventPtr->tid(), ffrtEventPtr->pid(), traceDataCache_->GetDataIndex(taskName));
38 streamFilters_->processFilter_->UpdateOrCreateThreadWithPidAndName(ffrtEventPtr->tid(), ffrtEventPtr->pid(),
39 taskName);
40 }
ParserFfrtTrace(const PbreaderDataSegment & dataSeg,bool & haveSplitSeg,std::unique_ptr<ProtoReader::FfrtProfilerEvent_Reader> & ffrtEventPtr)41 void PbreaderFfrtDetailParser::ParserFfrtTrace(const PbreaderDataSegment &dataSeg,
42 bool &haveSplitSeg,
43 std::unique_ptr<ProtoReader::FfrtProfilerEvent_Reader> &ffrtEventPtr)
44 {
45 auto eventInfoPtr = std::make_unique<HtraceEventParser::EventInfo>();
46 auto timeStamp = ffrtEventPtr->tv_nsec() + ffrtEventPtr->tv_sec() * SEC_TO_NS;
47 eventInfoPtr->timeStamp = streamFilters_->clockFilter_->ToPrimaryTraceTime(ffrtClockid_, timeStamp);
48 traceDataCache_->UpdateTraceTime(eventInfoPtr->timeStamp);
49 if (traceDataCache_->isSplitFile_) {
50 if (eventInfoPtr->timeStamp >= traceDataCache_->SplitFileMinTime() &&
51 eventInfoPtr->timeStamp <= traceDataCache_->SplitFileMaxTime()) {
52 haveSplitSeg = true;
53 }
54 return;
55 }
56 eventInfoPtr->pid = ffrtEventPtr->tid();
57 eventInfoPtr->tgid = ffrtEventPtr->pid();
58 eventInfoPtr->eventType = TRACE_EVENT_FFRT;
59 auto taskNameIndex = taskNameIndexMap_.Find(eventInfoPtr->pid, eventInfoPtr->tgid);
60 if (taskNameIndex == INVALID_UINT64) {
61 taskNameIndex = traceDataCache_->GetDataIndex("");
62 }
63 eventInfoPtr->taskNameIndex = taskNameIndex;
64 auto pos = (const char *)ffrtEventPtr->trace().Data() - dataSeg.seg->data();
65 eventInfoPtr->detail = std::move(dataSeg.seg->substr(pos, ffrtEventPtr->trace().Size()));
66 eventParser_->AppendEvent(std::move(eventInfoPtr));
67 }
Parser(const PbreaderDataSegment & dataSeg,bool & haveSplitSeg)68 void PbreaderFfrtDetailParser::Parser(const PbreaderDataSegment &dataSeg, bool &haveSplitSeg)
69 {
70 ProtoReader::FfrtProfilerResult_Reader ffrtResultReader(dataSeg.protoData);
71 for (auto ffrtResultItor = ffrtResultReader.ffrt_event(); ffrtResultItor; ++ffrtResultItor) {
72 auto ffrtEventPtr = std::make_unique<ProtoReader::FfrtProfilerEvent_Reader>(ffrtResultItor->ToBytes());
73 if (ffrtEventPtr->has_trace()) {
74 ParserFfrtTrace(dataSeg, haveSplitSeg, ffrtEventPtr);
75 } else if (!ffrtEventPtr->has_trace() && !ffrtEventPtr->has_raw()) {
76 PaserCommData(haveSplitSeg, ffrtEventPtr);
77 }
78 if (haveSplitSeg) {
79 return;
80 }
81 }
82 }
SetFfrtSrcClockid(PbreaderDataSegment & dataSeg)83 void PbreaderFfrtDetailParser::SetFfrtSrcClockid(PbreaderDataSegment &dataSeg)
84 {
85 ProtoReader::FfrtProfilerConfig_Reader ffrtCfgReader(dataSeg.protoData);
86 ffrtClockid_ = ffrtCfgReader.clock_id();
87 traceDataCache_->GetDataSourceClockIdData()->SetDataSourceClockId(DATA_SOURCE_TYPE_FFRT, ffrtClockid_);
88 TS_LOGI("ffrtClockid_=%u", ffrtClockid_);
89 }
FilterAllEventsReader()90 void PbreaderFfrtDetailParser::FilterAllEventsReader()
91 {
92 eventParser_->FilterAllEventsReader();
93 }
94 } // namespace TraceStreamer
95 } // namespace SysTuning
96