History

separate out supporting changes into 21114-part2 branch

humbletim committed 9 years ago

Commit b1595621 parent 9b0bee910 files · +833 −223Browse files

Showing the changes to libraries/script-engine/src/ScriptEngines.cpp (1 of 10 files). Show all

Unified · Split

libraries/script-engine/src/ScriptEngines.cpp+27−8
@@ -364,25 +364,43 @@ QStringList ScriptEngines::getRunningScripts() { · 363 unmodified lines
364364 }
365365
366366 void ScriptEngines::stopAllScripts(bool restart) {
367+ QVector<QString> toReload;
367368 QReadLocker lock(&_scriptEnginesHashLock);
368369 for (QHash<QUrl, ScriptEngine*>::const_iterator it = _scriptEnginesHash.constBegin();
369370 it != _scriptEnginesHash.constEnd(); it++) {
371+ ScriptEngine *scriptEngine = it.value();
370372 // skip already stopped scripts
371− if (it.value()->isFinished() || it.value()->isStopping()) {
373+ if (scriptEngine->isFinished() || scriptEngine->isStopping()) {
372374 continue;
373375 }
374376
375377 // queue user scripts if restarting
376− if (restart && it.value()->isUserLoaded()) {
377− connect(it.value(), &ScriptEngine::finished, this, [this](QString scriptName, ScriptEngine* engine) {
378− reloadScript(scriptName);
379− });
378+ if (restart && scriptEngine->isUserLoaded()) {
379+ toReload << it.key().toString();
380380 }
381381
382382 // stop all scripts
383− it.value()->stop(true);
384383 qCDebug(scriptengine) << "stopping script..." << it.key();
384+ scriptEngine->stop();
385385 }
386+ // wait for engines to stop (ie: providing time for .scriptEnding cleanup handlers to run) before
387+ // triggering reload of any Client scripts / Entity scripts
388+ QTimer::singleShot(500, this, [=]() {
389+ for(const auto &scriptName : toReload) {
390+ auto scriptEngine = getScriptEngine(scriptName);
391+ if (scriptEngine && !scriptEngine->isFinished()) {
392+ qCDebug(scriptengine) << "waiting on script:" << scriptName;
393+ scriptEngine->waitTillDoneRunning();
394+ qCDebug(scriptengine) << "done waiting on script:" << scriptName;
395+ }
396+ qCDebug(scriptengine) << "reloading script..." << scriptName;
397+ reloadScript(scriptName);
398+ }
399+ if (restart) {
400+ qCDebug(scriptengine) << "stopAllScripts -- emitting scriptsReloading";
401+ emit scriptsReloading();
402+ }
403+ });
386404 }
387405
388406 bool ScriptEngines::stopScript(const QString& rawScriptURL, bool restart) {
@@ -421,9 +439,10 @@ void ScriptEngines::setScriptsLocation(const QString& scriptsLocation) { · 32 unmodified lines
421439 }
422440
423441 void ScriptEngines::reloadAllScripts() {
442+ qCDebug(scriptengine) << "reloadAllScripts -- clearing caches";
424443 DependencyManager::get<ScriptCache>()->clearCache();
425444 DependencyManager::get<OffscreenUi>()->clearCache();
426− emit scriptsReloading();
445+ qCDebug(scriptengine) << "reloadAllScripts -- stopping all scripts";
427446 stopAllScripts(true);
428447 }
429448
@@ -456,7 +475,7 @@ ScriptEngine* ScriptEngines::loadScript(const QUrl& scriptFilename, bool isUserL · 26 unmodified lines
456475 return scriptEngine;
457476 }
458477
459− scriptEngine = new ScriptEngine(_context, NO_SCRIPT, "");
478+ scriptEngine = new ScriptEngine(_context, NO_SCRIPT, "about:" + scriptFilename.fileName());
460479 scriptEngine->setUserLoaded(isUserLoaded);
461480 connect(scriptEngine, &ScriptEngine::doneRunning, this, [scriptEngine] {
462481 scriptEngine->deleteLater();