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