diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 9c565153cd..4861bc6ecb 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -226,10 +226,7 @@ void EntityTreeRenderer::resetPersistentEntitiesScriptEngine() { manager->stop(); manager->waitTillDoneRunning(); manager->disconnectNonEssentialSignals(); - // TODO: script manager pointer is still in use somewhere after the cleanup in lambda. - // To prevent memory leaks on multiple reloads we would need to find all the usages and remove them. - // Script engines are correctly deleted later during shutdown currently. - qDebug() << "_nonPersistentEntitiesScriptManager lambda finished, script manager pointer use count: " << manager.use_count(); + manager->removeFromScriptEngines(); }); } _persistentEntitiesScriptManager = scriptManagerFactory(ScriptManager::ENTITY_CLIENT_SCRIPT, NO_SCRIPT, @@ -252,10 +249,7 @@ void EntityTreeRenderer::resetNonPersistentEntitiesScriptEngine() { manager->stop(); manager->waitTillDoneRunning(); manager->disconnectNonEssentialSignals(); - // TODO: script manager pointer is still in use somewhere after the cleanup in lambda. - // To prevent memory leaks on multiple reloads we would need to find all the usages and remove them. - // Script engines are correctly deleted later during shutdown currently. - qDebug() << "_nonPersistentEntitiesScriptManager lambda finished, script manager pointer use count: " << manager.use_count(); + manager->removeFromScriptEngines(); }); } _nonPersistentEntitiesScriptManager = scriptManagerFactory(ScriptManager::ENTITY_CLIENT_SCRIPT, NO_SCRIPT, diff --git a/libraries/script-engine/src/ScriptEngines.h b/libraries/script-engine/src/ScriptEngines.h index 9fb0c78282..671789bd8e 100644 --- a/libraries/script-engine/src/ScriptEngines.h +++ b/libraries/script-engine/src/ScriptEngines.h @@ -184,6 +184,8 @@ public: void addScriptEngine(ScriptManagerPointer); + void removeScriptEngine(ScriptManagerPointer); + ScriptGatekeeper scriptGatekeeper; signals: @@ -336,7 +338,6 @@ protected slots: protected: ScriptManagerPointer reloadScript(const QString& scriptName, bool isUserLoaded = true) { return loadScript(scriptName, isUserLoaded, false, false, true); } - void removeScriptEngine(ScriptManagerPointer); void onScriptEngineLoaded(const QString& scriptFilename); void quitWhenFinished(); void onScriptEngineError(const QString& scriptFilename); diff --git a/libraries/script-engine/src/ScriptManager.cpp b/libraries/script-engine/src/ScriptManager.cpp index a3279eee1e..1a6e6b1326 100644 --- a/libraries/script-engine/src/ScriptManager.cpp +++ b/libraries/script-engine/src/ScriptManager.cpp @@ -519,6 +519,11 @@ void ScriptManager::waitTillDoneRunning(bool shutdown) { } } +void ScriptManager::removeFromScriptEngines() { + Q_ASSERT(_scriptEngines); + _scriptEngines.toStrongRef()->removeScriptEngine(shared_from_this()); +} + QString ScriptManager::getFilename() const { QStringList fileNameParts = _fileNameString.split("/"); QString lastPart; diff --git a/libraries/script-engine/src/ScriptManager.h b/libraries/script-engine/src/ScriptManager.h index af95e1dd79..c4614c401e 100644 --- a/libraries/script-engine/src/ScriptManager.h +++ b/libraries/script-engine/src/ScriptManager.h @@ -471,6 +471,15 @@ public: */ void waitTillDoneRunning(bool shutdown = false); + /** + * @brief Removes shared pointer to script engine from the list of all script engines. + * + * This allows deletion of the script engine once all shared pointer instances are gone. + * This function is called for entity script engines when they are being destroyed. + * + */ + void removeFromScriptEngines(); + /** * @brief Load a script from a given URL *