aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Szymaniak <jon.szymaniak@gmail.com>2014-03-07 01:44:17 -0500
committerDimitri Stolnikov <horiz0n@gmx.net>2014-03-10 15:36:59 +0100
commit542a3dbb2beeaab198f025344072438f88cd7747 (patch)
tree93974bf56039d8fee9aa64f55bd637d10a2890b8
parent4e0a2c28e3399ad7a67b7a4baff5f59f4d633fca (diff)
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.
-rw-r--r--lib/bladerf/bladerf_common.cc14
1 files changed, 10 insertions, 4 deletions
diff --git a/lib/bladerf/bladerf_common.cc b/lib/bladerf/bladerf_common.cc
index 23035e1..fd0182f 100644
--- a/lib/bladerf/bladerf_common.cc
+++ b/lib/bladerf/bladerf_common.cc
@@ -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);
}