forked from qt-creator/qt-creator
PerfProfiler: Dismantle PerfProfilerRunner
Task-number: QTCREATORBUG-29168 Change-Id: I0d740922cc3b6752b28f78530b53180dbdbb2f8b Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user