From 4e862941cb9307ebbcfb88c1a14e463c62a854c4 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 19 May 2016 14:51:56 -0700 Subject: [PATCH] fix a race when restarting scripts -- avoid the old not-yet-stopped script from being considered the restart script --- libraries/script-engine/src/ScriptEngine.h | 3 +++ libraries/script-engine/src/ScriptEngines.cpp | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/libraries/script-engine/src/ScriptEngine.h b/libraries/script-engine/src/ScriptEngine.h index 80978e4527..b576e2a37f 100644 --- a/libraries/script-engine/src/ScriptEngine.h +++ b/libraries/script-engine/src/ScriptEngine.h @@ -146,6 +146,8 @@ public: bool isFinished() const { return _isFinished; } // used by Application and ScriptWidget bool isRunning() const { return _isRunning; } // used by ScriptWidget + bool isStopping() const { return _isStopping; } + void flagAsStopping() { _isStopping = true; } bool isDebuggable() const { return _debuggable; } @@ -189,6 +191,7 @@ protected: QString _parentURL; std::atomic _isFinished { false }; std::atomic _isRunning { false }; + std::atomic _isStopping { false }; int _evaluatesPending { 0 }; bool _isInitialized { false }; QHash _timerFunctionMap; diff --git a/libraries/script-engine/src/ScriptEngines.cpp b/libraries/script-engine/src/ScriptEngines.cpp index 70eb055d22..5a2beb901d 100644 --- a/libraries/script-engine/src/ScriptEngines.cpp +++ b/libraries/script-engine/src/ScriptEngines.cpp @@ -351,6 +351,7 @@ void ScriptEngines::stopAllScripts(bool restart) { reloadScript(scriptName); }); } + it.value()->flagAsStopping(); QMetaObject::invokeMethod(it.value(), "stop"); //it.value()->stop(); qCDebug(scriptengine) << "stopping script..." << it.key(); @@ -369,6 +370,7 @@ bool ScriptEngines::stopScript(const QString& rawScriptURL, bool restart) { if (_scriptEnginesHash.contains(scriptURL)) { ScriptEngine* scriptEngine = _scriptEnginesHash[scriptURL]; if (restart) { + scriptEngine->flagAsStopping(); auto scriptCache = DependencyManager::get(); scriptCache->deleteScript(scriptURL); connect(scriptEngine, &ScriptEngine::finished, this, [this](QString scriptName, ScriptEngine* engine) { @@ -454,7 +456,7 @@ ScriptEngine* ScriptEngines::getScriptEngine(const QUrl& rawScriptURL) { QReadLocker lock(&_scriptEnginesHashLock); const QUrl scriptURL = normalizeScriptURL(rawScriptURL); auto it = _scriptEnginesHash.find(scriptURL); - if (it != _scriptEnginesHash.end()) { + if (it != _scriptEnginesHash.end() && !it.value()->isStopping()) { result = it.value(); } }