Mercurial > hg > vamp-plugin-sdk
comparison src/vamp-sdk/PluginAdapter.cpp @ 467:bd8484e19353 vampipe
Fix long-standing memory leaks (parameter descriptors and feature list container) in plugin adapter
author | Chris Cannam |
---|---|
date | Fri, 14 Oct 2016 09:32:11 +0100 |
parents | abdf03252c8a |
children | 59f7c7ae2f64 |
comparison
equal
deleted
inserted
replaced
466:a94ab90dfd53 | 467:bd8484e19353 |
---|---|
164 #ifdef DEBUG_PLUGIN_ADAPTER | 164 #ifdef DEBUG_PLUGIN_ADAPTER |
165 std::cerr << "PluginAdapterBase::Impl[" << this << "]::getDescriptor" << std::endl; | 165 std::cerr << "PluginAdapterBase::Impl[" << this << "]::getDescriptor" << std::endl; |
166 #endif | 166 #endif |
167 | 167 |
168 if (m_populated) return &m_descriptor; | 168 if (m_populated) return &m_descriptor; |
169 | 169 |
170 Plugin *plugin = m_base->createPlugin(48000); | 170 Plugin *plugin = m_base->createPlugin(48000); |
171 | 171 |
172 if (!plugin) { | 172 if (!plugin) { |
173 std::cerr << "PluginAdapterBase::Impl::getDescriptor: Failed to create plugin" << std::endl; | 173 std::cerr << "PluginAdapterBase::Impl::getDescriptor: Failed to create plugin" << std::endl; |
174 return 0; | 174 return 0; |
296 for (unsigned int j = 0; desc->valueNames[j]; ++j) { | 296 for (unsigned int j = 0; desc->valueNames[j]; ++j) { |
297 free((void *)desc->valueNames[j]); | 297 free((void *)desc->valueNames[j]); |
298 } | 298 } |
299 free((void *)desc->valueNames); | 299 free((void *)desc->valueNames); |
300 } | 300 } |
301 free((void *)desc); | |
301 } | 302 } |
302 free((void *)m_descriptor.parameters); | 303 free((void *)m_descriptor.parameters); |
303 | 304 |
304 for (unsigned int i = 0; i < m_descriptor.programCount; ++i) { | 305 for (unsigned int i = 0; i < m_descriptor.programCount; ++i) { |
305 free((void *)m_descriptor.programs[i]); | 306 free((void *)m_descriptor.programs[i]); |
601 if (m_fs.find(plugin) != m_fs.end()) { | 602 if (m_fs.find(plugin) != m_fs.end()) { |
602 size_t outputCount = 0; | 603 size_t outputCount = 0; |
603 if (m_pluginOutputs[plugin]) { | 604 if (m_pluginOutputs[plugin]) { |
604 outputCount = m_pluginOutputs[plugin]->size(); | 605 outputCount = m_pluginOutputs[plugin]->size(); |
605 } | 606 } |
607 std::cerr << "cleanup: " << outputCount << " output(s)" << std::endl; | |
606 VampFeatureList *list = m_fs[plugin]; | 608 VampFeatureList *list = m_fs[plugin]; |
607 for (unsigned int i = 0; i < outputCount; ++i) { | 609 for (unsigned int i = 0; i < outputCount; ++i) { |
608 for (unsigned int j = 0; j < m_fsizes[plugin][i]; ++j) { | 610 for (unsigned int j = 0; j < m_fsizes[plugin][i]; ++j) { |
609 if (list[i].features[j].v1.label) { | 611 if (list[i].features[j].v1.label) { |
610 free(list[i].features[j].v1.label); | 612 free(list[i].features[j].v1.label); |
613 free(list[i].features[j].v1.values); | 615 free(list[i].features[j].v1.values); |
614 } | 616 } |
615 } | 617 } |
616 if (list[i].features) free(list[i].features); | 618 if (list[i].features) free(list[i].features); |
617 } | 619 } |
620 if (list) free((void *)list); | |
618 m_fs.erase(plugin); | 621 m_fs.erase(plugin); |
619 m_fsizes.erase(plugin); | 622 m_fsizes.erase(plugin); |
620 m_fvsizes.erase(plugin); | 623 m_fvsizes.erase(plugin); |
621 } | 624 } |
622 | 625 |
847 } | 850 } |
848 | 851 |
849 void | 852 void |
850 PluginAdapterBase::Impl::resizeFS(Plugin *plugin, int n) | 853 PluginAdapterBase::Impl::resizeFS(Plugin *plugin, int n) |
851 { | 854 { |
852 // std::cerr << "PluginAdapterBase::Impl::resizeFS(" << plugin << ", " << n << ")" << std::endl; | 855 #ifdef DEBUG_PLUGIN_ADAPTER |
856 std::cerr << "PluginAdapterBase::Impl::resizeFS(" << plugin << ", " << n << ")" << std::endl; | |
857 #endif | |
853 | 858 |
854 int i = m_fsizes[plugin].size(); | 859 int i = m_fsizes[plugin].size(); |
855 if (i >= n) return; | 860 if (i >= n) return; |
856 | 861 |
857 // std::cerr << "resizing from " << i << std::endl; | 862 #ifdef DEBUG_PLUGIN_ADAPTER |
863 std::cerr << "resizing from " << i << std::endl; | |
864 #endif | |
858 | 865 |
859 m_fs[plugin] = (VampFeatureList *)realloc | 866 m_fs[plugin] = (VampFeatureList *)realloc |
860 (m_fs[plugin], n * sizeof(VampFeatureList)); | 867 (m_fs[plugin], n * sizeof(VampFeatureList)); |
861 | 868 |
862 while (i < n) { | 869 while (i < n) { |
869 } | 876 } |
870 | 877 |
871 void | 878 void |
872 PluginAdapterBase::Impl::resizeFL(Plugin *plugin, int n, size_t sz) | 879 PluginAdapterBase::Impl::resizeFL(Plugin *plugin, int n, size_t sz) |
873 { | 880 { |
874 // std::cerr << "PluginAdapterBase::Impl::resizeFL(" << plugin << ", " << n << ", " | 881 #ifdef DEBUG_PLUGIN_ADAPTER |
875 // << sz << ")" << std::endl; | 882 std::cerr << "PluginAdapterBase::Impl::resizeFL(" << plugin << ", " << n << ", " |
876 | 883 << sz << ")" << std::endl; |
884 #endif | |
885 | |
877 size_t i = m_fsizes[plugin][n]; | 886 size_t i = m_fsizes[plugin][n]; |
878 if (i >= sz) return; | 887 if (i >= sz) return; |
879 | 888 |
880 // std::cerr << "resizing from " << i << std::endl; | 889 #ifdef DEBUG_PLUGIN_ADAPTER |
890 std::cerr << "resizing from " << i << std::endl; | |
891 #endif | |
881 | 892 |
882 m_fs[plugin][n].features = (VampFeatureUnion *)realloc | 893 m_fs[plugin][n].features = (VampFeatureUnion *)realloc |
883 (m_fs[plugin][n].features, 2 * sz * sizeof(VampFeatureUnion)); | 894 (m_fs[plugin][n].features, 2 * sz * sizeof(VampFeatureUnion)); |
884 | 895 |
885 while (m_fsizes[plugin][n] < sz) { | 896 while (m_fsizes[plugin][n] < sz) { |
894 } | 905 } |
895 | 906 |
896 void | 907 void |
897 PluginAdapterBase::Impl::resizeFV(Plugin *plugin, int n, int j, size_t sz) | 908 PluginAdapterBase::Impl::resizeFV(Plugin *plugin, int n, int j, size_t sz) |
898 { | 909 { |
899 // std::cerr << "PluginAdapterBase::Impl::resizeFV(" << plugin << ", " << n << ", " | 910 #ifdef DEBUG_PLUGIN_ADAPTER |
900 // << j << ", " << sz << ")" << std::endl; | 911 std::cerr << "PluginAdapterBase::Impl::resizeFV(" << plugin << ", " << n << ", " |
901 | 912 << j << ", " << sz << ")" << std::endl; |
913 #endif | |
914 | |
902 size_t i = m_fvsizes[plugin][n][j]; | 915 size_t i = m_fvsizes[plugin][n][j]; |
903 if (i >= sz) return; | 916 if (i >= sz) return; |
904 | 917 |
905 // std::cerr << "resizing from " << i << std::endl; | 918 #ifdef DEBUG_PLUGIN_ADAPTER |
906 | 919 std::cerr << "resizing from " << i << std::endl; |
920 #endif | |
921 | |
907 m_fs[plugin][n].features[j].v1.values = (float *)realloc | 922 m_fs[plugin][n].features[j].v1.values = (float *)realloc |
908 (m_fs[plugin][n].features[j].v1.values, sz * sizeof(float)); | 923 (m_fs[plugin][n].features[j].v1.values, sz * sizeof(float)); |
909 | 924 |
910 m_fvsizes[plugin][n][j] = sz; | 925 m_fvsizes[plugin][n][j] = sz; |
911 } | 926 } |