From e88207a73e2b714e4efe36e2b7c00dfdba83b12f Mon Sep 17 00:00:00 2001 From: Simon Walton <simon@highfidelity.io> Date: Fri, 29 Jun 2018 11:34:22 -0700 Subject: [PATCH 01/15] Move script-engine creation to run thread ScriptsModel should be created and destroyed on same thread, or else crash on Windows occurs. See https://github.com/highfidelity/hifi/pull/13492 --- assignment-client/src/Agent.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 42924a8487..956b1d88de 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -76,12 +76,6 @@ Agent::Agent(ReceivedMessage& message) : DependencyManager::set<recording::Recorder>(); DependencyManager::set<recording::ClipCache>(); - DependencyManager::set<ScriptCache>(); - DependencyManager::set<ScriptEngines>(ScriptEngine::AGENT_SCRIPT); - - DependencyManager::set<RecordingScriptingInterface>(); - DependencyManager::set<UsersScriptingInterface>(); - // Needed to ensure the creation of the DebugDraw instance on the main thread DebugDraw::getInstance(); @@ -157,6 +151,11 @@ void Agent::handleAudioPacket(QSharedPointer<ReceivedMessage> message) { static const QString AGENT_LOGGING_NAME = "agent"; void Agent::run() { + DependencyManager::set<ScriptCache>(); + DependencyManager::set<ScriptEngines>(ScriptEngine::AGENT_SCRIPT); + + DependencyManager::set<RecordingScriptingInterface>(); + DependencyManager::set<UsersScriptingInterface>(); // make sure we request our script once the agent connects to the domain auto nodeList = DependencyManager::get<NodeList>(); From 2b997ec159c622c45a19f66bc54c5914948d9026 Mon Sep 17 00:00:00 2001 From: Simon Walton <simon@highfidelity.io> Date: Thu, 5 Jul 2018 14:43:34 -0700 Subject: [PATCH 02/15] Don't reference Agent members after scriptEngine returns The Agent calls the script engine execute loop, which calls the Qt event processor, which may delete the Agent via deleteLater(). Take out unnecessary call to setFinished() to avoid crash. Probably this was a latent bug exposed by the eralier PR changes. --- assignment-client/src/Agent.cpp | 3 +-- libraries/script-engine/src/ScriptEngine.cpp | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 956b1d88de..9a5d69f64b 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -494,8 +494,6 @@ void Agent::executeScript() { Frame::clearFrameHandler(AVATAR_FRAME_TYPE); DependencyManager::destroy<RecordingScriptingInterface>(); - - setFinished(true); } QUuid Agent::getSessionUUID() const { @@ -829,6 +827,7 @@ void Agent::aboutToFinish() { // our entity tree is going to go away so tell that to the EntityScriptingInterface DependencyManager::get<EntityScriptingInterface>()->setEntityTree(nullptr); + DependencyManager::get<EntityScriptingInterface>()->setPacketSender(nullptr); DependencyManager::get<ResourceManager>()->cleanup(); diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 99c02ba1f6..97364a6119 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -1199,7 +1199,8 @@ void ScriptEngine::run() { stopAllTimers(); // make sure all our timers are stopped if the script is ending emit scriptEnding(); - if (entityScriptingInterface->getEntityPacketSender()->serversExist()) { + if (entityScriptingInterface->getEntityPacketSender() && + entityScriptingInterface->getEntityPacketSender()->serversExist()) { // release the queue of edit entity messages. entityScriptingInterface->getEntityPacketSender()->releaseQueuedMessages(); From 363f27cb032728b0cbb4d452b924485ecacc5c3f Mon Sep 17 00:00:00 2001 From: Simon Walton <simon@highfidelity.io> Date: Fri, 6 Jul 2018 10:27:20 -0700 Subject: [PATCH 03/15] Run Agent script on its own thread Uses ScriptEngine::runInThread() so that on takedown the Agent is not deleted under its own executeScript() method. --- assignment-client/src/Agent.cpp | 13 +++++++------ libraries/script-engine/src/ScriptEngine.cpp | 3 +-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 9a5d69f64b..7398e70634 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -488,12 +488,13 @@ void Agent::executeScript() { avatarDataTimer->setTimerType(Qt::PreciseTimer); avatarDataTimer->start(); - _scriptEngine->run(); + connect(_scriptEngine.data(), &ScriptEngine::doneRunning, this, [=]() { + Frame::clearFrameHandler(AUDIO_FRAME_TYPE); + Frame::clearFrameHandler(AVATAR_FRAME_TYPE); + DependencyManager::destroy<RecordingScriptingInterface>(); + setFinished(true); }); - Frame::clearFrameHandler(AUDIO_FRAME_TYPE); - Frame::clearFrameHandler(AVATAR_FRAME_TYPE); - - DependencyManager::destroy<RecordingScriptingInterface>(); + _scriptEngine->runInThread(); } QUuid Agent::getSessionUUID() const { @@ -823,11 +824,11 @@ void Agent::aboutToFinish() { if (_scriptEngine) { _scriptEngine->stop(); + _scriptEngine->waitTillDoneRunning(); } // our entity tree is going to go away so tell that to the EntityScriptingInterface DependencyManager::get<EntityScriptingInterface>()->setEntityTree(nullptr); - DependencyManager::get<EntityScriptingInterface>()->setPacketSender(nullptr); DependencyManager::get<ResourceManager>()->cleanup(); diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 97364a6119..99c02ba1f6 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -1199,8 +1199,7 @@ void ScriptEngine::run() { stopAllTimers(); // make sure all our timers are stopped if the script is ending emit scriptEnding(); - if (entityScriptingInterface->getEntityPacketSender() && - entityScriptingInterface->getEntityPacketSender()->serversExist()) { + if (entityScriptingInterface->getEntityPacketSender()->serversExist()) { // release the queue of edit entity messages. entityScriptingInterface->getEntityPacketSender()->releaseQueuedMessages(); From 000423673e8ccec268e652c356d6771595225ea9 Mon Sep 17 00:00:00 2001 From: Simon Walton <simon@highfidelity.io> Date: Mon, 9 Jul 2018 13:30:44 -0700 Subject: [PATCH 04/15] Don't explicitly destroy script engine; emit finished when actually finished --- assignment-client/src/Agent.cpp | 2 +- libraries/networking/src/ThreadedAssignment.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 42924a8487..caa087e120 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -497,6 +497,7 @@ void Agent::executeScript() { DependencyManager::destroy<RecordingScriptingInterface>(); setFinished(true); + emit finished(); } QUuid Agent::getSessionUUID() const { @@ -838,7 +839,6 @@ void Agent::aboutToFinish() { // destroy all other created dependencies DependencyManager::destroy<ScriptCache>(); - DependencyManager::destroy<ScriptEngines>(); DependencyManager::destroy<ResourceCacheSharedItems>(); DependencyManager::destroy<SoundCache>(); diff --git a/libraries/networking/src/ThreadedAssignment.cpp b/libraries/networking/src/ThreadedAssignment.cpp index 9a69d9b3d8..ad1fc83c65 100644 --- a/libraries/networking/src/ThreadedAssignment.cpp +++ b/libraries/networking/src/ThreadedAssignment.cpp @@ -67,7 +67,7 @@ void ThreadedAssignment::setFinished(bool isFinished) { // call our virtual aboutToFinish method - this gives the ThreadedAssignment subclass a chance to cleanup aboutToFinish(); - emit finished(); + //emit finished(); } } } From 9505f5c6feeec338ecbf9bd61dc09be08b90c386 Mon Sep 17 00:00:00 2001 From: Simon Walton <simon@highfidelity.io> Date: Mon, 9 Jul 2018 13:38:17 -0700 Subject: [PATCH 05/15] Revert current approach --- assignment-client/src/Agent.cpp | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 7398e70634..42924a8487 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -76,6 +76,12 @@ Agent::Agent(ReceivedMessage& message) : DependencyManager::set<recording::Recorder>(); DependencyManager::set<recording::ClipCache>(); + DependencyManager::set<ScriptCache>(); + DependencyManager::set<ScriptEngines>(ScriptEngine::AGENT_SCRIPT); + + DependencyManager::set<RecordingScriptingInterface>(); + DependencyManager::set<UsersScriptingInterface>(); + // Needed to ensure the creation of the DebugDraw instance on the main thread DebugDraw::getInstance(); @@ -151,11 +157,6 @@ void Agent::handleAudioPacket(QSharedPointer<ReceivedMessage> message) { static const QString AGENT_LOGGING_NAME = "agent"; void Agent::run() { - DependencyManager::set<ScriptCache>(); - DependencyManager::set<ScriptEngines>(ScriptEngine::AGENT_SCRIPT); - - DependencyManager::set<RecordingScriptingInterface>(); - DependencyManager::set<UsersScriptingInterface>(); // make sure we request our script once the agent connects to the domain auto nodeList = DependencyManager::get<NodeList>(); @@ -488,13 +489,14 @@ void Agent::executeScript() { avatarDataTimer->setTimerType(Qt::PreciseTimer); avatarDataTimer->start(); - connect(_scriptEngine.data(), &ScriptEngine::doneRunning, this, [=]() { - Frame::clearFrameHandler(AUDIO_FRAME_TYPE); - Frame::clearFrameHandler(AVATAR_FRAME_TYPE); - DependencyManager::destroy<RecordingScriptingInterface>(); - setFinished(true); }); + _scriptEngine->run(); - _scriptEngine->runInThread(); + Frame::clearFrameHandler(AUDIO_FRAME_TYPE); + Frame::clearFrameHandler(AVATAR_FRAME_TYPE); + + DependencyManager::destroy<RecordingScriptingInterface>(); + + setFinished(true); } QUuid Agent::getSessionUUID() const { @@ -824,7 +826,6 @@ void Agent::aboutToFinish() { if (_scriptEngine) { _scriptEngine->stop(); - _scriptEngine->waitTillDoneRunning(); } // our entity tree is going to go away so tell that to the EntityScriptingInterface From 1c23fc75a476879c9c5f5967f54109eeea544420 Mon Sep 17 00:00:00 2001 From: Simon Walton <simon@highfidelity.io> Date: Mon, 9 Jul 2018 16:56:54 -0700 Subject: [PATCH 06/15] Emit finished signal from AC derived classes To avoid Agent destruction-in-use move emit finished from setFinished to Agent methods. For other ACs emit from aboutToFinish(). --- assignment-client/src/Agent.cpp | 2 ++ assignment-client/src/assets/AssetServer.cpp | 1 + assignment-client/src/entities/EntityServer.cpp | 2 ++ assignment-client/src/scripts/EntityScriptServer.cpp | 2 ++ libraries/networking/src/ThreadedAssignment.cpp | 2 -- libraries/networking/src/ThreadedAssignment.h | 2 +- 6 files changed, 8 insertions(+), 3 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index caa087e120..1b36cd7207 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -335,6 +335,7 @@ void Agent::scriptRequestFinished() { } setFinished(true); + emit finished(); } request->deleteLater(); @@ -839,6 +840,7 @@ void Agent::aboutToFinish() { // destroy all other created dependencies DependencyManager::destroy<ScriptCache>(); + DependencyManager::destroy<ScriptEngines>(); DependencyManager::destroy<ResourceCacheSharedItems>(); DependencyManager::destroy<SoundCache>(); diff --git a/assignment-client/src/assets/AssetServer.cpp b/assignment-client/src/assets/AssetServer.cpp index e0c35b7148..7999d55fae 100644 --- a/assignment-client/src/assets/AssetServer.cpp +++ b/assignment-client/src/assets/AssetServer.cpp @@ -342,6 +342,7 @@ void AssetServer::aboutToFinish() { while (_pendingBakes.size() > 0) { QCoreApplication::processEvents(); } + emit finished(); } void AssetServer::run() { diff --git a/assignment-client/src/entities/EntityServer.cpp b/assignment-client/src/entities/EntityServer.cpp index 8b86ba5eb2..4162a4f156 100644 --- a/assignment-client/src/entities/EntityServer.cpp +++ b/assignment-client/src/entities/EntityServer.cpp @@ -72,6 +72,8 @@ void EntityServer::aboutToFinish() { DependencyManager::get<ResourceManager>()->cleanup(); OctreeServer::aboutToFinish(); + + emit finished(); } void EntityServer::handleEntityPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode) { diff --git a/assignment-client/src/scripts/EntityScriptServer.cpp b/assignment-client/src/scripts/EntityScriptServer.cpp index eea8e8b470..6198b03fbe 100644 --- a/assignment-client/src/scripts/EntityScriptServer.cpp +++ b/assignment-client/src/scripts/EntityScriptServer.cpp @@ -582,4 +582,6 @@ void EntityScriptServer::aboutToFinish() { _codec->releaseEncoder(_encoder); _encoder = nullptr; } + + emit finished(); } diff --git a/libraries/networking/src/ThreadedAssignment.cpp b/libraries/networking/src/ThreadedAssignment.cpp index ad1fc83c65..d6c09d2a6c 100644 --- a/libraries/networking/src/ThreadedAssignment.cpp +++ b/libraries/networking/src/ThreadedAssignment.cpp @@ -66,8 +66,6 @@ void ThreadedAssignment::setFinished(bool isFinished) { // call our virtual aboutToFinish method - this gives the ThreadedAssignment subclass a chance to cleanup aboutToFinish(); - - //emit finished(); } } } diff --git a/libraries/networking/src/ThreadedAssignment.h b/libraries/networking/src/ThreadedAssignment.h index 9372cfa667..f245ec917f 100644 --- a/libraries/networking/src/ThreadedAssignment.h +++ b/libraries/networking/src/ThreadedAssignment.h @@ -25,7 +25,7 @@ public: ~ThreadedAssignment() { stop(); } void setFinished(bool isFinished); - virtual void aboutToFinish() { }; + virtual void aboutToFinish() { emit finished(); }; void addPacketStatsAndSendStatsPacket(QJsonObject statsObject); public slots: From 2c629e2ec8fefde1e48ade09e4efe44a93666d82 Mon Sep 17 00:00:00 2001 From: Simon Walton <simon@highfidelity.io> Date: Mon, 9 Jul 2018 17:38:39 -0700 Subject: [PATCH 07/15] Don't destroy ScriptEngines in aboutToFinish() --- assignment-client/src/Agent.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 1b36cd7207..6a637223fe 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -840,7 +840,6 @@ void Agent::aboutToFinish() { // destroy all other created dependencies DependencyManager::destroy<ScriptCache>(); - DependencyManager::destroy<ScriptEngines>(); DependencyManager::destroy<ResourceCacheSharedItems>(); DependencyManager::destroy<SoundCache>(); From a305a6a534ba514d40a2bba85496f022f2df8139 Mon Sep 17 00:00:00 2001 From: Simon Walton <simon@highfidelity.io> Date: Thu, 12 Jul 2018 16:48:41 -0700 Subject: [PATCH 08/15] Emit finished in Agent::aboutToFinish() if script execution hasn't started yet --- assignment-client/src/Agent.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 6a637223fe..1cbe1f66ed 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -828,6 +828,8 @@ void Agent::aboutToFinish() { if (_scriptEngine) { _scriptEngine->stop(); + } else { + emit finished(); } // our entity tree is going to go away so tell that to the EntityScriptingInterface From ab4faca2fd4ad609bed961c4876050b11022f6bf Mon Sep 17 00:00:00 2001 From: Simon Walton <simon@highfidelity.io> Date: Fri, 13 Jul 2018 11:18:28 -0700 Subject: [PATCH 09/15] Emit finished() in new AudioMixer::aboutToFinish(). --- assignment-client/src/audio/AudioMixer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index d56b22466e..2db5a296f7 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -109,6 +109,7 @@ AudioMixer::AudioMixer(ReceivedMessage& message) : void AudioMixer::aboutToFinish() { DependencyManager::destroy<PluginManager>(); + emit finished(); } void AudioMixer::queueAudioPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer node) { From b60ea1f6a28f5a67b60928872f12185a53d1f9b3 Mon Sep 17 00:00:00 2001 From: Simon Walton <simon@highfidelity.io> Date: Mon, 16 Jul 2018 18:25:46 -0700 Subject: [PATCH 10/15] Fixes from reviewer Call base version from aboutToFinish(); add comment for script-engine logic. --- assignment-client/src/Agent.cpp | 8 +++++--- assignment-client/src/assets/AssetServer.cpp | 2 +- assignment-client/src/audio/AudioMixer.cpp | 2 +- assignment-client/src/entities/EntityServer.cpp | 3 +-- assignment-client/src/scripts/EntityScriptServer.cpp | 2 +- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index ca2cf30d68..0be691662d 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -336,7 +336,7 @@ void Agent::scriptRequestFinished() { } setFinished(true); - emit finished(); + ThreadedAssignment::aboutToFinish(); } request->deleteLater(); @@ -499,7 +499,7 @@ void Agent::executeScript() { DependencyManager::destroy<RecordingScriptingInterface>(); setFinished(true); - emit finished(); + ThreadedAssignment::aboutToFinish(); } QUuid Agent::getSessionUUID() const { @@ -827,10 +827,12 @@ void Agent::processAgentAvatarAudio() { void Agent::aboutToFinish() { setIsAvatar(false);// will stop timers for sending identity packets + // If script engine not started yet then finish up, else will be done when + // script engine exits. if (_scriptEngine) { _scriptEngine->stop(); } else { - emit finished(); + ThreadedAssignment::aboutToFinish(); } // our entity tree is going to go away so tell that to the EntityScriptingInterface diff --git a/assignment-client/src/assets/AssetServer.cpp b/assignment-client/src/assets/AssetServer.cpp index 7999d55fae..4ff4078255 100644 --- a/assignment-client/src/assets/AssetServer.cpp +++ b/assignment-client/src/assets/AssetServer.cpp @@ -342,7 +342,7 @@ void AssetServer::aboutToFinish() { while (_pendingBakes.size() > 0) { QCoreApplication::processEvents(); } - emit finished(); + ThreadedAssignment::aboutToFinish(); } void AssetServer::run() { diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 2db5a296f7..ec9f26b53c 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -109,7 +109,7 @@ AudioMixer::AudioMixer(ReceivedMessage& message) : void AudioMixer::aboutToFinish() { DependencyManager::destroy<PluginManager>(); - emit finished(); + ThreadedAssignment::aboutToFinish(); } void AudioMixer::queueAudioPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer node) { diff --git a/assignment-client/src/entities/EntityServer.cpp b/assignment-client/src/entities/EntityServer.cpp index 4162a4f156..6303cafde8 100644 --- a/assignment-client/src/entities/EntityServer.cpp +++ b/assignment-client/src/entities/EntityServer.cpp @@ -72,8 +72,7 @@ void EntityServer::aboutToFinish() { DependencyManager::get<ResourceManager>()->cleanup(); OctreeServer::aboutToFinish(); - - emit finished(); + ThreadedAssignment::aboutToFinish(); } void EntityServer::handleEntityPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode) { diff --git a/assignment-client/src/scripts/EntityScriptServer.cpp b/assignment-client/src/scripts/EntityScriptServer.cpp index a1258fe8db..b40ffbcfb3 100644 --- a/assignment-client/src/scripts/EntityScriptServer.cpp +++ b/assignment-client/src/scripts/EntityScriptServer.cpp @@ -588,5 +588,5 @@ void EntityScriptServer::aboutToFinish() { _encoder = nullptr; } - emit finished(); + ThreadedAssignment::aboutToFinish(); } From 64fc3e1091c3ee4a7777c7641341117e54f3d624 Mon Sep 17 00:00:00 2001 From: Simon Walton <simon@highfidelity.io> Date: Tue, 31 Jul 2018 15:30:33 -0700 Subject: [PATCH 11/15] ThreadedAssignment calls virtual stop() upon domain disconnect --- assignment-client/src/Agent.cpp | 16 ++++++---------- assignment-client/src/Agent.h | 6 ++++++ assignment-client/src/audio/AudioMixer.cpp | 1 - assignment-client/src/entities/EntityServer.cpp | 1 - .../src/scripts/EntityScriptServer.cpp | 2 -- libraries/networking/src/ThreadedAssignment.cpp | 6 ++++-- libraries/networking/src/ThreadedAssignment.h | 2 +- 7 files changed, 17 insertions(+), 17 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 0be691662d..cd4f59332a 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -336,7 +336,6 @@ void Agent::scriptRequestFinished() { } setFinished(true); - ThreadedAssignment::aboutToFinish(); } request->deleteLater(); @@ -499,7 +498,6 @@ void Agent::executeScript() { DependencyManager::destroy<RecordingScriptingInterface>(); setFinished(true); - ThreadedAssignment::aboutToFinish(); } QUuid Agent::getSessionUUID() const { @@ -827,14 +825,6 @@ void Agent::processAgentAvatarAudio() { void Agent::aboutToFinish() { setIsAvatar(false);// will stop timers for sending identity packets - // If script engine not started yet then finish up, else will be done when - // script engine exits. - if (_scriptEngine) { - _scriptEngine->stop(); - } else { - ThreadedAssignment::aboutToFinish(); - } - // our entity tree is going to go away so tell that to the EntityScriptingInterface DependencyManager::get<EntityScriptingInterface>()->setEntityTree(nullptr); @@ -864,3 +854,9 @@ void Agent::aboutToFinish() { _encoder = nullptr; } } + +void Agent::stop() { + if (_scriptEngine) { + _scriptEngine->stop(); + } +} diff --git a/assignment-client/src/Agent.h b/assignment-client/src/Agent.h index 0fc3fbe1f9..a5883805bb 100644 --- a/assignment-client/src/Agent.h +++ b/assignment-client/src/Agent.h @@ -97,6 +97,12 @@ public slots: */ bool isAvatar() const { return _isAvatar; } + /**jsdoc + * @function Agent.stop + * @deprecated This function is being removed from the API. + */ + Q_INVOKABLE virtual void stop() override; + private slots: void requestScript(); void scriptRequestFinished(); diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index ec9f26b53c..d56b22466e 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -109,7 +109,6 @@ AudioMixer::AudioMixer(ReceivedMessage& message) : void AudioMixer::aboutToFinish() { DependencyManager::destroy<PluginManager>(); - ThreadedAssignment::aboutToFinish(); } void AudioMixer::queueAudioPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer node) { diff --git a/assignment-client/src/entities/EntityServer.cpp b/assignment-client/src/entities/EntityServer.cpp index 6303cafde8..8b86ba5eb2 100644 --- a/assignment-client/src/entities/EntityServer.cpp +++ b/assignment-client/src/entities/EntityServer.cpp @@ -72,7 +72,6 @@ void EntityServer::aboutToFinish() { DependencyManager::get<ResourceManager>()->cleanup(); OctreeServer::aboutToFinish(); - ThreadedAssignment::aboutToFinish(); } void EntityServer::handleEntityPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode) { diff --git a/assignment-client/src/scripts/EntityScriptServer.cpp b/assignment-client/src/scripts/EntityScriptServer.cpp index b40ffbcfb3..ebe25b11bf 100644 --- a/assignment-client/src/scripts/EntityScriptServer.cpp +++ b/assignment-client/src/scripts/EntityScriptServer.cpp @@ -587,6 +587,4 @@ void EntityScriptServer::aboutToFinish() { _codec->releaseEncoder(_encoder); _encoder = nullptr; } - - ThreadedAssignment::aboutToFinish(); } diff --git a/libraries/networking/src/ThreadedAssignment.cpp b/libraries/networking/src/ThreadedAssignment.cpp index d6c09d2a6c..13d4e0bf8b 100644 --- a/libraries/networking/src/ThreadedAssignment.cpp +++ b/libraries/networking/src/ThreadedAssignment.cpp @@ -66,6 +66,8 @@ void ThreadedAssignment::setFinished(bool isFinished) { // call our virtual aboutToFinish method - this gives the ThreadedAssignment subclass a chance to cleanup aboutToFinish(); + + emit finished(); } } } @@ -118,7 +120,7 @@ void ThreadedAssignment::checkInWithDomainServerOrExit() { if (_numQueuedCheckIns >= MAX_SILENT_DOMAIN_SERVER_CHECK_INS) { qCDebug(networking) << "At least" << MAX_SILENT_DOMAIN_SERVER_CHECK_INS << "have been queued without a response from domain-server" << "Stopping the current assignment"; - setFinished(true); + stop(); } else { auto nodeList = DependencyManager::get<NodeList>(); QMetaObject::invokeMethod(nodeList.data(), "sendDomainServerCheckIn"); @@ -130,5 +132,5 @@ void ThreadedAssignment::checkInWithDomainServerOrExit() { void ThreadedAssignment::domainSettingsRequestFailed() { qCDebug(networking) << "Failed to retreive settings object from domain-server. Bailing on assignment."; - setFinished(true); + stop(); } diff --git a/libraries/networking/src/ThreadedAssignment.h b/libraries/networking/src/ThreadedAssignment.h index f245ec917f..9372cfa667 100644 --- a/libraries/networking/src/ThreadedAssignment.h +++ b/libraries/networking/src/ThreadedAssignment.h @@ -25,7 +25,7 @@ public: ~ThreadedAssignment() { stop(); } void setFinished(bool isFinished); - virtual void aboutToFinish() { emit finished(); }; + virtual void aboutToFinish() { }; void addPacketStatsAndSendStatsPacket(QJsonObject statsObject); public slots: From d991dd230faa7e14887c97392c853729b685922f Mon Sep 17 00:00:00 2001 From: Simon Walton <simon@highfidelity.io> Date: Tue, 31 Jul 2018 15:39:38 -0700 Subject: [PATCH 12/15] Remove call to aboutToFinish from AssetServer --- assignment-client/src/assets/AssetServer.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/assignment-client/src/assets/AssetServer.cpp b/assignment-client/src/assets/AssetServer.cpp index 4ff4078255..e0c35b7148 100644 --- a/assignment-client/src/assets/AssetServer.cpp +++ b/assignment-client/src/assets/AssetServer.cpp @@ -342,7 +342,6 @@ void AssetServer::aboutToFinish() { while (_pendingBakes.size() > 0) { QCoreApplication::processEvents(); } - ThreadedAssignment::aboutToFinish(); } void AssetServer::run() { From 33a46a6a827082956192af2d47d61b84474a19b8 Mon Sep 17 00:00:00 2001 From: Simon Walton <simon@highfidelity.io> Date: Tue, 31 Jul 2018 15:46:43 -0700 Subject: [PATCH 13/15] Make ThreadedAssignment::setFinished() protected --- libraries/networking/src/ThreadedAssignment.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/ThreadedAssignment.h b/libraries/networking/src/ThreadedAssignment.h index 9372cfa667..6eb72cfe0b 100644 --- a/libraries/networking/src/ThreadedAssignment.h +++ b/libraries/networking/src/ThreadedAssignment.h @@ -24,7 +24,6 @@ public: ThreadedAssignment(ReceivedMessage& message); ~ThreadedAssignment() { stop(); } - void setFinished(bool isFinished); virtual void aboutToFinish() { }; void addPacketStatsAndSendStatsPacket(QJsonObject statsObject); @@ -61,6 +60,7 @@ signals: protected: void commonInit(const QString& targetName, NodeType_t nodeType); + void setFinished(bool isFinished); bool _isFinished; QTimer _domainServerTimer; From 5a92032bdd5f4812a8a8961f427cb6e96181a29e Mon Sep 17 00:00:00 2001 From: Simon Walton <simon@highfidelity.io> Date: Tue, 31 Jul 2018 16:14:00 -0700 Subject: [PATCH 14/15] ThreadedAssignment::stop no longer deprecated --- assignment-client/src/Agent.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/assignment-client/src/Agent.h b/assignment-client/src/Agent.h index 4bc6beb431..7d47c8e713 100644 --- a/assignment-client/src/Agent.h +++ b/assignment-client/src/Agent.h @@ -67,10 +67,6 @@ public slots: void setIsAvatar(bool isAvatar); bool isAvatar() const { return _isAvatar; } - /**jsdoc - * @function Agent.stop - * @deprecated This function is being removed from the API. - */ Q_INVOKABLE virtual void stop() override; private slots: From 6f61642cb09e75e2f21596a30d11a1878a52d076 Mon Sep 17 00:00:00 2001 From: Simon Walton <simon@highfidelity.io> Date: Tue, 31 Jul 2018 18:10:49 -0700 Subject: [PATCH 15/15] Call setFinished() if script engine hasn't started up --- assignment-client/src/Agent.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index fb09efe287..23090e0d84 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -857,5 +857,7 @@ void Agent::aboutToFinish() { void Agent::stop() { if (_scriptEngine) { _scriptEngine->stop(); + } else { + setFinished(true); } }