AndroidSignalOperation: Don't kill and reuse the process

Don't kill the process, delete it instead.
Minimize code repetition when starting both versions
of adb process, enclose it in startAdbProcess().
Call deleteLater() and clear the pointer to adb process
from inside adb process handlers. Don't disconnect from adb
process unnecessarily now.

Change-Id: Id77eda562fa7fa4108c52cc839bd73a8032f5f25
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
Jarek Kobus
2022-03-22 17:41:52 +01:00
parent 780f5da7c4
commit 70221cf13f
2 changed files with 28 additions and 24 deletions

View File

@@ -36,7 +36,6 @@ namespace Internal {
AndroidSignalOperation::AndroidSignalOperation()
: m_adbPath(AndroidConfigurations::currentConfig().adbToolPath())
, m_adbProcess(new QtcProcess(this))
, m_timeout(new QTimer(this))
{
m_timeout->setInterval(5000);
@@ -47,7 +46,6 @@ void AndroidSignalOperation::adbFindRunAsFinished()
{
QTC_ASSERT(m_state == RunAs, return);
m_timeout->stop();
m_adbProcess->disconnect(this);
QString runAs = QString::fromLatin1(m_adbProcess->readAllStandardOutput());
if (m_adbProcess->exitStatus() != QProcess::NormalExit) {
@@ -56,6 +54,7 @@ void AndroidSignalOperation::adbFindRunAsFinished()
if (!adbError.isEmpty())
m_errorMessage += QLatin1String(" adb process error: ") + adbError;
}
m_adbProcess.release()->deleteLater();
if (runAs.isEmpty() || !m_errorMessage.isEmpty()) {
m_errorMessage = QLatin1String("Cannot find User for process: ")
+ QString::number(m_pid)
@@ -63,13 +62,9 @@ void AndroidSignalOperation::adbFindRunAsFinished()
m_state = Idle;
emit finished(m_errorMessage);
} else {
connect(m_adbProcess, &QtcProcess::finished,
this, &AndroidSignalOperation::adbKillFinished);
m_state = Kill;
m_timeout->start();
m_adbProcess->setCommand({m_adbPath, {"shell", "run-as", runAs,
"kill", QString("-%1").arg(m_signal), QString::number(m_pid)}});
m_adbProcess->start();
startAdbProcess(Kill, {m_adbPath, {"shell", "run-as", runAs, "kill",
QString("-%1").arg(m_signal), QString::number(m_pid)}},
[this] { adbKillFinished(); });
}
}
@@ -77,7 +72,6 @@ void AndroidSignalOperation::adbKillFinished()
{
QTC_ASSERT(m_state == Kill, return);
m_timeout->stop();
m_adbProcess->disconnect(this);
if (m_adbProcess->exitStatus() != QProcess::NormalExit) {
m_errorMessage = QLatin1String(" adb process exit code: ") + QString::number(m_adbProcess->exitCode());
@@ -87,6 +81,7 @@ void AndroidSignalOperation::adbKillFinished()
} else {
m_errorMessage = QString::fromLatin1(m_adbProcess->readAllStandardError());
}
m_adbProcess.release()->deleteLater();
if (!m_errorMessage.isEmpty()) {
m_errorMessage = QLatin1String("Cannot kill process: ") + QString::number(m_pid)
+ m_errorMessage;
@@ -97,8 +92,7 @@ void AndroidSignalOperation::adbKillFinished()
void AndroidSignalOperation::handleTimeout()
{
m_adbProcess->disconnect(this);
m_adbProcess->kill();
m_adbProcess.reset();
m_timeout->stop();
m_state = Idle;
m_errorMessage = QLatin1String("adb process timed out");
@@ -108,14 +102,20 @@ void AndroidSignalOperation::handleTimeout()
void AndroidSignalOperation::signalOperationViaADB(qint64 pid, int signal)
{
QTC_ASSERT(m_state == Idle, return);
m_adbProcess->disconnect(this);
m_pid = pid;
m_signal = signal;
connect(m_adbProcess, &QtcProcess::finished,
this, &AndroidSignalOperation::adbFindRunAsFinished);
m_state = RunAs;
startAdbProcess(RunAs, {m_adbPath, {"shell", "cat", QString("/proc/%1/cmdline").arg(m_pid)}},
[this] { adbFindRunAsFinished(); });
}
void AndroidSignalOperation::startAdbProcess(State state, const Utils::CommandLine &commandLine,
FinishHandler handler)
{
m_state = state;
m_timeout->start();
m_adbProcess->setCommand({m_adbPath, {"shell", "cat", QString("/proc/%1/cmdline").arg(m_pid)}});
m_adbProcess.reset(new QtcProcess);
connect(m_adbProcess.get(), &QtcProcess::finished, this, handler);
m_adbProcess->setCommand(commandLine);
m_adbProcess->start();
}

View File

@@ -47,22 +47,26 @@ protected:
explicit AndroidSignalOperation();
private:
enum State {
Idle,
RunAs,
Kill
};
using FinishHandler = std::function<void()>;
void adbFindRunAsFinished();
void adbKillFinished();
void handleTimeout();
void signalOperationViaADB(qint64 pid, int signal);
void startAdbProcess(State state, const Utils::CommandLine &commandLine, FinishHandler handler);
Utils::FilePath m_adbPath;
Utils::QtcProcess *m_adbProcess;
std::unique_ptr<Utils::QtcProcess> m_adbProcess;
QTimer *m_timeout;
enum State {
Idle,
RunAs,
Kill
} m_state = Idle;
State m_state = Idle;
qint64 m_pid = 0;
int m_signal = 0;