PerfProfiler: Dismantle PerfProfilerRunner

Task-number: QTCREATORBUG-29168
Change-Id: I0d740922cc3b6752b28f78530b53180dbdbb2f8b
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Jarek Kobus
2025-01-03 12:57:00 +01:00
parent 7c63aaedaf
commit 4b956f20be

View File

@@ -83,16 +83,19 @@ private:
PerfDataReader m_reader; PerfDataReader m_reader;
}; };
class PerfProfilerRunner final : public RunWorker // PerfProfilerRunWorkerFactory
class PerfProfilerRunWorkerFactory final : public RunWorkerFactory
{ {
public: public:
explicit PerfProfilerRunner(RunControl *runControl) PerfProfilerRunWorkerFactory()
: RunWorker(runControl)
{ {
setId("PerfProfilerRunner"); setProducer([](RunControl *runControl) {
auto worker = new RunWorker(runControl);
worker->setId("PerfProfilerRunner");
PerfParserWorker *perfParserWorker = new PerfParserWorker(runControl); PerfParserWorker *perfParserWorker = new PerfParserWorker(runControl);
addStopDependency(perfParserWorker); worker->addStopDependency(perfParserWorker);
// If the parser is gone, there is no point in going on. // If the parser is gone, there is no point in going on.
perfParserWorker->setEssential(true); perfParserWorker->setEssential(true);
@@ -103,11 +106,11 @@ public:
perfRecordWorker = new ProcessRunner(runControl); perfRecordWorker = new ProcessRunner(runControl);
perfRecordWorker->suppressDefaultStdOutHandling(); perfRecordWorker->suppressDefaultStdOutHandling();
perfRecordWorker->setStartModifier([this, runControl, perfRecordWorker] { perfRecordWorker->setStartModifier([worker, runControl, perfRecordWorker] {
const Store perfArgs = runControl->settingsData(PerfProfiler::Constants::PerfSettingsId); const Store perfArgs = runControl->settingsData(PerfProfiler::Constants::PerfSettingsId);
const QString recordArgs = perfArgs[Constants::PerfRecordArgsId].toString(); const QString recordArgs = perfArgs[Constants::PerfRecordArgsId].toString();
CommandLine cmd({device()->filePath("perf"), {"record"}}); CommandLine cmd({worker->device()->filePath("perf"), {"record"}});
cmd.addArgs(recordArgs, CommandLine::Raw); cmd.addArgs(recordArgs, CommandLine::Raw);
cmd.addArgs({"-o", "-", "--"}); cmd.addArgs({"-o", "-", "--"});
cmd.addCommandLineAsArgs(runControl->commandLine(), CommandLine::Raw); cmd.addCommandLineAsArgs(runControl->commandLine(), CommandLine::Raw);
@@ -115,43 +118,36 @@ public:
perfRecordWorker->setCommandLine(cmd); perfRecordWorker->setCommandLine(cmd);
perfRecordWorker->setWorkingDirectory(runControl->workingDirectory()); perfRecordWorker->setWorkingDirectory(runControl->workingDirectory());
perfRecordWorker->setEnvironment(runControl->environment()); perfRecordWorker->setEnvironment(runControl->environment());
appendMessage("Starting Perf: " + cmd.toUserOutput(), NormalMessageFormat); worker->appendMessage("Starting Perf: " + cmd.toUserOutput(), NormalMessageFormat);
}); });
// In the local case, the parser won't automatically stop when the recorder does. So we need // In the local case, the parser won't automatically stop when the recorder does. So we need
// to mark the recorder as essential, too. // to mark the recorder as essential, too.
perfRecordWorker->setEssential(true); perfRecordWorker->setEssential(true);
} }
addStartDependency(perfRecordWorker); worker->addStartDependency(perfRecordWorker);
perfParserWorker->addStartDependency(perfRecordWorker); perfParserWorker->addStartDependency(perfRecordWorker);
perfParserWorker->addStopDependency(perfRecordWorker); perfParserWorker->addStopDependency(perfRecordWorker);
PerfProfilerTool::instance()->onWorkerCreation(runControl); PerfProfilerTool::instance()->onWorkerCreation(runControl);
auto tool = PerfProfilerTool::instance(); auto tool = PerfProfilerTool::instance();
connect(tool->stopAction(), &QAction::triggered, runControl, &RunControl::initiateStop); QObject::connect(tool->stopAction(), &QAction::triggered,
connect(runControl, &RunControl::started, PerfProfilerTool::instance(), runControl, &RunControl::initiateStop);
QObject::connect(runControl, &RunControl::started, PerfProfilerTool::instance(),
&PerfProfilerTool::onRunControlStarted); &PerfProfilerTool::onRunControlStarted);
connect(runControl, &RunControl::stopped, PerfProfilerTool::instance(), QObject::connect(runControl, &RunControl::stopped, PerfProfilerTool::instance(),
&PerfProfilerTool::onRunControlFinished); &PerfProfilerTool::onRunControlFinished);
PerfDataReader *reader = perfParserWorker->reader(); PerfDataReader *reader = perfParserWorker->reader();
connect(perfRecordWorker, &ProcessRunner::stdOutData, QObject::connect(perfRecordWorker, &ProcessRunner::stdOutData,
this, [this, reader](const QByteArray &data) { worker, [worker, reader](const QByteArray &data) {
if (!reader->feedParser(data)) if (!reader->feedParser(data))
reportFailure(Tr::tr("Failed to transfer Perf data to perfparser.")); worker->reportFailure(Tr::tr("Failed to transfer Perf data to perfparser."));
}); });
}
};
// PerfProfilerRunWorkerFactory return worker;
});
class PerfProfilerRunWorkerFactory final : public RunWorkerFactory
{
public:
PerfProfilerRunWorkerFactory()
{
setProduct<PerfProfilerRunner>();
addSupportedRunMode(ProjectExplorer::Constants::PERFPROFILER_RUN_MODE); addSupportedRunMode(ProjectExplorer::Constants::PERFPROFILER_RUN_MODE);
} }
}; };