Mercurial > hg > piper-cpp
changeset 57:7aec704705c7
Make the output ID mapper stuff safer by using shared_ptr
author | Chris Cannam <c.cannam@qmul.ac.uk> |
---|---|
date | Mon, 19 Sep 2016 14:43:32 +0100 |
parents | 815e94fedc1c |
children | c38e12d4bbdd |
files | bits/CountingPluginHandleMapper.h bits/PluginHandleMapper.h bits/PreservingPluginHandleMapper.h capnproto/VampnProto.h json/VampJson.h |
diffstat | 5 files changed, 32 insertions(+), 34 deletions(-) [+] |
line wrap: on
line diff
--- a/bits/CountingPluginHandleMapper.h Mon Sep 19 14:10:19 2016 +0100 +++ b/bits/CountingPluginHandleMapper.h Mon Sep 19 14:43:32 2016 +0100 @@ -50,28 +50,21 @@ public: CountingPluginHandleMapper() : m_nextHandle(1) { } - ~CountingPluginHandleMapper() { - for (auto &o: m_outputMappers) { - delete o.second; - } - } - void addPlugin(Vamp::Plugin *p) { if (m_rplugins.find(p) == m_rplugins.end()) { Handle h = m_nextHandle++; m_plugins[h] = p; m_rplugins[p] = h; - m_outputMappers[h] = new DefaultPluginOutputIdMapper(p); + m_outputMappers[h] = + std::make_shared<DefaultPluginOutputIdMapper>(p); } } void removePlugin(Handle h) { if (m_plugins.find(h) == m_plugins.end()) { - std::cerr << "remove: no handle " << h << std::endl; throw NotFound(); } Vamp::Plugin *p = m_plugins[h]; - delete m_outputMappers.at(h); m_outputMappers.erase(h); m_plugins.erase(h); if (isConfigured(h)) { @@ -83,7 +76,6 @@ Handle pluginToHandle(Vamp::Plugin *p) const { if (m_rplugins.find(p) == m_rplugins.end()) { - std::cerr << "pluginToHandle: no plugin " << p << std::endl; throw NotFound(); } return m_rplugins.at(p); @@ -91,26 +83,23 @@ Vamp::Plugin *handleToPlugin(Handle h) const { if (m_plugins.find(h) == m_plugins.end()) { - std::cerr << "handleToPlugin: no handle " << h << std::endl; throw NotFound(); } return m_plugins.at(h); } - //!!! iffy: mapper will move when another plugin is added. return by value? - const PluginOutputIdMapper &pluginToOutputIdMapper(Vamp::Plugin *p) const { + const std::shared_ptr<PluginOutputIdMapper> pluginToOutputIdMapper + (Vamp::Plugin *p) const { // pluginToHandle checks the plugin has been registered with us - std::cerr << "output id mapper requested for plugin with handle " << pluginToHandle(p) << std::endl; - return *m_outputMappers.at(pluginToHandle(p)); + return m_outputMappers.at(pluginToHandle(p)); } - //!!! iffy: mapper will move when another plugin is added. return by value? - const PluginOutputIdMapper &handleToOutputIdMapper(Handle h) const { - std::cerr << "output id mapper requested for handle " << h << std::endl; + const std::shared_ptr<PluginOutputIdMapper> handleToOutputIdMapper + (Handle h) const { if (m_plugins.find(h) == m_plugins.end()) { throw NotFound(); } - return *m_outputMappers.at(h); + return m_outputMappers.at(h); } bool isConfigured(Handle h) const { @@ -144,7 +133,7 @@ std::set<Handle> m_configuredPlugins; std::map<Handle, int> m_channelCounts; std::map<Handle, int> m_blockSizes; - std::map<Handle, DefaultPluginOutputIdMapper *> m_outputMappers; + std::map<Handle, std::shared_ptr<PluginOutputIdMapper>> m_outputMappers; }; }
--- a/bits/PluginHandleMapper.h Mon Sep 19 14:10:19 2016 +0100 +++ b/bits/PluginHandleMapper.h Mon Sep 19 14:43:32 2016 +0100 @@ -35,9 +35,10 @@ #ifndef VAMPIPE_PLUGIN_HANDLE_MAPPER_H #define VAMPIPE_PLUGIN_HANDLE_MAPPER_H +#include "PluginOutputIdMapper.h" + #include <vamp-hostsdk/Plugin.h> - -#include "PluginOutputIdMapper.h" +#include <memory> namespace vampipe { @@ -58,8 +59,11 @@ virtual Handle pluginToHandle(Vamp::Plugin *) const = 0; // may throw NotFound virtual Vamp::Plugin *handleToPlugin(Handle) const = 0; // may throw NotFound - virtual const PluginOutputIdMapper &pluginToOutputIdMapper(Vamp::Plugin *p) const = 0; // may throw NotFound - virtual const PluginOutputIdMapper &handleToOutputIdMapper(Handle h) const = 0; // may throw NotFound + virtual const std::shared_ptr<PluginOutputIdMapper> pluginToOutputIdMapper + (Vamp::Plugin *p) const = 0; // may throw NotFound + + virtual const std::shared_ptr<PluginOutputIdMapper> handleToOutputIdMapper + (Handle h) const = 0; // may throw NotFound }; }
--- a/bits/PreservingPluginHandleMapper.h Mon Sep 19 14:10:19 2016 +0100 +++ b/bits/PreservingPluginHandleMapper.h Mon Sep 19 14:43:32 2016 +0100 @@ -49,7 +49,10 @@ class PreservingPluginHandleMapper : public PluginHandleMapper { public: - PreservingPluginHandleMapper() : m_handle(0), m_plugin(0) { } + PreservingPluginHandleMapper() : + m_handle(0), + m_plugin(0), + m_omapper(std::make_shared<PreservingPluginOutputIdMapper>()) { } virtual Handle pluginToHandle(Vamp::Plugin *p) const { if (p == m_plugin) return m_handle; @@ -68,18 +71,20 @@ return m_plugin; } - virtual const PluginOutputIdMapper &pluginToOutputIdMapper(Vamp::Plugin *) const { + virtual const std::shared_ptr<PluginOutputIdMapper> pluginToOutputIdMapper + (Vamp::Plugin *) const { return m_omapper; } - virtual const PluginOutputIdMapper &handleToOutputIdMapper(Handle h) const { + virtual const std::shared_ptr<PluginOutputIdMapper> handleToOutputIdMapper + (Handle h) const { return m_omapper; } private: mutable Handle m_handle; mutable Vamp::Plugin *m_plugin; - PreservingPluginOutputIdMapper m_omapper; + std::shared_ptr<PreservingPluginOutputIdMapper> m_omapper; }; }
--- a/capnproto/VampnProto.h Mon Sep 19 14:10:19 2016 +0100 +++ b/capnproto/VampnProto.h Mon Sep 19 14:43:32 2016 +0100 @@ -661,7 +661,7 @@ b.setPluginHandle(pmapper.pluginToHandle(pr.plugin)); auto f = b.initFeatures(); buildFeatureSet(f, pr.features, - pmapper.pluginToOutputIdMapper(pr.plugin)); + *pmapper.pluginToOutputIdMapper(pr.plugin)); } static void @@ -672,7 +672,7 @@ auto h = r.getPluginHandle(); pr.plugin = pmapper.handleToPlugin(h); readFeatureSet(pr.features, r.getFeatures(), - pmapper.handleToOutputIdMapper(r.getPluginHandle())); + *pmapper.handleToOutputIdMapper(r.getPluginHandle())); } static void
--- a/json/VampJson.h Mon Sep 19 14:10:19 2016 +0100 +++ b/json/VampJson.h Mon Sep 19 14:43:32 2016 +0100 @@ -1011,7 +1011,7 @@ json11::Json::object po; po["pluginHandle"] = pmapper.pluginToHandle(resp.plugin); po["features"] = fromFeatureSet(resp.features, - pmapper.pluginToOutputIdMapper(resp.plugin), + *pmapper.pluginToOutputIdMapper(resp.plugin), serialisation); jo["content"] = po; return json11::Json(jo); @@ -1041,7 +1041,7 @@ json11::Json::object po; po["pluginHandle"] = pmapper.pluginToHandle(resp.plugin); po["features"] = fromFeatureSet(resp.features, - pmapper.pluginToOutputIdMapper(resp.plugin), + *pmapper.pluginToOutputIdMapper(resp.plugin), serialisation); jo["content"] = po; return json11::Json(jo); @@ -1184,7 +1184,7 @@ auto h = jc["pluginHandle"].int_value(); resp.plugin = pmapper.handleToPlugin(h); resp.features = toFeatureSet(jc["features"], - pmapper.handleToOutputIdMapper(h), + *pmapper.handleToOutputIdMapper(h), serialisation); } return resp; @@ -1211,7 +1211,7 @@ auto h = jc["pluginHandle"].int_value(); resp.plugin = pmapper.handleToPlugin(h); resp.features = toFeatureSet(jc["features"], - pmapper.handleToOutputIdMapper(h), + *pmapper.handleToOutputIdMapper(h), serialisation); } return resp;