# HG changeset patch # User Chris Cannam # Date 1190989965 0 # Node ID 57d7889f626c618fcaf01b201269b61b68212ed5 # Parent c022976d18e8859e03c3c37b64e789fb8319b7cf * Unload feature extraction plugin .so when destroyed diff -r c022976d18e8 -r 57d7889f626c plugin/FeatureExtractionPluginFactory.cpp --- a/plugin/FeatureExtractionPluginFactory.cpp Fri Sep 28 13:56:38 2007 +0000 +++ b/plugin/FeatureExtractionPluginFactory.cpp Fri Sep 28 14:32:45 2007 +0000 @@ -18,6 +18,7 @@ #include "vamp/vamp.h" #include "vamp-sdk/PluginHostAdapter.h" +#include "vamp-sdk/hostext/PluginWrapper.h" #include "system/System.h" @@ -30,6 +31,25 @@ //#define DEBUG_PLUGIN_SCAN_AND_INSTANTIATE 1 +class PluginDeletionNotifyAdapter : public Vamp::HostExt::PluginWrapper { +public: + PluginDeletionNotifyAdapter(Vamp::Plugin *plugin, + FeatureExtractionPluginFactory *factory) : + PluginWrapper(plugin), m_factory(factory) { } + virtual ~PluginDeletionNotifyAdapter(); +protected: + FeatureExtractionPluginFactory *m_factory; +}; + +PluginDeletionNotifyAdapter::~PluginDeletionNotifyAdapter() +{ + // see notes in vamp-sdk/hostext/PluginLoader.cpp from which this is drawn + Vamp::Plugin *p = m_plugin; + delete m_plugin; + m_plugin = 0; + if (m_factory) m_factory->pluginDeleted(p); +} + static FeatureExtractionPluginFactory *_nativeInstance = 0; FeatureExtractionPluginFactory * @@ -276,6 +296,7 @@ float inputSampleRate) { Vamp::Plugin *rv = 0; + Vamp::PluginHostAdapter *plugin = 0; const VampPluginDescriptor *descriptor = 0; int index = 0; @@ -328,7 +349,12 @@ goto done; } - rv = new Vamp::PluginHostAdapter(descriptor, inputSampleRate); + plugin = new Vamp::PluginHostAdapter(descriptor, inputSampleRate); + + if (plugin) { + m_handleMap[plugin] = libraryHandle; + rv = new PluginDeletionNotifyAdapter(plugin, this); + } // std::cerr << "FeatureExtractionPluginFactory::instantiatePlugin: Constructed Vamp plugin, rv is " << rv << std::endl; @@ -346,6 +372,17 @@ return rv; } +void +FeatureExtractionPluginFactory::pluginDeleted(Vamp::Plugin *plugin) +{ + void *handle = m_handleMap[plugin]; + if (handle) { + std::cerr << "unloading library " << handle << " for plugin " << plugin << std::endl; + DLCLOSE(handle); + } + m_handleMap.erase(plugin); +} + QString FeatureExtractionPluginFactory::getPluginCategory(QString identifier) { diff -r c022976d18e8 -r 57d7889f626c plugin/FeatureExtractionPluginFactory.h --- a/plugin/FeatureExtractionPluginFactory.h Fri Sep 28 13:56:38 2007 +0000 +++ b/plugin/FeatureExtractionPluginFactory.h Fri Sep 28 14:32:45 2007 +0000 @@ -51,6 +51,10 @@ std::vector m_pluginPath; std::map m_taxonomy; + friend class PluginDeletionNotifyAdapter; + void pluginDeleted(Vamp::Plugin *); + std::map m_handleMap; + void generateTaxonomy(); };