From 5bd863efa05f3c6cfd672cffe87f57b33d1c32b5 Mon Sep 17 00:00:00 2001
From: Josh Blum <josh@joshknows.com>
Date: Mon, 4 Oct 2010 14:54:16 -0700
Subject: uhd: bounded buffer pop sets back element to empty to decrement
 references

---
 host/include/uhd/transport/bounded_buffer.ipp | 16 ++++++++++++++--
 host/lib/transport/libusb1_zero_copy.cpp      |  4 ----
 2 files changed, 14 insertions(+), 6 deletions(-)

(limited to 'host')

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;
-- 
cgit v1.2.3