summaryrefslogtreecommitdiffstats
path: root/src/network/bearer
diff options
context:
space:
mode:
authorJędrzej Nowacki <jedrzej.nowacki@digia.com>2014-05-15 16:21:39 +0000
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-05-19 15:52:58 +0200
commit1d7902a0caa77563d242e665e0a442e8afc6cf1c (patch)
tree2e16646b73353d75f5fb6f9b89b6beb64313bb79 /src/network/bearer
parent828656241bb69dc4c247796860963d88aa70ca5c (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.cpp14
-rw-r--r--src/network/bearer/qnetworkconfigmanager_p.h2
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);