diff --git a/src/plugins/android/androidrunnerworker.cpp b/src/plugins/android/androidrunnerworker.cpp index fd96fd62ee1..708f48a5031 100644 --- a/src/plugins/android/androidrunnerworker.cpp +++ b/src/plugins/android/androidrunnerworker.cpp @@ -138,6 +138,17 @@ void findProcessPID(QFutureInterface &fi, const QString &adbPath, fi.reportResult(processPID); } +static void deleter(QProcess *p) +{ + p->terminate(); + if (!p->waitForFinished(1000)) { + p->kill(); + p->waitForFinished(); + } + // Might get deleted from its own signal handler. + p->deleteLater(); +} + AndroidRunnerWorkerBase::AndroidRunnerWorkerBase(RunControl *runControl, const AndroidRunnable &runnable) : m_androidRunnable(runnable) , m_adbLogcatProcess(nullptr, deleter) @@ -327,7 +338,7 @@ void AndroidRunnerWorkerBase::asyncStart() forceStop(); // Start the logcat process before app starts. - std::unique_ptr logcatProcess(new QProcess, deleter); + std::unique_ptr logcatProcess(new QProcess, deleter); connect(logcatProcess.get(), &QProcess::readyReadStandardOutput, this, &AndroidRunnerWorkerBase::logcatReadStandardOutput); connect(logcatProcess.get(), &QProcess::readyReadStandardError, @@ -373,7 +384,7 @@ void AndroidRunnerWorkerBase::asyncStart() runAdb({"shell", "run-as", m_androidRunnable.packageName, "killall", gdbServerExecutable}); runAdb({"shell", "run-as", m_androidRunnable.packageName, "rm", gdbServerSocket}); - std::unique_ptr gdbServerProcess(new QProcess, deleter); + std::unique_ptr gdbServerProcess(new QProcess, deleter); gdbServerProcess->start(m_adb, selector() << "shell" << "run-as" << m_androidRunnable.packageName << "lib/" + gdbServerExecutable << "--multi" << "+" + gdbServerSocket); @@ -457,7 +468,7 @@ void AndroidRunnerWorkerBase::handleJdbWaiting() else jdbPath.appendPath("jdb"); - std::unique_ptr jdbProcess(new QProcess, deleter); + std::unique_ptr jdbProcess(new QProcess, &deleter); jdbProcess->setProcessChannelMode(QProcess::MergedChannels); jdbProcess->start(jdbPath.toString(), QStringList() << "-connect" << QString("com.sun.jdi.SocketAttach:hostname=localhost,port=%1") diff --git a/src/plugins/android/androidrunnerworker.h b/src/plugins/android/androidrunnerworker.h index 9781d27e8cf..f524332eba9 100644 --- a/src/plugins/android/androidrunnerworker.h +++ b/src/plugins/android/androidrunnerworker.h @@ -42,17 +42,6 @@ namespace Internal { const int MIN_SOCKET_HANDSHAKE_PORT = 20001; -static inline void deleter(QProcess *p) -{ - p->terminate(); - if (!p->waitForFinished(1000)) { - p->kill(); - p->waitForFinished(); - } - // Might get deleted from its own signal handler. - p->deleteLater(); -} - class AndroidRunnerWorkerBase : public QObject { Q_OBJECT @@ -88,13 +77,14 @@ protected: Settled }; virtual void onProcessIdChanged(qint64 pid); + using Deleter = void (*)(QProcess *); // Create the processes and timer in the worker thread, for correct thread affinity AndroidRunnable m_androidRunnable; QString m_adb; qint64 m_processPID = -1; - std::unique_ptr m_adbLogcatProcess; - std::unique_ptr m_psIsAlive; + std::unique_ptr m_adbLogcatProcess; + std::unique_ptr m_psIsAlive; QByteArray m_stdoutBuffer; QByteArray m_stderrBuffer; QRegExp m_logCatRegExp; @@ -107,8 +97,8 @@ protected: QString m_lastRunAdbError; JDBState m_jdbState = JDBState::Idle; Utils::Port m_localJdbServerPort; - std::unique_ptr m_gdbServerProcess; - std::unique_ptr m_jdbProcess; + std::unique_ptr m_gdbServerProcess; + std::unique_ptr m_jdbProcess; };