Add byte limit to chaches

This commit is contained in:
Atlante45 2015-01-08 17:06:05 -08:00
parent 8dbaeeb646
commit 77e4a2ef35
2 changed files with 26 additions and 3 deletions

View file

@ -67,13 +67,26 @@ QSharedPointer<Resource> ResourceCache::getResource(const QUrl& url, const QUrl&
_resources.insert(url, resource); _resources.insert(url, resource);
} else { } else {
_unusedResources.remove(resource->getLRUKey()); removeUnusedResource(resource);
} }
return resource; return resource;
} }
void ResourceCache::addUnusedResource(const QSharedPointer<Resource>& resource) { void ResourceCache::addUnusedResource(const QSharedPointer<Resource>& resource) {
const int RETAINED_RESOURCE_COUNT = 50; 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<int, QSharedPointer<Resource> >::iterator it = _unusedResources.begin();
_unusedResourcesTotalBytes -= it.value()->getBytesTotal();
it.value()->setCache(NULL);
_unusedResources.erase(it);
}
if (_unusedResources.size() > RETAINED_RESOURCE_COUNT) { if (_unusedResources.size() > RETAINED_RESOURCE_COUNT) {
// unload the oldest resource // unload the oldest resource
QMap<int, QSharedPointer<Resource> >::iterator it = _unusedResources.begin(); QMap<int, QSharedPointer<Resource> >::iterator it = _unusedResources.begin();
@ -82,6 +95,14 @@ void ResourceCache::addUnusedResource(const QSharedPointer<Resource>& resource)
} }
resource->setLRUKey(++_lastLRUKey); resource->setLRUKey(++_lastLRUKey);
_unusedResources.insert(resource->getLRUKey(), resource); _unusedResources.insert(resource->getLRUKey(), resource);
_unusedResourcesTotalBytes += resource->getBytesTotal();
}
void ResourceCache::removeUnusedResource(const QSharedPointer<Resource>& resource) {
if (_unusedResources.contains(resource->getLRUKey())) {
_unusedResources.remove(resource->getLRUKey());
_unusedResourcesTotalBytes -= resource->getBytesTotal();
}
} }
void ResourceCache::attemptRequest(Resource* resource) { void ResourceCache::attemptRequest(Resource* resource) {

View file

@ -45,7 +45,8 @@ public:
void refresh(const QUrl& url); void refresh(const QUrl& url);
protected: protected:
qint64 _unusedResourcesTotalBytes = 0;
QMap<int, QSharedPointer<Resource> > _unusedResources; QMap<int, QSharedPointer<Resource> > _unusedResources;
/// Loads a resource from the specified URL. /// Loads a resource from the specified URL.
@ -58,8 +59,9 @@ protected:
/// Creates a new resource. /// Creates a new resource.
virtual QSharedPointer<Resource> createResource(const QUrl& url, virtual QSharedPointer<Resource> createResource(const QUrl& url,
const QSharedPointer<Resource>& fallback, bool delayLoad, const void* extra) = 0; const QSharedPointer<Resource>& fallback, bool delayLoad, const void* extra) = 0;
void addUnusedResource(const QSharedPointer<Resource>& resource); void addUnusedResource(const QSharedPointer<Resource>& resource);
void removeUnusedResource(const QSharedPointer<Resource>& resource);
static void attemptRequest(Resource* resource); static void attemptRequest(Resource* resource);
static void requestCompleted(Resource* resource); static void requestCompleted(Resource* resource);