diff options
Diffstat (limited to 'host/lib')
-rw-r--r-- | host/lib/transport/udp_zero_copy.cpp | 57 |
1 files changed, 19 insertions, 38 deletions
diff --git a/host/lib/transport/udp_zero_copy.cpp b/host/lib/transport/udp_zero_copy.cpp index 8c97e1e99..bc73b96a8 100644 --- a/host/lib/transport/udp_zero_copy.cpp +++ b/host/lib/transport/udp_zero_copy.cpp @@ -39,14 +39,12 @@ static const size_t DEFAULT_NUM_FRAMES = 32; **********************************************************************/ class udp_zero_copy_asio_mrb : public managed_recv_buffer{ public: - typedef boost::function<void(udp_zero_copy_asio_mrb *)> release_cb_type; - - udp_zero_copy_asio_mrb(void *mem, const release_cb_type &release_cb): - _mem(mem), _len(0), _release_cb(release_cb){/* NOP */} + udp_zero_copy_asio_mrb(void *mem, bounded_buffer<udp_zero_copy_asio_mrb *> &pending): + _mem(mem), _len(0), _pending(pending){/* NOP */} void release(void){ if (_len == 0) return; - this->_release_cb(this); + _pending.push_with_haste(this); _len = 0; } @@ -63,7 +61,7 @@ private: void *_mem; size_t _len; - release_cb_type _release_cb; + bounded_buffer<udp_zero_copy_asio_mrb *> &_pending; }; /*********************************************************************** @@ -73,14 +71,13 @@ private: **********************************************************************/ class udp_zero_copy_asio_msb : public managed_send_buffer{ public: - typedef boost::function<void(udp_zero_copy_asio_msb *, size_t)> commit_cb_type; - - udp_zero_copy_asio_msb(void *mem, const commit_cb_type &commit_cb): - _mem(mem), _len(0), _commit_cb(commit_cb){/* NOP */} + udp_zero_copy_asio_msb(void *mem, bounded_buffer<udp_zero_copy_asio_msb *> &pending, int sock_fd): + _mem(mem), _len(0), _pending(pending), _sock_fd(sock_fd){/* NOP */} void commit(size_t len){ if (_len == 0) return; - this->_commit_cb(this, len); + ::send(_sock_fd, this->cast<const char *>(), len, 0); + _pending.push_with_haste(this); _len = 0; } @@ -95,7 +92,8 @@ private: void *_mem; size_t _len; - commit_cb_type _commit_cb; + bounded_buffer<udp_zero_copy_asio_msb *> &_pending; + int _sock_fd; }; /*********************************************************************** @@ -138,18 +136,18 @@ public: //allocate re-usable managed receive buffers for (size_t i = 0; i < get_num_recv_frames(); i++){ - _mrb_pool.push_back(udp_zero_copy_asio_mrb(_recv_buffer_pool->at(i), - boost::bind(&udp_zero_copy_asio_impl::release, this, _1)) - ); - handle_recv(&_mrb_pool.back()); + _mrb_pool.push_back(udp_zero_copy_asio_mrb( + _recv_buffer_pool->at(i), _pending_recv_buffs + )); + _pending_recv_buffs.push_with_haste(&_mrb_pool.back()); } //allocate re-usable managed send buffers for (size_t i = 0; i < get_num_send_frames(); i++){ - _msb_pool.push_back(udp_zero_copy_asio_msb(_send_buffer_pool->at(i), - boost::bind(&udp_zero_copy_asio_impl::commit, this, _1, _2)) - ); - handle_send(&_msb_pool.back()); + _msb_pool.push_back(udp_zero_copy_asio_msb( + _send_buffer_pool->at(i), _pending_send_buffs, _sock_fd + )); + _pending_send_buffs.push_with_haste(&_msb_pool.back()); } } @@ -189,19 +187,11 @@ public: ::recv(_sock_fd, mrb->cast<char *>(), _recv_frame_size, 0) ); - this->handle_recv(mrb); //timeout: return the managed buffer to the queue + _pending_recv_buffs.push_with_haste(mrb); //timeout: return the managed buffer to the queue } return managed_recv_buffer::sptr(); } - UHD_INLINE void handle_recv(udp_zero_copy_asio_mrb *mrb){ - _pending_recv_buffs.push_with_haste(mrb); - } - - void release(udp_zero_copy_asio_mrb *mrb){ - handle_recv(mrb); - } - size_t get_num_recv_frames(void) const {return _num_recv_frames;} size_t get_recv_frame_size(void) const {return _recv_frame_size;} @@ -221,15 +211,6 @@ public: return managed_send_buffer::sptr(); } - UHD_INLINE void handle_send(udp_zero_copy_asio_msb *msb){ - _pending_send_buffs.push_with_haste(msb); - } - - void commit(udp_zero_copy_asio_msb *msb, size_t len){ - ::send(_sock_fd, msb->cast<const char *>(), len, 0); - handle_send(msb); - } - size_t get_num_send_frames(void) const {return _num_send_frames;} size_t get_send_frame_size(void) const {return _send_frame_size;} |