diff options
| author | Josh Blum <josh@joshknows.com> | 2011-02-09 19:56:45 -0800 | 
|---|---|---|
| committer | Josh Blum <josh@joshknows.com> | 2011-02-09 19:56:45 -0800 | 
| commit | aa73e29d507f1523c17cf625dbd9c68f5a7d3787 (patch) | |
| tree | e208a28773b0f6b4780bd24d1d1d6c085e69f1fa | |
| parent | a72e29ca1de5b484bedcb1cfa8be6cd2216dc54e (diff) | |
| download | uhd-aa73e29d507f1523c17cf625dbd9c68f5a7d3787.tar.gz uhd-aa73e29d507f1523c17cf625dbd9c68f5a7d3787.tar.bz2 uhd-aa73e29d507f1523c17cf625dbd9c68f5a7d3787.zip | |
uhd: tweaks to vrt pkt handler and usrp2 fc monitor
pkt handler, only resize once per call to send/recv (not per fragment)
fc monitor, code tweaks, check ready before touching time wait stuff (faster)
| -rw-r--r-- | host/lib/transport/vrt_packet_handler.hpp | 8 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/io_impl.cpp | 29 | 
2 files changed, 21 insertions, 16 deletions
| diff --git a/host/lib/transport/vrt_packet_handler.hpp b/host/lib/transport/vrt_packet_handler.hpp index 11c70dd07..795d5bc62 100644 --- a/host/lib/transport/vrt_packet_handler.hpp +++ b/host/lib/transport/vrt_packet_handler.hpp @@ -196,8 +196,7 @@ template <typename T> UHD_INLINE T get_context_code(          size_t bytes_to_copy = nsamps_to_copy*bytes_per_item;          size_t nsamps_to_copy_per_io_buff = nsamps_to_copy/chans_per_otw_buff; -        state.io_buffs.resize(chans_per_otw_buff); -        for (size_t i = 0; i < state.width; i+=chans_per_otw_buff){ +        for (size_t i = 0; i < buffs.size(); i+=chans_per_otw_buff){              //fill a vector with pointers to the io buffers              for (size_t j = 0; j < chans_per_otw_buff; j++){ @@ -240,6 +239,8 @@ template <typename T> UHD_INLINE T get_context_code(          size_t vrt_header_offset_words32 = 0,          size_t chans_per_otw_buff = 1      ){ +        state.io_buffs.resize(chans_per_otw_buff); +          uhd::convert::function_type converter(              uhd::convert::get_converter_otw_to_cpu(                  io_type, otw_type, 1, chans_per_otw_buff @@ -345,7 +346,6 @@ template <typename T> UHD_INLINE T get_context_code(          //get send buffers for each otw channel          if (not get_send_buffs(state.managed_buffs)) return 0; -        state.io_buffs.resize(chans_per_otw_buff);          for (size_t i = 0; i < buffs.size(); i+=chans_per_otw_buff){              //calculate pointers with offsets to io and otw memory              for (size_t j = 0; j < chans_per_otw_buff; j++){ @@ -387,6 +387,8 @@ template <typename T> UHD_INLINE T get_context_code(          size_t vrt_header_offset_words32 = 0,          size_t chans_per_otw_buff = 1      ){ +        state.io_buffs.resize(chans_per_otw_buff); +          uhd::convert::function_type converter(              uhd::convert::get_converter_cpu_to_otw(                  io_type, otw_type, chans_per_otw_buff, 1 diff --git a/host/lib/usrp/usrp2/io_impl.cpp b/host/lib/usrp/usrp2/io_impl.cpp index 0376ebdae..d09ce1871 100644 --- a/host/lib/usrp/usrp2/io_impl.cpp +++ b/host/lib/usrp/usrp2/io_impl.cpp @@ -32,6 +32,18 @@ using namespace uhd;  using namespace uhd::usrp;  using namespace uhd::transport;  namespace asio = boost::asio; +namespace pt = boost::posix_time; + +/*********************************************************************** + * helpers + **********************************************************************/ +static UHD_INLINE pt::time_duration to_time_dur(double timeout){ +    return pt::microseconds(long(timeout*1e6)); +} + +static UHD_INLINE double from_time_dur(const pt::time_duration &time_dur){ +    return 1e-6*time_dur.total_microseconds(); +}  /***********************************************************************   * constants @@ -61,6 +73,7 @@ public:          _last_seq_out = 0;          _last_seq_ack = 0;          _max_seqs_out = max_seqs_out; +        _ready_fcn = boost::bind(&flow_control_monitor::ready, this);      }      /*! @@ -73,11 +86,8 @@ public:          boost::this_thread::disable_interruption di; //disable because the wait can throw          boost::unique_lock<boost::mutex> lock(_fc_mutex);          _last_seq_out = seq; -        return _fc_cond.timed_wait( -            lock, -            boost::posix_time::microseconds(long(timeout*1e6)), -            boost::bind(&flow_control_monitor::ready, this) -        ); +        if (this->ready()) return true; +        return _fc_cond.timed_wait(lock, to_time_dur(timeout), _ready_fcn);      }      /*! @@ -99,6 +109,7 @@ private:      boost::mutex _fc_mutex;      boost::condition _fc_cond;      seq_type _last_seq_out, _last_seq_ack, _max_seqs_out; +    boost::function<bool(void)> _ready_fcn;  };  /*********************************************************************** @@ -318,14 +329,6 @@ size_t usrp2_impl::send(  /***********************************************************************   * Alignment logic on receive   **********************************************************************/ -static UHD_INLINE boost::posix_time::time_duration to_time_dur(double timeout){ -    return boost::posix_time::microseconds(long(timeout*1e6)); -} - -static UHD_INLINE double from_time_dur(const boost::posix_time::time_duration &time_dur){ -    return 1e-6*time_dur.total_microseconds(); -} -  static UHD_INLINE time_spec_t extract_time_spec(      const vrt::if_packet_info_t &packet_info  ){ | 
