mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 15:29:32 +02:00
Merge pull request #13858 from birarda/bug/ess-crash
fix a crash in ESS from missing dependency
This commit is contained in:
commit
24d097502e
3 changed files with 28 additions and 18 deletions
|
@ -24,6 +24,7 @@
|
||||||
#include <plugins/CodecPlugin.h>
|
#include <plugins/CodecPlugin.h>
|
||||||
#include <plugins/PluginManager.h>
|
#include <plugins/PluginManager.h>
|
||||||
#include <ResourceManager.h>
|
#include <ResourceManager.h>
|
||||||
|
#include <ResourceScriptingInterface.h>
|
||||||
#include <ScriptCache.h>
|
#include <ScriptCache.h>
|
||||||
#include <ScriptEngines.h>
|
#include <ScriptEngines.h>
|
||||||
#include <SoundCacheScriptingInterface.h>
|
#include <SoundCacheScriptingInterface.h>
|
||||||
|
@ -55,7 +56,8 @@ int EntityScriptServer::_entitiesScriptEngineCount = 0;
|
||||||
EntityScriptServer::EntityScriptServer(ReceivedMessage& message) : ThreadedAssignment(message) {
|
EntityScriptServer::EntityScriptServer(ReceivedMessage& message) : ThreadedAssignment(message) {
|
||||||
qInstallMessageHandler(messageHandler);
|
qInstallMessageHandler(messageHandler);
|
||||||
|
|
||||||
DependencyManager::get<EntityScriptingInterface>()->setPacketSender(&_entityEditSender);
|
DependencyManager::set<EntityScriptingInterface>(false)->setPacketSender(&_entityEditSender);
|
||||||
|
DependencyManager::set<ResourceScriptingInterface>();
|
||||||
|
|
||||||
DependencyManager::set<ResourceManager>();
|
DependencyManager::set<ResourceManager>();
|
||||||
DependencyManager::set<PluginManager>();
|
DependencyManager::set<PluginManager>();
|
||||||
|
@ -455,8 +457,11 @@ void EntityScriptServer::resetEntitiesScriptEngine() {
|
||||||
auto newEngineSP = qSharedPointerCast<EntitiesScriptEngineProvider>(newEngine);
|
auto newEngineSP = qSharedPointerCast<EntitiesScriptEngineProvider>(newEngine);
|
||||||
DependencyManager::get<EntityScriptingInterface>()->setEntitiesScriptEngine(newEngineSP);
|
DependencyManager::get<EntityScriptingInterface>()->setEntitiesScriptEngine(newEngineSP);
|
||||||
|
|
||||||
disconnect(_entitiesScriptEngine.data(), &ScriptEngine::entityScriptDetailsUpdated,
|
if (_entitiesScriptEngine) {
|
||||||
this, &EntityScriptServer::updateEntityPPS);
|
disconnect(_entitiesScriptEngine.data(), &ScriptEngine::entityScriptDetailsUpdated,
|
||||||
|
this, &EntityScriptServer::updateEntityPPS);
|
||||||
|
}
|
||||||
|
|
||||||
_entitiesScriptEngine.swap(newEngine);
|
_entitiesScriptEngine.swap(newEngine);
|
||||||
connect(_entitiesScriptEngine.data(), &ScriptEngine::entityScriptDetailsUpdated,
|
connect(_entitiesScriptEngine.data(), &ScriptEngine::entityScriptDetailsUpdated,
|
||||||
this, &EntityScriptServer::updateEntityPPS);
|
this, &EntityScriptServer::updateEntityPPS);
|
||||||
|
@ -487,6 +492,21 @@ void EntityScriptServer::shutdownScriptEngine() {
|
||||||
_shuttingDown = true;
|
_shuttingDown = true;
|
||||||
|
|
||||||
clear(); // always clear() on shutdown
|
clear(); // always clear() on shutdown
|
||||||
|
|
||||||
|
auto scriptEngines = DependencyManager::get<ScriptEngines>();
|
||||||
|
scriptEngines->shutdownScripting();
|
||||||
|
|
||||||
|
_entitiesScriptEngine.clear();
|
||||||
|
|
||||||
|
auto entityScriptingInterface = DependencyManager::get<EntityScriptingInterface>();
|
||||||
|
// our entity tree is going to go away so tell that to the EntityScriptingInterface
|
||||||
|
entityScriptingInterface->setEntityTree(nullptr);
|
||||||
|
|
||||||
|
// Should always be true as they are singletons.
|
||||||
|
if (entityScriptingInterface->getPacketSender() == &_entityEditSender) {
|
||||||
|
// The packet sender is about to go away.
|
||||||
|
entityScriptingInterface->setPacketSender(nullptr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EntityScriptServer::addingEntity(const EntityItemID& entityID) {
|
void EntityScriptServer::addingEntity(const EntityItemID& entityID) {
|
||||||
|
@ -559,24 +579,18 @@ void EntityScriptServer::handleOctreePacket(QSharedPointer<ReceivedMessage> mess
|
||||||
void EntityScriptServer::aboutToFinish() {
|
void EntityScriptServer::aboutToFinish() {
|
||||||
shutdownScriptEngine();
|
shutdownScriptEngine();
|
||||||
|
|
||||||
auto entityScriptingInterface = DependencyManager::get<EntityScriptingInterface>();
|
|
||||||
// our entity tree is going to go away so tell that to the EntityScriptingInterface
|
|
||||||
entityScriptingInterface->setEntityTree(nullptr);
|
|
||||||
|
|
||||||
// Should always be true as they are singletons.
|
|
||||||
if (entityScriptingInterface->getPacketSender() == &_entityEditSender) {
|
|
||||||
// The packet sender is about to go away.
|
|
||||||
entityScriptingInterface->setPacketSender(nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
DependencyManager::destroy<AssignmentParentFinder>();
|
DependencyManager::destroy<AssignmentParentFinder>();
|
||||||
|
|
||||||
DependencyManager::get<ResourceManager>()->cleanup();
|
DependencyManager::get<ResourceManager>()->cleanup();
|
||||||
|
|
||||||
DependencyManager::destroy<PluginManager>();
|
DependencyManager::destroy<PluginManager>();
|
||||||
|
|
||||||
|
DependencyManager::destroy<ResourceScriptingInterface>();
|
||||||
|
DependencyManager::destroy<EntityScriptingInterface>();
|
||||||
|
|
||||||
// cleanup the AudioInjectorManager (and any still running injectors)
|
// cleanup the AudioInjectorManager (and any still running injectors)
|
||||||
DependencyManager::destroy<AudioInjectorManager>();
|
DependencyManager::destroy<AudioInjectorManager>();
|
||||||
|
|
||||||
DependencyManager::destroy<ScriptEngines>();
|
DependencyManager::destroy<ScriptEngines>();
|
||||||
DependencyManager::destroy<EntityScriptServerServices>();
|
DependencyManager::destroy<EntityScriptServerServices>();
|
||||||
|
|
||||||
|
|
|
@ -176,9 +176,7 @@ ScriptEngine::ScriptEngine(Context context, const QString& scriptContents, const
|
||||||
_timerFunctionMap(),
|
_timerFunctionMap(),
|
||||||
_fileNameString(fileNameString),
|
_fileNameString(fileNameString),
|
||||||
_arrayBufferClass(new ArrayBufferClass(this)),
|
_arrayBufferClass(new ArrayBufferClass(this)),
|
||||||
_assetScriptingInterface(new AssetScriptingInterface(this)),
|
_assetScriptingInterface(new AssetScriptingInterface(this))
|
||||||
// don't delete `ScriptEngines` until all `ScriptEngine`s are gone
|
|
||||||
_scriptEngines(DependencyManager::get<ScriptEngines>())
|
|
||||||
{
|
{
|
||||||
switch (_context) {
|
switch (_context) {
|
||||||
case Context::CLIENT_SCRIPT:
|
case Context::CLIENT_SCRIPT:
|
||||||
|
|
|
@ -806,8 +806,6 @@ protected:
|
||||||
static const QString _SETTINGS_ENABLE_EXTENDED_EXCEPTIONS;
|
static const QString _SETTINGS_ENABLE_EXTENDED_EXCEPTIONS;
|
||||||
|
|
||||||
Setting::Handle<bool> _enableExtendedJSExceptions { _SETTINGS_ENABLE_EXTENDED_EXCEPTIONS, true };
|
Setting::Handle<bool> _enableExtendedJSExceptions { _SETTINGS_ENABLE_EXTENDED_EXCEPTIONS, true };
|
||||||
|
|
||||||
QSharedPointer<ScriptEngines> _scriptEngines;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
ScriptEnginePointer scriptEngineFactory(ScriptEngine::Context context,
|
ScriptEnginePointer scriptEngineFactory(ScriptEngine::Context context,
|
||||||
|
|
Loading…
Reference in a new issue