From 6bc4255ecd25658b430cec1f6191e0044c5e6c7f Mon Sep 17 00:00:00 2001 From: reillyg Date: Thu, 4 Feb 2016 14:45:36 -0800 Subject: Make UsbDeviceHandle::ReleaseInterface asynchronous. This patch adds a callback to UsbDeviceHandle::ReleaseInterface that is called when the interface has been released. Previously this result was returned synchronously while the actual release operation happened in the background. In the process I've fixed an issue where libusb_release_interface could have been called from the UI thread if there were no pending transfers to delay it. BUG=None Review URL: https://codereview.chromium.org/1664023002 Cr-Commit-Position: refs/heads/master@{#373641} --- chrome/browser/devtools/device/usb/android_usb_browsertest.cc | 9 ++++++--- chrome/browser/devtools/device/usb/android_usb_device.cc | 9 +++++++-- 2 files changed, 13 insertions(+), 5 deletions(-) (limited to 'chrome') diff --git a/chrome/browser/devtools/device/usb/android_usb_browsertest.cc b/chrome/browser/devtools/device/usb/android_usb_browsertest.cc index caa9950..2fac360 100644 --- a/chrome/browser/devtools/device/usb/android_usb_browsertest.cc +++ b/chrome/browser/devtools/device/usb/android_usb_browsertest.cc @@ -153,13 +153,16 @@ class MockUsbDeviceHandle : public UsbDeviceHandle { FROM_HERE, base::Bind(callback, success)); } - bool ReleaseInterface(int interface_number) override { + void ReleaseInterface(int interface_number, + const ResultCallback& callback) override { + bool success = false; if (device_->claimed_interfaces_.find(interface_number) == device_->claimed_interfaces_.end()) - return false; + success = false; device_->claimed_interfaces_.erase(interface_number); - return true; + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::Bind(callback, success)); } void SetInterfaceAlternateSetting(int interface_number, diff --git a/chrome/browser/devtools/device/usb/android_usb_device.cc b/chrome/browser/devtools/device/usb/android_usb_device.cc index fc8a274..8e655a6 100644 --- a/chrome/browser/devtools/device/usb/android_usb_device.cc +++ b/chrome/browser/devtools/device/usb/android_usb_device.cc @@ -128,10 +128,15 @@ void DumpMessage(bool outgoing, const char* data, size_t length) { #endif // 0 } +void CloseDevice(scoped_refptr usb_device, + bool release_successful) { + usb_device->Close(); +} + void ReleaseInterface(scoped_refptr usb_device, int interface_id) { - usb_device->ReleaseInterface(interface_id); - usb_device->Close(); + usb_device->ReleaseInterface(interface_id, + base::Bind(&CloseDevice, usb_device)); } void RespondOnCallerThread(const AndroidUsbDevicesCallback& callback, -- cgit v1.1