forked from sdr/gr-osmosdr
rtl, osmosdr: reorder buffer allocation to prevent memory leak
the leak would occur if the requested device could not be opened
This commit is contained in:
parent
237385a0c3
commit
05700e6092
|
@ -65,7 +65,10 @@ osmosdr_make_src_c (const std::string &args)
|
||||||
osmosdr_src_c::osmosdr_src_c (const std::string &args)
|
osmosdr_src_c::osmosdr_src_c (const std::string &args)
|
||||||
: gr_sync_block ("osmosdr_src_c",
|
: gr_sync_block ("osmosdr_src_c",
|
||||||
gr_make_io_signature (0, 0, sizeof (gr_complex)),
|
gr_make_io_signature (0, 0, sizeof (gr_complex)),
|
||||||
args_to_io_signature(args))
|
args_to_io_signature(args)),
|
||||||
|
_running(true),
|
||||||
|
_auto_gain(false),
|
||||||
|
_skipped(0)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
unsigned int dev_index = 0, mcr = 0;
|
unsigned int dev_index = 0, mcr = 0;
|
||||||
|
@ -80,15 +83,17 @@ osmosdr_src_c::osmosdr_src_c (const std::string &args)
|
||||||
mcr = (unsigned int) boost::lexical_cast< double >( dict["mcr"] );
|
mcr = (unsigned int) boost::lexical_cast< double >( dict["mcr"] );
|
||||||
|
|
||||||
if (mcr != 0)
|
if (mcr != 0)
|
||||||
throw std::runtime_error("Setting the master clock rate is not supported.");
|
throw std::runtime_error("FIXME: Setting the MCR is not supported.");
|
||||||
|
|
||||||
if (dict.count("nchan"))
|
if (dict.count("nchan"))
|
||||||
nchan = boost::lexical_cast< size_t >( dict["nchan"] );
|
nchan = boost::lexical_cast< size_t >( dict["nchan"] );
|
||||||
|
|
||||||
if (nchan != 1)
|
if (nchan != 1)
|
||||||
throw std::runtime_error("Values of nchan != 1 are not supported.");
|
throw std::runtime_error("FIXME: Values of nchan != 1 are not supported.");
|
||||||
|
|
||||||
_buf_num = BUF_NUM;
|
_buf_num = BUF_NUM;
|
||||||
|
_buf_head = _buf_used = _buf_offset = 0;
|
||||||
|
_samp_avail = BUF_SIZE / BYTES_PER_SAMPLE;
|
||||||
|
|
||||||
if (dict.count("buffers")) {
|
if (dict.count("buffers")) {
|
||||||
_buf_num = (unsigned int)boost::lexical_cast< double >( dict["buffers"] );
|
_buf_num = (unsigned int)boost::lexical_cast< double >( dict["buffers"] );
|
||||||
|
@ -98,14 +103,6 @@ osmosdr_src_c::osmosdr_src_c (const std::string &args)
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
_buf = (unsigned short **) malloc(_buf_num * sizeof(unsigned short *));
|
|
||||||
|
|
||||||
for(unsigned int i = 0; i < _buf_num; ++i)
|
|
||||||
_buf[i] = (unsigned short *) malloc(BUF_SIZE);
|
|
||||||
|
|
||||||
_buf_head = _buf_used = _buf_offset = 0;
|
|
||||||
_samp_avail = BUF_SIZE / BYTES_PER_SAMPLE;
|
|
||||||
|
|
||||||
if ( dev_index >= osmosdr_get_device_count() )
|
if ( dev_index >= osmosdr_get_device_count() )
|
||||||
throw std::runtime_error("Wrong osmosdr device index given.");
|
throw std::runtime_error("Wrong osmosdr device index given.");
|
||||||
|
|
||||||
|
@ -118,23 +115,22 @@ osmosdr_src_c::osmosdr_src_c (const std::string &args)
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
throw std::runtime_error("Failed to open osmosdr device.");
|
throw std::runtime_error("Failed to open osmosdr device.");
|
||||||
|
|
||||||
ret = osmosdr_set_sample_rate( _dev, 500000 );
|
ret = osmosdr_set_sample_rate( _dev, 1000000 );
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
throw std::runtime_error("Failed to set default samplerate.");
|
throw std::runtime_error("Failed to set default samplerate.");
|
||||||
|
|
||||||
|
ret = osmosdr_set_tuner_gain_mode(_dev, int(!_auto_gain));
|
||||||
|
if (ret < 0)
|
||||||
|
throw std::runtime_error("Failed to enable manual gain mode.");
|
||||||
|
|
||||||
ret = osmosdr_reset_buffer( _dev );
|
ret = osmosdr_reset_buffer( _dev );
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
throw std::runtime_error("Failed to reset usb buffers.");
|
throw std::runtime_error("Failed to reset usb buffers.");
|
||||||
|
|
||||||
ret = osmosdr_set_tuner_gain_mode(_dev, 1);
|
_buf = (unsigned short **) malloc(_buf_num * sizeof(unsigned short *));
|
||||||
if (ret < 0)
|
|
||||||
throw std::runtime_error("Failed to enable manual gain mode.");
|
|
||||||
|
|
||||||
_running = true;
|
for(unsigned int i = 0; i < _buf_num; ++i)
|
||||||
|
_buf[i] = (unsigned short *) malloc(BUF_SIZE);
|
||||||
_auto_gain = false;
|
|
||||||
|
|
||||||
_skipped = 0;
|
|
||||||
|
|
||||||
_thread = gruel::thread(_osmosdr_wait, this);
|
_thread = gruel::thread(_osmosdr_wait, this);
|
||||||
}
|
}
|
||||||
|
@ -174,11 +170,6 @@ void osmosdr_src_c::osmosdr_callback(unsigned char *buf, uint32_t len)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (len != BUF_SIZE) {
|
|
||||||
printf("U(%d)\n", len); fflush(stdout);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
{
|
||||||
boost::mutex::scoped_lock lock( _buf_mutex );
|
boost::mutex::scoped_lock lock( _buf_mutex );
|
||||||
|
|
||||||
|
|
|
@ -79,7 +79,10 @@ static const int MAX_OUT = 1; // maximum number of output streams
|
||||||
rtl_source_c::rtl_source_c (const std::string &args)
|
rtl_source_c::rtl_source_c (const std::string &args)
|
||||||
: gr_sync_block ("rtl_source_c",
|
: gr_sync_block ("rtl_source_c",
|
||||||
gr_make_io_signature (MIN_IN, MAX_IN, sizeof (gr_complex)),
|
gr_make_io_signature (MIN_IN, MAX_IN, sizeof (gr_complex)),
|
||||||
gr_make_io_signature (MIN_OUT, MAX_OUT, sizeof (gr_complex)))
|
gr_make_io_signature (MIN_OUT, MAX_OUT, sizeof (gr_complex))),
|
||||||
|
_running(true),
|
||||||
|
_auto_gain(false),
|
||||||
|
_skipped(0)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
unsigned int dev_index = 0, rtl_freq = 0, tuner_freq = 0;
|
unsigned int dev_index = 0, rtl_freq = 0, tuner_freq = 0;
|
||||||
|
@ -96,6 +99,8 @@ rtl_source_c::rtl_source_c (const std::string &args)
|
||||||
tuner_freq = (unsigned int)boost::lexical_cast< double >( dict["tuner_xtal"] );
|
tuner_freq = (unsigned int)boost::lexical_cast< double >( dict["tuner_xtal"] );
|
||||||
|
|
||||||
_buf_num = BUF_NUM;
|
_buf_num = BUF_NUM;
|
||||||
|
_buf_head = _buf_used = _buf_offset = 0;
|
||||||
|
_samp_avail = BUF_SIZE / BYTES_PER_SAMPLE;
|
||||||
|
|
||||||
if (dict.count("buffers")) {
|
if (dict.count("buffers")) {
|
||||||
_buf_num = (unsigned int)boost::lexical_cast< double >( dict["buffers"] );
|
_buf_num = (unsigned int)boost::lexical_cast< double >( dict["buffers"] );
|
||||||
|
@ -105,14 +110,6 @@ rtl_source_c::rtl_source_c (const std::string &args)
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
_buf = (unsigned short **) malloc(_buf_num * sizeof(unsigned short *));
|
|
||||||
|
|
||||||
for(unsigned int i = 0; i < _buf_num; ++i)
|
|
||||||
_buf[i] = (unsigned short *) malloc(BUF_SIZE);
|
|
||||||
|
|
||||||
_buf_head = _buf_used = _buf_offset = 0;
|
|
||||||
_samp_avail = BUF_SIZE / BYTES_PER_SAMPLE;
|
|
||||||
|
|
||||||
// create a lookup table for gr_complex values
|
// create a lookup table for gr_complex values
|
||||||
for (unsigned int i = 0; i <= 0xffff; i++) {
|
for (unsigned int i = 0; i <= 0xffff; i++) {
|
||||||
#if 1 // little endian
|
#if 1 // little endian
|
||||||
|
@ -152,19 +149,18 @@ rtl_source_c::rtl_source_c (const std::string &args)
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
throw std::runtime_error("Failed to set default samplerate.");
|
throw std::runtime_error("Failed to set default samplerate.");
|
||||||
|
|
||||||
|
ret = rtlsdr_set_tuner_gain_mode(_dev, int(!_auto_gain));
|
||||||
|
if (ret < 0)
|
||||||
|
throw std::runtime_error("Failed to enable manual gain mode.");
|
||||||
|
|
||||||
ret = rtlsdr_reset_buffer( _dev );
|
ret = rtlsdr_reset_buffer( _dev );
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
throw std::runtime_error("Failed to reset usb buffers.");
|
throw std::runtime_error("Failed to reset usb buffers.");
|
||||||
|
|
||||||
ret = rtlsdr_set_tuner_gain_mode(_dev, 1);
|
_buf = (unsigned short **) malloc(_buf_num * sizeof(unsigned short *));
|
||||||
if (ret < 0)
|
|
||||||
throw std::runtime_error("Failed to enable manual gain mode.");
|
|
||||||
|
|
||||||
_running = true;
|
for(unsigned int i = 0; i < _buf_num; ++i)
|
||||||
|
_buf[i] = (unsigned short *) malloc(BUF_SIZE);
|
||||||
_auto_gain = false;
|
|
||||||
|
|
||||||
_skipped = 0;
|
|
||||||
|
|
||||||
_thread = gruel::thread(_rtlsdr_wait, this);
|
_thread = gruel::thread(_rtlsdr_wait, this);
|
||||||
}
|
}
|
||||||
|
@ -204,11 +200,6 @@ void rtl_source_c::rtlsdr_callback(unsigned char *buf, uint32_t len)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (len != BUF_SIZE) {
|
|
||||||
printf("U(%d)\n", len); fflush(stdout);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
{
|
||||||
boost::mutex::scoped_lock lock( _buf_mutex );
|
boost::mutex::scoped_lock lock( _buf_mutex );
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue