From da5bbe51d13886410c1fc13e062ec09a2022a85f Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 21 Apr 2016 16:37:21 -0700 Subject: [PATCH] Fix AssetClient not properly disconnecting from callbacks --- libraries/networking/src/AssetClient.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/libraries/networking/src/AssetClient.cpp b/libraries/networking/src/AssetClient.cpp index 8fb0001b57..105a37d773 100644 --- a/libraries/networking/src/AssetClient.cpp +++ b/libraries/networking/src/AssetClient.cpp @@ -330,19 +330,25 @@ void AssetClient::handleAssetGetReply(QSharedPointer message, S if (message->isComplete()) { callbacks.completeCallback(true, error, message->readAll()); + messageCallbackMap.erase(requestIt); } else { - connect(message.data(), &ReceivedMessage::progress, this, [this, length, message, callbacks]() { + connect(message.data(), &ReceivedMessage::progress, this, [this, length, message, &callbacks]() { callbacks.progressCallback(message->getSize(), length); }); - connect(message.data(), &ReceivedMessage::completed, this, [this, message, error, callbacks]() { + connect(message.data(), &ReceivedMessage::completed, this, [this, messageID, message, &messageCallbackMap, &callbacks]() { if (message->failed()) { callbacks.completeCallback(false, AssetServerError::NoError, QByteArray()); } else { - callbacks.completeCallback(true, error, message->readAll()); + callbacks.completeCallback(true, AssetServerError::NoError, message->readAll()); } + + // We should never get to this point without the associated senderNode and messageID + // in our list of pending requests. If the senderNode had disconnected or the message + // had been canceled, we should have been disconnected from the ReceivedMessage + // signals and thus never had this lambda called. + messageCallbackMap.erase(messageID); }); } - messageCallbackMap.erase(requestIt); } // Although the messageCallbackMap may now be empty, we won't delete the node until we have disconnected from