summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2010-04-02 02:38:42 +0000
committerDavid Robillard <d@drobilla.net>2010-04-02 02:38:42 +0000
commit5fcc724a4bcd9a8111a0a6d483e3d6dcbe97a2d5 (patch)
tree1c3c404e825b7703b34bf965c4e1b87184879bb9
parentbf6140f75321990ba867e9085a7d079ec35a1979 (diff)
downloadingen-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.cpp10
-rw-r--r--src/module/World.cpp5
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();