commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] [gnuradio] 02/04: blocks: Fixed UDP source bug


From: git
Subject: [Commit-gnuradio] [gnuradio] 02/04: blocks: Fixed UDP source bug
Date: Fri, 13 Mar 2015 14:07:06 +0000 (UTC)

This is an automated email from the git hooks/post-receive script.

trondeau pushed a commit to branch maint
in repository gnuradio.

commit 854ff515b60cbacffffb0f9bdef07a031d666dc4
Author: Martin Braun <address@hidden>
Date:   Sun Mar 8 22:06:28 2015 -0700

    blocks: Fixed UDP source bug
    
    Before, it would actually read too few bytes from the
    incoming buffer.
    Also removed some 'magic' constants and replaced by const
    variables.
---
 gr-blocks/include/gnuradio/blocks/udp_source.h |  4 ++--
 gr-blocks/lib/udp_source_impl.cc               | 25 ++++++++++++++-----------
 gr-blocks/lib/udp_source_impl.h                |  2 ++
 3 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/gr-blocks/include/gnuradio/blocks/udp_source.h 
b/gr-blocks/include/gnuradio/blocks/udp_source.h
index 67c31a7..d1b4062 100644
--- a/gr-blocks/include/gnuradio/blocks/udp_source.h
+++ b/gr-blocks/include/gnuradio/blocks/udp_source.h
@@ -1,6 +1,6 @@
 /* -*- c++ -*- */
 /*
- * Copyright 2007-2010,2013 Free Software Foundation, Inc.
+ * Copyright 2007-2010,2013,2015 Free Software Foundation, Inc.
  *
  * This file is part of GNU Radio
  *
@@ -43,7 +43,7 @@ namespace gr {
        * \brief UDP Source Constructor
        *
        * \param itemsize     The size (in bytes) of the item datatype
-       * \param host         The name or IP address of the receiving host; can 
be
+       * \param host         The name or IP address of the transmitting host; 
can be
        *                     NULL, None, or "0.0.0.0" to allow reading from any
        *                     interface on the host
        * \param port         The port number on which to receive data; use 0 to
diff --git a/gr-blocks/lib/udp_source_impl.cc b/gr-blocks/lib/udp_source_impl.cc
index ca40184..b1977a8 100644
--- a/gr-blocks/lib/udp_source_impl.cc
+++ b/gr-blocks/lib/udp_source_impl.cc
@@ -35,6 +35,8 @@
 namespace gr {
   namespace blocks {
 
+    const int udp_source_impl::BUF_SIZE_PAYLOADS = 50;
+
     udp_source::sptr
     udp_source::make(size_t itemsize,
                      const std::string &ipaddr, int port,
@@ -56,7 +58,7 @@ namespace gr {
     {
       // Give us some more room to play.
       d_rxbuf = new char[4*d_payload_size];
-      d_residbuf = new char[50*d_payload_size];
+      d_residbuf = new char[BUF_SIZE_PAYLOADS*d_payload_size];
 
       connect(host, port);
     }
@@ -150,7 +152,7 @@ namespace gr {
           if(d_eof && (bytes_transferred == 1) && (d_rxbuf[0] == 0x00)) {
             // If we are using EOF notification, test for it and don't
             // add anything to the output.
-            d_residual = -1;
+            d_residual = WORK_DONE;
             d_cond_wait.notify_one();
             return;
           }
@@ -158,7 +160,7 @@ namespace gr {
             // Make sure we never go beyond the boundary of the
             // residual buffer.  This will just drop the last bit of
             // data in the buffer if we've run out of room.
-            if((int)(d_residual + bytes_transferred) >= (50*d_payload_size)) {
+            if((int)(d_residual + bytes_transferred) >= 
(BUF_SIZE_PAYLOADS*d_payload_size)) {
               GR_LOG_WARN(d_logger, "Too much data; dropping packet.");
             }
             else {
@@ -192,24 +194,25 @@ namespace gr {
       //use timed_wait to avoid permanent blocking in the work function
       d_cond_wait.timed_wait(lock, boost::posix_time::milliseconds(10));
 
-      if(d_residual < 0)
-        return -1;
+      if (d_residual < 0) {
+        return d_residual;
+      }
 
-      int to_be_sent = (int)(d_residual - d_sent);
-      int to_send    = std::min(noutput_items, to_be_sent);
+      int bytes_left_in_buffer = (int)(d_residual - d_sent);
+      int bytes_to_send        = std::min<int>(d_itemsize * noutput_items, 
bytes_left_in_buffer);
 
       // Copy the received data in the residual buffer to the output stream
-      memcpy(out, d_residbuf+d_sent, to_send);
-      int nitems = to_send/d_itemsize;
+      memcpy(out, d_residbuf+d_sent, bytes_to_send);
+      int nitems = bytes_to_send/d_itemsize;
 
       // Keep track of where we are if we don't have enough output
       // space to send all the data in the residbuf.
-      if(to_send == to_be_sent) {
+      if (bytes_to_send == bytes_left_in_buffer) {
         d_residual = 0;
         d_sent = 0;
       }
       else {
-        d_sent += to_send;
+        d_sent += bytes_to_send;
       }
 
       return nitems;
diff --git a/gr-blocks/lib/udp_source_impl.h b/gr-blocks/lib/udp_source_impl.h
index 949364c..42cb64d 100644
--- a/gr-blocks/lib/udp_source_impl.h
+++ b/gr-blocks/lib/udp_source_impl.h
@@ -44,6 +44,8 @@ namespace gr {
       ssize_t d_sent;         // track how much of d_residbuf we've outputted
       size_t  d_offset;       // point to residbuf location offset
 
+      static const int BUF_SIZE_PAYLOADS; //!< The d_residbuf size in 
multiples of d_payload_size
+
       std::string d_host;
       unsigned short d_port;
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]