diff options
author | Michael West <michael.west@ettus.com> | 2013-11-20 11:57:38 -0800 |
---|---|---|
committer | Michael West <michael.west@ettus.com> | 2013-11-20 11:57:38 -0800 |
commit | 1fe3db82d6d292a186fe26e728dfdf68db4db056 (patch) | |
tree | 55e4aecf11f2387cde6486dbb671aaa6bdebe470 /host/lib/transport/libusb1_base.cpp | |
parent | a0bae5347bd542b6f84601f8f0c8c70137ea44d1 (diff) | |
parent | 58f4af976d64765c2402e1ce00ee78f4aae51881 (diff) | |
download | uhd-1fe3db82d6d292a186fe26e728dfdf68db4db056.tar.gz uhd-1fe3db82d6d292a186fe26e728dfdf68db4db056.tar.bz2 uhd-1fe3db82d6d292a186fe26e728dfdf68db4db056.zip |
Merged in branch master
Diffstat (limited to 'host/lib/transport/libusb1_base.cpp')
-rw-r--r-- | host/lib/transport/libusb1_base.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/host/lib/transport/libusb1_base.cpp b/host/lib/transport/libusb1_base.cpp index 0ef53db0a..8bd0f4354 100644 --- a/host/lib/transport/libusb1_base.cpp +++ b/host/lib/transport/libusb1_base.cpp @@ -19,10 +19,12 @@ #include <uhd/exception.hpp> #include <uhd/utils/msg.hpp> #include <uhd/utils/log.hpp> +#include <uhd/utils/tasks.hpp> #include <uhd/types/dict.hpp> #include <boost/weak_ptr.hpp> #include <boost/thread/mutex.hpp> #include <boost/foreach.hpp> +#include <boost/bind.hpp> #include <cstdlib> #include <iostream> @@ -37,9 +39,11 @@ public: libusb_session_impl(void){ UHD_ASSERT_THROW(libusb_init(&_context) == 0); libusb_set_debug(_context, debug_level); + task_handler = task::make(boost::bind(&libusb_session_impl::libusb_event_handler_task, this, _context)); } ~libusb_session_impl(void){ + task_handler.reset(); libusb_exit(_context); } @@ -49,6 +53,21 @@ public: private: libusb_context *_context; + task::sptr task_handler; + + /* + * Task to handle libusb events. There should only be one thread per libusb_context handling events. + * Using more than one thread can result in excessive CPU usage in kernel space (presumably from locking/waiting). + * The libusb documentation says it is safe, which it is, but it neglects to state the cost in CPU usage. + * Just don't do it! + */ + UHD_INLINE void libusb_event_handler_task(libusb_context *context) + { + timeval tv; + tv.tv_sec = 0; + tv.tv_usec = 100000; + libusb_handle_events_timeout(context, &tv); + } }; libusb::session::sptr libusb::session::get_global_session(void){ @@ -274,6 +293,10 @@ public: return libusb::device_descriptor::make(this->get_device())->get().idProduct; } + bool firmware_loaded() { + return (get_manufacturer() == "Ettus Research LLC"); + } + private: libusb::device::sptr _dev; //always keep a reference to device }; |