diff options
author | Martin Braun <martin.braun@ettus.com> | 2017-12-15 17:15:12 -0800 |
---|---|---|
committer | Martin Braun <martin.braun@ettus.com> | 2017-12-22 15:05:59 -0800 |
commit | 48c44dbe3844adf56019a84cb814bbc7a0ef7591 (patch) | |
tree | 729038706f1213521d0db426ca56ccb47eb80be1 /host | |
parent | 7c7d5090177d32efb1bffa648fcb507fe04e97f9 (diff) | |
download | uhd-48c44dbe3844adf56019a84cb814bbc7a0ef7591.tar.gz uhd-48c44dbe3844adf56019a84cb814bbc7a0ef7591.tar.bz2 uhd-48c44dbe3844adf56019a84cb814bbc7a0ef7591.zip |
mpmd: Implement better xport selection algorithm
Reviewed-by: Trung Tran <trung.tran@ettus.com>
Diffstat (limited to 'host')
-rw-r--r-- | host/lib/usrp/mpmd/mpmd_xport_mgr.cpp | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/host/lib/usrp/mpmd/mpmd_xport_mgr.cpp b/host/lib/usrp/mpmd/mpmd_xport_mgr.cpp index 242a46527..0de832b34 100644 --- a/host/lib/usrp/mpmd/mpmd_xport_mgr.cpp +++ b/host/lib/usrp/mpmd/mpmd_xport_mgr.cpp @@ -57,9 +57,11 @@ public: UHD_LOG_TRACE("MPMD", __func__ << "(): xport medium is " << xport_medium); + UHD_ASSERT_THROW(_xport_ctrls.count(xport_medium) > 0); + UHD_ASSERT_THROW(_xport_ctrls.at(xport_medium)); // When we've picked our preferred option, pass it to the transport // implementation for execution: - return _xport_ctrls[xport_medium]->make_transport( + return _xport_ctrls.at(xport_medium)->make_transport( xport_info_out, xport_type, xport_args @@ -82,9 +84,16 @@ private: xport_info_t select_xport_option( const xport_info_list_t &xport_info_list ) const { - // Naive xport picking method, this needs fixing (FIXME). - // Have algorithm run on baseline score, allocation, and random soup - return xport_info_list.at(0); + for (const auto& xport_info : xport_info_list) { + const std::string xport_medium = xport_info.at("type"); + if (_xport_ctrls.count(xport_medium) != 0 and + _xport_ctrls.at(xport_medium) and + _xport_ctrls.at(xport_medium)->is_valid(xport_info)) { + return xport_info; + } + } + + throw uhd::runtime_error("Could not select a transport option!"); } //! Create an instance of an xport manager implementation @@ -106,11 +115,13 @@ private: ); #endif } else { - throw uhd::key_error("Unknown transport medium!"); + UHD_LOG_WARNING("MPMD", + "Cannot instantiate transport medium " << xport_medium); + return nullptr; } } - //! This will make sure that _xport_ctrls contains a valid transport manager + //! This will try to make _xport_ctrls contain a valid transport manager // for \p xport_medium // // When this function returns, it will be possible to access @@ -124,7 +135,10 @@ private: if (_xport_ctrls.count(xport_medium) == 0) { UHD_LOG_TRACE("MPMD", "Instantiating transport manager `" << xport_medium << "'"); - _xport_ctrls[xport_medium] = make_mgr_impl(xport_medium, _mb_args); + auto mgr_impl = make_mgr_impl(xport_medium, _mb_args); + if (mgr_impl) { + _xport_ctrls[xport_medium] = std::move(mgr_impl); + } } } @@ -134,7 +148,7 @@ private: //! Cache available xport manager implementations // // Should only every be populated by require_xport_mgr() - std::map<std::string, mpmd_xport_ctrl_base::uptr> _xport_ctrls; + std::unordered_map<std::string, mpmd_xport_ctrl_base::uptr> _xport_ctrls; //! Motherboard args, can contain things like 'recv_buff_size' const uhd::device_addr_t _mb_args; |