diff options
author | David Robillard <d@drobilla.net> | 2015-10-30 17:02:07 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2015-10-30 17:02:07 +0000 |
commit | 8510f80faad7a719a97cf14b1a82a1cc2141282b (patch) | |
tree | 11ab0ede29a4a2e29d1e689f6b2cb23ee0da47f1 /src/server/BlockFactory.cpp | |
parent | 2fe35cd17f96a1d393fda203ccaa234b0aa69b16 (diff) | |
download | ingen-8510f80faad7a719a97cf14b1a82a1cc2141282b.tar.gz ingen-8510f80faad7a719a97cf14b1a82a1cc2141282b.tar.bz2 ingen-8510f80faad7a719a97cf14b1a82a1cc2141282b.zip |
Update clients when plugins are unloaded/reloaded
git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@5808 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/server/BlockFactory.cpp')
-rw-r--r-- | src/server/BlockFactory.cpp | 41 |
1 files changed, 38 insertions, 3 deletions
diff --git a/src/server/BlockFactory.cpp b/src/server/BlockFactory.cpp index 0a51e03e..b715ecb7 100644 --- a/src/server/BlockFactory.cpp +++ b/src/server/BlockFactory.cpp @@ -59,14 +59,46 @@ BlockFactory::plugins() { ThreadManager::assert_thread(THREAD_PRE_PROCESS); if (!_has_loaded) { - _has_loaded = true; - // TODO: Plugin list refreshing load_lv2_plugins(); _has_loaded = true; } return _plugins; } +std::set<PluginImpl*> +BlockFactory::refresh() +{ + // Record current plugins, and those that are currently zombies + const Plugins old_plugins(_plugins); + std::set<PluginImpl*> zombies; + for (const auto& p : _plugins) { + if (p.second->is_zombie()) { + zombies.insert(p.second); + } + } + + // Re-load plugins + load_lv2_plugins(); + + // Add any new plugins to response + std::set<PluginImpl*> new_plugins; + for (const auto& p : _plugins) { + Plugins::const_iterator o = old_plugins.find(p.first); + if (o == old_plugins.end()) { + new_plugins.insert(p.second); + } + } + + // Add any resurrected plugins to response + for (const auto& z : zombies) { + if (!z->is_zombie()) { + new_plugins.insert(z); + } + } + + return new_plugins; +} + PluginImpl* BlockFactory::plugin(const Raul::URI& uri) { @@ -182,9 +214,12 @@ BlockFactory::load_lv2_plugins() continue; } - if (_plugins.find(uri) == _plugins.end()) { + Plugins::iterator p = _plugins.find(uri); + if (p == _plugins.end()) { LV2Plugin* const plugin = new LV2Plugin(_world, lv2_plug); _plugins.insert(make_pair(uri, plugin)); + } else if (lilv_plugin_verify(lv2_plug)) { + p->second->set_is_zombie(false); } } |