From 982a50dbcf8d922af62d59e2f36fbae17f200d65 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 7 Jul 2014 11:33:54 -0700 Subject: [PATCH] Remove multithread access from NetworkAccessManager for the time being --- .../networking/src/NetworkAccessManager.cpp | 150 +----------------- .../networking/src/NetworkAccessManager.h | 20 +-- 2 files changed, 10 insertions(+), 160 deletions(-) diff --git a/libraries/networking/src/NetworkAccessManager.cpp b/libraries/networking/src/NetworkAccessManager.cpp index 7e5ba3f66e..e92760d303 100644 --- a/libraries/networking/src/NetworkAccessManager.cpp +++ b/libraries/networking/src/NetworkAccessManager.cpp @@ -9,153 +9,19 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include -#include -#include +#include #include "NetworkAccessManager.h" +QThreadStorage networkAccessManagers; + NetworkAccessManager& NetworkAccessManager::getInstance() { - static NetworkAccessManager sharedInstance; - return sharedInstance; + if (!networkAccessManagers.hasLocalData()) { + networkAccessManagers.setLocalData(new NetworkAccessManager()); + } + + return *networkAccessManagers.localData(); } NetworkAccessManager::NetworkAccessManager() { - qRegisterMetaType(); } - -QNetworkReply* NetworkAccessManager::get(const QNetworkRequest& request) { - if (QThread::currentThread() != thread()) { - QNetworkReply* result; - QMetaObject::invokeMethod(this, - "get", - Qt::BlockingQueuedConnection, - Q_RETURN_ARG(QNetworkReply*, result), - Q_ARG(const QNetworkRequest, request)); - return result; - } - return QNetworkAccessManager::get(request); -} - -QNetworkReply* NetworkAccessManager::head(const QNetworkRequest& request) { - if (QThread::currentThread() != thread()) { - QNetworkReply* result; - QMetaObject::invokeMethod(this, - "head", - Qt::BlockingQueuedConnection, - Q_RETURN_ARG(QNetworkReply*, result), - Q_ARG(const QNetworkRequest, request)); - return result; - } - return QNetworkAccessManager::head(request); -} - -QNetworkReply* NetworkAccessManager::post(const QNetworkRequest& request, QIODevice* data) { - if (QThread::currentThread() != thread()) { - QNetworkReply* result; - QMetaObject::invokeMethod(this, - "post", - Qt::BlockingQueuedConnection, - Q_RETURN_ARG(QNetworkReply*, result), - Q_ARG(const QNetworkRequest, request), - Q_ARG(QIODevice*, data)); - return result; - } - return QNetworkAccessManager::post(request, data); -} - -QNetworkReply* NetworkAccessManager::post(const QNetworkRequest& request, const QByteArray& data) { - if (QThread::currentThread() != thread()) { - QNetworkReply* result; - QMetaObject::invokeMethod(this, - "post", - Qt::BlockingQueuedConnection, - Q_RETURN_ARG(QNetworkReply*, result), - Q_ARG(const QNetworkRequest, request), - Q_ARG(const QByteArray, data)); - return result; - } - return QNetworkAccessManager::post(request, data); -} - -QNetworkReply* NetworkAccessManager::post(const QNetworkRequest& request, QHttpMultiPart* multiPart) { - if (QThread::currentThread() != thread()) { - QNetworkReply* result; - QMetaObject::invokeMethod(this, - "post", - Qt::BlockingQueuedConnection, - Q_RETURN_ARG(QNetworkReply*, result), - Q_ARG(const QNetworkRequest, request), - Q_ARG(QHttpMultiPart*, multiPart)); - return result; - } - return QNetworkAccessManager::post(request, multiPart); -} - -QNetworkReply* NetworkAccessManager::put(const QNetworkRequest& request, QIODevice* data) { - if (QThread::currentThread() != thread()) { - QNetworkReply* result; - QMetaObject::invokeMethod(this, - "put", - Qt::BlockingQueuedConnection, - Q_RETURN_ARG(QNetworkReply*, result), - Q_ARG(const QNetworkRequest, request), - Q_ARG(QIODevice*, data)); - return result; - } - return QNetworkAccessManager::put(request, data); -} - -QNetworkReply* NetworkAccessManager::put(const QNetworkRequest& request, QHttpMultiPart* multiPart) { - if (QThread::currentThread() != thread()) { - QNetworkReply* result; - QMetaObject::invokeMethod(this, - "put", - Qt::BlockingQueuedConnection, - Q_RETURN_ARG(QNetworkReply*, result), - Q_ARG(const QNetworkRequest, request), - Q_ARG(QHttpMultiPart*, multiPart)); - return result; - } - return QNetworkAccessManager::put(request, multiPart); -} - -QNetworkReply* NetworkAccessManager::put(const QNetworkRequest & request, const QByteArray & data) { - if (QThread::currentThread() != thread()) { - QNetworkReply* result; - QMetaObject::invokeMethod(this, - "put", - Qt::BlockingQueuedConnection, - Q_RETURN_ARG(QNetworkReply*, result), - Q_ARG(const QNetworkRequest, request), - Q_ARG(const QByteArray, data)); - return result; - } - return QNetworkAccessManager::put(request, data); -} - - -QNetworkReply* NetworkAccessManager::sendCustomRequest(const QNetworkRequest& request, const QByteArray& verb, QIODevice* data) { - if (QThread::currentThread() != thread()) { - QNetworkReply* result; - QMetaObject::invokeMethod(this, - "sendCustomRequest", - Qt::BlockingQueuedConnection, - Q_RETURN_ARG(QNetworkReply*, result), - Q_ARG(const QNetworkRequest, request), - Q_ARG(const QByteArray, verb), - Q_ARG(QIODevice*, data)); - return result; - } - return QNetworkAccessManager::sendCustomRequest(request, verb, data); -} - -void NetworkAccessManager::setCache(QAbstractNetworkCache* cache) { - if (QThread::currentThread() != thread()) { - QMetaObject::invokeMethod(this, - "setCache", - Qt::BlockingQueuedConnection, - Q_ARG(QAbstractNetworkCache*, cache)); - } - QNetworkAccessManager::setCache(cache); -} \ No newline at end of file diff --git a/libraries/networking/src/NetworkAccessManager.h b/libraries/networking/src/NetworkAccessManager.h index 1b49cc9dee..c1e22f5082 100644 --- a/libraries/networking/src/NetworkAccessManager.h +++ b/libraries/networking/src/NetworkAccessManager.h @@ -13,32 +13,16 @@ #define hifi_NetworkAccessManager_h #include -#include -#include -/// Wrapper around QNetworkAccessManager wo that we only use one instance -/// For any other method you should need, make sure to be on the right thread -/// or if it is not but is a slot, use QMetaObject::invokeMethod() -/// In the case what you want to call isn't a slot and you aren't on the same thread, -/// then add then method to the method to the wrapper with the Q_INVKABLE flag +/// Wrapper around QNetworkAccessManager to restrict at one instance by thread class NetworkAccessManager : public QNetworkAccessManager { Q_OBJECT public: static NetworkAccessManager& getInstance(); - Q_INVOKABLE QNetworkReply* get(const QNetworkRequest& request); - Q_INVOKABLE QNetworkReply* head(const QNetworkRequest& request); - Q_INVOKABLE QNetworkReply* post(const QNetworkRequest& request, QIODevice* data); - Q_INVOKABLE QNetworkReply* post(const QNetworkRequest& request, const QByteArray& data); - Q_INVOKABLE QNetworkReply* post(const QNetworkRequest& request, QHttpMultiPart* multiPart); - Q_INVOKABLE QNetworkReply* put(const QNetworkRequest& request, QIODevice* data); - Q_INVOKABLE QNetworkReply* put(const QNetworkRequest& request, QHttpMultiPart* multiPart); - Q_INVOKABLE QNetworkReply* put(const QNetworkRequest& request, const QByteArray& data); - Q_INVOKABLE QNetworkReply* sendCustomRequest(const QNetworkRequest& request, const QByteArray& verb, QIODevice* data = 0); - Q_INVOKABLE void setCache(QAbstractNetworkCache* cache); - private: NetworkAccessManager(); + Q_DISABLE_COPY(NetworkAccessManager) }; #endif // hifi_NetworkAccessManager_h \ No newline at end of file