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 result;
foreach(QSharedPointer<Resource> resource, ResourceCache::getLoadingRequests()) {
result.downloading.append(resource ? (resource->getProgress() * 100.0f) : 0.0f);
foreach(auto resource, ResourceCache::getLoadingRequests()) {
result.downloading.append(resource->getProgress() * 100.0f);
}
result.pending = ResourceCache::getPendingRequestCount();
return result;

View file

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

View file

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

View file

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