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
164 const QString& fileNameString) {164 const QString& fileNameString) {
165 ScriptEngine* engine = new ScriptEngine(context, scriptContents, fileNameString);165 ScriptEngine* engine = new ScriptEngine(context, scriptContents, fileNameString);
166 ScriptEnginePointer engineSP = ScriptEnginePointer(engine);166 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);
168 return engineSP;170 return engineSP;
169}171}
170 172
@@ -259,7 +261,7 @@ bool ScriptEngine::isDebugMode() const { · 88 unmodified lines
259}261}
260 262
261ScriptEngine::~ScriptEngine() {263ScriptEngine::~ScriptEngine() {
262 auto scriptEngines = DependencyManager::get<ScriptEngines>();264 QSharedPointer<ScriptEngines> scriptEngines(_scriptEngines);
263 if (scriptEngines) {265 if (scriptEngines) {
264 scriptEngines->removeScriptEngine(qSharedPointerCast<ScriptEngine>(sharedFromThis()));266 scriptEngines->removeScriptEngine(qSharedPointerCast<ScriptEngine>(sharedFromThis()));
265 }267 }
@@ -1012,7 +1014,8 @@ QScriptValue ScriptEngine::evaluateInClosure(const QScriptValue& closure, const · 746 unmodified lines
1012}1014}
1013 1015
1014QScriptValue ScriptEngine::evaluate(const QString& sourceCode, const QString& fileName, int lineNumber) {1016QScriptValue 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()) {
1016 return QScriptValue(); // bail early1019 return QScriptValue(); // bail early
1017 }1020 }
1018 1021
@@ -1062,7 +1065,8 @@ void ScriptEngine::run() { · 43 unmodified lines
1062 auto name = filenameParts.size() > 0 ? filenameParts[filenameParts.size() - 1] : "unknown";1065 auto name = filenameParts.size() > 0 ? filenameParts[filenameParts.size() - 1] : "unknown";
1063 PROFILE_SET_THREAD_NAME("Script: " + name);1066 PROFILE_SET_THREAD_NAME("Script: " + name);
1064 1067
1065 if (DependencyManager::get<ScriptEngines>()->isStopped()) {1068 QSharedPointer<ScriptEngines> scriptEngines(_scriptEngines);
1069 if (!scriptEngines || scriptEngines->isStopped()) {
1066 return; // bail early - avoid setting state in init(), as evaluate() will bail too1070 return; // bail early - avoid setting state in init(), as evaluate() will bail too
1067 }1071 }
1068 1072
@@ -1319,7 +1323,7 @@ void ScriptEngine::updateMemoryCost(const qint64& deltaSize) { · 250 unmodified lines
1319 1323
1320void ScriptEngine::timerFired() {1324void ScriptEngine::timerFired() {
1321 {1325 {
1322 auto engine = DependencyManager::get<ScriptEngines>();1326 QSharedPointer<ScriptEngines> engine(_scriptEngines);
1323 if (!engine || engine->isStopped()) {1327 if (!engine || engine->isStopped()) {
1324 scriptWarningMessage("Script.timerFired() while shutting down is ignored... parent script:" + getFilename());1328 scriptWarningMessage("Script.timerFired() while shutting down is ignored... parent script:" + getFilename());
1325 return; // bail early1329 return; // bail early
@@ -1373,7 +1377,8 @@ QObject* ScriptEngine::setupTimerWithInterval(const QScriptValue& function, int · 47 unmodified lines
1373}1377}
1374 1378
1375QObject* ScriptEngine::setInterval(const QScriptValue& function, int intervalMS) {1379QObject* ScriptEngine::setInterval(const QScriptValue& function, int intervalMS) {
1376 if (DependencyManager::get<ScriptEngines>()->isStopped()) {1380 QSharedPointer<ScriptEngines> scriptEngines(_scriptEngines);
1381 if (!scriptEngines || scriptEngines->isStopped()) {
1377 scriptWarningMessage("Script.setInterval() while shutting down is ignored... parent script:" + getFilename());1382 scriptWarningMessage("Script.setInterval() while shutting down is ignored... parent script:" + getFilename());
1378 return NULL; // bail early1383 return NULL; // bail early
1379 }1384 }
@@ -1382,7 +1387,8 @@ QObject* ScriptEngine::setInterval(const QScriptValue& function, int intervalMS) · 2 unmodified lines
1382}1387}
1383 1388
1384QObject* ScriptEngine::setTimeout(const QScriptValue& function, int timeoutMS) {1389QObject* ScriptEngine::setTimeout(const QScriptValue& function, int timeoutMS) {
1385 if (DependencyManager::get<ScriptEngines>()->isStopped()) {1390 QSharedPointer<ScriptEngines> scriptEngines(_scriptEngines);
1391 if (!scriptEngines || scriptEngines->isStopped()) {
1386 scriptWarningMessage("Script.setTimeout() while shutting down is ignored... parent script:" + getFilename());1392 scriptWarningMessage("Script.setTimeout() while shutting down is ignored... parent script:" + getFilename());
1387 return NULL; // bail early1393 return NULL; // bail early
1388 }1394 }
@@ -1813,7 +1819,8 @@ void ScriptEngine::include(const QStringList& includeFiles, QScriptValue callbac · 424 unmodified lines
1813 if (!IS_THREADSAFE_INVOCATION(thread(), __FUNCTION__)) {1819 if (!IS_THREADSAFE_INVOCATION(thread(), __FUNCTION__)) {
1814 return;1820 return;
1815 }1821 }
1816 if (DependencyManager::get<ScriptEngines>()->isStopped()) {1822 QSharedPointer<ScriptEngines> scriptEngines(_scriptEngines);
1823 if (!scriptEngines || scriptEngines->isStopped()) {
1817 scriptWarningMessage("Script.include() while shutting down is ignored... includeFiles:"1824 scriptWarningMessage("Script.include() while shutting down is ignored... includeFiles:"
1818 + includeFiles.join(",") + "parent script:" + getFilename());1825 + includeFiles.join(",") + "parent script:" + getFilename());
1819 return; // bail early1826 return; // bail early
@@ -1907,7 +1914,8 @@ void ScriptEngine::include(const QStringList& includeFiles, QScriptValue callbac · 87 unmodified lines
1907}1914}
1908 1915
1909void ScriptEngine::include(const QString& includeFile, QScriptValue callback) {1916void ScriptEngine::include(const QString& includeFile, QScriptValue callback) {
1910 if (DependencyManager::get<ScriptEngines>()->isStopped()) {1917 QSharedPointer<ScriptEngines> scriptEngines(_scriptEngines);
1918 if (!scriptEngines || scriptEngines->isStopped()) {
1911 scriptWarningMessage("Script.include() while shutting down is ignored... includeFile:"1919 scriptWarningMessage("Script.include() while shutting down is ignored... includeFile:"
1912 + includeFile + "parent script:" + getFilename());1920 + includeFile + "parent script:" + getFilename());
1913 return; // bail early1921 return; // bail early
@@ -1925,7 +1933,8 @@ void ScriptEngine::load(const QString& loadFile) { · 11 unmodified lines
1925 if (!IS_THREADSAFE_INVOCATION(thread(), __FUNCTION__)) {1933 if (!IS_THREADSAFE_INVOCATION(thread(), __FUNCTION__)) {
1926 return;1934 return;
1927 }1935 }
1928 if (DependencyManager::get<ScriptEngines>()->isStopped()) {1936 QSharedPointer<ScriptEngines> scriptEngines(_scriptEngines);
1937 if (!scriptEngines || scriptEngines->isStopped()) {
1929 scriptWarningMessage("Script.load() while shutting down is ignored... loadFile:"1938 scriptWarningMessage("Script.load() while shutting down is ignored... loadFile:"
1930 + loadFile + "parent script:" + getFilename());1939 + loadFile + "parent script:" + getFilename());
1931 return; // bail early1940 return; // bail early
@@ -2073,10 +2082,11 @@ void ScriptEngine::loadEntityScript(const EntityItemID& entityID, const QString& · 141 unmodified lines
2073 }2082 }
2074 PROFILE_RANGE(script, __FUNCTION__);2083 PROFILE_RANGE(script, __FUNCTION__);
2075 2084
2076 if (isStopping() || DependencyManager::get<ScriptEngines>()->isStopped()) {2085 QSharedPointer<ScriptEngines> scriptEngines(_scriptEngines);
2086 if (isStopping() || !scriptEngines || scriptEngines->isStopped()) {
2077 qCDebug(scriptengine) << "loadEntityScript.start " << entityID.toString()2087 qCDebug(scriptengine) << "loadEntityScript.start " << entityID.toString()
2078 << " but isStopping==" << isStopping()2088 << " but isStopping==" << isStopping()
2079 << " || engines->isStopped==" << DependencyManager::get<ScriptEngines>()->isStopped();2089 << " || engines->isStopped==" << scriptEngines->isStopped();
2080 return;2090 return;
2081 }2091 }
2082 2092