summaryrefslogtreecommitdiffstats
path: root/host
diff options
context:
space:
mode:
authorJosh Blum <josh@joshknows.com>2010-10-04 14:54:16 -0700
committerJosh Blum <josh@joshknows.com>2010-10-04 14:54:16 -0700
commit5bd863efa05f3c6cfd672cffe87f57b33d1c32b5 (patch)
tree193b2b278a4143e225fd3ee40b9a55a26318b9c9 /host
parent219183453b23a572ddd6eeec81c3bc1907754560 (diff)
downloaduhd-5bd863efa05f3c6cfd672cffe87f57b33d1c32b5.tar.gz
uhd-5bd863efa05f3c6cfd672cffe87f57b33d1c32b5.tar.bz2
uhd-5bd863efa05f3c6cfd672cffe87f57b33d1c32b5.zip
uhd: bounded buffer pop sets back element to empty to decrement references
Diffstat (limited to 'host')
-rw-r--r--host/include/uhd/transport/bounded_buffer.ipp16
-rw-r--r--host/lib/transport/libusb1_zero_copy.cpp4
2 files changed, 14 insertions, 6 deletions
diff --git a/host/include/uhd/transport/bounded_buffer.ipp b/host/include/uhd/transport/bounded_buffer.ipp
index 71143741e..58f78bab4 100644
--- a/host/include/uhd/transport/bounded_buffer.ipp
+++ b/host/include/uhd/transport/bounded_buffer.ipp
@@ -73,7 +73,7 @@ namespace uhd{ namespace transport{ namespace{ /*anon*/
UHD_INLINE void pop_with_wait(elem_type &elem){
boost::unique_lock<boost::mutex> lock(_mutex);
_empty_cond.wait(lock, boost::bind(&bounded_buffer_impl<elem_type>::not_empty, this));
- elem = _buffer.back(); _buffer.pop_back();
+ this->pop_back(elem);
lock.unlock();
_full_cond.notify_one();
}
@@ -84,7 +84,7 @@ namespace uhd{ namespace transport{ namespace{ /*anon*/
lock, boost::posix_time::microseconds(long(timeout*1e6)),
boost::bind(&bounded_buffer_impl<elem_type>::not_empty, this)
)) return false;
- elem = _buffer.back(); _buffer.pop_back();
+ this->pop_back(elem);
lock.unlock();
_full_cond.notify_one();
return true;
@@ -104,6 +104,18 @@ namespace uhd{ namespace transport{ namespace{ /*anon*/
bool not_full(void) const{return not _buffer.full();}
bool not_empty(void) const{return not _buffer.empty();}
+
+ /*!
+ * Three part operation to pop an element:
+ * 1) assign elem to the back element
+ * 2) assign the back element to empty
+ * 3) pop the back to move the counter
+ */
+ UHD_INLINE void pop_back(elem_type &elem){
+ elem = _buffer.back();
+ _buffer.back() = elem_type();
+ _buffer.pop_back();
+ }
};
}}} //namespace
diff --git a/host/lib/transport/libusb1_zero_copy.cpp b/host/lib/transport/libusb1_zero_copy.cpp
index c7f084f62..819874483 100644
--- a/host/lib/transport/libusb1_zero_copy.cpp
+++ b/host/lib/transport/libusb1_zero_copy.cpp
@@ -335,10 +335,6 @@ libusb_zero_copy_impl::libusb_zero_copy_impl(
if (send_xfer_size == 0) send_xfer_size = DEFAULT_XFER_SIZE;
if (send_num_xfers == 0) send_num_xfers = DEFAULT_NUM_XFERS;
- //sanity check the transfer sizes
- UHD_ASSERT_THROW(recv_xfer_size % 512 == 0);
- UHD_ASSERT_THROW(send_xfer_size % 512 == 0);
-
//store the num xfers for the num frames count
_recv_xfer_size = recv_xfer_size;
_recv_num_frames = recv_num_xfers;