From 9aacd136b88fd41f0bf872a882a6db440a088ca2 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Wed, 14 Aug 2019 13:51:40 -0700 Subject: [PATCH] Add blocking to script unload for client entity-scripts --- interface/src/Application.cpp | 1 - libraries/entities-renderer/src/EntityTreeRenderer.cpp | 2 +- libraries/script-engine/src/ScriptEngine.cpp | 5 +++-- libraries/script-engine/src/ScriptEngine.h | 3 ++- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 481975caac..0df377a4f2 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2761,7 +2761,6 @@ void Application::cleanupBeforeQuit() { } getEntities()->shutdown(); // tell the entities system we're shutting down, so it will stop running scripts - getEntities()->clear(); // Clear any queued processing (I/O, FBX/OBJ/Texture parsing) QThreadPool::globalInstance()->clear(); diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 305384361d..fd82567a94 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -253,7 +253,7 @@ void EntityTreeRenderer::clear() { // unload and stop the engine if (_entitiesScriptEngine) { // do this here (instead of in deleter) to avoid marshalling unload signals back to this thread - _entitiesScriptEngine->unloadAllEntityScripts(); + _entitiesScriptEngine->unloadAllEntityScripts(true); _entitiesScriptEngine->stop(); } diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 5e20f06a7f..6808da2e1a 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -2470,13 +2470,14 @@ QList ScriptEngine::getListOfEntityScriptIDs() { return _entityScripts.keys(); } -void ScriptEngine::unloadAllEntityScripts() { +void ScriptEngine::unloadAllEntityScripts(bool blockingCall) { if (QThread::currentThread() != thread()) { #ifdef THREAD_DEBUGGING qCDebug(scriptengine) << "*** WARNING *** ScriptEngine::unloadAllEntityScripts() called on wrong thread [" << QThread::currentThread() << "], invoking on correct thread [" << thread() << "]"; #endif - QMetaObject::invokeMethod(this, "unloadAllEntityScripts"); + QMetaObject::invokeMethod(this, "unloadAllEntityScripts", + blockingCall ? Qt::BlockingQueuedConnection : Qt::QueuedConnection); return; } #ifdef THREAD_DEBUGGING diff --git a/libraries/script-engine/src/ScriptEngine.h b/libraries/script-engine/src/ScriptEngine.h index 52ece63dc2..d738b13ecc 100644 --- a/libraries/script-engine/src/ScriptEngine.h +++ b/libraries/script-engine/src/ScriptEngine.h @@ -578,9 +578,10 @@ public: /**jsdoc * @function Script.unloadAllEntityScripts + * @param {boolean} [blockingCall=false] - Wait for completion if call moved to another thread. * @deprecated This function is deprecated and will be removed. */ - Q_INVOKABLE void unloadAllEntityScripts(); + Q_INVOKABLE void unloadAllEntityScripts(bool blockingCall = false); /**jsdoc * Calls a method in an entity script.