Showing the changes to libraries/script-engine/src/ScriptEngines.cpp (1 of 18 files). Show all
Unified · Split
| @@ -137,16 +137,14 @@ void ScriptEngines::registerScriptInitializer(ScriptInitializer initializer) { · 136 unmodified lines | ||
| 137 | 137 | _scriptInitializers.push_back(initializer); |
| 138 | 138 | } |
| 139 | 139 | |
| 140 | −void ScriptEngines::addScriptEngine(ScriptEngine* engine) { | |
| 141 | − if (_isStopped) { | |
| 142 | − engine->deleteLater(); | |
| 143 | − } else { | |
| 140 | +void ScriptEngines::addScriptEngine(QSharedPointer<ScriptEngine> engine) { | |
| 141 | + if (!_isStopped) { | |
| 144 | 142 | QMutexLocker locker(&_allScriptsMutex); |
| 145 | 143 | _allKnownScriptEngines.insert(engine); |
| 146 | 144 | } |
| 147 | 145 | } |
| 148 | 146 | |
| 149 | −void ScriptEngines::removeScriptEngine(ScriptEngine* engine) { | |
| 147 | +void ScriptEngines::removeScriptEngine(QSharedPointer<ScriptEngine> engine) { | |
| 150 | 148 | // If we're not already in the middle of stopping all scripts, then we should remove ourselves |
| 151 | 149 | // from the list of running scripts. We don't do this if we're in the process of stopping all scripts |
| 152 | 150 | // because that method removes scripts from its list as it iterates them |
| @@ -161,9 +159,9 @@ void ScriptEngines::shutdownScripting() { · 8 unmodified lines | ||
| 161 | 159 | QMutexLocker locker(&_allScriptsMutex); |
| 162 | 160 | qCDebug(scriptengine) << "Stopping all scripts.... currently known scripts:" << _allKnownScriptEngines.size(); |
| 163 | 161 | |
| 164 | − QMutableSetIterator<ScriptEngine*> i(_allKnownScriptEngines); | |
| 162 | + QMutableSetIterator<QSharedPointer<ScriptEngine>> i(_allKnownScriptEngines); | |
| 165 | 163 | while (i.hasNext()) { |
| 166 | − ScriptEngine* scriptEngine = i.next(); | |
| 164 | + QSharedPointer<ScriptEngine> scriptEngine = i.next(); | |
| 167 | 165 | QString scriptName = scriptEngine->getFilename(); |
| 168 | 166 | |
| 169 | 167 | // 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 | ||
| 187 | 185 | qCDebug(scriptengine) << "waiting on script:" << scriptName; |
| 188 | 186 | scriptEngine->waitTillDoneRunning(); |
| 189 | 187 | 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(); | |
| 195 | 188 | } |
| 189 | + // Once the script is stopped, we can remove it from our set | |
| 190 | + i.remove(); | |
| 196 | 191 | } |
| 197 | 192 | qCDebug(scriptengine) << "DONE Stopping all scripts...."; |
| 198 | 193 | } |
| @@ -369,9 +364,9 @@ void ScriptEngines::stopAllScripts(bool restart) { · 170 unmodified lines | ||
| 369 | 364 | _isReloading = true; |
| 370 | 365 | } |
| 371 | 366 | |
| 372 | − for (QHash<QUrl, ScriptEngine*>::const_iterator it = _scriptEnginesHash.constBegin(); | |
| 367 | + for (QHash<QUrl, QSharedPointer<ScriptEngine>>::const_iterator it = _scriptEnginesHash.constBegin(); | |
| 373 | 368 | it != _scriptEnginesHash.constEnd(); it++) { |
| 374 | − ScriptEngine *scriptEngine = it.value(); | |
| 369 | + QSharedPointer<ScriptEngine> scriptEngine = it.value(); | |
| 375 | 370 | // skip already stopped scripts |
| 376 | 371 | if (scriptEngine->isFinished() || scriptEngine->isStopping()) { |
| 377 | 372 | continue; |
| @@ -417,11 +412,12 @@ bool ScriptEngines::stopScript(const QString& rawScriptURL, bool restart) { · 39 unmodified lines | ||
| 417 | 412 | |
| 418 | 413 | QReadLocker lock(&_scriptEnginesHashLock); |
| 419 | 414 | if (_scriptEnginesHash.contains(scriptURL)) { |
| 420 | − ScriptEngine* scriptEngine = _scriptEnginesHash[scriptURL]; | |
| 415 | + QSharedPointer<ScriptEngine> scriptEngine = _scriptEnginesHash[scriptURL]; | |
| 421 | 416 | if (restart) { |
| 422 | 417 | auto scriptCache = DependencyManager::get<ScriptCache>(); |
| 423 | 418 | 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) { | |
| 425 | 421 | reloadScript(scriptName); |
| 426 | 422 | }); |
| 427 | 423 | } |
| @@ -449,11 +445,11 @@ void ScriptEngines::reloadAllScripts() { · 21 unmodified lines | ||
| 449 | 445 | stopAllScripts(true); |
| 450 | 446 | } |
| 451 | 447 | |
| 452 | −ScriptEngine* ScriptEngines::loadScript(const QUrl& scriptFilename, bool isUserLoaded, bool loadScriptFromEditor, | |
| 448 | +QSharedPointer<ScriptEngine> ScriptEngines::loadScript(const QUrl& scriptFilename, bool isUserLoaded, bool loadScriptFromEditor, | |
| 453 | 449 | bool activateMainWindow, bool reload) { |
| 454 | 450 | 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), | |
| 457 | 453 | Q_ARG(QUrl, scriptFilename), |
| 458 | 454 | Q_ARG(bool, isUserLoaded), |
| 459 | 455 | Q_ARG(bool, loadScriptFromEditor), |
| @@ -479,19 +475,16 @@ ScriptEngine* ScriptEngines::loadScript(const QUrl& scriptFilename, bool isUserL · 19 unmodified lines | ||
| 479 | 475 | return scriptEngine; |
| 480 | 476 | } |
| 481 | 477 | |
| 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); | |
| 483 | 480 | scriptEngine->setUserLoaded(isUserLoaded); |
| 484 | − connect(scriptEngine, &ScriptEngine::doneRunning, this, [scriptEngine] { | |
| 485 | − scriptEngine->deleteLater(); | |
| 486 | − }, Qt::QueuedConnection); | |
| 487 | − | |
| 488 | 481 | |
| 489 | 482 | if (scriptFilename.isEmpty() || !scriptUrl.isValid()) { |
| 490 | 483 | launchScriptEngine(scriptEngine); |
| 491 | 484 | } else { |
| 492 | 485 | // 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); | |
| 495 | 488 | |
| 496 | 489 | // get the script engine object to load the script at the designated script URL |
| 497 | 490 | scriptEngine->loadURL(scriptUrl, reload); |
| @@ -500,8 +493,8 @@ ScriptEngine* ScriptEngines::loadScript(const QUrl& scriptFilename, bool isUserL · 2 unmodified lines | ||
| 500 | 493 | return scriptEngine; |
| 501 | 494 | } |
| 502 | 495 | |
| 503 | −ScriptEngine* ScriptEngines::getScriptEngine(const QUrl& rawScriptURL) { | |
| 504 | − ScriptEngine* result = nullptr; | |
| 496 | +QSharedPointer<ScriptEngine> ScriptEngines::getScriptEngine(const QUrl& rawScriptURL) { | |
| 497 | + QSharedPointer<ScriptEngine> result; | |
| 505 | 498 | { |
| 506 | 499 | QReadLocker lock(&_scriptEnginesHashLock); |
| 507 | 500 | const QUrl scriptURL = normalizeScriptURL(rawScriptURL); |
| @@ -516,7 +509,8 @@ ScriptEngine* ScriptEngines::getScriptEngine(const QUrl& rawScriptURL) { · 8 unmodified lines | ||
| 516 | 509 | // FIXME - change to new version of ScriptCache loading notification |
| 517 | 510 | void ScriptEngines::onScriptEngineLoaded(const QString& rawScriptURL) { |
| 518 | 511 | 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); | |
| 520 | 514 | |
| 521 | 515 | launchScriptEngine(scriptEngine); |
| 522 | 516 | |
| @@ -532,12 +526,12 @@ void ScriptEngines::onScriptEngineLoaded(const QString& rawScriptURL) { · 9 unmodified lines | ||
| 532 | 526 | emit scriptCountChanged(); |
| 533 | 527 | } |
| 534 | 528 | |
| 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) { | |
| 538 | 532 | loadScript(scriptName, userLoaded); |
| 539 | 533 | }); |
| 540 | − connect(scriptEngine, &ScriptEngine::reloadScript, [&](const QString& scriptName, bool userLoaded) { | |
| 534 | + connect(scriptEngine.data(), &ScriptEngine::reloadScript, [&](const QString& scriptName, bool userLoaded) { | |
| 541 | 535 | loadScript(scriptName, userLoaded, false, false, true); |
| 542 | 536 | }); |
| 543 | 537 | |
| @@ -558,7 +552,7 @@ void ScriptEngines::launchScriptEngine(ScriptEngine* scriptEngine) { · 14 unmodified lines | ||
| 558 | 552 | } |
| 559 | 553 | } |
| 560 | 554 | |
| 561 | −void ScriptEngines::onScriptFinished(const QString& rawScriptURL, ScriptEngine* engine) { | |
| 555 | +void ScriptEngines::onScriptFinished(const QString& rawScriptURL, QSharedPointer<ScriptEngine> engine) { | |
| 562 | 556 | bool removed = false; |
| 563 | 557 | { |
| 564 | 558 | QWriteLocker lock(&_scriptEnginesHashLock); |