mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 19:10:49 +02:00
Clear unused resources before refresh
This commit is contained in:
parent
bfeb095fb4
commit
90edf055f7
2 changed files with 30 additions and 26 deletions
|
@ -34,20 +34,17 @@ ResourceCache::ResourceCache(QObject* parent) :
|
||||||
}
|
}
|
||||||
|
|
||||||
ResourceCache::~ResourceCache() {
|
ResourceCache::~ResourceCache() {
|
||||||
// the unused resources may themselves reference resources that will be added to the unused
|
clearUnusedResource();
|
||||||
// list on destruction, so keep clearing until there are no references left
|
|
||||||
while (!_unusedResources.isEmpty()) {
|
|
||||||
foreach (const QSharedPointer<Resource>& resource, _unusedResources) {
|
|
||||||
resource->setCache(nullptr);
|
|
||||||
}
|
|
||||||
_unusedResources.clear();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResourceCache::refreshAll() {
|
void ResourceCache::refreshAll() {
|
||||||
for (auto it = _resources.begin(); it != _resources.end(); ++it) {
|
// Clear all unused resources so we don't have to reload them
|
||||||
if (!it.value().isNull()) {
|
clearUnusedResource();
|
||||||
it.value().data()->refresh();
|
|
||||||
|
// Refresh all remaining resources in use
|
||||||
|
foreach (auto resource, _resources) {
|
||||||
|
if (!resource.isNull()) {
|
||||||
|
resource.data()->refresh();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -144,6 +141,17 @@ void ResourceCache::reserveUnusedResource(qint64 resourceSize) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ResourceCache::clearUnusedResource() {
|
||||||
|
// the unused resources may themselves reference resources that will be added to the unused
|
||||||
|
// list on destruction, so keep clearing until there are no references left
|
||||||
|
while (!_unusedResources.isEmpty()) {
|
||||||
|
foreach (const QSharedPointer<Resource>& resource, _unusedResources) {
|
||||||
|
resource->setCache(nullptr);
|
||||||
|
}
|
||||||
|
_unusedResources.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ResourceCache::attemptRequest(Resource* resource) {
|
void ResourceCache::attemptRequest(Resource* resource) {
|
||||||
auto sharedItems = DependencyManager::get<ResourceCacheSharedItems>();
|
auto sharedItems = DependencyManager::get<ResourceCacheSharedItems>();
|
||||||
if (_requestLimit <= 0) {
|
if (_requestLimit <= 0) {
|
||||||
|
@ -271,11 +279,12 @@ void Resource::refresh() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Resource::allReferencesCleared() {
|
void Resource::allReferencesCleared() {
|
||||||
if (QThread::currentThread() != thread()) {
|
|
||||||
QMetaObject::invokeMethod(this, "allReferencesCleared");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (_cache) {
|
if (_cache) {
|
||||||
|
if (QThread::currentThread() != thread()) {
|
||||||
|
QMetaObject::invokeMethod(this, "allReferencesCleared");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// create and reinsert new shared pointer
|
// create and reinsert new shared pointer
|
||||||
QSharedPointer<Resource> self(this, &Resource::allReferencesCleared);
|
QSharedPointer<Resource> self(this, &Resource::allReferencesCleared);
|
||||||
setSelf(self);
|
setSelf(self);
|
||||||
|
|
|
@ -51,7 +51,7 @@ static const qint64 MAX_UNUSED_MAX_SIZE = 10 * BYTES_PER_GIGABYTES;
|
||||||
class ResourceCacheSharedItems : public Dependency {
|
class ResourceCacheSharedItems : public Dependency {
|
||||||
SINGLETON_DEPENDENCY
|
SINGLETON_DEPENDENCY
|
||||||
public:
|
public:
|
||||||
QList<QPointer<Resource> > _pendingRequests;
|
QList<QPointer<Resource>> _pendingRequests;
|
||||||
QList<Resource*> _loadingRequests;
|
QList<Resource*> _loadingRequests;
|
||||||
private:
|
private:
|
||||||
ResourceCacheSharedItems() { }
|
ResourceCacheSharedItems() { }
|
||||||
|
@ -86,10 +86,6 @@ public slots:
|
||||||
void checkAsynchronousGets();
|
void checkAsynchronousGets();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
qint64 _unusedResourcesMaxSize = DEFAULT_UNUSED_MAX_SIZE;
|
|
||||||
qint64 _unusedResourcesSize = 0;
|
|
||||||
QMap<int, QSharedPointer<Resource> > _unusedResources;
|
|
||||||
|
|
||||||
/// Loads a resource from the specified URL.
|
/// Loads a resource from the specified URL.
|
||||||
/// \param fallback a fallback URL to load if the desired one is unavailable
|
/// \param fallback a fallback URL to load if the desired one is unavailable
|
||||||
/// \param delayLoad if true, don't load the resource immediately; wait until load is first requested
|
/// \param delayLoad if true, don't load the resource immediately; wait until load is first requested
|
||||||
|
@ -104,6 +100,7 @@ protected:
|
||||||
void addUnusedResource(const QSharedPointer<Resource>& resource);
|
void addUnusedResource(const QSharedPointer<Resource>& resource);
|
||||||
void removeUnusedResource(const QSharedPointer<Resource>& resource);
|
void removeUnusedResource(const QSharedPointer<Resource>& resource);
|
||||||
void reserveUnusedResource(qint64 resourceSize);
|
void reserveUnusedResource(qint64 resourceSize);
|
||||||
|
void clearUnusedResource();
|
||||||
|
|
||||||
static void attemptRequest(Resource* resource);
|
static void attemptRequest(Resource* resource);
|
||||||
static void requestCompleted(Resource* resource);
|
static void requestCompleted(Resource* resource);
|
||||||
|
@ -119,7 +116,10 @@ private:
|
||||||
void getResourceAsynchronously(const QUrl& url);
|
void getResourceAsynchronously(const QUrl& url);
|
||||||
QReadWriteLock _resourcesToBeGottenLock;
|
QReadWriteLock _resourcesToBeGottenLock;
|
||||||
QQueue<QUrl> _resourcesToBeGotten;
|
QQueue<QUrl> _resourcesToBeGotten;
|
||||||
|
|
||||||
|
qint64 _unusedResourcesMaxSize = DEFAULT_UNUSED_MAX_SIZE;
|
||||||
|
qint64 _unusedResourcesSize = 0;
|
||||||
|
QMap<int, QSharedPointer<Resource>> _unusedResources;
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Base class for resources.
|
/// Base class for resources.
|
||||||
|
@ -173,12 +173,10 @@ public:
|
||||||
const QUrl& getURL() const { return _url; }
|
const QUrl& getURL() const { return _url; }
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|
||||||
/// Fired when the resource has been loaded.
|
/// Fired when the resource has been loaded.
|
||||||
void loaded();
|
void loaded();
|
||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
|
|
||||||
void attemptRequest();
|
void attemptRequest();
|
||||||
|
|
||||||
/// Refreshes the resource if the last modified date on the network
|
/// Refreshes the resource if the last modified date on the network
|
||||||
|
@ -186,7 +184,6 @@ protected slots:
|
||||||
void maybeRefresh();
|
void maybeRefresh();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
virtual void init();
|
virtual void init();
|
||||||
|
|
||||||
/// Called when the download has finished. The recipient should delete the reply when done with it.
|
/// Called when the download has finished. The recipient should delete the reply when done with it.
|
||||||
|
@ -208,14 +205,12 @@ protected:
|
||||||
QPointer<ResourceCache> _cache;
|
QPointer<ResourceCache> _cache;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
void handleDownloadProgress(qint64 bytesReceived, qint64 bytesTotal);
|
void handleDownloadProgress(qint64 bytesReceived, qint64 bytesTotal);
|
||||||
void handleReplyError();
|
void handleReplyError();
|
||||||
void handleReplyFinished();
|
void handleReplyFinished();
|
||||||
void handleReplyTimeout();
|
void handleReplyTimeout();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void setLRUKey(int lruKey) { _lruKey = lruKey; }
|
void setLRUKey(int lruKey) { _lruKey = lruKey; }
|
||||||
|
|
||||||
void makeRequest();
|
void makeRequest();
|
||||||
|
|
Loading…
Reference in a new issue