forked from qt-creator/qt-creator
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:
@@ -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();
|
||||
}
|
||||
|
||||
|
@@ -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;
|
||||
|
||||
|
Reference in New Issue
Block a user