diff --git a/trace_streamer/src/rpc/ffrt_converter.cpp b/trace_streamer/src/rpc/ffrt_converter.cpp index c5ec286c1dbbf401a7760200d4df4262ba97b31c..91856086854e12dc7f16ec9016dcde867b3c98a6 100644 --- a/trace_streamer/src/rpc/ffrt_converter.cpp +++ b/trace_streamer/src/rpc/ffrt_converter.cpp @@ -309,6 +309,38 @@ static void GenFfrtPids(FfrtPids& ffrtPids, Info &info, FfrtTidMap &ffrtTidMap, } } +bool IsOldVersionTrace(ConStr &log) +{ + static const std::string fPattern = " F|"; + static const std::string hCo = "|H:Co"; + + size_t fPos = log.find(fPattern); + if (fPos == std::string::npos) { + return false; + } + size_t hCoPos = log.find(hCo, fPos + fPattern.size()); + if (hCoPos != std::string::npos && hCoPos > fPos + fPattern.size()) { + bool valid = true; + std::string numStr = log.substr(fPos + fPattern.size(), hCoPos - fPos - fPattern.size()); + int num = 0; + auto [ptr, ec] = std::from_chars(numStr.data(), numStr.data() + numStr.size(), num); + if (ec != std::errc{}) { + valid = false; + } + if (!valid) { + return false; + } + size_t afterCo = hCoPos + hCo.size(); + while (afterCo < log.length() && isspace(log[afterCo])) { + ++afterCo; + } + if (afterCo < log.length() && isdigit(log[afterCo])) { + return true; + } + } + return false; +} + void FfrtConverter::ClassifyLogsForFfrtWorker(FfrtPids& ffrtPids, FfrtWakeLogs& ffrtWakeLogs) { PidMap pidMap; @@ -413,6 +445,7 @@ void FfrtConverter::ClassifyLogsForFfrtWorker(FfrtPids& ffrtPids, FfrtWakeLogs& } #else uint64_t lineno = 0; + bool shouldCheck = true; std::vector indexs; indexs.reserve(ten); auto classifyLogs = [this, &traceMap, &pidMap, &ffrtTidMap, &ffrtWakeLogs](ConVecStr& newLogs, size_t startLineNo) { @@ -425,6 +458,10 @@ void FfrtConverter::ClassifyLogsForFfrtWorker(FfrtPids& ffrtPids, FfrtWakeLogs& ConStr& log = context_[lineno]; indexs.clear(); FindProcessNamePositions(log, indexs); + if (shouldCheck && IsOldVersionTrace(log)) { + this->isOldVersionTrace_ = true; + shouldCheck = false; + } if (indexs.size() > 1) { std::vector newLogs; SplitLogs(indexs, newLogs, log); @@ -998,6 +1035,20 @@ void HandleSchedSwitch(ConStr &mark, int tid, int &prio) } } +bool FfrtConverter::HandleFfrtTaskCo(ConStr &log, int lineno, bool &switchInFakeLog, bool &switchOutFakeLog) +{ + if (IsOldVersionTrace(log)) { + context_[lineno] = "\n"; + if (switchInFakeLog) { + switchInFakeLog = false; + } else { + switchOutFakeLog = true; + } + return true; + } + return false; +} + static bool IsFfrtTaskBlockOrFinish(ConStr &log) { static const std::string fStr = " F|"; @@ -1061,6 +1112,8 @@ bool FfrtConverter::HandleFfrtTaskExecute(FakeLogArgs &fakLogArg, WakeLogs &wake if (!missLog.empty()) { context_[fakLogArg.lineno] = missLog + context_[fakLogArg.lineno]; } + fakLogArg.switchInFakeLog = true; + fakLogArg.switchOutFakeLog = false; if (wakeLogs.find(fakLogArg.taskRunning) != wakeLogs.end()) { int prevIndex = FindGreaterThan(wakeLogs[fakLogArg.taskRunning], fakLogArg.lineno); if (prevIndex > 0) { @@ -1074,16 +1127,32 @@ bool FfrtConverter::HandleFfrtTaskExecute(FakeLogArgs &fakLogArg, WakeLogs &wake } bool FfrtConverter::HandlePreLineno(FakeLogArgs &fakArg, WakeLogs &wakeLogs, - TaskLabels &taskLabels) + TaskLabels &taskLabels, ConStr traceBeginMark, ConStr traceEndMark) { std::string label = ExtractTaskLable(fakArg.log); if (HandleFfrtTaskExecute(fakArg, wakeLogs, taskLabels, label)) { return true; } if (fakArg.taskRunning != -1) { + if (this->isOldVersionTrace_) { + if (HandleFfrtTaskCo(fakArg.log, fakArg.lineno, fakArg.switchInFakeLog, fakArg.switchOutFakeLog)) { + return true; + } + if (fakArg.switchInFakeLog && (fakArg.log.find(traceBeginMark) != std::string::npos)) { + context_[fakArg.lineno] = "\n"; + return true; + } + if (fakArg.switchOutFakeLog && (fakArg.log.find(traceEndMark) != std::string::npos)) { + context_[fakArg.lineno] = "\n"; + return true; + } + } if (IsFfrtTaskBlockOrFinish(fakArg.log)) { std::string fakeLog = MakeCoyieldFakeLog(fakArg); context_[fakArg.lineno] = fakeLog; + if (this->isOldVersionTrace_ && fakArg.switchOutFakeLog) { + fakArg.switchOutFakeLog = false; + } fakArg.taskRunning = -1; return true; } @@ -1096,7 +1165,8 @@ bool FfrtConverter::HandlePreLineno(FakeLogArgs &fakArg, WakeLogs &wakeLogs, } void FfrtConverter::ExceTaskLabelOhos(TaskLabels &taskLabels, FfrtWakeLogs &ffrtWakeLogs, - std::pair pidItem) + std::pair pidItem, std::string traceBeginMark, + std::string traceEndMark) { taskLabels[pidItem.first] = {}; WakeLogs tmp = {}; @@ -1107,7 +1177,8 @@ void FfrtConverter::ExceTaskLabelOhos(TaskLabels &taskLabels, FfrtWakeLogs &ffrt std::string tname = tidItem.second.first; std::vector linenos = tidItem.second.second; int prio = 120; - + bool switchInFakeLog = false; + bool switchOutFakeLog = false; int taskRunning = -1; for (auto lineno : linenos) { @@ -1118,17 +1189,19 @@ void FfrtConverter::ExceTaskLabelOhos(TaskLabels &taskLabels, FfrtWakeLogs &ffrt std::string cpuId = ExtractCpuId(log); std::string timestamp = ExtractTimeStr(log); FakeLogArgs fakArg{pidItem.first, tidItem.first, taskRunning, prio, lineno, - log, tname, taskLabels[pidItem.first][taskRunning], - cpuId, timestamp}; - HandlePreLineno(fakArg, wakeLogs, taskLabels); + switchInFakeLog, switchOutFakeLog, log, tname, + taskLabels[pidItem.first][taskRunning], cpuId, timestamp}; + HandlePreLineno(fakArg, wakeLogs, taskLabels, traceBeginMark, traceEndMark); } } } void FfrtConverter::GenTaskLabelsOhos(FfrtPids &ffrtPids, FfrtWakeLogs& ffrtWakeLogs, TaskLabels &taskLabels) { + static std::string traceBeginMark = tracingMarkerKey_ + "B"; + static std::string traceEndMark = tracingMarkerKey_ + "E"; for (auto &pidItem : ffrtPids) { - ExceTaskLabelOhos(taskLabels, ffrtWakeLogs, pidItem); + ExceTaskLabelOhos(taskLabels, ffrtWakeLogs, pidItem, traceBeginMark, traceEndMark); } } @@ -1177,16 +1250,16 @@ bool FfrtConverter::HandleHFfrtTaskExecute(FakeLogArgs &fakeArgs, WakeLogs &wake } fakeArgs.taskRunning = gid; FakeLogArgs fakArg2{fakeArgs.pid, fakeArgs.tid, fakeArgs.taskRunning, fakeArgs.prio, fakeArgs.lineno, - fakeArgs.log, fakeArgs.tname, taskLabels[fakeArgs.pid][fakeArgs.taskRunning], - fakeArgs.cpuId, fakeArgs.timestamp}; + fakeArgs.switchInFakeLog, fakeArgs.switchOutFakeLog, fakeArgs.log, fakeArgs.tname, + taskLabels[fakeArgs.pid][fakeArgs.taskRunning], fakeArgs.cpuId, fakeArgs.timestamp}; std::string fakeLog = MakeCostartFakeLog(fakArg2); context_[fakeArgs.lineno] = fakeLog; if (!missLog.empty()) { context_[fakeArgs.lineno] = missLog + context_[fakeArgs.lineno]; } FakeLogArgs fakArg3{fakeArgs.pid, fakeArgs.tid, fakeArgs.taskRunning, fakeArgs.prio, fakeArgs.lineno, - fakeArgs.log, fakeArgs.tname, taskLabels[fakeArgs.pid][fakeArgs.taskRunning], - fakeArgs.cpuId, fakeArgs.timestamp}; + fakeArgs.switchInFakeLog, fakeArgs.switchOutFakeLog, fakeArgs.log, fakeArgs.tname, + taskLabels[fakeArgs.pid][fakeArgs.taskRunning], fakeArgs.cpuId, fakeArgs.timestamp}; if (wakeLogs.find(fakeArgs.taskRunning) != wakeLogs.end()) { int prevIndex = FindGreaterThan(wakeLogs[fakeArgs.taskRunning], fakeArgs.lineno); if (prevIndex > 0) { @@ -1253,6 +1326,8 @@ bool FfrtConverter::HandlePreLinenoNohos(FakeLogArgs &fakArg, WakeLogs &wakeLogs void FfrtConverter::ExceTaskLabelNohos(TaskLabels &taskLabels, FfrtWakeLogs &ffrtWakeLogs, std::pair pidItem, std::unordered_map &schedWakeFlag) { + bool oneF = false; + bool twoF = false; taskLabels[pidItem.first] = {}; WakeLogs tmp = {}; WakeLogs &wakeLogs = (ffrtWakeLogs.find(pidItem.first) != ffrtWakeLogs.end()) @@ -1275,8 +1350,8 @@ void FfrtConverter::ExceTaskLabelNohos(TaskLabels &taskLabels, FfrtWakeLogs &ffr std::string label = ExtractTaskLable(log); FakeLogArgs fakArg{pidItem.first, tidItem.first, taskRunning, prio, lineno, - log, tname, taskLabels[pidItem.first][taskRunning], - cpuId, timestamp}; + oneF, twoF, log, tname, + taskLabels[pidItem.first][taskRunning], cpuId, timestamp}; HandlePreLinenoNohos(fakArg, wakeLogs, taskLabels, schedWakeFlag); } } diff --git a/trace_streamer/src/rpc/ffrt_converter.h b/trace_streamer/src/rpc/ffrt_converter.h index 138ab39971eec46318d1c962b54ab8039ce8ce72..94fb6b6c36771bc780bbe06cd628723f6a8c085f 100644 --- a/trace_streamer/src/rpc/ffrt_converter.h +++ b/trace_streamer/src/rpc/ffrt_converter.h @@ -56,6 +56,8 @@ struct FakeLogArgs { int &taskRunning; int prio; int lineno; + bool &switchInFakeLog; + bool &switchOutFakeLog; std::string &log; std::string &tname; std::string &taskLabel; @@ -89,6 +91,7 @@ private: std::vector context_ = {}; std::string tracingMarkerKey_; std::string osPlatformKet_ = "ohos"; + bool isOldVersionTrace_ = false; void FindQueueTaskInfo(FfrtPids &ffrtPids, QueueTaskInfo &queueTaskInfo); @@ -96,13 +99,15 @@ private: void HandleMarks(ConStr &log, int lineno, int pid); + bool HandleFfrtTaskCo(ConStr &log, int lineno, bool &switchInFakeLog, bool &switchOutFakeLog); + bool HandleFfrtTaskExecute(FakeLogArgs &fakLogArg, WakeLogs &wakeLogs, TaskLabels &taskLabels, std::string &label); void GenTaskLabelsOhos(FfrtPids &ffrtPids, FfrtWakeLogs& ffrtWakeLogs, TaskLabels &taskLabels); bool HandlePreLineno(FakeLogArgs &fakArg, WakeLogs &wakeLogs, - TaskLabels &taskLabels); + TaskLabels &taskLabels, ConStr traceBeginMark, ConStr traceEndMark); void SetTracingMarkerKey(LogInfo logInfo); @@ -112,7 +117,8 @@ private: void HandleTaskGroups(std::vector> &taskGroups, WakeLogs &wakeLogs); - void ExceTaskLabelOhos(TaskLabels &taskLabels, FfrtWakeLogs &ffrtWakeLogs, std::pair pidItem); + void ExceTaskLabelOhos(TaskLabels &taskLabels, FfrtWakeLogs &ffrtWakeLogs, std::pair pidItem, + std::string traceBeginMark, std::string traceEndMark); bool HandleHFfrtTaskExecute(FakeLogArgs &fakeArgs, WakeLogs &wakeLogs, TaskLabels &taskLabels, std::string label, std::unordered_map &schedWakeFlag);