From 1d7902a0caa77563d242e665e0a442e8afc6cf1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Nowacki?= Date: Thu, 15 May 2014 16:21:39 +0000 Subject: Fix crash in QNetworkAccessManager. Recreating QCoreApplication could cause a crash in QNetworkAccessManager constructor. That was caused by an invalid shutdown detection introduced in f273d6fbc02055ff3999adc0df76360ca0670435. Task-number: QTBUG-36897 Change-Id: Ib5bba773a2a4fcde690a3a93680aef551aae3a5b Reviewed-by: Peter Hartmann --- src/network/bearer/qnetworkconfigmanager.cpp | 14 +++++++++++--- src/network/bearer/qnetworkconfigmanager_p.h | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) (limited to 'src/network') diff --git a/src/network/bearer/qnetworkconfigmanager.cpp b/src/network/bearer/qnetworkconfigmanager.cpp index 855ab4e485..db1325d85b 100644 --- a/src/network/bearer/qnetworkconfigmanager.cpp +++ b/src/network/bearer/qnetworkconfigmanager.cpp @@ -57,6 +57,13 @@ QT_BEGIN_NAMESPACE static QBasicAtomicPointer connManager_ptr; static QBasicAtomicInt appShutdown; +static void connManager_prepare() +{ + int shutdown = appShutdown.fetchAndStoreAcquire(0); + Q_ASSERT(shutdown == 0 || shutdown == 1); + Q_UNUSED(shutdown); +} + static void connManager_cleanup() { // this is not atomic or thread-safe! @@ -68,8 +75,9 @@ static void connManager_cleanup() cmp->cleanup(); } -void QNetworkConfigurationManagerPrivate::addPostRoutine() +void QNetworkConfigurationManagerPrivate::addPreAndPostRoutine() { + qAddPreRoutine(connManager_prepare); qAddPostRoutine(connManager_cleanup); } @@ -85,12 +93,12 @@ QNetworkConfigurationManagerPrivate *qNetworkConfigurationManagerPrivate() if (QCoreApplicationPrivate::mainThread() == QThread::currentThread()) { // right thread or no main thread yet - ptr->addPostRoutine(); + ptr->addPreAndPostRoutine(); ptr->initialize(); } else { // wrong thread, we need to make the main thread do this QObject *obj = new QObject; - QObject::connect(obj, SIGNAL(destroyed()), ptr, SLOT(addPostRoutine()), Qt::DirectConnection); + QObject::connect(obj, SIGNAL(destroyed()), ptr, SLOT(addPreAndPostRoutine()), Qt::DirectConnection); ptr->initialize(); // this moves us to the right thread obj->moveToThread(QCoreApplicationPrivate::mainThread()); obj->deleteLater(); diff --git a/src/network/bearer/qnetworkconfigmanager_p.h b/src/network/bearer/qnetworkconfigmanager_p.h index d0913a843a..78b90b60a8 100644 --- a/src/network/bearer/qnetworkconfigmanager_p.h +++ b/src/network/bearer/qnetworkconfigmanager_p.h @@ -94,7 +94,7 @@ public: public Q_SLOTS: void updateConfigurations(); - static void addPostRoutine(); + static void addPreAndPostRoutine(); Q_SIGNALS: void configurationAdded(const QNetworkConfiguration &config); -- cgit v1.2.3