diff options
author | Balint Seeber <balint@ettus.com> | 2013-11-19 12:37:18 -0800 |
---|---|---|
committer | Balint Seeber <balint@ettus.com> | 2013-11-19 12:37:18 -0800 |
commit | 2ab579a3036fcdb4739510fa2f919f54ce660586 (patch) | |
tree | d5d5589969ae4e0f92f4b37d5242aa3791046df0 /host/lib/transport/libusb1_base.cpp | |
parent | 45a780cc858dd84e4883139ad2121aeb222d2d8e (diff) | |
parent | 39d69b3a8871e4d6f442511e57394f83a012d3b6 (diff) | |
download | uhd-2ab579a3036fcdb4739510fa2f919f54ce660586.tar.gz uhd-2ab579a3036fcdb4739510fa2f919f54ce660586.tar.bz2 uhd-2ab579a3036fcdb4739510fa2f919f54ce660586.zip |
Merge remote-tracking branch 'origin/usb_cpu_perf' into b200/kitchen_sink
Diffstat (limited to 'host/lib/transport/libusb1_base.cpp')
-rw-r--r-- | host/lib/transport/libusb1_base.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/host/lib/transport/libusb1_base.cpp b/host/lib/transport/libusb1_base.cpp index 0ef53db0a..4cf3ea17d 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){ |