diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index 35430cf..5389fcc 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -109,6 +109,8 @@ bool CubicSDR::OnInit() { } int CubicSDR::OnExit() { + demodMgr.terminateAll(); + std::cout << "Terminating SDR thread.." << std::endl; sdrThread->terminate(); t_SDR->join(); @@ -123,8 +125,6 @@ int CubicSDR::OnExit() { delete sdrPostThread; delete t_PostSDR; - demodMgr.terminateAll(); - delete threadCmdQueueSDR; delete iqVisualQueue; diff --git a/src/sdr/SDRPostThread.cpp b/src/sdr/SDRPostThread.cpp index 9b5ab71..9681514 100644 --- a/src/sdr/SDRPostThread.cpp +++ b/src/sdr/SDRPostThread.cpp @@ -27,7 +27,9 @@ SDRPostThread::~SDRPostThread() { } void SDRPostThread::bindDemodulator(DemodulatorInstance *demod) { - demodulators_add.push_back(demod); + busy_demod.lock(); + demodulators.push_back(demod); + busy_demod.unlock(); } void SDRPostThread::removeDemodulator(DemodulatorInstance *demod) { @@ -35,7 +37,13 @@ void SDRPostThread::removeDemodulator(DemodulatorInstance *demod) { return; } - demodulators_remove.push_back(demod); + busy_demod.lock(); + std::vector::iterator i = std::find(demodulators.begin(), demodulators.end(), demod); + + if (i != demodulators.end()) { + demodulators.erase(i); + } + busy_demod.unlock(); } void SDRPostThread::setIQDataInQueue(SDRThreadIQDataQueue* iqDataQueue) { @@ -129,25 +137,8 @@ void SDRPostThread::threadMain() { iqVisualQueue.load()->push(visualDataOut); } - - if (demodulators_add.size()) { - while (!demodulators_add.empty()) { - demodulators.push_back(demodulators_add.back()); - demodulators_add.pop_back(); - } - } - if (demodulators_remove.size()) { - while (!demodulators_remove.empty()) { - DemodulatorInstance *demod = demodulators_remove.back(); - demodulators_remove.pop_back(); - - std::vector::iterator i = std::find(demodulators.begin(), demodulators.end(), demod); - - if (i != demodulators.end()) { - demodulators.erase(i); - } - } - } + + busy_demod.lock(); int activeDemods = 0; bool pushedData = false; @@ -226,6 +217,8 @@ void SDRPostThread::threadMain() { } } } + + busy_demod.unlock(); } data_in->decRefCount(); } diff --git a/src/sdr/SDRPostThread.h b/src/sdr/SDRPostThread.h index 142c04b..38362eb 100644 --- a/src/sdr/SDRPostThread.h +++ b/src/sdr/SDRPostThread.h @@ -25,10 +25,9 @@ protected: std::atomic iqDataInQueue; std::atomic iqDataOutQueue; std::atomic iqVisualQueue; - + + std::mutex busy_demod; std::vector demodulators; - std::vector demodulators_add; - std::vector demodulators_remove; std::atomic terminated; iirfilt_crcf dcFilter; int num_vis_samples;