From 0d06d8ea936660b7e6464ffc5ede1ba0da4d0821 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Fri, 15 Apr 2016 16:22:56 -0700 Subject: [PATCH] Clear freed loading resources --- libraries/networking/src/ResourceCache.cpp | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/libraries/networking/src/ResourceCache.cpp b/libraries/networking/src/ResourceCache.cpp index fcf0e833e1..8f2bbcbb85 100644 --- a/libraries/networking/src/ResourceCache.cpp +++ b/libraries/networking/src/ResourceCache.cpp @@ -73,7 +73,18 @@ QList> ResourceCacheSharedItems::getLoadingRequests() { void ResourceCacheSharedItems::removeRequest(QWeakPointer resource) { Lock lock(_mutex); - _loadingRequests.removeAll(resource); + // resource can only be removed if it still has a ref-count, as + // QWeakPointer has no operator== implementation for two weak ptrs, so + // manually loop in case resource has been freed. + for (int i = 0; i < _loadingRequests.size();) { + auto request = _loadingRequests.at(i); + // Clear our resource and any freed resources + if (!request || request.data() == resource.data()) { + _loadingRequests.removeAt(i); + continue; + } + i++; + } } QSharedPointer ResourceCacheSharedItems::getHighestPendingRequest() { @@ -82,12 +93,16 @@ QSharedPointer ResourceCacheSharedItems::getHighestPendingRequest() { int highestIndex = -1; float highestPriority = -FLT_MAX; QSharedPointer highestResource; + for (int i = 0; i < _pendingRequests.size();) { + // Clear any freed resources auto resource = _pendingRequests.at(i).lock(); if (!resource) { _pendingRequests.removeAt(i); continue; } + + // Check load priority float priority = resource->getLoadPriority(); if (priority >= highestPriority) { highestPriority = priority; @@ -96,9 +111,11 @@ QSharedPointer ResourceCacheSharedItems::getHighestPendingRequest() { } i++; } + if (highestIndex >= 0) { _pendingRequests.takeAt(highestIndex); } + return highestResource; }