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;