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);