Merge pull request #7942 from sethalves/fix-edit-js-restart

fix a race that keeps some scripts from restarting
This commit is contained in:
Brad Hefta-Gaub 2016-05-25 17:22:17 -07:00
commit 485c8aceac
3 changed files with 15 additions and 6 deletions

View file

@ -941,7 +941,13 @@ void ScriptEngine::stopAllTimersForEntityScript(const EntityItemID& entityID) {
} }
void ScriptEngine::stop() { void ScriptEngine::stop(bool marshal) {
_isStopping = true; // this can be done on any thread
if (marshal) {
QMetaObject::invokeMethod(this, "stop");
return;
}
if (!_isFinished) { if (!_isFinished) {
_isFinished = true; _isFinished = true;
emit runningStateChanged(); emit runningStateChanged();

View file

@ -84,7 +84,7 @@ public:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// NOTE - this is intended to be a public interface for Agent scripts, and local scripts, but not for EntityScripts // NOTE - this is intended to be a public interface for Agent scripts, and local scripts, but not for EntityScripts
Q_INVOKABLE void stop(); Q_INVOKABLE void stop(bool marshal = false);
// Stop any evaluating scripts and wait for the scripting thread to finish. // Stop any evaluating scripts and wait for the scripting thread to finish.
void waitTillDoneRunning(); void waitTillDoneRunning();
@ -147,6 +147,9 @@ public:
bool isFinished() const { return _isFinished; } // used by Application and ScriptWidget bool isFinished() const { return _isFinished; } // used by Application and ScriptWidget
bool isRunning() const { return _isRunning; } // used by ScriptWidget bool isRunning() const { return _isRunning; } // used by ScriptWidget
// this is used by code in ScriptEngines.cpp during the "reload all" operation
bool isStopping() const { return _isStopping; }
bool isDebuggable() const { return _debuggable; } bool isDebuggable() const { return _debuggable; }
void disconnectNonEssentialSignals(); void disconnectNonEssentialSignals();
@ -189,6 +192,7 @@ protected:
QString _parentURL; QString _parentURL;
std::atomic<bool> _isFinished { false }; std::atomic<bool> _isFinished { false };
std::atomic<bool> _isRunning { false }; std::atomic<bool> _isRunning { false };
std::atomic<bool> _isStopping { false };
int _evaluatesPending { 0 }; int _evaluatesPending { 0 };
bool _isInitialized { false }; bool _isInitialized { false };
QHash<QTimer*, CallbackData> _timerFunctionMap; QHash<QTimer*, CallbackData> _timerFunctionMap;

View file

@ -380,7 +380,7 @@ void ScriptEngines::stopAllScripts(bool restart) {
// Stop and possibly restart all currently running scripts // Stop and possibly restart all currently running scripts
for (QHash<QUrl, ScriptEngine*>::const_iterator it = _scriptEnginesHash.constBegin(); for (QHash<QUrl, ScriptEngine*>::const_iterator it = _scriptEnginesHash.constBegin();
it != _scriptEnginesHash.constEnd(); it++) { it != _scriptEnginesHash.constEnd(); it++) {
if (it.value()->isFinished()) { if (it.value()->isFinished() || it.value()->isStopping()) {
continue; continue;
} }
if (restart && it.value()->isUserLoaded()) { if (restart && it.value()->isUserLoaded()) {
@ -388,8 +388,7 @@ void ScriptEngines::stopAllScripts(bool restart) {
reloadScript(scriptName); reloadScript(scriptName);
}); });
} }
QMetaObject::invokeMethod(it.value(), "stop"); it.value()->stop(true);
//it.value()->stop();
qCDebug(scriptengine) << "stopping script..." << it.key(); qCDebug(scriptengine) << "stopping script..." << it.key();
} }
} }
@ -460,7 +459,7 @@ ScriptEngine* ScriptEngines::loadScript(const QUrl& scriptFilename, bool isUserL
} }
auto scriptEngine = getScriptEngine(scriptUrl); auto scriptEngine = getScriptEngine(scriptUrl);
if (scriptEngine) { if (scriptEngine && !scriptEngine->isStopping()) {
return scriptEngine; return scriptEngine;
} }