Make sure ResourceCacheSharedItems deals with strong refs

This commit is contained in:
Atlante45 2016-04-10 23:48:49 -07:00
parent 5eb4f63573
commit e45939d18f
4 changed files with 42 additions and 27 deletions

View file

@ -122,8 +122,8 @@ void DownloadInfoResultFromScriptValue(const QScriptValue& object, DownloadInfoR
DownloadInfoResult GlobalServicesScriptingInterface::getDownloadInfo() { DownloadInfoResult GlobalServicesScriptingInterface::getDownloadInfo() {
DownloadInfoResult result; DownloadInfoResult result;
foreach(QSharedPointer<Resource> resource, ResourceCache::getLoadingRequests()) { foreach(auto resource, ResourceCache::getLoadingRequests()) {
result.downloading.append(resource ? (resource->getProgress() * 100.0f) : 0.0f); result.downloading.append(resource->getProgress() * 100.0f);
} }
result.pending = ResourceCache::getPendingRequestCount(); result.pending = ResourceCache::getPendingRequestCount();
return result; return result;

View file

@ -196,7 +196,7 @@ void Stats::updateStats(bool force) {
STAT_UPDATE(audioMixerPps, -1); STAT_UPDATE(audioMixerPps, -1);
} }
QList<QWeakPointer<Resource>> loadingRequests = ResourceCache::getLoadingRequests(); auto loadingRequests = ResourceCache::getLoadingRequests();
STAT_UPDATE(downloads, loadingRequests.size()); STAT_UPDATE(downloads, loadingRequests.size());
STAT_UPDATE(downloadLimit, ResourceCache::getRequestLimit()) STAT_UPDATE(downloadLimit, ResourceCache::getRequestLimit())
STAT_UPDATE(downloadsPending, ResourceCache::getPendingRequestCount()); STAT_UPDATE(downloadsPending, ResourceCache::getPendingRequestCount());
@ -205,8 +205,7 @@ void Stats::updateStats(bool force) {
bool shouldUpdateUrls = _downloads != _downloadUrls.size(); bool shouldUpdateUrls = _downloads != _downloadUrls.size();
if (!shouldUpdateUrls) { if (!shouldUpdateUrls) {
for (int i = 0; i < _downloads; i++) { for (int i = 0; i < _downloads; i++) {
auto request = loadingRequests[i].lock(); if (loadingRequests[i]->getURL().toString() != _downloadUrls[i]) {
if (!request || request->getURL().toString() != _downloadUrls[i]) {
shouldUpdateUrls = true; shouldUpdateUrls = true;
break; break;
} }
@ -215,10 +214,8 @@ void Stats::updateStats(bool force) {
// If the urls have changed, update the list // If the urls have changed, update the list
if (shouldUpdateUrls) { if (shouldUpdateUrls) {
_downloadUrls.clear(); _downloadUrls.clear();
foreach (QSharedPointer<Resource> request, loadingRequests) { foreach (auto resource, loadingRequests) {
if (request) { _downloadUrls << resource->getURL().toString();
_downloadUrls << request->getURL().toString();
}
} }
emit downloadUrlsChanged(); emit downloadUrlsChanged();
} }

View file

@ -41,9 +41,9 @@ void ResourceCache::refreshAll() {
resetResourceCounters(); resetResourceCounters();
// Refresh all remaining resources in use // Refresh all remaining resources in use
foreach (auto resource, _resources) { foreach (QSharedPointer<Resource> resource, _resources) {
if (!resource.isNull()) { if (resource) {
resource.data()->refresh(); resource->refresh();
} }
} }
} }
@ -110,7 +110,7 @@ QSharedPointer<Resource> ResourceCache::getResource(const QUrl& url, const QUrl&
} }
if (QThread::currentThread() != thread()) { if (QThread::currentThread() != thread()) {
assert(delayLoad && !extra); assert(delayLoad);
getResourceAsynchronously(url); getResourceAsynchronously(url);
return QSharedPointer<Resource>(); return QSharedPointer<Resource>();
} }
@ -208,9 +208,19 @@ void ResourceCacheSharedItems::appendPendingRequest(QWeakPointer<Resource> resou
_pendingRequests.append(resource); _pendingRequests.append(resource);
} }
QList<QWeakPointer<Resource>> ResourceCacheSharedItems::getPendingRequests() const { QList<QSharedPointer<Resource>> ResourceCacheSharedItems::getPendingRequests() {
Lock lock(_mutex); QList<QSharedPointer<Resource>> result;
return _pendingRequests;
{
Lock lock(_mutex);
foreach(QSharedPointer<Resource> resource, _pendingRequests) {
if (resource) {
result.append(resource);
}
}
_pendingRequests.removeAll(QWeakPointer<Resource>());
}
return result;
} }
uint32_t ResourceCacheSharedItems::getPendingRequestsCount() const { uint32_t ResourceCacheSharedItems::getPendingRequestsCount() const {
@ -218,9 +228,19 @@ uint32_t ResourceCacheSharedItems::getPendingRequestsCount() const {
return _pendingRequests.size(); return _pendingRequests.size();
} }
QList<QWeakPointer<Resource>> ResourceCacheSharedItems::getLoadingRequests() const { QList<QSharedPointer<Resource>> ResourceCacheSharedItems::getLoadingRequests() {
Lock lock(_mutex); QList<QSharedPointer<Resource>> result;
return _loadingRequests;
{
Lock lock(_mutex);
foreach(QSharedPointer<Resource> resource, _loadingRequests) {
if (resource) {
result.append(resource);
}
}
_loadingRequests.removeAll(QWeakPointer<Resource>());
}
return result;
} }
void ResourceCacheSharedItems::removeRequest(QWeakPointer<Resource> resource) { void ResourceCacheSharedItems::removeRequest(QWeakPointer<Resource> resource) {
@ -254,7 +274,7 @@ QSharedPointer<Resource> ResourceCacheSharedItems::getHighestPendingRequest() {
return highestResource; return highestResource;
} }
const QList<QWeakPointer<Resource>> ResourceCache::getLoadingRequests() { QList<QSharedPointer<Resource>> ResourceCache::getLoadingRequests() {
return DependencyManager::get<ResourceCacheSharedItems>()->getLoadingRequests(); return DependencyManager::get<ResourceCacheSharedItems>()->getLoadingRequests();
} }

View file

@ -65,9 +65,9 @@ public:
void appendPendingRequest(QWeakPointer<Resource> newRequest); void appendPendingRequest(QWeakPointer<Resource> newRequest);
void appendActiveRequest(QWeakPointer<Resource> newRequest); void appendActiveRequest(QWeakPointer<Resource> newRequest);
void removeRequest(QWeakPointer<Resource> doneRequest); void removeRequest(QWeakPointer<Resource> doneRequest);
QList<QWeakPointer<Resource>> getPendingRequests() const; QList<QSharedPointer<Resource>> getPendingRequests();
uint32_t getPendingRequestsCount() const; uint32_t getPendingRequestsCount() const;
QList<QWeakPointer<Resource>> getLoadingRequests() const; QList<QSharedPointer<Resource>> getLoadingRequests();
QSharedPointer<Resource> getHighestPendingRequest(); QSharedPointer<Resource> getHighestPendingRequest();
private: private:
@ -88,8 +88,6 @@ class ResourceCache : public QObject {
Q_PROPERTY(size_t sizeCached READ getSizeCachedResources NOTIFY dirty) Q_PROPERTY(size_t sizeCached READ getSizeCachedResources NOTIFY dirty)
public: public:
virtual ~ResourceCache();
size_t getNumTotalResources() const { return _numTotalResources; } size_t getNumTotalResources() const { return _numTotalResources; }
size_t getSizeTotalResources() const { return _totalResourcesSize; } size_t getSizeTotalResources() const { return _totalResourcesSize; }
@ -106,10 +104,12 @@ public:
void setUnusedResourceCacheSize(qint64 unusedResourcesMaxSize); void setUnusedResourceCacheSize(qint64 unusedResourcesMaxSize);
qint64 getUnusedResourceCacheSize() const { return _unusedResourcesMaxSize; } qint64 getUnusedResourceCacheSize() const { return _unusedResourcesMaxSize; }
static const QList<QWeakPointer<Resource>> getLoadingRequests(); static QList<QSharedPointer<Resource>> getLoadingRequests();
static int getPendingRequestCount(); static int getPendingRequestCount();
ResourceCache(QObject* parent = nullptr);
virtual ~ResourceCache();
void refreshAll(); void refreshAll();
void refresh(const QUrl& url); void refresh(const QUrl& url);
@ -124,8 +124,6 @@ protected slots:
void updateTotalSize(const qint64& oldSize, const qint64& newSize); void updateTotalSize(const qint64& oldSize, const qint64& newSize);
protected: protected:
ResourceCache(QObject* parent = nullptr);
/// 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