History

rework ScriptEngine lifetimes using 'smart' pointers

Seth Alves committed 9 years ago

Commit d89f2b71 parent 49ab8af18 files · +135 −146Browse files

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

Unified · Split

libraries/script-engine/src/ScriptEngines.cpp+28−34
@@ -137,16 +137,14 @@ void ScriptEngines::registerScriptInitializer(ScriptInitializer initializer) { · 136 unmodified lines
137137 _scriptInitializers.push_back(initializer);
138138 }
139139
140−void ScriptEngines::addScriptEngine(ScriptEngine* engine) {
141− if (_isStopped) {
142− engine->deleteLater();
143− } else {
140+void ScriptEngines::addScriptEngine(QSharedPointer<ScriptEngine> engine) {
141+ if (!_isStopped) {
144142 QMutexLocker locker(&_allScriptsMutex);
145143 _allKnownScriptEngines.insert(engine);
146144 }
147145 }
148146
149−void ScriptEngines::removeScriptEngine(ScriptEngine* engine) {
147+void ScriptEngines::removeScriptEngine(QSharedPointer<ScriptEngine> engine) {
150148 // If we're not already in the middle of stopping all scripts, then we should remove ourselves
151149 // from the list of running scripts. We don't do this if we're in the process of stopping all scripts
152150 // because that method removes scripts from its list as it iterates them
@@ -161,9 +159,9 @@ void ScriptEngines::shutdownScripting() { · 8 unmodified lines
161159 QMutexLocker locker(&_allScriptsMutex);
162160 qCDebug(scriptengine) << "Stopping all scripts.... currently known scripts:" << _allKnownScriptEngines.size();
163161
164− QMutableSetIterator<ScriptEngine*> i(_allKnownScriptEngines);
162+ QMutableSetIterator<QSharedPointer<ScriptEngine>> i(_allKnownScriptEngines);
165163 while (i.hasNext()) {
166− ScriptEngine* scriptEngine = i.next();
164+ QSharedPointer<ScriptEngine> scriptEngine = i.next();
167165 QString scriptName = scriptEngine->getFilename();
168166
169167 // NOTE: typically all script engines are running. But there's at least one known exception to this, the
@@ -187,12 +185,9 @@ void ScriptEngines::shutdownScripting() { · 17 unmodified lines
187185 qCDebug(scriptengine) << "waiting on script:" << scriptName;
188186 scriptEngine->waitTillDoneRunning();
189187 qCDebug(scriptengine) << "done waiting on script:" << scriptName;
190−
191− scriptEngine->deleteLater();
192−
193− // Once the script is stopped, we can remove it from our set
194− i.remove();
195188 }
189+ // Once the script is stopped, we can remove it from our set
190+ i.remove();
196191 }
197192 qCDebug(scriptengine) << "DONE Stopping all scripts....";
198193 }
@@ -369,9 +364,9 @@ void ScriptEngines::stopAllScripts(bool restart) { · 170 unmodified lines
369364 _isReloading = true;
370365 }
371366
372− for (QHash<QUrl, ScriptEngine*>::const_iterator it = _scriptEnginesHash.constBegin();
367+ for (QHash<QUrl, QSharedPointer<ScriptEngine>>::const_iterator it = _scriptEnginesHash.constBegin();
373368 it != _scriptEnginesHash.constEnd(); it++) {
374− ScriptEngine *scriptEngine = it.value();
369+ QSharedPointer<ScriptEngine> scriptEngine = it.value();
375370 // skip already stopped scripts
376371 if (scriptEngine->isFinished() || scriptEngine->isStopping()) {
377372 continue;
@@ -417,11 +412,12 @@ bool ScriptEngines::stopScript(const QString& rawScriptURL, bool restart) { · 39 unmodified lines
417412
418413 QReadLocker lock(&_scriptEnginesHashLock);
419414 if (_scriptEnginesHash.contains(scriptURL)) {
420− ScriptEngine* scriptEngine = _scriptEnginesHash[scriptURL];
415+ QSharedPointer<ScriptEngine> scriptEngine = _scriptEnginesHash[scriptURL];
421416 if (restart) {
422417 auto scriptCache = DependencyManager::get<ScriptCache>();
423418 scriptCache->deleteScript(scriptURL);
424− connect(scriptEngine, &ScriptEngine::finished, this, [this](QString scriptName, ScriptEngine* engine) {
419+ connect(scriptEngine.data(), &ScriptEngine::finished,
420+ this, [this](QString scriptName, QSharedPointer<ScriptEngine> engine) {
425421 reloadScript(scriptName);
426422 });
427423 }
@@ -449,11 +445,11 @@ void ScriptEngines::reloadAllScripts() { · 21 unmodified lines
449445 stopAllScripts(true);
450446 }
451447
452−ScriptEngine* ScriptEngines::loadScript(const QUrl& scriptFilename, bool isUserLoaded, bool loadScriptFromEditor,
448+QSharedPointer<ScriptEngine> ScriptEngines::loadScript(const QUrl& scriptFilename, bool isUserLoaded, bool loadScriptFromEditor,
453449 bool activateMainWindow, bool reload) {
454450 if (thread() != QThread::currentThread()) {
455− ScriptEngine* result { nullptr };
456− BLOCKING_INVOKE_METHOD(this, "loadScript", Q_RETURN_ARG(ScriptEngine*, result),
451+ QSharedPointer<ScriptEngine> result { nullptr };
452+ BLOCKING_INVOKE_METHOD(this, "loadScript", Q_RETURN_ARG(QSharedPointer<ScriptEngine>, result),
457453 Q_ARG(QUrl, scriptFilename),
458454 Q_ARG(bool, isUserLoaded),
459455 Q_ARG(bool, loadScriptFromEditor),
@@ -479,19 +475,16 @@ ScriptEngine* ScriptEngines::loadScript(const QUrl& scriptFilename, bool isUserL · 19 unmodified lines
479475 return scriptEngine;
480476 }
481477
482− scriptEngine = new ScriptEngine(_context, NO_SCRIPT, "about:" + scriptFilename.fileName());
478+ scriptEngine = QSharedPointer<ScriptEngine>(new ScriptEngine(_context, NO_SCRIPT, "about:" + scriptFilename.fileName()));
479+ addScriptEngine(scriptEngine);
483480 scriptEngine->setUserLoaded(isUserLoaded);
484− connect(scriptEngine, &ScriptEngine::doneRunning, this, [scriptEngine] {
485− scriptEngine->deleteLater();
486− }, Qt::QueuedConnection);
487−
488481
489482 if (scriptFilename.isEmpty() || !scriptUrl.isValid()) {
490483 launchScriptEngine(scriptEngine);
491484 } else {
492485 // connect to the appropriate signals of this script engine
493− connect(scriptEngine, &ScriptEngine::scriptLoaded, this, &ScriptEngines::onScriptEngineLoaded);
494− connect(scriptEngine, &ScriptEngine::errorLoadingScript, this, &ScriptEngines::onScriptEngineError);
486+ connect(scriptEngine.data(), &ScriptEngine::scriptLoaded, this, &ScriptEngines::onScriptEngineLoaded);
487+ connect(scriptEngine.data(), &ScriptEngine::errorLoadingScript, this, &ScriptEngines::onScriptEngineError);
495488
496489 // get the script engine object to load the script at the designated script URL
497490 scriptEngine->loadURL(scriptUrl, reload);
@@ -500,8 +493,8 @@ ScriptEngine* ScriptEngines::loadScript(const QUrl& scriptFilename, bool isUserL · 2 unmodified lines
500493 return scriptEngine;
501494 }
502495
503−ScriptEngine* ScriptEngines::getScriptEngine(const QUrl& rawScriptURL) {
504− ScriptEngine* result = nullptr;
496+QSharedPointer<ScriptEngine> ScriptEngines::getScriptEngine(const QUrl& rawScriptURL) {
497+ QSharedPointer<ScriptEngine> result;
505498 {
506499 QReadLocker lock(&_scriptEnginesHashLock);
507500 const QUrl scriptURL = normalizeScriptURL(rawScriptURL);
@@ -516,7 +509,8 @@ ScriptEngine* ScriptEngines::getScriptEngine(const QUrl& rawScriptURL) { · 8 unmodified lines
516509 // FIXME - change to new version of ScriptCache loading notification
517510 void ScriptEngines::onScriptEngineLoaded(const QString& rawScriptURL) {
518511 UserActivityLogger::getInstance().loadedScript(rawScriptURL);
519− ScriptEngine* scriptEngine = qobject_cast<ScriptEngine*>(sender());
512+ QSharedPointer<BaseScriptEngine> baseScriptEngine = qobject_cast<ScriptEngine*>(sender())->sharedFromThis();
513+ QSharedPointer<ScriptEngine> scriptEngine = qSharedPointerCast<ScriptEngine>(baseScriptEngine);
520514
521515 launchScriptEngine(scriptEngine);
522516
@@ -532,12 +526,12 @@ void ScriptEngines::onScriptEngineLoaded(const QString& rawScriptURL) { · 9 unmodified lines
532526 emit scriptCountChanged();
533527 }
534528
535−void ScriptEngines::launchScriptEngine(ScriptEngine* scriptEngine) {
536− connect(scriptEngine, &ScriptEngine::finished, this, &ScriptEngines::onScriptFinished, Qt::DirectConnection);
537− connect(scriptEngine, &ScriptEngine::loadScript, [&](const QString& scriptName, bool userLoaded) {
529+void ScriptEngines::launchScriptEngine(QSharedPointer<ScriptEngine> scriptEngine) {
530+ connect(scriptEngine.data(), &ScriptEngine::finished, this, &ScriptEngines::onScriptFinished, Qt::DirectConnection);
531+ connect(scriptEngine.data(), &ScriptEngine::loadScript, [&](const QString& scriptName, bool userLoaded) {
538532 loadScript(scriptName, userLoaded);
539533 });
540− connect(scriptEngine, &ScriptEngine::reloadScript, [&](const QString& scriptName, bool userLoaded) {
534+ connect(scriptEngine.data(), &ScriptEngine::reloadScript, [&](const QString& scriptName, bool userLoaded) {
541535 loadScript(scriptName, userLoaded, false, false, true);
542536 });
543537
@@ -558,7 +552,7 @@ void ScriptEngines::launchScriptEngine(ScriptEngine* scriptEngine) { · 14 unmodified lines
558552 }
559553 }
560554
561−void ScriptEngines::onScriptFinished(const QString& rawScriptURL, ScriptEngine* engine) {
555+void ScriptEngines::onScriptFinished(const QString& rawScriptURL, QSharedPointer<ScriptEngine> engine) {
562556 bool removed = false;
563557 {
564558 QWriteLocker lock(&_scriptEnginesHashLock);