Index: device/usb/usb_device_impl.cc |
diff --git a/device/usb/usb_device_impl.cc b/device/usb/usb_device_impl.cc |
index b686efc3dbd17bbe472f4bb0f308954ce49f603d..bdda9ca9ee318993f4a93b3cff73902095488260 100644 |
--- a/device/usb/usb_device_impl.cc |
+++ b/device/usb/usb_device_impl.cc |
@@ -15,6 +15,7 @@ |
#include "base/sequenced_task_runner.h" |
#include "base/single_thread_task_runner.h" |
#include "base/stl_util.h" |
+#include "base/threading/thread_restrictions.h" |
#include "base/threading/thread_task_runner_handle.h" |
#include "build/build_config.h" |
#include "components/device_event_log/device_event_log.h" |
@@ -22,15 +23,14 @@ |
#include "device/usb/usb_descriptors.h" |
#include "device/usb/usb_device_handle_impl.h" |
#include "device/usb/usb_error.h" |
+#include "device/usb/usb_service.h" |
#include "third_party/libusb/src/libusb/libusb.h" |
namespace device { |
-UsbDeviceImpl::UsbDeviceImpl( |
- scoped_refptr<UsbContext> context, |
- PlatformUsbDevice platform_device, |
- const libusb_device_descriptor& descriptor, |
- scoped_refptr<base::SequencedTaskRunner> blocking_task_runner) |
+UsbDeviceImpl::UsbDeviceImpl(scoped_refptr<UsbContext> context, |
+ PlatformUsbDevice platform_device, |
+ const libusb_device_descriptor& descriptor) |
: UsbDevice(descriptor.bcdUSB, |
descriptor.bDeviceClass, |
descriptor.bDeviceSubClass, |
@@ -42,9 +42,7 @@ UsbDeviceImpl::UsbDeviceImpl( |
base::string16(), |
base::string16()), |
platform_device_(platform_device), |
- context_(context), |
- task_runner_(base::ThreadTaskRunnerHandle::Get()), |
- blocking_task_runner_(blocking_task_runner) { |
+ context_(context) { |
CHECK(platform_device) << "platform_device cannot be NULL"; |
libusb_ref_device(platform_device); |
ReadAllConfigurations(); |
@@ -59,9 +57,12 @@ UsbDeviceImpl::~UsbDeviceImpl() { |
void UsbDeviceImpl::Open(const OpenCallback& callback) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- blocking_task_runner_->PostTask( |
+ scoped_refptr<base::SequencedTaskRunner> blocking_task_runner = |
+ UsbService::CreateBlockingTaskRunner(); |
+ blocking_task_runner->PostTask( |
FROM_HERE, |
- base::Bind(&UsbDeviceImpl::OpenOnBlockingThread, this, callback)); |
+ base::Bind(&UsbDeviceImpl::OpenOnBlockingThread, this, callback, |
+ base::ThreadTaskRunnerHandle::Get(), blocking_task_runner)); |
} |
void UsbDeviceImpl::ReadAllConfigurations() { |
@@ -99,24 +100,31 @@ void UsbDeviceImpl::RefreshActiveConfiguration() { |
ActiveConfigurationChanged(config_value); |
} |
-void UsbDeviceImpl::OpenOnBlockingThread(const OpenCallback& callback) { |
+void UsbDeviceImpl::OpenOnBlockingThread( |
+ const OpenCallback& callback, |
+ scoped_refptr<base::TaskRunner> task_runner, |
+ scoped_refptr<base::SequencedTaskRunner> blocking_task_runner) { |
+ base::ThreadRestrictions::AssertIOAllowed(); |
PlatformUsbDeviceHandle handle; |
const int rv = libusb_open(platform_device_, &handle); |
if (LIBUSB_SUCCESS == rv) { |
- task_runner_->PostTask( |
- FROM_HERE, base::Bind(&UsbDeviceImpl::Opened, this, handle, callback)); |
+ task_runner->PostTask( |
+ FROM_HERE, base::Bind(&UsbDeviceImpl::Opened, this, handle, callback, |
+ blocking_task_runner)); |
} else { |
USB_LOG(EVENT) << "Failed to open device: " |
<< ConvertPlatformUsbErrorToString(rv); |
- task_runner_->PostTask(FROM_HERE, base::Bind(callback, nullptr)); |
+ task_runner->PostTask(FROM_HERE, base::Bind(callback, nullptr)); |
} |
} |
-void UsbDeviceImpl::Opened(PlatformUsbDeviceHandle platform_handle, |
- const OpenCallback& callback) { |
+void UsbDeviceImpl::Opened( |
+ PlatformUsbDeviceHandle platform_handle, |
+ const OpenCallback& callback, |
+ scoped_refptr<base::SequencedTaskRunner> blocking_task_runner) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
scoped_refptr<UsbDeviceHandle> device_handle = new UsbDeviceHandleImpl( |
- context_, this, platform_handle, blocking_task_runner_); |
+ context_, this, platform_handle, blocking_task_runner); |
handles().push_back(device_handle.get()); |
callback.Run(device_handle); |
} |