diff options
-rw-r--r-- | host/lib/transport/liberio_zero_copy.cpp | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/host/lib/transport/liberio_zero_copy.cpp b/host/lib/transport/liberio_zero_copy.cpp index 989480382..15131910a 100644 --- a/host/lib/transport/liberio_zero_copy.cpp +++ b/host/lib/transport/liberio_zero_copy.cpp @@ -57,8 +57,6 @@ private: liberio_ctx* _ctx; }; -UHD_SINGLETON_FCN(liberio_context_holder, get_liberio_context_holder); - class liberio_zero_copy_msb : public virtual managed_send_buffer { public: @@ -139,7 +137,15 @@ public: UHD_ASSERT_THROW(xport_params.num_send_frames > 0); UHD_ASSERT_THROW(xport_params.num_recv_frames > 0); - liberio_ctx* ctx = get_liberio_context_holder().get(); + { + std::lock_guard<std::mutex> _l(_context_lock); + if (!_ref_count) { + _context_holder = std::make_shared<liberio_context_holder>(); + } + + _ref_count++; + } + liberio_ctx* ctx = _context_holder->get(); /* we hold a reference, that we'd drop immediately after, * so no requirement to get another one here ... @@ -193,6 +199,13 @@ public: { liberio_chan_put(_tx_chan); liberio_chan_put(_rx_chan); + { + std::lock_guard<std::mutex> _l(_context_lock); + _ref_count--; + if (!_ref_count) { + _context_holder.reset(); + } + } } managed_recv_buffer::sptr get_recv_buff(double timeout = 0.1) @@ -245,8 +258,16 @@ private: size_t _next_send_buff_index; std::mutex _rx_mutex; std::mutex _tx_mutex; + + static std::mutex _context_lock; + static size_t _ref_count; + static std::shared_ptr<liberio_context_holder> _context_holder; }; +std::mutex liberio_zero_copy_impl::_context_lock; +size_t liberio_zero_copy_impl::_ref_count = 0; +std::shared_ptr<liberio_context_holder> liberio_zero_copy_impl::_context_holder{}; + liberio_zero_copy::sptr liberio_zero_copy::make(const std::string& tx_path, const std::string& rx_path, const zero_copy_xport_params& default_buff_args) |