From 3ea2feb63abcd15802d1b5d2cf2d3402ca86616c Mon Sep 17 00:00:00 2001
From: Tom Rondeau <tom@trondeau.com>
Date: Tue, 14 Apr 2015 16:07:48 -0400
Subject: controlport: fixed controlport probes.

---
 gr-blocks/lib/ctrlport_probe2_c_impl.cc | 30 ++++++++++++++++++------------
 1 file changed, 18 insertions(+), 12 deletions(-)

(limited to 'gr-blocks/lib/ctrlport_probe2_c_impl.cc')

diff --git a/gr-blocks/lib/ctrlport_probe2_c_impl.cc b/gr-blocks/lib/ctrlport_probe2_c_impl.cc
index bd43130be5..b8ed0af444 100644
--- a/gr-blocks/lib/ctrlport_probe2_c_impl.cc
+++ b/gr-blocks/lib/ctrlport_probe2_c_impl.cc
@@ -65,21 +65,26 @@ namespace gr {
     }
 
     std::vector<gr_complex>
-    ctrlport_probe2_c_impl::get() {
+    ctrlport_probe2_c_impl::get()
+    {
       return buffered_get.get();
     }
 
     void
     ctrlport_probe2_c_impl::set_length(int len)
     {
+      gr::thread::scoped_lock guard(d_setlock);
+
       if(len > 8191) {
-        std::cerr << "probe2_c: length " << len
-                  << " exceeds maximum buffer size of 8191" << std::endl;
+        GR_LOG_WARN(d_logger,
+                    boost::format("probe2_c: length %1% exceeds maximum"
+                                  " buffer size of 8191") % len);
         len = 8191;
       }
 
       d_len = len;
-      d_buffer.reserve(d_len);
+      d_buffer.resize(d_len);
+      d_index = 0;
     }
 
     int
@@ -95,20 +100,21 @@ namespace gr {
     {
       const gr_complex *in = (const gr_complex*)input_items[0];
 
+      gr::thread::scoped_lock guard(d_setlock);
+
       // copy samples to get buffer if we need samples
-      if(d_buffer.size() < d_len) {
+      if(d_index < d_len) {
         // copy smaller of remaining buffer space and num inputs to work()
-        int num_copy = std::min( (int)(d_len - d_buffer.size()), noutput_items );
+        int num_copy = std::min( (int)(d_len - d_index), noutput_items );
 
-        // TODO: convert this to a copy operator for speed...
-        for(int i = 0; i < num_copy; i++) {
-          d_buffer.push_back(in[i]);
-        }
+        memcpy(&d_buffer[d_index], in, num_copy*sizeof(gr_complex));
+        d_index += num_copy;
       }
 
       // notify the waiting get() if we fill up the buffer
-      if(d_buffer.size() == d_len) {
-          buffered_get.offer_data(d_buffer);
+      if(d_index == d_len) {
+        buffered_get.offer_data(d_buffer);
+        d_index = 0;
       }
 
       return noutput_items;
-- 
cgit v1.2.3