mirror of
https://github.com/overte-org/overte.git
synced 2025-08-06 20:58:38 +02:00
Make resource cache props thread-safe
This commit is contained in:
parent
3c86191a59
commit
f34e951c3f
2 changed files with 43 additions and 20 deletions
|
@ -38,6 +38,7 @@ ResourceCache::~ResourceCache() {
|
||||||
void ResourceCache::refreshAll() {
|
void ResourceCache::refreshAll() {
|
||||||
// Clear all unused resources so we don't have to reload them
|
// Clear all unused resources so we don't have to reload them
|
||||||
clearUnusedResource();
|
clearUnusedResource();
|
||||||
|
resetResourceCounters();
|
||||||
|
|
||||||
// Refresh all remaining resources in use
|
// Refresh all remaining resources in use
|
||||||
foreach (auto resource, _resources) {
|
foreach (auto resource, _resources) {
|
||||||
|
@ -53,16 +54,24 @@ void ResourceCache::refresh(const QUrl& url) {
|
||||||
resource->refresh();
|
resource->refresh();
|
||||||
} else {
|
} else {
|
||||||
_resources.remove(url);
|
_resources.remove(url);
|
||||||
|
resetResourceCounters();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const QVariantList ResourceCache::getResourceList() const {
|
QVariantList ResourceCache::getResourceList() {
|
||||||
QVariantList list;
|
QVariantList list;
|
||||||
auto resources = _resources.uniqueKeys();
|
if (QThread::currentThread() != thread()) {
|
||||||
list.reserve(resources.size());
|
// NOTE: invokeMethod does not allow a const QObject*
|
||||||
for (auto& resource : resources) {
|
QMetaObject::invokeMethod(this, "getResourceList", Qt::BlockingQueuedConnection,
|
||||||
list << resource;
|
Q_RETURN_ARG(QVariantList, list));
|
||||||
|
} else {
|
||||||
|
auto resources = _resources.uniqueKeys();
|
||||||
|
list.reserve(resources.size());
|
||||||
|
for (auto& resource : resources) {
|
||||||
|
list << resource;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -124,7 +133,7 @@ QSharedPointer<Resource> ResourceCache::getResource(const QUrl& url, const QUrl&
|
||||||
void ResourceCache::setUnusedResourceCacheSize(qint64 unusedResourcesMaxSize) {
|
void ResourceCache::setUnusedResourceCacheSize(qint64 unusedResourcesMaxSize) {
|
||||||
_unusedResourcesMaxSize = clamp(unusedResourcesMaxSize, MIN_UNUSED_MAX_SIZE, MAX_UNUSED_MAX_SIZE);
|
_unusedResourcesMaxSize = clamp(unusedResourcesMaxSize, MIN_UNUSED_MAX_SIZE, MAX_UNUSED_MAX_SIZE);
|
||||||
reserveUnusedResource(0);
|
reserveUnusedResource(0);
|
||||||
emit dirty();
|
resetResourceCounters();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResourceCache::addUnusedResource(const QSharedPointer<Resource>& resource) {
|
void ResourceCache::addUnusedResource(const QSharedPointer<Resource>& resource) {
|
||||||
|
@ -138,7 +147,8 @@ void ResourceCache::addUnusedResource(const QSharedPointer<Resource>& resource)
|
||||||
resource->setLRUKey(++_lastLRUKey);
|
resource->setLRUKey(++_lastLRUKey);
|
||||||
_unusedResources.insert(resource->getLRUKey(), resource);
|
_unusedResources.insert(resource->getLRUKey(), resource);
|
||||||
_unusedResourcesSize += resource->getBytes();
|
_unusedResourcesSize += resource->getBytes();
|
||||||
emit dirty();
|
|
||||||
|
resetResourceCounters();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResourceCache::removeUnusedResource(const QSharedPointer<Resource>& resource) {
|
void ResourceCache::removeUnusedResource(const QSharedPointer<Resource>& resource) {
|
||||||
|
@ -146,7 +156,7 @@ void ResourceCache::removeUnusedResource(const QSharedPointer<Resource>& resourc
|
||||||
_unusedResources.remove(resource->getLRUKey());
|
_unusedResources.remove(resource->getLRUKey());
|
||||||
_unusedResourcesSize -= resource->getBytes();
|
_unusedResourcesSize -= resource->getBytes();
|
||||||
}
|
}
|
||||||
emit dirty();
|
resetResourceCounters();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResourceCache::reserveUnusedResource(qint64 resourceSize) {
|
void ResourceCache::reserveUnusedResource(qint64 resourceSize) {
|
||||||
|
@ -177,6 +187,12 @@ void ResourceCache::clearUnusedResource() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ResourceCache::resetResourceCounters() {
|
||||||
|
_numTotalResources = _resources.size();
|
||||||
|
_numUnusedResources = _unusedResources.size();
|
||||||
|
emit dirty();
|
||||||
|
}
|
||||||
|
|
||||||
void ResourceCache::updateTotalSize(const qint64& oldSize, const qint64& newSize) {
|
void ResourceCache::updateTotalSize(const qint64& oldSize, const qint64& newSize) {
|
||||||
_totalResourcesSize += (newSize - oldSize);
|
_totalResourcesSize += (newSize - oldSize);
|
||||||
emit dirty();
|
emit dirty();
|
||||||
|
|
|
@ -12,7 +12,9 @@
|
||||||
#ifndef hifi_ResourceCache_h
|
#ifndef hifi_ResourceCache_h
|
||||||
#define hifi_ResourceCache_h
|
#define hifi_ResourceCache_h
|
||||||
|
|
||||||
|
#include <atomic>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
|
||||||
#include <QtCore/QHash>
|
#include <QtCore/QHash>
|
||||||
#include <QtCore/QList>
|
#include <QtCore/QList>
|
||||||
#include <QtCore/QObject>
|
#include <QtCore/QObject>
|
||||||
|
@ -29,6 +31,8 @@
|
||||||
|
|
||||||
#include "ResourceManager.h"
|
#include "ResourceManager.h"
|
||||||
|
|
||||||
|
Q_DECLARE_METATYPE(size_t)
|
||||||
|
|
||||||
class QNetworkReply;
|
class QNetworkReply;
|
||||||
class QTimer;
|
class QTimer;
|
||||||
|
|
||||||
|
@ -79,20 +83,19 @@ private:
|
||||||
/// Base class for resource caches.
|
/// Base class for resource caches.
|
||||||
class ResourceCache : public QObject {
|
class ResourceCache : public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_PROPERTY(int numTotal READ getNumTotalResources NOTIFY dirty)
|
Q_PROPERTY(size_t numTotal READ getNumTotalResources NOTIFY dirty)
|
||||||
Q_PROPERTY(int numCached READ getNumCachedResources NOTIFY dirty)
|
Q_PROPERTY(size_t numCached READ getNumCachedResources NOTIFY dirty)
|
||||||
Q_PROPERTY(qint64 sizeTotal READ getSizeTotalResources NOTIFY dirty)
|
Q_PROPERTY(size_t sizeTotal READ getSizeTotalResources NOTIFY dirty)
|
||||||
Q_PROPERTY(qint64 sizeCached READ getSizeCachedResources NOTIFY dirty)
|
Q_PROPERTY(size_t sizeCached READ getSizeCachedResources NOTIFY dirty)
|
||||||
Q_PROPERTY(QVariantList resources READ getResourceList NOTIFY dirty)
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
int getNumTotalResources() const { return _resources.size(); }
|
size_t getNumTotalResources() const { return _numTotalResources; }
|
||||||
qint64 getSizeTotalResources() const { return _totalResourcesSize; }
|
size_t getSizeTotalResources() const { return _totalResourcesSize; }
|
||||||
|
|
||||||
int getNumCachedResources() const { return _unusedResources.size(); }
|
size_t getNumCachedResources() const { return _numUnusedResources; }
|
||||||
qint64 getSizeCachedResources() const { return _unusedResourcesSize; }
|
size_t getSizeCachedResources() const { return _unusedResourcesSize; }
|
||||||
|
|
||||||
const QVariantList getResourceList() const;
|
Q_INVOKABLE QVariantList getResourceList();
|
||||||
|
|
||||||
static void setRequestLimit(int limit);
|
static void setRequestLimit(int limit);
|
||||||
static int getRequestLimit() { return _requestLimit; }
|
static int getRequestLimit() { return _requestLimit; }
|
||||||
|
@ -149,6 +152,7 @@ private:
|
||||||
|
|
||||||
void reserveUnusedResource(qint64 resourceSize);
|
void reserveUnusedResource(qint64 resourceSize);
|
||||||
void clearUnusedResource();
|
void clearUnusedResource();
|
||||||
|
void resetResourceCounters();
|
||||||
|
|
||||||
QHash<QUrl, QWeakPointer<Resource>> _resources;
|
QHash<QUrl, QWeakPointer<Resource>> _resources;
|
||||||
int _lastLRUKey = 0;
|
int _lastLRUKey = 0;
|
||||||
|
@ -160,8 +164,11 @@ private:
|
||||||
QReadWriteLock _resourcesToBeGottenLock;
|
QReadWriteLock _resourcesToBeGottenLock;
|
||||||
QQueue<QUrl> _resourcesToBeGotten;
|
QQueue<QUrl> _resourcesToBeGotten;
|
||||||
|
|
||||||
qint64 _totalResourcesSize { 0 };
|
std::atomic<size_t> _numTotalResources { 0 };
|
||||||
qint64 _unusedResourcesSize { 0 };
|
std::atomic<size_t> _numUnusedResources { 0 };
|
||||||
|
|
||||||
|
std::atomic<qint64> _totalResourcesSize { 0 };
|
||||||
|
std::atomic<qint64> _unusedResourcesSize { 0 };
|
||||||
|
|
||||||
qint64 _unusedResourcesMaxSize = DEFAULT_UNUSED_MAX_SIZE;
|
qint64 _unusedResourcesMaxSize = DEFAULT_UNUSED_MAX_SIZE;
|
||||||
QMap<int, QSharedPointer<Resource>> _unusedResources;
|
QMap<int, QSharedPointer<Resource>> _unusedResources;
|
||||||
|
|
Loading…
Reference in a new issue