Hi Sylvain,
On Thu, 16 Apr 2020 09:30:31 +1000
Anton Blanchard <anton(a)ozlabs.org> wrote:
Hi Sylvain,
Looks to me like this has the potential to just
hang and prevent the
thread from terminating.
This needs bounds. One retry is fine, infinite ones not so much.
Good idea, how does this look?
Just checking to see if this is OK to be merged?
Thanks,
Anton
Anton
--
I'm using an Airspy HF+ Discovery with the Soapy driver. Whenever I
turn AGC off it stops receiving samples.
On closer inspection, switching AGC off results in samples stalling
for an extended period (hundreds of milliseconds). As such, we hit the
timeout in SoapyAirspyHF::readStream() and return SOAPY_SDR_TIMEOUT
(-1).
Things go wrong at this point. It takes a long time before
readStream() is called again, presumably because we returned 0 from
work(). By this time our buffers have overflown, readStream() returns
SOAPY_SDR_OVERFLOW (-2) and work() returns 0. We loop forever,
continually overflowing buffers.
Fix this by looping in soapy_source_c::work() when ->readStream
returns SOAPY_SDR_OVERFLOW so that we consume the buffers straight
away.
Signed-off-by: Anton Blanchard <anton(a)ozlabs.org>
---
lib/soapy/soapy_source_c.cc | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/lib/soapy/soapy_source_c.cc b/lib/soapy/soapy_source_c.cc
index a645361..5c683c9 100644
--- a/lib/soapy/soapy_source_c.cc
+++ b/lib/soapy/soapy_source_c.cc
@@ -96,9 +96,14 @@ int soapy_source_c::work( int noutput_items,
{
int flags = 0;
long long timeNs = 0;
- int ret = _device->readStream(
- _stream, &output_items[0],
- noutput_items, flags, timeNs);
+ int ret;
+ int retries = 1;
+
+ do {
+ ret = _device->readStream(
+ _stream, &output_items[0],
+ noutput_items, flags, timeNs);
+ } while (retries-- && (ret == SOAPY_SDR_OVERFLOW));
if (ret < 0) return 0; //call again
return ret;