forked from qt-creator/qt-creator
Android: Fix a crash on Creator shutdown during app startup
The AndroidRunnerWorker lives in a separate thread created by AndroidRunner. Thus, we can't delete it directly from the AndroidRunner's d'tor. Instead, we connect to QThread's finished() signal and delete the worker later. Make m_pidRunner a child of AndroidRunnerWorker so that it's moved together with its parent to the other thread. Change-Id: I5c3723315ee5183fa8451f0706311b14f173dca1 Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
@@ -54,23 +54,24 @@ AndroidRunner::AndroidRunner(RunControl *runControl, const QString &intentName)
|
||||
const int apiLevel = AndroidManager::deviceApiLevel(m_target);
|
||||
qCDebug(androidRunnerLog) << "Device API:" << apiLevel;
|
||||
|
||||
m_worker.reset(new AndroidRunnerWorker(this, m_packageName));
|
||||
m_worker = new AndroidRunnerWorker(this, m_packageName);
|
||||
m_worker->setIntentName(intent);
|
||||
m_worker->setIsPreNougat(apiLevel <= 23);
|
||||
|
||||
m_worker->moveToThread(&m_thread);
|
||||
QObject::connect(&m_thread, &QThread::finished, m_worker, &QObject::deleteLater);
|
||||
|
||||
connect(this, &AndroidRunner::asyncStart, m_worker.data(), &AndroidRunnerWorker::asyncStart);
|
||||
connect(this, &AndroidRunner::asyncStop, m_worker.data(), &AndroidRunnerWorker::asyncStop);
|
||||
connect(this, &AndroidRunner::asyncStart, m_worker, &AndroidRunnerWorker::asyncStart);
|
||||
connect(this, &AndroidRunner::asyncStop, m_worker, &AndroidRunnerWorker::asyncStop);
|
||||
connect(this, &AndroidRunner::androidDeviceInfoChanged,
|
||||
m_worker.data(), &AndroidRunnerWorker::setAndroidDeviceInfo);
|
||||
connect(m_worker.data(), &AndroidRunnerWorker::remoteProcessStarted,
|
||||
m_worker, &AndroidRunnerWorker::setAndroidDeviceInfo);
|
||||
|
||||
connect(m_worker, &AndroidRunnerWorker::remoteProcessStarted,
|
||||
this, &AndroidRunner::handleRemoteProcessStarted);
|
||||
connect(m_worker.data(), &AndroidRunnerWorker::remoteProcessFinished,
|
||||
connect(m_worker, &AndroidRunnerWorker::remoteProcessFinished,
|
||||
this, &AndroidRunner::handleRemoteProcessFinished);
|
||||
connect(m_worker.data(), &AndroidRunnerWorker::remoteOutput,
|
||||
this, &AndroidRunner::remoteOutput);
|
||||
connect(m_worker.data(), &AndroidRunnerWorker::remoteErrorOutput,
|
||||
connect(m_worker, &AndroidRunnerWorker::remoteOutput, this, &AndroidRunner::remoteOutput);
|
||||
connect(m_worker, &AndroidRunnerWorker::remoteErrorOutput,
|
||||
this, &AndroidRunner::remoteErrorOutput);
|
||||
|
||||
connect(&m_outputParser, &QmlDebug::QmlOutputParser::waitingForConnectionOnPort,
|
||||
|
@@ -56,7 +56,7 @@ private:
|
||||
QString m_launchedAVDName;
|
||||
QThread m_thread;
|
||||
QTimer m_checkAVDTimer;
|
||||
QScopedPointer<AndroidRunnerWorker> m_worker;
|
||||
AndroidRunnerWorker *m_worker = nullptr;
|
||||
QPointer<ProjectExplorer::Target> m_target;
|
||||
Utils::Port m_debugServerPort;
|
||||
QUrl m_qmlServer;
|
||||
|
@@ -203,6 +203,7 @@ AndroidRunnerWorker::AndroidRunnerWorker(RunWorker *runner, const QString &packa
|
||||
|
||||
QtSupport::QtVersion *version = QtSupport::QtKitAspect::qtVersion(target->kit());
|
||||
m_useAppParamsForQmlDebugger = version->qtVersion() >= QVersionNumber(5, 12);
|
||||
m_pidRunner.setParent(this); // Move m_pidRunner object together with *this into a separate thread.
|
||||
}
|
||||
|
||||
AndroidRunnerWorker::~AndroidRunnerWorker()
|
||||
|
Reference in New Issue
Block a user