From 1fff480b73cd072cc7618f6e35c58963f5a5c337 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 30 Sep 2016 13:23:02 -0700 Subject: [PATCH 01/11] Add timeout to AssetResourceRequest --- .../networking/src/AssetResourceRequest.cpp | 59 ++++++++++++++++++- .../networking/src/AssetResourceRequest.h | 6 ++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/libraries/networking/src/AssetResourceRequest.cpp b/libraries/networking/src/AssetResourceRequest.cpp index a8311c6146..8faf7082cd 100644 --- a/libraries/networking/src/AssetResourceRequest.cpp +++ b/libraries/networking/src/AssetResourceRequest.cpp @@ -14,6 +14,7 @@ #include "AssetClient.h" #include "AssetUtils.h" #include "MappingRequest.h" +#include AssetResourceRequest::~AssetResourceRequest() { if (_assetMappingRequest) { @@ -23,6 +24,10 @@ AssetResourceRequest::~AssetResourceRequest() { if (_assetRequest) { _assetRequest->deleteLater(); } + + if (_sendTimer) { + cleanupTimer(); + } } bool AssetResourceRequest::urlIsAssetHash() const { @@ -32,6 +37,25 @@ bool AssetResourceRequest::urlIsAssetHash() const { return hashRegex.exactMatch(_url.toString()); } +void AssetResourceRequest::setupTimer() { + Q_ASSERT(!_sendTimer); + static const int TIMEOUT_MS = 2000; + + _sendTimer = new QTimer(); + connect(this, &QObject::destroyed, _sendTimer, &QTimer::deleteLater); + connect(_sendTimer, &QTimer::timeout, this, &AssetResourceRequest::onTimeout); + + _sendTimer->setSingleShot(true); + _sendTimer->start(TIMEOUT_MS); +} + +void AssetResourceRequest::cleanupTimer() { + Q_ASSERT(_sendTimer); + disconnect(_sendTimer, 0, this, 0); + _sendTimer->deleteLater(); + _sendTimer = nullptr; +} + void AssetResourceRequest::doSend() { // We'll either have a hash or an ATP path to a file (that maps to a hash) if (urlIsAssetHash()) { @@ -58,6 +82,8 @@ void AssetResourceRequest::requestMappingForPath(const AssetPath& path) { Q_ASSERT(_state == InProgress); Q_ASSERT(request == _assetMappingRequest); + cleanupTimer(); + switch (request->getError()) { case MappingRequest::NoError: // we have no error, we should have a resulting hash - use that to send of a request for that asset @@ -93,6 +119,7 @@ void AssetResourceRequest::requestMappingForPath(const AssetPath& path) { _assetMappingRequest = nullptr; }); + setupTimer(); _assetMappingRequest->start(); } @@ -102,11 +129,15 @@ void AssetResourceRequest::requestHash(const AssetHash& hash) { auto assetClient = DependencyManager::get(); _assetRequest = assetClient->createRequest(hash); - connect(_assetRequest, &AssetRequest::progress, this, &AssetResourceRequest::progress); + connect(_assetRequest, &AssetRequest::progress, this, &AssetResourceRequest::onDownloadProgress); connect(_assetRequest, &AssetRequest::finished, this, [this](AssetRequest* req) { Q_ASSERT(_state == InProgress); Q_ASSERT(req == _assetRequest); Q_ASSERT(req->getState() == AssetRequest::Finished); + + cleanupTimer(); + + qDebug() << "Asset request finished, " << req->getHash() << "error: " << req->getError(); switch (req->getError()) { case AssetRequest::Error::NoError: @@ -134,9 +165,35 @@ void AssetResourceRequest::requestHash(const AssetHash& hash) { _assetRequest = nullptr; }); + setupTimer(); _assetRequest->start(); } void AssetResourceRequest::onDownloadProgress(qint64 bytesReceived, qint64 bytesTotal) { + Q_ASSERT(_state == InProgress); + + // We've received data, so reset the timer + _sendTimer->start(); + emit progress(bytesReceived, bytesTotal); } + +void AssetResourceRequest::onTimeout() { + if (_state == InProgress) { + qWarning() << "Asset request timed out: " << _url; + if (_assetRequest) { + disconnect(_assetRequest, 0, this, 0); + _assetRequest->deleteLater(); + _assetRequest = nullptr; + } + if (_assetMappingRequest) { + disconnect(_assetMappingRequest, 0, this, 0); + _assetMappingRequest->deleteLater(); + _assetMappingRequest = nullptr; + } + _result = Timeout; + _state = Finished; + emit finished(); + } + cleanupTimer(); +} diff --git a/libraries/networking/src/AssetResourceRequest.h b/libraries/networking/src/AssetResourceRequest.h index 6839db0628..c462fbc3f8 100644 --- a/libraries/networking/src/AssetResourceRequest.h +++ b/libraries/networking/src/AssetResourceRequest.h @@ -28,13 +28,19 @@ protected: private slots: void onDownloadProgress(qint64 bytesReceived, qint64 bytesTotal); + void onTimeout(); private: + void setupTimer(); + void cleanupTimer(); + bool urlIsAssetHash() const; void requestMappingForPath(const AssetPath& path); void requestHash(const AssetHash& hash); + QTimer* _sendTimer { nullptr }; + GetMappingRequest* _assetMappingRequest { nullptr }; AssetRequest* _assetRequest { nullptr }; }; From 3c374e8ee2ff4262ed85b9af4240a557b532413e Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 30 Sep 2016 16:21:41 -0700 Subject: [PATCH 02/11] Add retry logic to ScriptCache --- libraries/script-engine/src/ScriptCache.cpp | 66 ++++++++++++++++----- libraries/script-engine/src/ScriptCache.h | 11 +++- 2 files changed, 61 insertions(+), 16 deletions(-) diff --git a/libraries/script-engine/src/ScriptCache.cpp b/libraries/script-engine/src/ScriptCache.cpp index 91d7f36102..f8a2c02f10 100644 --- a/libraries/script-engine/src/ScriptCache.cpp +++ b/libraries/script-engine/src/ScriptCache.cpp @@ -25,6 +25,7 @@ #include "ScriptEngines.h" #include "ScriptEngineLogging.h" +#include ScriptCache::ScriptCache(QObject* parent) { // nothing to do here... @@ -133,8 +134,11 @@ void ScriptCache::getScriptContents(const QString& scriptOrURL, contentAvailable qCDebug(scriptengine) << "Found script in cache:" << url.toString(); contentAvailable(url.toString(), scriptContent, true, true); } else { - bool alreadyWaiting = _contentCallbacks.contains(url); - _contentCallbacks.insert(url, contentAvailable); + auto& scriptRequest = _activeScriptRequests[url]; + + bool alreadyWaiting = scriptRequest.scriptUsers.size() > 0; + scriptRequest.scriptUsers.push_back(contentAvailable); + lock.unlock(); if (alreadyWaiting) { @@ -152,6 +156,9 @@ void ScriptCache::getScriptContents(const QString& scriptOrURL, contentAvailable } } +static const int MAX_RETRIES = 5; +static int START_DELAY_BETWEEN_RETRIES = 200; + void ScriptCache::scriptContentAvailable() { #ifdef THREAD_DEBUGGING qCDebug(scriptengine) << "ScriptCache::scriptContentAvailable() on thread [" << QThread::currentThread() << "] expected thread [" << thread() << "]"; @@ -160,29 +167,60 @@ void ScriptCache::scriptContentAvailable() { QUrl url = req->getUrl(); QString scriptContent; - QList allCallbacks; + std::vector allCallbacks; + bool finished { false }; bool success { false }; { - Lock lock(_containerLock); - allCallbacks = _contentCallbacks.values(url); - _contentCallbacks.remove(url); Q_ASSERT(req->getState() == ResourceRequest::Finished); success = req->getResult() == ResourceRequest::Success; - if (success) { - _scriptCache[url] = scriptContent = req->getData(); - qCDebug(scriptengine) << "Done downloading script at:" << url.toString(); - } else { - // Dubious, but retained here because it matches the behavior before fixing the threading - scriptContent = _scriptCache[url]; - qCWarning(scriptengine) << "Error loading script from URL " << url; + Lock lock(_containerLock); + + if (_activeScriptRequests.contains(url)) { + auto& scriptRequest = _activeScriptRequests[url]; + + if (success) { + allCallbacks = scriptRequest.scriptUsers; + auto scriptContent = _scriptCache[url]; + + _activeScriptRequests.remove(url); + + _scriptCache[url] = scriptContent = req->getData(); + finished = true; + qCDebug(scriptengine) << "Done downloading script at:" << url.toString(); + } else { + if (scriptRequest.numRetries < MAX_RETRIES) { + ++scriptRequest.numRetries; + + qDebug() << "Script request failed: " << url; + + int timeout = exp(scriptRequest.numRetries) * START_DELAY_BETWEEN_RETRIES; + QTimer::singleShot(timeout, this, [this, url]() { + qDebug() << "Retrying script request: " << url; + + auto request = ResourceManager::createResourceRequest(nullptr, url); + Q_ASSERT(request); + + // We've already made a request, so the cache must be disabled or it wasn't there, so enabling + // it will do nothing. + request->setCacheEnabled(false); + connect(request, &ResourceRequest::finished, this, &ScriptCache::scriptContentAvailable); + request->send(); + }); + } else { + // Dubious, but retained here because it matches the behavior before fixing the threading + scriptContent = _scriptCache[url]; + finished = true; + qCWarning(scriptengine) << "Error loading script from URL " << url; + } + } } } req->deleteLater(); - if (!DependencyManager::get()->isStopped()) { + if (finished && !DependencyManager::get()->isStopped()) { foreach(contentAvailableCallback thisCallback, allCallbacks) { thisCallback(url.toString(), scriptContent, true, success); } diff --git a/libraries/script-engine/src/ScriptCache.h b/libraries/script-engine/src/ScriptCache.h index 5c0c235bd1..42feaac2ad 100644 --- a/libraries/script-engine/src/ScriptCache.h +++ b/libraries/script-engine/src/ScriptCache.h @@ -15,13 +15,19 @@ #include #include +using contentAvailableCallback = std::function; + class ScriptUser { public: virtual void scriptContentsAvailable(const QUrl& url, const QString& scriptContents) = 0; virtual void errorInLoadingScript(const QUrl& url) = 0; }; -using contentAvailableCallback = std::function; +class ScriptRequest { +public: + std::vector scriptUsers { }; + int numRetries { 0 }; +}; /// Interface for loading scripts class ScriptCache : public QObject, public Dependency { @@ -51,7 +57,8 @@ private: ScriptCache(QObject* parent = NULL); Mutex _containerLock; - QMultiMap _contentCallbacks; + QMap _activeScriptRequests; + //QMultiMap _contentCallbacks; QHash _scriptCache; QMultiMap _scriptUsers; From c6485cc50cb60866495c92b07b6c5c28853a93f8 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 30 Sep 2016 16:56:08 -0700 Subject: [PATCH 03/11] Fix scriptcache only serving empty strings --- libraries/script-engine/src/ScriptCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/script-engine/src/ScriptCache.cpp b/libraries/script-engine/src/ScriptCache.cpp index f8a2c02f10..d8d75bce64 100644 --- a/libraries/script-engine/src/ScriptCache.cpp +++ b/libraries/script-engine/src/ScriptCache.cpp @@ -182,7 +182,7 @@ void ScriptCache::scriptContentAvailable() { if (success) { allCallbacks = scriptRequest.scriptUsers; - auto scriptContent = _scriptCache[url]; + //auto scriptContent = _scriptCache[url]; _activeScriptRequests.remove(url); From ca4022814e3c81198c3d61d0b8a307b015494b01 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Sun, 2 Oct 2016 21:18:13 -0700 Subject: [PATCH 04/11] Add extra logging to asset client --- libraries/networking/src/AssetClient.cpp | 6 ++++++ libraries/networking/src/AssetRequest.cpp | 6 +++++- libraries/networking/src/AssetRequest.h | 1 + libraries/script-engine/src/AssetScriptingInterface.cpp | 1 - 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/AssetClient.cpp b/libraries/networking/src/AssetClient.cpp index 9583d4735d..624d98df7a 100644 --- a/libraries/networking/src/AssetClient.cpp +++ b/libraries/networking/src/AssetClient.cpp @@ -394,12 +394,14 @@ void AssetClient::handleCompleteCallback(const QWeakPointer& node, Message auto senderNode = node.toStrongRef(); if (!senderNode) { + qCDebug(asset_client) << "Got completed asset for node that no longer exists"; return; } // Check if we have any pending requests for this node auto messageMapIt = _pendingRequests.find(senderNode); if (messageMapIt == _pendingRequests.end()) { + qCDebug(asset_client) << "Got completed asset for a node that doesn't have any pending requests"; return; } @@ -409,6 +411,7 @@ void AssetClient::handleCompleteCallback(const QWeakPointer& node, Message // Check if we have this pending request auto requestIt = messageCallbackMap.find(messageID); if (requestIt == messageCallbackMap.end()) { + qCDebug(asset_client) << "Got completed asset for a request that doesn't exist"; return; } @@ -416,13 +419,16 @@ void AssetClient::handleCompleteCallback(const QWeakPointer& node, Message auto& message = callbacks.message; if (!message) { + qCDebug(asset_client) << "Got completed asset for a message that doesn't exist"; return; } if (message->failed()) { + qCDebug(asset_client) << "Got failed asset"; callbacks.completeCallback(false, AssetServerError::NoError, QByteArray()); } else { + qCDebug(asset_client) << "Got asset"; callbacks.completeCallback(true, AssetServerError::NoError, message->readAll()); } diff --git a/libraries/networking/src/AssetRequest.cpp b/libraries/networking/src/AssetRequest.cpp index 4f0e812031..6f319df034 100644 --- a/libraries/networking/src/AssetRequest.cpp +++ b/libraries/networking/src/AssetRequest.cpp @@ -107,9 +107,11 @@ void AssetRequest::start() { auto assetClient = DependencyManager::get(); auto that = QPointer(this); // Used to track the request's lifetime + auto hash = _hash; _assetRequestID = assetClient->getAsset(_hash, start, end, - [this, that, start, end](bool responseReceived, AssetServerError serverError, const QByteArray& data) { + [this, that, hash, start, end](bool responseReceived, AssetServerError serverError, const QByteArray& data) { if (!that) { + qCWarning(asset_client) << "Got reply for dead asset request " << hash << "- error code" << _error; // If the request is dead, return return; } @@ -148,6 +150,8 @@ void AssetRequest::start() { if (_error != NoError) { qCWarning(asset_client) << "Got error retrieving asset" << _hash << "- error code" << _error; + } else { + qCDebug(asset_client) << "Received asset successfully: " << _hash; } _state = Finished; diff --git a/libraries/networking/src/AssetRequest.h b/libraries/networking/src/AssetRequest.h index c0bde9d8a8..0a6810b052 100644 --- a/libraries/networking/src/AssetRequest.h +++ b/libraries/networking/src/AssetRequest.h @@ -49,6 +49,7 @@ public: const State& getState() const { return _state; } const Error& getError() const { return _error; } QUrl getUrl() const { return ::getATPUrl(_hash); } + QString getHash() const { return _hash; } signals: void finished(AssetRequest* thisRequest); diff --git a/libraries/script-engine/src/AssetScriptingInterface.cpp b/libraries/script-engine/src/AssetScriptingInterface.cpp index 80cd30a8b6..32b1b5e792 100644 --- a/libraries/script-engine/src/AssetScriptingInterface.cpp +++ b/libraries/script-engine/src/AssetScriptingInterface.cpp @@ -21,7 +21,6 @@ AssetScriptingInterface::AssetScriptingInterface(QScriptEngine* engine) : _engine(engine) { - } void AssetScriptingInterface::uploadData(QString data, QScriptValue callback) { From 82aa1bafaddc711a699eaf898b39ebf5ab15da88 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 3 Oct 2016 09:31:09 -0700 Subject: [PATCH 05/11] Update BatchLoader to use ScriptCache --- libraries/script-engine/src/BatchLoader.cpp | 33 ++++++++++----------- libraries/script-engine/src/ScriptCache.cpp | 1 - 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/libraries/script-engine/src/BatchLoader.cpp b/libraries/script-engine/src/BatchLoader.cpp index f3e6242216..15b3b6c853 100644 --- a/libraries/script-engine/src/BatchLoader.cpp +++ b/libraries/script-engine/src/BatchLoader.cpp @@ -13,12 +13,14 @@ #include #include +#include #include "ScriptEngineLogging.h" #include "BatchLoader.h" #include #include #include "ResourceManager.h" #include "ScriptEngines.h" +#include "ScriptCache.h" BatchLoader::BatchLoader(const QList& urls) : QObject(), @@ -38,30 +40,25 @@ void BatchLoader::start() { for (const auto& rawURL : _urls) { QUrl url = expandScriptUrl(normalizeScriptURL(rawURL)); - auto request = ResourceManager::createResourceRequest(this, url); - if (!request) { - _data.insert(url, QString()); - qCDebug(scriptengine) << "Could not load" << url; - continue; - } - connect(request, &ResourceRequest::finished, this, [=]() { - if (request->getResult() == ResourceRequest::Success) { - _data.insert(url, request->getData()); + + qCDebug(scriptengine) << "Loading script at " << url; + + QPointer self = this; + DependencyManager::get()->getScriptContents(url.toString(), [this, self](const QString& url, const QString& contents, bool isURL, bool success) { + if (!self) { + return; + } + if (isURL && success) { + _data.insert(url, contents); + qCDebug(scriptengine) << "Loaded: " << url; } else { _data.insert(url, QString()); qCDebug(scriptengine) << "Could not load" << url; } - request->deleteLater(); checkFinished(); - }); - - // If we end up being destroyed before the reply finishes, clean it up - connect(this, &QObject::destroyed, request, &QObject::deleteLater); - - qCDebug(scriptengine) << "Loading script at " << url; - - request->send(); + }, false); } + checkFinished(); } diff --git a/libraries/script-engine/src/ScriptCache.cpp b/libraries/script-engine/src/ScriptCache.cpp index d8d75bce64..e9f20b5164 100644 --- a/libraries/script-engine/src/ScriptCache.cpp +++ b/libraries/script-engine/src/ScriptCache.cpp @@ -182,7 +182,6 @@ void ScriptCache::scriptContentAvailable() { if (success) { allCallbacks = scriptRequest.scriptUsers; - //auto scriptContent = _scriptCache[url]; _activeScriptRequests.remove(url); From ae507c4609f7c81d8722221421a0e6c58ad04fda Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 3 Oct 2016 22:26:10 -0700 Subject: [PATCH 06/11] Add ScriptCache to assignment clients --- assignment-client/src/AssignmentClient.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index 800f00b352..3bea0ce31c 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -57,6 +57,7 @@ AssignmentClient::AssignmentClient(Assignment::Type requestAssignmentType, QStri auto scriptableAvatar = DependencyManager::set(); auto addressManager = DependencyManager::set(); auto scriptEngines = DependencyManager::set(); + DependencyManager::set(); // create a NodeList as an unassigned client, must be after addressManager auto nodeList = DependencyManager::set(NodeType::Unassigned, listenPort); From 9dfa3e4a17b40fc2b2865c6470f895782f4172db Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 4 Oct 2016 08:21:40 -0700 Subject: [PATCH 07/11] Move ScriptCache from AssignmentClient to Agent --- assignment-client/src/Agent.cpp | 1 + assignment-client/src/AssignmentClient.cpp | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index c6a2a3d5e8..f4f5819361 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -62,6 +62,7 @@ Agent::Agent(ReceivedMessage& message) : DependencyManager::set(); DependencyManager::set(); DependencyManager::set(); + DependencyManager::set(); auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index 3bea0ce31c..800f00b352 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -57,7 +57,6 @@ AssignmentClient::AssignmentClient(Assignment::Type requestAssignmentType, QStri auto scriptableAvatar = DependencyManager::set(); auto addressManager = DependencyManager::set(); auto scriptEngines = DependencyManager::set(); - DependencyManager::set(); // create a NodeList as an unassigned client, must be after addressManager auto nodeList = DependencyManager::set(NodeType::Unassigned, listenPort); From bba5a7563f511c46104859f23ed124dc7b975b27 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 5 Oct 2016 19:25:03 -0700 Subject: [PATCH 08/11] Remove extraneous logging --- libraries/networking/src/AssetClient.cpp | 10 ++++------ libraries/networking/src/AssetResourceRequest.cpp | 2 -- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/libraries/networking/src/AssetClient.cpp b/libraries/networking/src/AssetClient.cpp index 624d98df7a..f5e2caa60d 100644 --- a/libraries/networking/src/AssetClient.cpp +++ b/libraries/networking/src/AssetClient.cpp @@ -394,14 +394,14 @@ void AssetClient::handleCompleteCallback(const QWeakPointer& node, Message auto senderNode = node.toStrongRef(); if (!senderNode) { - qCDebug(asset_client) << "Got completed asset for node that no longer exists"; + qCWarning(asset_client) << "Got completed asset for node that no longer exists"; return; } // Check if we have any pending requests for this node auto messageMapIt = _pendingRequests.find(senderNode); if (messageMapIt == _pendingRequests.end()) { - qCDebug(asset_client) << "Got completed asset for a node that doesn't have any pending requests"; + qCWarning(asset_client) << "Got completed asset for a node that doesn't have any pending requests"; return; } @@ -411,7 +411,7 @@ void AssetClient::handleCompleteCallback(const QWeakPointer& node, Message // Check if we have this pending request auto requestIt = messageCallbackMap.find(messageID); if (requestIt == messageCallbackMap.end()) { - qCDebug(asset_client) << "Got completed asset for a request that doesn't exist"; + qCWarning(asset_client) << "Got completed asset for a request that doesn't exist"; return; } @@ -419,16 +419,14 @@ void AssetClient::handleCompleteCallback(const QWeakPointer& node, Message auto& message = callbacks.message; if (!message) { - qCDebug(asset_client) << "Got completed asset for a message that doesn't exist"; + qCWarning(asset_client) << "Got completed asset for a message that doesn't exist"; return; } if (message->failed()) { - qCDebug(asset_client) << "Got failed asset"; callbacks.completeCallback(false, AssetServerError::NoError, QByteArray()); } else { - qCDebug(asset_client) << "Got asset"; callbacks.completeCallback(true, AssetServerError::NoError, message->readAll()); } diff --git a/libraries/networking/src/AssetResourceRequest.cpp b/libraries/networking/src/AssetResourceRequest.cpp index 8faf7082cd..fa946d3f4f 100644 --- a/libraries/networking/src/AssetResourceRequest.cpp +++ b/libraries/networking/src/AssetResourceRequest.cpp @@ -136,8 +136,6 @@ void AssetResourceRequest::requestHash(const AssetHash& hash) { Q_ASSERT(req->getState() == AssetRequest::Finished); cleanupTimer(); - - qDebug() << "Asset request finished, " << req->getHash() << "error: " << req->getError(); switch (req->getError()) { case AssetRequest::Error::NoError: From 17a1f9b5ae35536a45ce7ace8ce9e83f1cdc1fbb Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 5 Oct 2016 19:25:17 -0700 Subject: [PATCH 09/11] Make timer child of QObject instead of attaching to destroyed --- libraries/networking/src/AssetResourceRequest.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libraries/networking/src/AssetResourceRequest.cpp b/libraries/networking/src/AssetResourceRequest.cpp index fa946d3f4f..f320f00dbb 100644 --- a/libraries/networking/src/AssetResourceRequest.cpp +++ b/libraries/networking/src/AssetResourceRequest.cpp @@ -41,8 +41,7 @@ void AssetResourceRequest::setupTimer() { Q_ASSERT(!_sendTimer); static const int TIMEOUT_MS = 2000; - _sendTimer = new QTimer(); - connect(this, &QObject::destroyed, _sendTimer, &QTimer::deleteLater); + _sendTimer = new QTimer(this); connect(_sendTimer, &QTimer::timeout, this, &AssetResourceRequest::onTimeout); _sendTimer->setSingleShot(true); From 4901f386ca8a68e81a4f3b28def9667adc0e8d01 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 5 Oct 2016 19:25:41 -0700 Subject: [PATCH 10/11] Remove unused property in ScriptCache --- libraries/script-engine/src/ScriptCache.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libraries/script-engine/src/ScriptCache.h b/libraries/script-engine/src/ScriptCache.h index 42feaac2ad..17ba5c4b0a 100644 --- a/libraries/script-engine/src/ScriptCache.h +++ b/libraries/script-engine/src/ScriptCache.h @@ -58,11 +58,10 @@ private: Mutex _containerLock; QMap _activeScriptRequests; - //QMultiMap _contentCallbacks; QHash _scriptCache; QMultiMap _scriptUsers; QSet _badScripts; }; -#endif // hifi_ScriptCache_h \ No newline at end of file +#endif // hifi_ScriptCache_h From 4171fdd2e1372bb9465d3bae465769bd45b4467e Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 5 Oct 2016 19:27:24 -0700 Subject: [PATCH 11/11] Remove extraneous log line from AssetRequest --- libraries/networking/src/AssetRequest.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/libraries/networking/src/AssetRequest.cpp b/libraries/networking/src/AssetRequest.cpp index 6f319df034..4449531177 100644 --- a/libraries/networking/src/AssetRequest.cpp +++ b/libraries/networking/src/AssetRequest.cpp @@ -150,8 +150,6 @@ void AssetRequest::start() { if (_error != NoError) { qCWarning(asset_client) << "Got error retrieving asset" << _hash << "- error code" << _error; - } else { - qCDebug(asset_client) << "Received asset successfully: " << _hash; } _state = Finished;