1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-03-23 04:44:53 -04:00

Web API and related: fixed memory leaks and some malfunctions

This commit is contained in:
f4exb 2018-02-14 11:27:57 +01:00
parent a1f69ebc2b
commit e8537d6582
7 changed files with 79 additions and 24 deletions

View File

@ -98,13 +98,12 @@ void FileSourceInput::openFileStream()
<< " fileSize: " << fileSize << "bytes"
<< " length: " << m_recordLength << " seconds";
MsgReportFileSourceStreamData *report = MsgReportFileSourceStreamData::create(m_sampleRate,
m_sampleSize,
m_centerFrequency,
m_startingTimeStamp,
m_recordLength); // file stream data
if (getMessageQueueToGUI()) {
MsgReportFileSourceStreamData *report = MsgReportFileSourceStreamData::create(m_sampleRate,
m_sampleSize,
m_centerFrequency,
m_startingTimeStamp,
m_recordLength); // file stream data
getMessageQueueToGUI()->push(report);
}
}
@ -161,9 +160,8 @@ bool FileSourceInput::start()
//applySettings(m_generalSettings, m_settings, true);
qDebug("FileSourceInput::startInput: started");
MsgReportFileSourceAcquisition *report = MsgReportFileSourceAcquisition::create(true); // acquisition on
if (getMessageQueueToGUI()) {
MsgReportFileSourceAcquisition *report = MsgReportFileSourceAcquisition::create(true); // acquisition on
getMessageQueueToGUI()->push(report);
}
@ -184,9 +182,8 @@ void FileSourceInput::stop()
m_deviceDescription.clear();
MsgReportFileSourceAcquisition *report = MsgReportFileSourceAcquisition::create(false); // acquisition off
if (getMessageQueueToGUI()) {
MsgReportFileSourceAcquisition *report = MsgReportFileSourceAcquisition::create(false); // acquisition off
getMessageQueueToGUI()->push(report);
}
}
@ -209,10 +206,10 @@ bool FileSourceInput::deserialize(const QByteArray& data)
MsgConfigureFileSource* message = MsgConfigureFileSource::create(m_settings);
m_inputMessageQueue.push(message);
if (m_guiMessageQueue)
if (getMessageQueueToGUI())
{
MsgConfigureFileSource* messageToGUI = MsgConfigureFileSource::create(m_settings);
m_guiMessageQueue->push(messageToGUI);
getMessageQueueToGUI()->push(messageToGUI);
}
return success;
@ -241,10 +238,10 @@ void FileSourceInput::setCenterFrequency(qint64 centerFrequency)
MsgConfigureFileSource* message = MsgConfigureFileSource::create(m_settings);
m_inputMessageQueue.push(message);
if (m_guiMessageQueue)
if (getMessageQueueToGUI())
{
MsgConfigureFileSource* messageToGUI = MsgConfigureFileSource::create(m_settings);
m_guiMessageQueue->push(messageToGUI);
getMessageQueueToGUI()->push(messageToGUI);
}
}
@ -299,9 +296,8 @@ bool FileSourceInput::handleMessage(const Message& message)
if (m_fileSourceThread != 0)
{
report = MsgReportFileSourceStreamTiming::create(m_fileSourceThread->getSamplesCount());
if (getMessageQueueToGUI()) {
report = MsgReportFileSourceStreamTiming::create(m_fileSourceThread->getSamplesCount());
getMessageQueueToGUI()->push(report);
}
}
@ -361,10 +357,10 @@ int FileSourceInput::webapiRun(
MsgStartStop *message = MsgStartStop::create(run);
m_inputMessageQueue.push(message);
if (m_guiMessageQueue) // forward to GUI if any
if (getMessageQueueToGUI()) // forward to GUI if any
{
MsgStartStop *msgToGUI = MsgStartStop::create(run);
m_guiMessageQueue->push(msgToGUI);
getMessageQueueToGUI()->push(msgToGUI);
}
return 200;

View File

@ -264,7 +264,7 @@ void PerseusInput::closeDevice()
{
if (m_perseusDescriptor)
{
perseus_stop_async_input(m_perseusDescriptor);
if (m_running) { stop(); }
perseus_close(m_perseusDescriptor);
}
}

View File

@ -48,6 +48,7 @@ DSPDeviceSinkEngine::DSPDeviceSinkEngine(uint32_t uid, QObject* parent) :
DSPDeviceSinkEngine::~DSPDeviceSinkEngine()
{
stop();
wait();
}
@ -70,8 +71,11 @@ void DSPDeviceSinkEngine::start()
void DSPDeviceSinkEngine::stop()
{
qDebug() << "DSPDeviceSinkEngine::stop";
DSPExit cmd;
m_syncMessenger.sendWait(cmd);
gotoIdle();
m_state = StNotStarted;
QThread::exit();
// DSPExit cmd;
// m_syncMessenger.sendWait(cmd);
}
bool DSPDeviceSinkEngine::initGeneration()

View File

@ -52,7 +52,8 @@ DSPDeviceSourceEngine::DSPDeviceSourceEngine(uint uid, QObject* parent) :
DSPDeviceSourceEngine::~DSPDeviceSourceEngine()
{
wait();
stop();
wait();
}
void DSPDeviceSourceEngine::run()

View File

@ -386,6 +386,7 @@ int WebAPIAdapterGUI::instancePresetsGet(
}
swgPresets->append(new SWGSDRangel::SWGPresetItem);
swgPresets->back()->init();
swgPresets->back()->setCenterFrequency(preset->getCenterFrequency());
*swgPresets->back()->getType() = preset->isSourcePreset() ? "R" : "T";
*swgPresets->back()->getName() = preset->getDescription();
@ -409,6 +410,7 @@ int WebAPIAdapterGUI::instancePresetPatch(
if (deviceSetIndex >= nbDeviceSets)
{
error.init();
*error.getMessage() = QString("There is no device set at index %1. Number of device sets is %2").arg(deviceSetIndex).arg(nbDeviceSets);
return 404;
}
@ -419,6 +421,7 @@ int WebAPIAdapterGUI::instancePresetPatch(
if (selectedPreset == 0)
{
error.init();
*error.getMessage() = QString("There is no preset [%1, %2, %3]")
.arg(*presetIdentifier->getGroupName())
.arg(presetIdentifier->getCenterFrequency())
@ -430,12 +433,14 @@ int WebAPIAdapterGUI::instancePresetPatch(
if (deviceUI->m_deviceSourceEngine && !selectedPreset->isSourcePreset())
{
error.init();
*error.getMessage() = QString("Preset type (T) and device set type (Rx) mismatch");
return 404;
}
if (deviceUI->m_deviceSinkEngine && selectedPreset->isSourcePreset())
{
error.init();
*error.getMessage() = QString("Preset type (R) and device set type (Tx) mismatch");
return 404;
}
@ -463,6 +468,7 @@ int WebAPIAdapterGUI::instancePresetPut(
if (deviceSetIndex >= nbDeviceSets)
{
error.init();
*error.getMessage() = QString("There is no device set at index %1. Number of device sets is %2").arg(deviceSetIndex).arg(nbDeviceSets);
return 404;
}
@ -473,6 +479,7 @@ int WebAPIAdapterGUI::instancePresetPut(
if (selectedPreset == 0)
{
error.init();
*error.getMessage() = QString("There is no preset [%1, %2, %3]")
.arg(*presetIdentifier->getGroupName())
.arg(presetIdentifier->getCenterFrequency())
@ -485,12 +492,14 @@ int WebAPIAdapterGUI::instancePresetPut(
if (deviceUI->m_deviceSourceEngine && !selectedPreset->isSourcePreset())
{
error.init();
*error.getMessage() = QString("Preset type (T) and device set type (Rx) mismatch");
return 404;
}
if (deviceUI->m_deviceSinkEngine && selectedPreset->isSourcePreset())
{
error.init();
*error.getMessage() = QString("Preset type (R) and device set type (Tx) mismatch");
return 404;
}
@ -519,12 +528,26 @@ int WebAPIAdapterGUI::instancePresetPost(
if (deviceSetIndex >= nbDeviceSets)
{
error.init();
*error.getMessage() = QString("There is no device set at index %1. Number of device sets is %2").arg(deviceSetIndex).arg(nbDeviceSets);
return 404;
}
DeviceUISet *deviceSet = m_mainWindow.m_deviceUIs[deviceSetIndex];
int deviceCenterFrequency = 0;
if (deviceSet->m_deviceSourceEngine) { // Rx
deviceCenterFrequency = deviceSet->m_deviceSourceEngine->getSource()->getCenterFrequency();
} else if (deviceSet->m_deviceSinkEngine) { // Tx
deviceCenterFrequency = deviceSet->m_deviceSinkEngine->getSink()->getCenterFrequency();
} else {
error.init();
*error.getMessage() = QString("Device set error");
return 500;
}
const Preset *selectedPreset = m_mainWindow.m_settings.getPreset(*presetIdentifier->getGroupName(),
presetIdentifier->getCenterFrequency(),
deviceCenterFrequency,
*presetIdentifier->getName());
if (selectedPreset == 0) // save on a new preset
@ -533,9 +556,10 @@ int WebAPIAdapterGUI::instancePresetPost(
}
else
{
error.init();
*error.getMessage() = QString("Preset already exists [%1, %2, %3]")
.arg(*presetIdentifier->getGroupName())
.arg(presetIdentifier->getCenterFrequency())
.arg(deviceCenterFrequency)
.arg(*presetIdentifier->getName());
return 409;
}
@ -1287,6 +1311,7 @@ void WebAPIAdapterGUI::getDeviceSetList(SWGSDRangel::SWGDeviceSetList* deviceSet
void WebAPIAdapterGUI::getDeviceSet(SWGSDRangel::SWGDeviceSet *deviceSet, const DeviceUISet* deviceUISet, int deviceUISetIndex)
{
deviceSet->init();
SWGSDRangel::SWGSamplingDevice *samplingDevice = deviceSet->getSamplingDevice();
samplingDevice->init();
samplingDevice->setIndex(deviceUISetIndex);
@ -1313,6 +1338,7 @@ void WebAPIAdapterGUI::getDeviceSet(SWGSDRangel::SWGDeviceSet *deviceSet, const
for (int i = 0; i < deviceSet->getChannelcount(); i++)
{
channels->append(new SWGSDRangel::SWGChannel);
channels->back()->init();
ChannelSourceAPI *channel = deviceUISet->m_deviceSinkAPI->getChanelAPIAt(i);
channels->back()->setDeltaFrequency(channel->getCenterFrequency());
channels->back()->setIndex(channel->getIndexInDeviceSet());
@ -1343,6 +1369,7 @@ void WebAPIAdapterGUI::getDeviceSet(SWGSDRangel::SWGDeviceSet *deviceSet, const
for (int i = 0; i < deviceSet->getChannelcount(); i++)
{
channels->append(new SWGSDRangel::SWGChannel);
channels->back()->init();
ChannelSinkAPI *channel = deviceUISet->m_deviceSourceAPI->getChanelAPIAt(i);
channels->back()->setDeltaFrequency(channel->getCenterFrequency());
channels->back()->setIndex(channel->getIndexInDeviceSet());

View File

@ -79,6 +79,10 @@ MainCore::MainCore(qtwebapp::LoggerWithFile *logger, const MainParser& parser, Q
MainCore::~MainCore()
{
while (m_deviceSets.size() > 0) {
removeLastDevice();
}
m_apiServer->stop();
m_settings.save();
delete m_apiServer;
@ -338,6 +342,7 @@ void MainCore::removeLastDevice()
m_deviceSets.back()->m_deviceSourceAPI->getPluginInterface()->deleteSampleSourcePluginInstanceInput(
m_deviceSets.back()->m_deviceSourceAPI->getSampleSource());
m_deviceSets.back()->m_deviceSourceAPI->clearBuddiesLists(); // clear old API buddies lists
delete m_deviceSets.back()->m_deviceSourceAPI;
delete m_deviceSets.back();
@ -355,6 +360,7 @@ void MainCore::removeLastDevice()
m_deviceSets.back()->m_deviceSinkAPI->getPluginInterface()->deleteSampleSinkPluginInstanceOutput(
m_deviceSets.back()->m_deviceSinkAPI->getSampleSink());
m_deviceSets.back()->m_deviceSinkAPI->clearBuddiesLists(); // clear old API buddies lists
delete m_deviceSets.back()->m_deviceSinkAPI;
delete m_deviceSets.back();

View File

@ -393,12 +393,14 @@ int WebAPIAdapterSrv::instancePresetFilePut(
}
else
{
error.init();
*error.getMessage() = QString("File %1 not found or not readable").arg(fileName);
return 404;
}
}
else
{
error.init();
*error.getMessage() = QString("Empty file path");
return 404;
}
@ -418,6 +420,7 @@ int WebAPIAdapterSrv::instancePresetFilePost(
if (selectedPreset == 0)
{
error.init();
*error.getMessage() = QString("There is no preset [%1, %2, %3]")
.arg(*presetIdentifier->getGroupName())
.arg(presetIdentifier->getCenterFrequency())
@ -453,12 +456,14 @@ int WebAPIAdapterSrv::instancePresetFilePost(
}
else
{
error.init();
*error.getMessage() = QString("File %1 cannot be written").arg(filePath);
return 404;
}
}
else
{
error.init();
*error.getMessage() = QString("Empty file path");
return 404;
}
@ -496,6 +501,7 @@ int WebAPIAdapterSrv::instancePresetsGet(
}
swgPresets->append(new SWGSDRangel::SWGPresetItem);
swgPresets->back()->init();
swgPresets->back()->setCenterFrequency(preset->getCenterFrequency());
*swgPresets->back()->getType() = preset->isSourcePreset() ? "R" : "T";
*swgPresets->back()->getName() = preset->getDescription();
@ -519,6 +525,7 @@ int WebAPIAdapterSrv::instancePresetPatch(
if (deviceSetIndex >= nbDeviceSets)
{
error.init();
*error.getMessage() = QString("There is no device set at index %1. Number of device sets is %2").arg(deviceSetIndex).arg(nbDeviceSets);
return 404;
}
@ -529,6 +536,7 @@ int WebAPIAdapterSrv::instancePresetPatch(
if (selectedPreset == 0)
{
error.init();
*error.getMessage() = QString("There is no preset [%1, %2, %3]")
.arg(*presetIdentifier->getGroupName())
.arg(presetIdentifier->getCenterFrequency())
@ -540,12 +548,14 @@ int WebAPIAdapterSrv::instancePresetPatch(
if (deviceSet->m_deviceSourceEngine && !selectedPreset->isSourcePreset())
{
error.init();
*error.getMessage() = QString("Preset type (T) and device set type (Rx) mismatch");
return 404;
}
if (deviceSet->m_deviceSinkEngine && selectedPreset->isSourcePreset())
{
error.init();
*error.getMessage() = QString("Preset type (R) and device set type (Tx) mismatch");
return 404;
}
@ -573,6 +583,7 @@ int WebAPIAdapterSrv::instancePresetPut(
if (deviceSetIndex >= nbDeviceSets)
{
error.init();
*error.getMessage() = QString("There is no device set at index %1. Number of device sets is %2").arg(deviceSetIndex).arg(nbDeviceSets);
return 404;
}
@ -583,6 +594,7 @@ int WebAPIAdapterSrv::instancePresetPut(
if (selectedPreset == 0)
{
error.init();
*error.getMessage() = QString("There is no preset [%1, %2, %3]")
.arg(*presetIdentifier->getGroupName())
.arg(presetIdentifier->getCenterFrequency())
@ -595,12 +607,14 @@ int WebAPIAdapterSrv::instancePresetPut(
if (deviceSet->m_deviceSourceEngine && !selectedPreset->isSourcePreset())
{
error.init();
*error.getMessage() = QString("Preset type (T) and device set type (Rx) mismatch");
return 404;
}
if (deviceSet->m_deviceSinkEngine && selectedPreset->isSourcePreset())
{
error.init();
*error.getMessage() = QString("Preset type (R) and device set type (Tx) mismatch");
return 404;
}
@ -629,6 +643,7 @@ int WebAPIAdapterSrv::instancePresetPost(
if (deviceSetIndex >= nbDeviceSets)
{
error.init();
*error.getMessage() = QString("There is no device set at index %1. Number of device sets is %2").arg(deviceSetIndex).arg(nbDeviceSets);
return 404;
}
@ -641,6 +656,7 @@ int WebAPIAdapterSrv::instancePresetPost(
} else if (deviceSet->m_deviceSinkEngine) { // Tx
deviceCenterFrequency = deviceSet->m_deviceSinkEngine->getSink()->getCenterFrequency();
} else {
error.init();
*error.getMessage() = QString("Device set error");
return 500;
}
@ -655,6 +671,7 @@ int WebAPIAdapterSrv::instancePresetPost(
}
else
{
error.init();
*error.getMessage() = QString("Preset already exists [%1, %2, %3]")
.arg(*presetIdentifier->getGroupName())
.arg(deviceCenterFrequency)
@ -684,6 +701,7 @@ int WebAPIAdapterSrv::instancePresetDelete(
if (selectedPreset == 0)
{
error.init();
*error.getMessage() = QString("There is no preset [%1, %2, %3]")
.arg(*response.getGroupName())
.arg(response.getCenterFrequency())
@ -1388,6 +1406,7 @@ void WebAPIAdapterSrv::getDeviceSetList(SWGSDRangel::SWGDeviceSetList* deviceSet
void WebAPIAdapterSrv::getDeviceSet(SWGSDRangel::SWGDeviceSet *swgDeviceSet, const DeviceSet* deviceSet, int deviceUISetIndex)
{
swgDeviceSet->init();
SWGSDRangel::SWGSamplingDevice *samplingDevice = swgDeviceSet->getSamplingDevice();
samplingDevice->init();
samplingDevice->setIndex(deviceUISetIndex);
@ -1414,6 +1433,7 @@ void WebAPIAdapterSrv::getDeviceSet(SWGSDRangel::SWGDeviceSet *swgDeviceSet, con
for (int i = 0; i < swgDeviceSet->getChannelcount(); i++)
{
channels->append(new SWGSDRangel::SWGChannel);
channels->back()->init();
ChannelSourceAPI *channel = deviceSet->m_deviceSinkAPI->getChanelAPIAt(i);
channels->back()->setDeltaFrequency(channel->getCenterFrequency());
channels->back()->setIndex(channel->getIndexInDeviceSet());
@ -1444,6 +1464,7 @@ void WebAPIAdapterSrv::getDeviceSet(SWGSDRangel::SWGDeviceSet *swgDeviceSet, con
for (int i = 0; i < swgDeviceSet->getChannelcount(); i++)
{
channels->append(new SWGSDRangel::SWGChannel);
channels->back()->init();
ChannelSinkAPI *channel = deviceSet->m_deviceSourceAPI->getChanelAPIAt(i);
channels->back()->setDeltaFrequency(channel->getCenterFrequency());
channels->back()->setIndex(channel->getIndexInDeviceSet());