diff data/fileio/FileSource.cpp @ 833:3cc81dbc31bb

Use thread-local storage for network managers; otherwise we get "Cannot create children for a parent that is in a different thread" from nm.get()
author Chris Cannam
date Fri, 19 Jul 2013 13:47:11 +0100
parents 95d4a59295b7
children fcee7e040ab4
line wrap: on
line diff
--- a/data/fileio/FileSource.cpp	Wed Jul 17 15:43:42 2013 +0100
+++ b/data/fileio/FileSource.cpp	Fri Jul 19 13:47:11 2013 +0100
@@ -25,6 +25,7 @@
 #include <QFileInfo>
 #include <QDir>
 #include <QCoreApplication>
+#include <QThreadStorage>
 
 #include <iostream>
 #include <cstdlib>
@@ -67,7 +68,7 @@
 }
 #endif
 
-static QNetworkAccessManager nm;
+static QThreadStorage<QNetworkAccessManager *> nms;
 
 FileSource::FileSource(QString fileOrUrl, ProgressReporter *reporter,
                        QString preferredContentType) :
@@ -260,6 +261,13 @@
 void
 FileSource::init()
 {
+    { // check we have a QNetworkAccessManager
+        QMutexLocker locker(&m_mapMutex);
+        if (!nms.hasLocalData()) {
+            nms.setLocalData(new QNetworkAccessManager());
+        }
+    }
+
     if (isResource()) {
 #ifdef DEBUG_FILE_SOURCE
         std::cerr << "FileSource::init: Is a resource" << std::endl;
@@ -443,7 +451,7 @@
              QString("%1, */*").arg(m_preferredContentType).toLatin1());
     }
 
-    m_reply = nm.get(req);
+    m_reply = nms.localData()->get(req);
 
     connect(m_reply, SIGNAL(readyRead()),
             this, SLOT(readyRead()));