From d2426f30c66618f94949ea349543a1b2f0af62ac Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Fri, 15 Apr 2016 15:56:55 -0700 Subject: [PATCH 1/2] Mv ResourceCacheShared to top of impl --- libraries/networking/src/ResourceCache.cpp | 150 ++++++++++----------- 1 file changed, 75 insertions(+), 75 deletions(-) diff --git a/libraries/networking/src/ResourceCache.cpp b/libraries/networking/src/ResourceCache.cpp index 96e05c8d09..fcf0e833e1 100644 --- a/libraries/networking/src/ResourceCache.cpp +++ b/libraries/networking/src/ResourceCache.cpp @@ -28,6 +28,80 @@ (((x) > (max)) ? (max) :\ (x))) +void ResourceCacheSharedItems::appendActiveRequest(QWeakPointer resource) { + Lock lock(_mutex); + _loadingRequests.append(resource); +} + +void ResourceCacheSharedItems::appendPendingRequest(QWeakPointer resource) { + Lock lock(_mutex); + _pendingRequests.append(resource); +} + +QList> ResourceCacheSharedItems::getPendingRequests() { + QList> result; + + { + Lock lock(_mutex); + foreach(QSharedPointer resource, _pendingRequests) { + if (resource) { + result.append(resource); + } + } + } + return result; +} + +uint32_t ResourceCacheSharedItems::getPendingRequestsCount() const { + Lock lock(_mutex); + return _pendingRequests.size(); +} + +QList> ResourceCacheSharedItems::getLoadingRequests() { + QList> result; + + { + Lock lock(_mutex); + foreach(QSharedPointer resource, _loadingRequests) { + if (resource) { + result.append(resource); + } + } + } + return result; +} + +void ResourceCacheSharedItems::removeRequest(QWeakPointer resource) { + Lock lock(_mutex); + _loadingRequests.removeAll(resource); +} + +QSharedPointer ResourceCacheSharedItems::getHighestPendingRequest() { + Lock lock(_mutex); + // look for the highest priority pending request + int highestIndex = -1; + float highestPriority = -FLT_MAX; + QSharedPointer highestResource; + for (int i = 0; i < _pendingRequests.size();) { + auto resource = _pendingRequests.at(i).lock(); + if (!resource) { + _pendingRequests.removeAt(i); + continue; + } + float priority = resource->getLoadPriority(); + if (priority >= highestPriority) { + highestPriority = priority; + highestIndex = i; + highestResource = resource; + } + i++; + } + if (highestIndex >= 0) { + _pendingRequests.takeAt(highestIndex); + } + return highestResource; +} + ResourceCache::ResourceCache(QObject* parent) : QObject(parent) { auto& domainHandler = DependencyManager::get()->getDomainHandler(); connect(&domainHandler, &DomainHandler::disconnectedFromDomain, @@ -264,81 +338,7 @@ void ResourceCache::updateTotalSize(const qint64& oldSize, const qint64& newSize _totalResourcesSize += (newSize - oldSize); emit dirty(); } - -void ResourceCacheSharedItems::appendActiveRequest(QWeakPointer resource) { - Lock lock(_mutex); - _loadingRequests.append(resource); -} - -void ResourceCacheSharedItems::appendPendingRequest(QWeakPointer resource) { - Lock lock(_mutex); - _pendingRequests.append(resource); -} - -QList> ResourceCacheSharedItems::getPendingRequests() { - QList> result; - - { - Lock lock(_mutex); - foreach(QSharedPointer resource, _pendingRequests) { - if (resource) { - result.append(resource); - } - } - } - return result; -} - -uint32_t ResourceCacheSharedItems::getPendingRequestsCount() const { - Lock lock(_mutex); - return _pendingRequests.size(); -} - -QList> ResourceCacheSharedItems::getLoadingRequests() { - QList> result; - - { - Lock lock(_mutex); - foreach(QSharedPointer resource, _loadingRequests) { - if (resource) { - result.append(resource); - } - } - } - return result; -} - -void ResourceCacheSharedItems::removeRequest(QWeakPointer resource) { - Lock lock(_mutex); - _loadingRequests.removeAll(resource); -} - -QSharedPointer ResourceCacheSharedItems::getHighestPendingRequest() { - Lock lock(_mutex); - // look for the highest priority pending request - int highestIndex = -1; - float highestPriority = -FLT_MAX; - QSharedPointer highestResource; - for (int i = 0; i < _pendingRequests.size();) { - auto resource = _pendingRequests.at(i).lock(); - if (!resource) { - _pendingRequests.removeAt(i); - continue; - } - float priority = resource->getLoadPriority(); - if (priority >= highestPriority) { - highestPriority = priority; - highestIndex = i; - highestResource = resource; - } - i++; - } - if (highestIndex >= 0) { - _pendingRequests.takeAt(highestIndex); - } - return highestResource; -} - + QList> ResourceCache::getLoadingRequests() { return DependencyManager::get()->getLoadingRequests(); } From 0d06d8ea936660b7e6464ffc5ede1ba0da4d0821 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Fri, 15 Apr 2016 16:22:56 -0700 Subject: [PATCH 2/2] 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; }