diff options
author | Jędrzej Nowacki <jedrzej.nowacki@digia.com> | 2014-05-15 16:21:39 +0000 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-05-19 15:52:58 +0200 |
commit | 1d7902a0caa77563d242e665e0a442e8afc6cf1c (patch) | |
tree | 2e16646b73353d75f5fb6f9b89b6beb64313bb79 /src/network/bearer | |
parent | 828656241bb69dc4c247796860963d88aa70ca5c (diff) |
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 <phartmann@blackberry.com>
Diffstat (limited to 'src/network/bearer')
-rw-r--r-- | src/network/bearer/qnetworkconfigmanager.cpp | 14 | ||||
-rw-r--r-- | src/network/bearer/qnetworkconfigmanager_p.h | 2 |
2 files changed, 12 insertions, 4 deletions
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<QNetworkConfigurationManagerPrivate> 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); |