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
   inverted.
 - The list item removal and iterator increment was done incorrectly
   and would result in a crash after the first item was fixed.
This commit is contained in:
Jon Szymaniak 2014-03-07 01:44:17 -05:00 committed by Dimitri Stolnikov
parent 79ad6f6a76
commit 2ae3fdbc22
1 changed files with 10 additions and 4 deletions

View File

@ -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 )
_devs.erase(it);
/* 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 {
++it;
}
}
bladerf_close((struct bladerf *)dev);
}