aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosh Blum <josh@joshknows.com>2010-09-24 18:14:32 -0700
committerJosh Blum <josh@joshknows.com>2010-09-24 18:14:32 -0700
commit1dffd5bb5fe16cd35ba54e44e927888e0192e905 (patch)
tree08da412307cd9aecb885671035db5b8b68eb2978
parentf2f4840ff9e15ed21344a5a19d676d548b542e91 (diff)
downloaduhd-1dffd5bb5fe16cd35ba54e44e927888e0192e905.tar.gz
uhd-1dffd5bb5fe16cd35ba54e44e927888e0192e905.tar.bz2
uhd-1dffd5bb5fe16cd35ba54e44e927888e0192e905.zip
usb: tweaks to usb code to cleanup properly and/or in error conditions
-rw-r--r--host/lib/transport/libusb1_base.cpp17
-rw-r--r--host/lib/transport/libusb1_control.cpp1
-rw-r--r--host/lib/transport/libusb1_device_handle.cpp9
3 files changed, 13 insertions, 14 deletions
diff --git a/host/lib/transport/libusb1_base.cpp b/host/lib/transport/libusb1_base.cpp
index 1f816c6e2..cd3e4adcf 100644
--- a/host/lib/transport/libusb1_base.cpp
+++ b/host/lib/transport/libusb1_base.cpp
@@ -30,9 +30,7 @@ using namespace uhd::transport;
**********************************************************/
void libusb::init(libusb_context **ctx, int debug_level)
{
- if (libusb_init(ctx) < 0)
- std::cerr << "error: libusb_init" << std::endl;
-
+ UHD_ASSERT_THROW(libusb_init(ctx) == 0);
libusb_set_debug(*ctx, debug_level);
}
@@ -48,14 +46,13 @@ libusb_device_handle *libusb::open_device(libusb_context *ctx,
libusb_device *dev = libusb_dev_list[i];
if (compare_device(dev, handle)) {
- libusb_open(dev, &dev_handle);
- libusb_unref_device(dev);
- break;
+ if (libusb_open(dev, &dev_handle) == 0) break;
}
-
- libusb_unref_device(dev);
}
+ libusb_free_device_list(libusb_dev_list, true);
+ if(dev_handle == NULL)
+ throw std::runtime_error("USB: cannot open device handle");
return dev_handle;
}
@@ -70,12 +67,12 @@ bool libusb::compare_device(libusb_device *dev,
boost::uint16_t device_addr = handle->get_device_addr();
libusb_device_descriptor libusb_desc;
- if (libusb_get_device_descriptor(dev, &libusb_desc) < 0)
+ if (libusb_get_device_descriptor(dev, &libusb_desc) != 0)
return false;
if (vendor_id != libusb_desc.idVendor)
return false;
if (product_id != libusb_desc.idProduct)
- return false;
+ return false;
if (serial != get_serial(dev))
return false;
if (device_addr != libusb_get_device_address(dev))
diff --git a/host/lib/transport/libusb1_control.cpp b/host/lib/transport/libusb1_control.cpp
index 3531128b2..be9b51111 100644
--- a/host/lib/transport/libusb1_control.cpp
+++ b/host/lib/transport/libusb1_control.cpp
@@ -46,6 +46,7 @@ private:
libusb_control_impl::libusb_control_impl(usb_device_handle::sptr handle)
{
+ _ctx = NULL;
libusb::init(&_ctx, libusb_debug_level);
// Find and open the libusb_device corresponding to the
diff --git a/host/lib/transport/libusb1_device_handle.cpp b/host/lib/transport/libusb1_device_handle.cpp
index 7efddd410..6bef37ed2 100644
--- a/host/lib/transport/libusb1_device_handle.cpp
+++ b/host/lib/transport/libusb1_device_handle.cpp
@@ -77,7 +77,7 @@ usb_device_handle::sptr make_usb_device_handle(libusb_device *dev)
libusb_device_descriptor desc;
if (libusb_get_device_descriptor(dev, &desc) < 0) {
- UHD_ASSERT_THROW("USB: failed to get device descriptor");
+ throw std::runtime_error("USB: failed to get device descriptor");
}
std::string serial = libusb::get_serial(dev);
@@ -104,14 +104,15 @@ std::vector<usb_device_handle::sptr> usb_device_handle::get_device_list(boost::u
size_t dev_size = libusb_get_device_list(ctx, &libusb_device_list);
for (size_t i = 0; i < dev_size; i++) {
libusb_device *dev = libusb_device_list[i];
- if(libusb_get_device_descriptor(dev, &desc) < 0) {
- UHD_ASSERT_THROW("USB: failed to get device descriptor");
+ if(libusb_get_device_descriptor(dev, &desc) != 0) {
+ continue; //just try the next device, do not throw
}
if(desc.idVendor == vid && desc.idProduct == pid) {
- device_handle_list.push_back(make_usb_device_handle(dev));
+ device_handle_list.push_back(make_usb_device_handle(dev));
}
}
+ libusb_free_device_list(libusb_device_list, true);
libusb_exit(ctx);
return device_handle_list;
}