diff options
| -rw-r--r-- | host/lib/transport/udp_zero_copy_asio.cpp | 54 | 
1 files changed, 9 insertions, 45 deletions
| diff --git a/host/lib/transport/udp_zero_copy_asio.cpp b/host/lib/transport/udp_zero_copy_asio.cpp index 3826dcd79..697e172cd 100644 --- a/host/lib/transport/udp_zero_copy_asio.cpp +++ b/host/lib/transport/udp_zero_copy_asio.cpp @@ -24,7 +24,7 @@  #include <uhd/utils/warning.hpp>  #include <boost/asio.hpp>  #include <boost/format.hpp> -#include <boost/thread.hpp> +#include <boost/thread/thread.hpp>  #include <boost/enable_shared_from_this.hpp>  #include <iostream> @@ -32,9 +32,6 @@ using namespace uhd;  using namespace uhd::transport;  namespace asio = boost::asio; -/*********************************************************************** - * Constants - **********************************************************************/  //Define this to the the boost async io calls to perform receive.  //Otherwise, get_recv_buff uses a blocking receive with timeout.  #define USE_ASIO_ASYNC_RECV @@ -43,32 +40,6 @@ namespace asio = boost::asio;  //Otherwise, the commit callback uses a blocking send.  //#define USE_ASIO_ASYNC_SEND -//By default, this buffer is sized insufficiently small. -//For peformance, this buffer should be 10s of megabytes. -static const size_t MIN_RECV_SOCK_BUFF_SIZE = size_t(10e3); - -//Large buffers cause more underflow at high rates. -//Perhaps this is due to the kernel scheduling, -//but may change with host-based flow control. -static const size_t MIN_SEND_SOCK_BUFF_SIZE = size_t(10e3); - -//The number of async frames to allocate for each send and recv: -//The non-async recv can have a very large number of recv frames -//because the CPU overhead is independent of the number of frames. -#ifdef USE_ASIO_ASYNC_RECV -static const size_t DEFAULT_NUM_RECV_FRAMES = 32; -#else -static const size_t DEFAULT_NUM_RECV_FRAMES = MIN_RECV_SOCK_BUFF_SIZE/udp_simple::mtu; -#endif - -//The non-async send only ever requires a single frame -//because the buffer will be committed before a new get. -#ifdef USE_ASIO_ASYNC_SEND -static const size_t DEFAULT_NUM_SEND_FRAMES = 32; -#else -static const size_t DEFAULT_NUM_SEND_FRAMES = MIN_SEND_SOCK_BUFF_SIZE/udp_simple::mtu; -#endif -  //The number of service threads to spawn for async ASIO:  //A single concurrent thread for io_service seems to be the fastest.  //Threads are disabled when no async implementations are enabled. @@ -78,6 +49,9 @@ static const size_t CONCURRENCY_HINT = 1;  static const size_t CONCURRENCY_HINT = 0;  #endif +//A reasonable number of frames for send/recv and async/sync +static const size_t DEFAULT_NUM_FRAMES = 32; +  /***********************************************************************   * Zero Copy UDP implementation with ASIO:   *   This is the portable zero copy implementation for systems @@ -95,9 +69,9 @@ public:          const device_addr_t &hints      ):          _recv_frame_size(size_t(hints.cast<double>("recv_frame_size", udp_simple::mtu))), -        _num_recv_frames(size_t(hints.cast<double>("num_recv_frames", DEFAULT_NUM_RECV_FRAMES))), +        _num_recv_frames(size_t(hints.cast<double>("num_recv_frames", DEFAULT_NUM_FRAMES))),          _send_frame_size(size_t(hints.cast<double>("send_frame_size", udp_simple::mtu))), -        _num_send_frames(size_t(hints.cast<double>("num_send_frames", DEFAULT_NUM_SEND_FRAMES))), +        _num_send_frames(size_t(hints.cast<double>("num_send_frames", DEFAULT_NUM_FRAMES))),          _concurrency_hint(hints.cast<size_t>("concurrency_hint", CONCURRENCY_HINT)),          _io_service(_concurrency_hint)      { @@ -325,16 +299,11 @@ template<typename Opt> static void resize_buff_helper(      const size_t target_size,      const std::string &name  ){ -    size_t min_sock_buff_size = 0; -    if (name == "recv") min_sock_buff_size = MIN_RECV_SOCK_BUFF_SIZE; -    if (name == "send") min_sock_buff_size = MIN_SEND_SOCK_BUFF_SIZE; -    min_sock_buff_size = std::max(min_sock_buff_size, target_size); -      std::string help_message;      #if defined(UHD_PLATFORM_LINUX)          help_message = str(boost::format(              "Please run: sudo sysctl -w net.core.%smem_max=%d\n" -        ) % ((name == "recv")?"r":"w") % min_sock_buff_size); +        ) % ((name == "recv")?"r":"w") % target_size);      #endif /*defined(UHD_PLATFORM_LINUX)*/      //resize the buffer if size was provided @@ -348,14 +317,9 @@ template<typename Opt> static void resize_buff_helper(              "Current %s sock buff size: %d bytes"          ) % name % actual_size << std::endl;          if (actual_size < target_size) uhd::warning::post(str(boost::format( -            "The %s buffer is smaller than the requested size.\n" -            "The minimum requested buffer size is %d bytes.\n" +            "The %s buffer could not be resized sufficiently.\n"              "See the transport application notes on buffer resizing.\n%s" -        ) % name % min_sock_buff_size % help_message)); -    } -    //otherwise, ensure that the buffer is at least the minimum size -    else if (udp_trans->get_buff_size<Opt>() < min_sock_buff_size){ -        resize_buff_helper<Opt>(udp_trans, min_sock_buff_size, name); +        ) % name % help_message));      }  } | 
