From 77e4a2ef354c565b6a434bf1fa401a0dc6c896a0 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 8 Jan 2015 17:06:05 -0800 Subject: [PATCH] Add byte limit to chaches --- libraries/networking/src/ResourceCache.cpp | 23 +++++++++++++++++++++- libraries/networking/src/ResourceCache.h | 6 ++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/libraries/networking/src/ResourceCache.cpp b/libraries/networking/src/ResourceCache.cpp index 5bb327fe63..6db2cba385 100644 --- a/libraries/networking/src/ResourceCache.cpp +++ b/libraries/networking/src/ResourceCache.cpp @@ -67,13 +67,26 @@ QSharedPointer ResourceCache::getResource(const QUrl& url, const QUrl& _resources.insert(url, resource); } else { - _unusedResources.remove(resource->getLRUKey()); + removeUnusedResource(resource); } return resource; } void ResourceCache::addUnusedResource(const QSharedPointer& resource) { const int RETAINED_RESOURCE_COUNT = 50; + const int RETAINED_RESOURCE_SIZE = 100 * 1024 * 1024; + + while (_unusedResourcesTotalBytes + resource->getBytesTotal() > RETAINED_RESOURCE_SIZE && + !_unusedResources.empty()) { + // unload the oldest resource + QMap >::iterator it = _unusedResources.begin(); + + _unusedResourcesTotalBytes -= it.value()->getBytesTotal(); + it.value()->setCache(NULL); + _unusedResources.erase(it); + } + + if (_unusedResources.size() > RETAINED_RESOURCE_COUNT) { // unload the oldest resource QMap >::iterator it = _unusedResources.begin(); @@ -82,6 +95,14 @@ void ResourceCache::addUnusedResource(const QSharedPointer& resource) } resource->setLRUKey(++_lastLRUKey); _unusedResources.insert(resource->getLRUKey(), resource); + _unusedResourcesTotalBytes += resource->getBytesTotal(); +} + +void ResourceCache::removeUnusedResource(const QSharedPointer& resource) { + if (_unusedResources.contains(resource->getLRUKey())) { + _unusedResources.remove(resource->getLRUKey()); + _unusedResourcesTotalBytes -= resource->getBytesTotal(); + } } void ResourceCache::attemptRequest(Resource* resource) { diff --git a/libraries/networking/src/ResourceCache.h b/libraries/networking/src/ResourceCache.h index e1b6327652..0a4121ca5e 100644 --- a/libraries/networking/src/ResourceCache.h +++ b/libraries/networking/src/ResourceCache.h @@ -45,7 +45,8 @@ public: void refresh(const QUrl& url); protected: - + + qint64 _unusedResourcesTotalBytes = 0; QMap > _unusedResources; /// Loads a resource from the specified URL. @@ -58,8 +59,9 @@ protected: /// Creates a new resource. virtual QSharedPointer createResource(const QUrl& url, const QSharedPointer& fallback, bool delayLoad, const void* extra) = 0; - + void addUnusedResource(const QSharedPointer& resource); + void removeUnusedResource(const QSharedPointer& resource); static void attemptRequest(Resource* resource); static void requestCompleted(Resource* resource);