1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2026-08-14 23:43:43 -04:00

Fix memory leak and race condition relating to DSP*Engines. Part of #2159

This commit is contained in:
srcejon
2024-11-14 11:42:53 +00:00
parent 7c7a7d7c1e
commit 6dcc342c10
3 changed files with 37 additions and 17 deletions
+23 -6
View File
@@ -778,10 +778,19 @@ void RemoveDeviceSetFSM::removeUI()
void RemoveDeviceSetFSM::stopEngine()
{
qDebug() << "RemoveDeviceSetFSM::stopEngine";
QThread *thread = m_mainWindow->m_dspEngine->removeDeviceEngineAt(m_deviceSetIndex);
if (thread && !thread->isFinished()) // FIXME: Is there a race condition here? We might need to connect before calling thread->exit
QThread *thread = m_mainWindow->m_dspEngine->getDeviceEngineThread(m_deviceSetIndex);
if (thread)
{
connect(thread, &QThread::finished, m_mainWindow, &MainWindow::engineStopped);
bool finished = thread->isFinished();
if (!finished) {
connect(thread, &QThread::finished, m_mainWindow, &MainWindow::engineStopped);
}
m_mainWindow->m_dspEngine->removeDeviceEngineAt(m_deviceSetIndex);
if (finished) {
emit m_mainWindow->engineStopped();
}
}
else
{
@@ -801,12 +810,20 @@ void RemoveDeviceSetFSM::removeDeviceSet()
DeviceAPI *deviceAPI = m_deviceUISet->m_deviceAPI;
delete m_deviceUISet;
if (m_deviceSourceEngine) {
if (m_deviceSourceEngine)
{
delete deviceAPI->getSampleSource();
} else if (m_deviceSinkEngine) {
delete m_deviceSourceEngine;
}
else if (m_deviceSinkEngine)
{
delete deviceAPI->getSampleSink();
} else {
delete m_deviceSinkEngine;
}
else
{
delete deviceAPI->getSampleMIMO();
delete m_deviceMIMOEngine;
}
delete deviceAPI;