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