Skip to content

Commit

Permalink
integrate RecordHost in PerfRecord
Browse files Browse the repository at this point in the history
There is some logic left from the time before RecordHost.
This patch removes these fragments
  • Loading branch information
lievenhey committed Sep 19, 2023
1 parent d8dc19a commit 18835dc
Show file tree
Hide file tree
Showing 6 changed files with 39 additions and 37 deletions.
27 changes: 6 additions & 21 deletions src/perfrecord.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include <csignal>
#include <unistd.h>

#include <KShell>
#include <kwindowsystem_version.h>
#if KWINDOWSYSTEM_VERSION >= QT_VERSION_CHECK(5, 101, 0)
#include <KX11Extras>
Expand Down Expand Up @@ -174,27 +175,11 @@ void PerfRecord::record(const QStringList& perfOptions, const QString& outputPat
runPerf(actuallyElevatePrivileges(elevatePrivileges), options, outputPath, {});
}

void PerfRecord::record(const QStringList& perfOptions, const QString& outputPath, bool elevatePrivileges,
const QString& exePath, const QStringList& exeOptions, const QString& workingDirectory)
void PerfRecord::record(const QStringList& perfOptions, const QString& outputPath, bool elevatePrivileges)
{
QFileInfo exeFileInfo(exePath);

if (!exeFileInfo.exists()) {
exeFileInfo.setFile(QStandardPaths::findExecutable(exePath));
}

if (!exeFileInfo.exists()) {
emit recordingFailed(tr("File '%1' does not exist.").arg(exePath));
return;
}
if (!exeFileInfo.isFile()) {
emit recordingFailed(tr("'%1' is not a file.").arg(exePath));
return;
}
if (!exeFileInfo.isExecutable()) {
emit recordingFailed(tr("File '%1' is not executable.").arg(exePath));
return;
}
auto exePath = m_host->clientApplication();
auto exeOptions = m_host->clientApplicationArguments();
auto workingDirectory = m_host->currentWorkingDirectory();

QStringList options = perfOptions;
if (actuallyElevatePrivileges(elevatePrivileges)) {
Expand All @@ -211,7 +196,7 @@ void PerfRecord::record(const QStringList& perfOptions, const QString& outputPat

m_perfControlFifo.requestStart();
} else {
options.append(exeFileInfo.absoluteFilePath());
options.append(exePath);
options += exeOptions;
runPerf(false, options, outputPath, workingDirectory);
}
Expand Down
6 changes: 4 additions & 2 deletions src/perfrecord.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ class PerfRecord : public QObject
explicit PerfRecord(const RecordHost* host, QObject* parent = nullptr);
~PerfRecord();

void record(const QStringList& perfOptions, const QString& outputPath, bool elevatePrivileges,
const QString& exePath, const QStringList& exeOptions, const QString& workingDirectory = QString());
void record(const QStringList& perfOptions, const QString& outputPath, bool elevatePrivileges);

void record(const QStringList& perfOptions, const QString& outputPath, bool elevatePrivileges,
const QStringList& pids);
void recordSystem(const QStringList& perfOptions, const QString& outputPath);
Expand Down Expand Up @@ -55,4 +55,6 @@ class PerfRecord : public QObject

bool runPerf(bool elevatePrivileges, const QStringList& perfOptions, const QString& outputPath,
const QString& workingDirectory = QString());

bool runRemotePerf(const QStringList& perfOptions, const QString& outputPath, const QString& workingDirectory = {});
};
2 changes: 1 addition & 1 deletion src/recordhost.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -327,7 +327,7 @@ void RecordHost::setClientApplication(const QString& clientApplication)
}
}

void RecordHost::setClientApplicationArguments(const QString& arguments)
void RecordHost::setClientApplicationArguments(const QStringList& arguments)
{
Q_ASSERT(QThread::currentThread() == thread());

Expand Down
8 changes: 4 additions & 4 deletions src/recordhost.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,11 +61,11 @@ class RecordHost : public QObject
}
void setClientApplication(const QString& clientApplication);

QString clientApplicationArguments() const
QStringList clientApplicationArguments() const
{
return m_clientApplicationArguments;
}
void setClientApplicationArguments(const QString& arguments);
void setClientApplicationArguments(const QStringList& arguments);

QString outputFileName() const
{
Expand Down Expand Up @@ -111,7 +111,7 @@ class RecordHost : public QObject
void hostChanged();
void currentWorkingDirectoryChanged(const QString& cwd); // Maybe QUrl
void clientApplicationChanged(const QString& clientApplication);
void clientApplicationArgumentsChanged(const QString& arguments);
void clientApplicationArgumentsChanged(const QStringList& arguments);
void perfCapabilitiesChanged(RecordHost::PerfCapabilities perfCapabilities);
void isPerfInstalledChanged(bool isInstalled);
void outputFileNameChanged(const QString& outputFileName);
Expand All @@ -126,7 +126,7 @@ class RecordHost : public QObject
QString m_error;
QString m_cwd;
QString m_clientApplication;
QString m_clientApplicationArguments;
QStringList m_clientApplicationArguments;
QString m_outputFileName;
PerfCapabilities m_perfCapabilities;
JobTracker m_checkPerfCapabilitiesJob;
Expand Down
23 changes: 18 additions & 5 deletions src/recordpage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ RecordPage::RecordPage(QWidget* parent)

connect(ui->applicationParametersBox, &QLineEdit::editingFinished, this, [this] {
ui->multiConfig->saveCurrentConfig();
m_recordHost->setClientApplicationArguments(ui->applicationParametersBox->text());
m_recordHost->setClientApplicationArguments(KShell::splitArgs(ui->applicationParametersBox->text()));
});

ui->compressionComboBox->addItem(tr("Disabled"), -1);
Expand Down Expand Up @@ -620,14 +620,27 @@ void RecordPage::onStartRecordingButtonClicked(bool checked)
switch (recordType) {
case RecordType::LaunchApplication: {
const auto applicationName = m_recordHost->clientApplication();
const auto appParameters = ui->applicationParametersBox->text();
const auto appParameters = m_recordHost->clientApplicationArguments();
auto workingDir = m_recordHost->currentWorkingDirectory();
if (workingDir.isEmpty()) {
workingDir = ui->workingDirectory->placeholderText();
}
rememberApplication(applicationName, appParameters, workingDir, ui->applicationName->comboBox());
m_perfRecord->record(perfOptions, outputFile, elevatePrivileges, applicationName,
KShell::splitArgs(appParameters), workingDir);
rememberApplication(applicationName, appParameters.join(QLatin1Char(' ')), workingDir,
ui->applicationName->comboBox());
m_perfRecord->record(perfOptions, outputFile, elevatePrivileges);
break;
}
case RecordType::LaunchRemoteApplication: {
// TODO: network record
const auto applicationName = m_recordHost->clientApplication();
const auto appParameters = m_recordHost->clientApplicationArguments();
auto workingDir = m_recordHost->currentWorkingDirectory();
if (workingDir.isEmpty()) {
workingDir = ui->workingDirectory->placeholderText();
}
rememberApplication(applicationName, appParameters.join(QLatin1Char(' ')), workingDir,
ui->applicationName->comboBox());
m_perfRecord->record(perfOptions, outputFile, elevatePrivileges);
break;
}
case RecordType::AttachToProcess: {
Expand Down
10 changes: 6 additions & 4 deletions tests/integrationtests/tst_perfparser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,6 @@
#include "perfparser.h"
#include "perfrecord.h"
#include "recordhost.h"
#include "unistd.h"
#include "util.h"

#include "../testutils.h"
#include <hotspot-config.h>
Expand Down Expand Up @@ -429,7 +427,9 @@ private slots:
QSignalSpy recordingFinishedSpy(&perf, &PerfRecord::recordingFinished);
QSignalSpy recordingFailedSpy(&perf, &PerfRecord::recordingFailed);

perf.record({QStringLiteral("--no-buildid-cache")}, tempFile.fileName(), false, exePath, exeOptions);
host.setClientApplication(exePath);
host.setClientApplicationArguments(exeOptions);
perf.record({QStringLiteral("--no-buildid-cache")}, tempFile.fileName(), false);
perf.sendInput(QByteArrayLiteral("some input\n"));
QVERIFY(recordingFinishedSpy.wait());

Expand Down Expand Up @@ -735,11 +735,13 @@ private slots:
QSignalSpy recordingFinishedSpy(&perf, &PerfRecord::recordingFinished);
QSignalSpy recordingFailedSpy(&perf, &PerfRecord::recordingFailed);

host.setClientApplication(exePath);
host.setClientApplicationArguments(exeOptions);
// always add `-c 1000000`, as perf's frequency mode is too unreliable for testing purposes
perf.record(
perfOptions
+ QStringList {QStringLiteral("-c"), QStringLiteral("1000000"), QStringLiteral("--no-buildid-cache")},
fileName, false, exePath, exeOptions);
fileName, false);

VERIFY_OR_THROW(recordingFinishedSpy.wait(10000));

Expand Down

0 comments on commit 18835dc

Please sign in to comment.