From 854c0ea3e3ab36b0b527f900f5a1dc029a083835 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz <zach@highfidelity.io> Date: Wed, 27 Apr 2016 18:37:30 -0700 Subject: [PATCH] Clean out updateMemoryCost --- libraries/networking/src/ResourceCache.cpp | 11 +++++++---- libraries/networking/src/ResourceCache.h | 11 ++++++----- libraries/script-engine/src/ScriptEngine.cpp | 12 +++++++++++- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/libraries/networking/src/ResourceCache.cpp b/libraries/networking/src/ResourceCache.cpp index 32b1c03766..4cc8b1d4f0 100644 --- a/libraries/networking/src/ResourceCache.cpp +++ b/libraries/networking/src/ResourceCache.cpp @@ -128,10 +128,13 @@ void ScriptableResource::release() { _resource.reset(); } -void ScriptableResource::updateMemoryCost(const QObject* engine) { - if (_resource && !_resource->isInScript()) { - _resource->setInScript(true); - connect(_resource.data(), SIGNAL(updateSize(qint64)), engine, SLOT(updateMemoryCost(qint64))); +bool ScriptableResource::isInScript() const { + return _resource && _resource->isInScript(); +} + +void ScriptableResource::setInScript(bool isInScript) { + if (_resource) { + _resource->setInScript(isInScript); } } diff --git a/libraries/networking/src/ResourceCache.h b/libraries/networking/src/ResourceCache.h index 98473a58c3..b81c69c079 100644 --- a/libraries/networking/src/ResourceCache.h +++ b/libraries/networking/src/ResourceCache.h @@ -104,9 +104,10 @@ public: const QUrl& getUrl() const { return _url; } int getState() const { return (int)_state; } + const QSharedPointer<Resource>& getResource() const { return _resource; } - // Connects to a SLOT(updateMemoryCost(qint64)) on the given engine - void updateMemoryCost(const QObject* engine); + bool isInScript() const; + void setInScript(bool isInScript); signals: void progressChanged(uint64_t bytesReceived, uint64_t bytesTotal); @@ -357,6 +358,9 @@ private slots: void handleReplyFinished(); private: + friend class ResourceCache; + friend class ScriptableResource; + void setLRUKey(int lruKey) { _lruKey = lruKey; } void makeRequest(); @@ -366,9 +370,6 @@ private: bool isInScript() const { return _isInScript; } void setInScript(bool isInScript) { _isInScript = isInScript; } - friend class ResourceCache; - friend class ScriptableResource; - ResourceRequest* _request{ nullptr }; int _lruKey{ 0 }; QTimer* _replyTimer{ nullptr }; diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 1cbd2a6127..fc8b581ffe 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -274,7 +274,17 @@ static void resultHandlerFromScriptValue(const QScriptValue& value, AnimVariantR using ScriptableResourceRawPtr = ScriptableResource*; static QScriptValue scriptableResourceToScriptValue(QScriptEngine* engine, const ScriptableResourceRawPtr& resource) { - resource->updateMemoryCost(engine); + // The first script to encounter this resource will track its memory. + // In this way, it will be more likely to GC. + // This fails in the case that the resource is used across many scripts, but + // in that case it would be too difficult to tell which one should track the memory, and + // this serves the common case (use in a single script). + auto data = resource->getResource(); + if (data && !resource->isInScript()) { + resource->setInScript(true); + QObject::connect(data.data(), SIGNAL(updateSize(qint64)), engine, SLOT(updateMemoryCost(qint64))); + } + auto object = engine->newQObject( const_cast<ScriptableResourceRawPtr>(resource), QScriptEngine::ScriptOwnership);