Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d1a3e8f1 authored by Josh Gao's avatar Josh Gao
Browse files

adb: fix deadlock.

libusb hotplug callbacks are called with the libusb lock taken, and we
call into libusb with our local mutex, so we need to enforce an ordering
between the two. Instead of calling device_connected or
device_disconnected directly, enqueue them onto the main thread.

Bug: http://b/62200735
Test: manually hotplugged a device
Change-Id: Ic5d55db83b47f4bb60f124ce94ddfe06f5f1a0c6
parent 0f185bb1
Loading
Loading
Loading
Loading
+9 −5
Original line number Diff line number Diff line
@@ -427,11 +427,15 @@ static void device_disconnected(libusb_device* device) {

static int hotplug_callback(libusb_context*, libusb_device* device, libusb_hotplug_event event,
                            void*) {
    // 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;
}