From 419ff3bbeaf7dbf2d11408c1a442c6f976166702 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 12 May 2016 13:49:43 -0700 Subject: [PATCH] Track request lifetime in lambda callbacks --- libraries/networking/src/AssetClient.cpp | 4 +--- libraries/networking/src/AssetRequest.cpp | 14 +++++++++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/libraries/networking/src/AssetClient.cpp b/libraries/networking/src/AssetClient.cpp index 080b0c9b90..c4ec0ad61e 100644 --- a/libraries/networking/src/AssetClient.cpp +++ b/libraries/networking/src/AssetClient.cpp @@ -202,7 +202,7 @@ AssetUpload* AssetClient::createUpload(const QByteArray& data) { } MessageID AssetClient::getAsset(const QString& hash, DataOffset start, DataOffset end, - ReceivedAssetCallback callback, ProgressCallback progressCallback) { + ReceivedAssetCallback callback, ProgressCallback progressCallback) { Q_ASSERT(QThread::currentThread() == thread()); if (hash.length() != SHA256_HASH_HEX_LENGTH) { @@ -238,8 +238,6 @@ MessageID AssetClient::getAsset(const QString& hash, DataOffset start, DataOffse callback(false, AssetServerError::NoError, QByteArray()); return INVALID_MESSAGE_ID; } - - } MessageID AssetClient::getAssetInfo(const QString& hash, GetInfoCallback callback) { diff --git a/libraries/networking/src/AssetRequest.cpp b/libraries/networking/src/AssetRequest.cpp index 594c471196..4f0e812031 100644 --- a/libraries/networking/src/AssetRequest.cpp +++ b/libraries/networking/src/AssetRequest.cpp @@ -106,9 +106,13 @@ void AssetRequest::start() { int start = 0, end = _info.size; auto assetClient = DependencyManager::get(); + auto that = QPointer(this); // Used to track the request's lifetime _assetRequestID = assetClient->getAsset(_hash, start, end, - [this, start, end](bool responseReceived, AssetServerError serverError, const QByteArray& data) { - + [this, that, start, end](bool responseReceived, AssetServerError serverError, const QByteArray& data) { + if (!that) { + // If the request is dead, return + return; + } _assetRequestID = AssetClient::INVALID_MESSAGE_ID; if (!responseReceived) { @@ -148,7 +152,11 @@ void AssetRequest::start() { _state = Finished; emit finished(this); - }, [this](qint64 totalReceived, qint64 total) { + }, [this, that](qint64 totalReceived, qint64 total) { + if (!that) { + // If the request is dead, return + return; + } emit progress(totalReceived, total); }); });