diff --git a/libraries/networking/src/ResourceCache.cpp b/libraries/networking/src/ResourceCache.cpp index 9611e2ec65..96e05c8d09 100644 --- a/libraries/networking/src/ResourceCache.cpp +++ b/libraries/networking/src/ResourceCache.cpp @@ -101,8 +101,7 @@ void ResourceCache::refresh(const QUrl& url) { if (resource) { resource->refresh(); } else { - QWriteLocker locker(&_resourcesLock); - _resources.remove(url); + removeResource(url); resetResourceCounters(); } } @@ -196,11 +195,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()); @@ -233,8 +229,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); @@ -259,6 +254,12 @@ void ResourceCache::resetResourceCounters() { emit dirty(); } +void ResourceCache::removeResource(const QUrl& url, qint64 size) { + QWriteLocker locker(&_resourcesLock); + _resources.remove(url); + _totalResourcesSize -= size; +} + void ResourceCache::updateTotalSize(const qint64& oldSize, const qint64& newSize) { _totalResourcesSize += (newSize - oldSize); emit dirty(); @@ -454,12 +455,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); @@ -467,8 +468,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 aea1e91099..ed3dbf69b6 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); QReadWriteLock _resourcesLock { QReadWriteLock::Recursive }; QHash> _resources;