bladerf: Fixed bug in cached device cleanup

A couple issues were present in bladerf_common::close, which caused
entries in the _devs list (our "device cache") to not be removed. This
would result in a stale device handle being used upon attempting to
reopen the device.

Two issues were associated with this bug:
 - The weak_ptr expired() conditional was incorrect; the logic was
 - The list item removal and iterator increment was done incorrectly
   and would result in a crash after the first item was fixed.
Jon Szymaniak 9 years ago committed by Dimitri Stolnikov
parent 4e0a2c28e3
commit 542a3dbb2b
  1. 14

@ -75,14 +75,20 @@ bladerf_sptr bladerf_common:: get_cached_device(struct bladerf_devinfo devinfo)
return bladerf_sptr();
/* This is called when a bladerf_sptr hits a refcount of 0 */
void bladerf_common::close(void* dev)
boost::unique_lock<boost::mutex> lock(_devs_mutex);
std::list<boost::weak_ptr<struct bladerf> >::iterator it;
for (it = _devs.begin(); it != _devs.end(); ++it)
if ( (*it).expired() == 0 )
/* Prune expired entries from device cache */
std::list<boost::weak_ptr<struct bladerf> >::iterator it(_devs.begin());
while ( it != _devs.end() ) {
if ( (*it).expired() ) {
it = _devs.erase(it);
} else {
bladerf_close((struct bladerf *)dev);