From 32e9c49cf0ab2ce1d9d1fbed63cfc8978608d75e Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Thu, 14 Apr 2016 13:50:36 -0700 Subject: [PATCH 1/2] Fix cache tallies for uncached resources --- libraries/networking/src/ResourceCache.cpp | 32 +++++++++++++--------- libraries/networking/src/ResourceCache.h | 1 + 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/libraries/networking/src/ResourceCache.cpp b/libraries/networking/src/ResourceCache.cpp index c5b7db8ed1..e83272eecb 100644 --- a/libraries/networking/src/ResourceCache.cpp +++ b/libraries/networking/src/ResourceCache.cpp @@ -53,7 +53,7 @@ void ResourceCache::refresh(const QUrl& url) { if (!resource.isNull()) { resource->refresh(); } else { - _resources.remove(url); + removeResource(url); resetResourceCounters(); } } @@ -140,11 +140,8 @@ void ResourceCache::addUnusedResource(const QSharedPointer& resource) // If it doesn't fit or its size is unknown, remove it from the cache. if (resource->getBytes() == 0 || resource->getBytes() > _unusedResourcesMaxSize) { resource->setCache(nullptr); - - _totalResourcesSize -= resource->getBytes(); - _resources.remove(resource->getURL()); + removeResource(resource->getURL(), resource->getBytes()); resetResourceCounters(); - return; } reserveUnusedResource(resource->getBytes()); @@ -173,8 +170,7 @@ void ResourceCache::reserveUnusedResource(qint64 resourceSize) { it.value()->setCache(nullptr); auto size = it.value()->getBytes(); - _totalResourcesSize -= size; - _resources.remove(it.value()->getURL()); + removeResource(it.value()->getURL(), size); _unusedResourcesSize -= size; _unusedResources.erase(it); @@ -198,6 +194,11 @@ void ResourceCache::resetResourceCounters() { emit dirty(); } +void ResourceCache::removeResource(const QUrl& url, qint64 size) { + _resources.remove(url); + _totalResourcesSize -= size; +} + void ResourceCache::updateTotalSize(const qint64& oldSize, const qint64& newSize) { _totalResourcesSize += (newSize - oldSize); emit dirty(); @@ -370,12 +371,12 @@ void Resource::refresh() { } void Resource::allReferencesCleared() { - if (_cache && isCacheable()) { - if (QThread::currentThread() != thread()) { - QMetaObject::invokeMethod(this, "allReferencesCleared"); - return; - } + if (QThread::currentThread() != thread()) { + QMetaObject::invokeMethod(this, "allReferencesCleared"); + return; + } + if (_cache && isCacheable()) { // create and reinsert new shared pointer QSharedPointer self(this, &Resource::allReferencesCleared); setSelf(self); @@ -383,8 +384,13 @@ void Resource::allReferencesCleared() { // add to the unused list _cache->addUnusedResource(self); - } else { + if (_cache) { + // remove from the cache + _cache->removeResource(getURL(), getBytes()); + _cache->resetResourceCounters(); + } + deleteLater(); } } diff --git a/libraries/networking/src/ResourceCache.h b/libraries/networking/src/ResourceCache.h index 84eba1cdc0..c1f99ff1c7 100644 --- a/libraries/networking/src/ResourceCache.h +++ b/libraries/networking/src/ResourceCache.h @@ -153,6 +153,7 @@ private: void reserveUnusedResource(qint64 resourceSize); void clearUnusedResource(); void resetResourceCounters(); + void removeResource(const QUrl& url, qint64 size = 0); QHash> _resources; int _lastLRUKey = 0; From cff5886313156c97bc3a297283194fbc10cee811 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Fri, 15 Apr 2016 10:46:19 -0700 Subject: [PATCH 2/2] Use correct resources lock --- libraries/networking/src/ResourceCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/ResourceCache.cpp b/libraries/networking/src/ResourceCache.cpp index 7449f61821..96e05c8d09 100644 --- a/libraries/networking/src/ResourceCache.cpp +++ b/libraries/networking/src/ResourceCache.cpp @@ -255,7 +255,7 @@ void ResourceCache::resetResourceCounters() { } void ResourceCache::removeResource(const QUrl& url, qint64 size) { - QWriteLocker locker(&_unusedResourcesLock); + QWriteLocker locker(&_resourcesLock); _resources.remove(url); _totalResourcesSize -= size; }