diff options
author | David Robillard <d@drobilla.net> | 2010-04-02 02:38:42 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2010-04-02 02:38:42 +0000 |
commit | 5fcc724a4bcd9a8111a0a6d483e3d6dcbe97a2d5 (patch) | |
tree | 1c3c404e825b7703b34bf965c4e1b87184879bb9 | |
parent | bf6140f75321990ba867e9085a7d079ec35a1979 (diff) | |
download | ingen-5fcc724a4bcd9a8111a0a6d483e3d6dcbe97a2d5.tar.gz ingen-5fcc724a4bcd9a8111a0a6d483e3d6dcbe97a2d5.tar.bz2 ingen-5fcc724a4bcd9a8111a0a6d483e3d6dcbe97a2d5.zip |
Fix crashes on exit.
git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@2550 a436a847-0d15-0410-975c-d299462d15a1
-rw-r--r-- | src/engine/Engine.cpp | 10 | ||||
-rw-r--r-- | src/module/World.cpp | 5 |
2 files changed, 10 insertions, 5 deletions
diff --git a/src/engine/Engine.cpp b/src/engine/Engine.cpp index a17a58c0..5fdee74a 100644 --- a/src/engine/Engine.cpp +++ b/src/engine/Engine.cpp @@ -83,11 +83,11 @@ Engine::~Engine() { deactivate(); - for (EngineStore::iterator i = engine_store()->begin(); - i != engine_store()->end(); ++i) { - if ( ! PtrCast<GraphObjectImpl>(i->second)->parent() ) - i->second.reset(); - } + SharedPtr<EngineStore> store = engine_store(); + if (store) + for (EngineStore::iterator i = store->begin(); i != store->end(); ++i) + if ( ! PtrCast<GraphObjectImpl>(i->second)->parent() ) + i->second.reset(); delete _broadcaster; delete _node_factory; diff --git a/src/module/World.cpp b/src/module/World.cpp index 727e2dc8..bfdcb7e8 100644 --- a/src/module/World.cpp +++ b/src/module/World.cpp @@ -77,6 +77,9 @@ load_module(const string& name) Shared::module_path(name), Glib::MODULE_BIND_LAZY); + // FIXME: SEGV on exit without this + module->make_resident(); + if (*module) { LOG(info) << "Loaded `" << name << "' from " << INGEN_MODULE_DIR << endl; return SharedPtr<Glib::Module>(module); @@ -129,6 +132,8 @@ struct WorldImpl : public boost::noncopyable { virtual ~WorldImpl() { + local_engine.reset(); + modules.clear(); interface_factories.clear(); script_runners.clear(); |