Mercurial > hg > svcore
diff transform/FeatureExtractionModelTransformer.cpp @ 1237:a83541a1f100 project-file-rework
Ensure plugin is deleted in same thread that created and used it
author | Chris Cannam |
---|---|
date | Fri, 28 Oct 2016 11:32:36 +0100 |
parents | 91ff08313375 |
children | cbdd534f517a |
line wrap: on
line diff
--- a/transform/FeatureExtractionModelTransformer.cpp Fri Oct 28 11:08:17 2016 +0100 +++ b/transform/FeatureExtractionModelTransformer.cpp Fri Oct 28 11:32:36 2016 +0100 @@ -47,8 +47,6 @@ m_haveOutputs(false) { SVDEBUG << "FeatureExtractionModelTransformer::FeatureExtractionModelTransformer: plugin " << m_transforms.begin()->getPluginIdentifier() << ", outputName " << m_transforms.begin()->getOutput() << endl; - -// initialise(); } FeatureExtractionModelTransformer::FeatureExtractionModelTransformer(Input in, @@ -62,8 +60,6 @@ } else { SVDEBUG << "FeatureExtractionModelTransformer::FeatureExtractionModelTransformer: " << transforms.size() << " transform(s), first has plugin " << m_transforms.begin()->getPluginIdentifier() << ", outputName " << m_transforms.begin()->getOutput() << endl; } - -// initialise(); } static bool @@ -77,6 +73,10 @@ bool FeatureExtractionModelTransformer::initialise() { + // This is (now) called from the run thread. The plugin is + // constructed, initialised, used, and destroyed all from a single + // thread. + // All transforms must use the same plugin, parameters, and // inputs: they can differ only in choice of plugin output. So we // initialise based purely on the first transform in the list (but @@ -235,6 +235,18 @@ } void +FeatureExtractionModelTransformer::deinitialise() +{ + cerr << "deleting plugin for transform in thread " + << QThread::currentThreadId() << endl; + + delete m_plugin; + for (int j = 0; j < (int)m_descriptors.size(); ++j) { + delete m_descriptors[j]; + } +} + +void FeatureExtractionModelTransformer::createOutputModels(int n) { DenseTimeValueModel *input = getConformingInput(); @@ -502,11 +514,9 @@ FeatureExtractionModelTransformer::~FeatureExtractionModelTransformer() { -// SVDEBUG << "FeatureExtractionModelTransformer::~FeatureExtractionModelTransformer()" << endl; - delete m_plugin; - for (int j = 0; j < (int)m_descriptors.size(); ++j) { - delete m_descriptors[j]; - } + // Parent class dtor set the abandoned flag and waited for the run + // thread to exit; the run thread owns the plugin, and should have + // destroyed it before exiting (via a call to deinitialise) } FeatureExtractionModelTransformer::Models @@ -781,6 +791,8 @@ delete[] buffers[ch]; } delete[] buffers; + + deinitialise(); } void