History

fix a couple shutdown crashes and a class of asan warning

Seth Alves committed 7 years ago

Commit 6589db61 parent 6cd57705 files · +39 −25Browse files

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

Unified · Split

libraries/script-engine/src/ScriptEngine.cpp+22−12
@@ -164,7 +164,9 @@ ScriptEnginePointer scriptEngineFactory(ScriptEngine::Context context, · 163 unmodified lines
164164 const QString& fileNameString) {
165165 ScriptEngine* engine = new ScriptEngine(context, scriptContents, fileNameString);
166166 ScriptEnginePointer engineSP = ScriptEnginePointer(engine);
167− DependencyManager::get<ScriptEngines>()->addScriptEngine(qSharedPointerCast<ScriptEngine>(engineSP));
167+ auto scriptEngines = DependencyManager::get<ScriptEngines>();
168+ scriptEngines->addScriptEngine(qSharedPointerCast<ScriptEngine>(engineSP));
169+ engine->setScriptEngines(scriptEngines);
168170 return engineSP;
169171 }
170172
@@ -259,7 +261,7 @@ bool ScriptEngine::isDebugMode() const { · 88 unmodified lines
259261 }
260262
261263 ScriptEngine::~ScriptEngine() {
262− auto scriptEngines = DependencyManager::get<ScriptEngines>();
264+ QSharedPointer<ScriptEngines> scriptEngines(_scriptEngines);
263265 if (scriptEngines) {
264266 scriptEngines->removeScriptEngine(qSharedPointerCast<ScriptEngine>(sharedFromThis()));
265267 }
@@ -1012,7 +1014,8 @@ QScriptValue ScriptEngine::evaluateInClosure(const QScriptValue& closure, const · 746 unmodified lines
10121014 }
10131015
10141016 QScriptValue ScriptEngine::evaluate(const QString& sourceCode, const QString& fileName, int lineNumber) {
1015− if (DependencyManager::get<ScriptEngines>()->isStopped()) {
1017+ QSharedPointer<ScriptEngines> scriptEngines(_scriptEngines);
1018+ if (!scriptEngines || scriptEngines->isStopped()) {
10161019 return QScriptValue(); // bail early
10171020 }
10181021
@@ -1062,7 +1065,8 @@ void ScriptEngine::run() { · 43 unmodified lines
10621065 auto name = filenameParts.size() > 0 ? filenameParts[filenameParts.size() - 1] : "unknown";
10631066 PROFILE_SET_THREAD_NAME("Script: " + name);
10641067
1065− if (DependencyManager::get<ScriptEngines>()->isStopped()) {
1068+ QSharedPointer<ScriptEngines> scriptEngines(_scriptEngines);
1069+ if (!scriptEngines || scriptEngines->isStopped()) {
10661070 return; // bail early - avoid setting state in init(), as evaluate() will bail too
10671071 }
10681072
@@ -1319,7 +1323,7 @@ void ScriptEngine::updateMemoryCost(const qint64& deltaSize) { · 250 unmodified lines
13191323
13201324 void ScriptEngine::timerFired() {
13211325 {
1322− auto engine = DependencyManager::get<ScriptEngines>();
1326+ QSharedPointer<ScriptEngines> engine(_scriptEngines);
13231327 if (!engine || engine->isStopped()) {
13241328 scriptWarningMessage("Script.timerFired() while shutting down is ignored... parent script:" + getFilename());
13251329 return; // bail early
@@ -1373,7 +1377,8 @@ QObject* ScriptEngine::setupTimerWithInterval(const QScriptValue& function, int · 47 unmodified lines
13731377 }
13741378
13751379 QObject* ScriptEngine::setInterval(const QScriptValue& function, int intervalMS) {
1376− if (DependencyManager::get<ScriptEngines>()->isStopped()) {
1380+ QSharedPointer<ScriptEngines> scriptEngines(_scriptEngines);
1381+ if (!scriptEngines || scriptEngines->isStopped()) {
13771382 scriptWarningMessage("Script.setInterval() while shutting down is ignored... parent script:" + getFilename());
13781383 return NULL; // bail early
13791384 }
@@ -1382,7 +1387,8 @@ QObject* ScriptEngine::setInterval(const QScriptValue& function, int intervalMS) · 2 unmodified lines
13821387 }
13831388
13841389 QObject* ScriptEngine::setTimeout(const QScriptValue& function, int timeoutMS) {
1385− if (DependencyManager::get<ScriptEngines>()->isStopped()) {
1390+ QSharedPointer<ScriptEngines> scriptEngines(_scriptEngines);
1391+ if (!scriptEngines || scriptEngines->isStopped()) {
13861392 scriptWarningMessage("Script.setTimeout() while shutting down is ignored... parent script:" + getFilename());
13871393 return NULL; // bail early
13881394 }
@@ -1813,7 +1819,8 @@ void ScriptEngine::include(const QStringList& includeFiles, QScriptValue callbac · 424 unmodified lines
18131819 if (!IS_THREADSAFE_INVOCATION(thread(), __FUNCTION__)) {
18141820 return;
18151821 }
1816− if (DependencyManager::get<ScriptEngines>()->isStopped()) {
1822+ QSharedPointer<ScriptEngines> scriptEngines(_scriptEngines);
1823+ if (!scriptEngines || scriptEngines->isStopped()) {
18171824 scriptWarningMessage("Script.include() while shutting down is ignored... includeFiles:"
18181825 + includeFiles.join(",") + "parent script:" + getFilename());
18191826 return; // bail early
@@ -1907,7 +1914,8 @@ void ScriptEngine::include(const QStringList& includeFiles, QScriptValue callbac · 87 unmodified lines
19071914 }
19081915
19091916 void ScriptEngine::include(const QString& includeFile, QScriptValue callback) {
1910− if (DependencyManager::get<ScriptEngines>()->isStopped()) {
1917+ QSharedPointer<ScriptEngines> scriptEngines(_scriptEngines);
1918+ if (!scriptEngines || scriptEngines->isStopped()) {
19111919 scriptWarningMessage("Script.include() while shutting down is ignored... includeFile:"
19121920 + includeFile + "parent script:" + getFilename());
19131921 return; // bail early
@@ -1925,7 +1933,8 @@ void ScriptEngine::load(const QString& loadFile) { · 11 unmodified lines
19251933 if (!IS_THREADSAFE_INVOCATION(thread(), __FUNCTION__)) {
19261934 return;
19271935 }
1928− if (DependencyManager::get<ScriptEngines>()->isStopped()) {
1936+ QSharedPointer<ScriptEngines> scriptEngines(_scriptEngines);
1937+ if (!scriptEngines || scriptEngines->isStopped()) {
19291938 scriptWarningMessage("Script.load() while shutting down is ignored... loadFile:"
19301939 + loadFile + "parent script:" + getFilename());
19311940 return; // bail early
@@ -2073,10 +2082,11 @@ void ScriptEngine::loadEntityScript(const EntityItemID& entityID, const QString& · 141 unmodified lines
20732082 }
20742083 PROFILE_RANGE(script, __FUNCTION__);
20752084
2076− if (isStopping() || DependencyManager::get<ScriptEngines>()->isStopped()) {
2085+ QSharedPointer<ScriptEngines> scriptEngines(_scriptEngines);
2086+ if (isStopping() || !scriptEngines || scriptEngines->isStopped()) {
20772087 qCDebug(scriptengine) << "loadEntityScript.start " << entityID.toString()
20782088 << " but isStopping==" << isStopping()
2079− << " || engines->isStopped==" << DependencyManager::get<ScriptEngines>()->isStopped();
2089+ << " || engines->isStopped==" << scriptEngines->isStopped();
20802090 return;
20812091 }
20822092