diff options
| -rw-r--r-- | host/lib/usrp/usrp_e/usrp_e_mmap_zero_copy.cpp | 33 | 
1 files changed, 14 insertions, 19 deletions
| diff --git a/host/lib/usrp/usrp_e/usrp_e_mmap_zero_copy.cpp b/host/lib/usrp/usrp_e/usrp_e_mmap_zero_copy.cpp index 9e25ed088..4e10bcc48 100644 --- a/host/lib/usrp/usrp_e/usrp_e_mmap_zero_copy.cpp +++ b/host/lib/usrp/usrp_e/usrp_e_mmap_zero_copy.cpp @@ -31,6 +31,7 @@ using namespace uhd::transport;  static const bool fp_verbose = true; //fast-path verbose  static const bool sp_verbose = true; //slow-path verbose +static const size_t poll_breakout = 10; //how many poll timeouts constitute a full timeout  /***********************************************************************   * The zero copy interface implementation @@ -104,19 +105,19 @@ public:          //poll/wait for a ready frame          if (not (info->flags & RB_USER)){ -            pollfd pfd; -            pfd.fd = _fd; -            pfd.events = POLLIN; -            ssize_t poll_ret = ::poll(&pfd, 1, size_t(timeout*1e3)); -            if (fp_verbose) std::cout << "  POLLIN: " << poll_ret << std::endl; -            if (poll_ret <= 0) return managed_recv_buffer::sptr(); -        } - -        //check that the frame is really ready -        if (not (info->flags & RB_USER)){ -            if (fp_verbose) std::cout << "  flags: not ready" << std::endl; -            return managed_recv_buffer::sptr(); -        } +            for (size_t i = 0; i < poll_breakout; i++){ +                pollfd pfd; +                pfd.fd = _fd; +                pfd.events = POLLIN; +                ssize_t poll_ret = ::poll(&pfd, 1, size_t(timeout*1e3/poll_breakout)); +                if (fp_verbose) std::cout << "  POLLIN: " << poll_ret << std::endl; +                if (poll_ret > 0) goto found_user_frame; //good poll, continue on +            } +            return managed_recv_buffer::sptr(); //timed-out for real +        } found_user_frame: + +        //the process has claimed the frame +        info->flags = RB_USER_PROCESS;          //increment the index for the next call          if (++_recv_index == size_t(_rb_size.num_rx_frames)) _recv_index = 0; @@ -150,12 +151,6 @@ public:              if (poll_ret <= 0) return managed_send_buffer::sptr();          } -        //check that the frame is really ready -        if (not (info->flags & RB_KERNEL)){ -            if (fp_verbose) std::cout << "  flags: not ready" << std::endl; -            return managed_send_buffer::sptr(); -        } -          //increment the index for the next call          if (++_send_index == size_t(_rb_size.num_tx_frames)) _send_index = 0; | 
