From 55af5eaf06c64e1bb041de74f96a1fc9adfa4c93 Mon Sep 17 00:00:00 2001
From: Brad Davis <bdavis@saintandreas.org>
Date: Tue, 12 Jan 2016 12:40:02 -0800
Subject: [PATCH] Fix crash on shutdown due to lifetime of scripts

---
 libraries/script-engine/src/ScriptEngine.cpp  |  3 ---
 libraries/script-engine/src/ScriptEngines.cpp | 11 ++++++++++-
 libraries/script-engine/src/ScriptEngines.h   |  2 ++
 3 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp
index e997879391..a65fe7417d 100644
--- a/libraries/script-engine/src/ScriptEngine.cpp
+++ b/libraries/script-engine/src/ScriptEngine.cpp
@@ -171,9 +171,6 @@ void ScriptEngine::runInThread() {
     // when the thread is finished, add thread to the deleteLater queue
     connect(workerThread, &QThread::finished, workerThread, &QThread::deleteLater);
 
-    // when the thread is finished, add scriptEngine to the deleteLater queue
-    connect(workerThread, &QThread::finished, this, &ScriptEngine::deleteLater);
-
     moveToThread(workerThread);
 
     // Starts an event loop, and emits workerThread->started()
diff --git a/libraries/script-engine/src/ScriptEngines.cpp b/libraries/script-engine/src/ScriptEngines.cpp
index 293d798cd0..0a646bd696 100644
--- a/libraries/script-engine/src/ScriptEngines.cpp
+++ b/libraries/script-engine/src/ScriptEngines.cpp
@@ -112,6 +112,8 @@ void ScriptEngines::shutdownScripting() {
             scriptEngine->waitTillDoneRunning();
             qCDebug(scriptengine) << "done waiting on script:" << scriptName;
 
+            scriptEngine->deleteLater();
+
             // If the script is stopped, we can remove it from our set
             i.remove();
         }
@@ -343,6 +345,10 @@ ScriptEngine* ScriptEngines::loadScript(const QString& scriptFilename, bool isUs
 
     scriptEngine = new ScriptEngine(NO_SCRIPT, "", true);
     scriptEngine->setUserLoaded(isUserLoaded);
+    connect(scriptEngine, &ScriptEngine::doneRunning, this, [scriptEngine] {
+        scriptEngine->deleteLater();
+    }, Qt::QueuedConnection);
+
 
     if (scriptFilename.isNull()) {
         launchScriptEngine(scriptEngine);
@@ -431,5 +437,8 @@ QString ScriptEngines::getPreviousScriptLocation() const {
 }
 
 void ScriptEngines::setPreviousScriptLocation(const QString& previousScriptLocation) {
-    _previousScriptLocation.set(previousScriptLocation);
+    if (_previousScriptLocation.get() != previousScriptLocation) {
+        _previousScriptLocation.set(previousScriptLocation);
+        emit previousScriptLocationChanged();
+    }
 }
diff --git a/libraries/script-engine/src/ScriptEngines.h b/libraries/script-engine/src/ScriptEngines.h
index 6d78f3cfa0..97afe9ac57 100644
--- a/libraries/script-engine/src/ScriptEngines.h
+++ b/libraries/script-engine/src/ScriptEngines.h
@@ -30,6 +30,7 @@ class ScriptEngines : public QObject, public Dependency {
 
     Q_PROPERTY(ScriptsModel* scriptsModel READ scriptsModel CONSTANT)
     Q_PROPERTY(ScriptsModelFilter* scriptsModelFilter READ scriptsModelFilter CONSTANT)
+    Q_PROPERTY(QString previousScriptLocation READ getPreviousScriptLocation WRITE setPreviousScriptLocation NOTIFY previousScriptLocationChanged)
 
 public:
     using ScriptInitializer = std::function<void(ScriptEngine*)>;
@@ -72,6 +73,7 @@ signals:
     void scriptCountChanged();
     void scriptsReloading();
     void scriptLoadError(const QString& filename, const QString& error);
+    void previousScriptLocationChanged();
 
 protected slots: 
     void onScriptFinished(const QString& fileNameString, ScriptEngine* engine);