Merge "adb: fix deadlock." am: 68599f5759
am: d5a2cdb72c
Change-Id: I671768311d2c2969bc5797efc43c84175b417ae7
diff --git a/adb/client/usb_libusb.cpp b/adb/client/usb_libusb.cpp
index fc32469..9477c56 100644
--- a/adb/client/usb_libusb.cpp
+++ b/adb/client/usb_libusb.cpp
@@ -427,11 +427,15 @@
static int hotplug_callback(libusb_context*, libusb_device* device, libusb_hotplug_event event,
void*) {
- if (event == LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED) {
- device_connected(device);
- } else if (event == LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT) {
- device_disconnected(device);
- }
+ // We're called with the libusb lock taken. Call these on the main thread outside of this
+ // function so that the usb_handle mutex is always taken before the libusb mutex.
+ fdevent_run_on_main_thread([device, event]() {
+ if (event == LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED) {
+ device_connected(device);
+ } else if (event == LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT) {
+ device_disconnected(device);
+ }
+ });
return 0;
}