From 542a3dbb2beeaab198f025344072438f88cd7747 Mon Sep 17 00:00:00 2001 From: Jon Szymaniak Date: Fri, 7 Mar 2014 01:44:17 -0500 Subject: [PATCH] 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. --- lib/bladerf/bladerf_common.cc | 14 ++++++++++---- 1 file 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 lock(_devs_mutex); - std::list >::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 >::iterator it(_devs.begin()); + while ( it != _devs.end() ) { + if ( (*it).expired() ) { + it = _devs.erase(it); + } else { + ++it; + } + } bladerf_close((struct bladerf *)dev); }