| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "device/usb/usb_device_handle_impl.h" | 5 #include "device/usb/usb_device_handle_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <memory> | 8 #include <memory> |
| 9 #include <numeric> | 9 #include <numeric> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 NOTREACHED(); | 105 NOTREACHED(); |
| 106 return UsbTransferStatus::TRANSFER_ERROR; | 106 return UsbTransferStatus::TRANSFER_ERROR; |
| 107 } | 107 } |
| 108 | 108 |
| 109 static void RunTransferCallback( | 109 static void RunTransferCallback( |
| 110 scoped_refptr<base::TaskRunner> callback_task_runner, | 110 scoped_refptr<base::TaskRunner> callback_task_runner, |
| 111 const UsbDeviceHandle::TransferCallback& callback, | 111 const UsbDeviceHandle::TransferCallback& callback, |
| 112 UsbTransferStatus status, | 112 UsbTransferStatus status, |
| 113 scoped_refptr<net::IOBuffer> buffer, | 113 scoped_refptr<net::IOBuffer> buffer, |
| 114 size_t result) { | 114 size_t result) { |
| 115 if (callback_task_runner->RunsTasksOnCurrentThread()) { | 115 if (callback_task_runner->RunsTasksInCurrentSequence()) { |
| 116 callback.Run(status, buffer, result); | 116 callback.Run(status, buffer, result); |
| 117 } else { | 117 } else { |
| 118 callback_task_runner->PostTask( | 118 callback_task_runner->PostTask( |
| 119 FROM_HERE, base::Bind(callback, status, buffer, result)); | 119 FROM_HERE, base::Bind(callback, status, buffer, result)); |
| 120 } | 120 } |
| 121 } | 121 } |
| 122 | 122 |
| 123 void ReportIsochronousTransferError( | 123 void ReportIsochronousTransferError( |
| 124 scoped_refptr<base::TaskRunner> callback_task_runner, | 124 scoped_refptr<base::TaskRunner> callback_task_runner, |
| 125 const UsbDeviceHandle::IsochronousTransferCallback& callback, | 125 const UsbDeviceHandle::IsochronousTransferCallback& callback, |
| 126 const std::vector<uint32_t> packet_lengths, | 126 const std::vector<uint32_t> packet_lengths, |
| 127 UsbTransferStatus status) { | 127 UsbTransferStatus status) { |
| 128 std::vector<UsbDeviceHandle::IsochronousPacket> packets( | 128 std::vector<UsbDeviceHandle::IsochronousPacket> packets( |
| 129 packet_lengths.size()); | 129 packet_lengths.size()); |
| 130 for (size_t i = 0; i < packet_lengths.size(); ++i) { | 130 for (size_t i = 0; i < packet_lengths.size(); ++i) { |
| 131 packets[i].length = packet_lengths[i]; | 131 packets[i].length = packet_lengths[i]; |
| 132 packets[i].transferred_length = 0; | 132 packets[i].transferred_length = 0; |
| 133 packets[i].status = status; | 133 packets[i].status = status; |
| 134 } | 134 } |
| 135 if (callback_task_runner->RunsTasksOnCurrentThread()) { | 135 if (callback_task_runner->RunsTasksInCurrentSequence()) { |
| 136 callback.Run(nullptr, packets); | 136 callback.Run(nullptr, packets); |
| 137 } else { | 137 } else { |
| 138 callback_task_runner->PostTask(FROM_HERE, | 138 callback_task_runner->PostTask(FROM_HERE, |
| 139 base::Bind(callback, nullptr, packets)); | 139 base::Bind(callback, nullptr, packets)); |
| 140 } | 140 } |
| 141 } | 141 } |
| 142 | 142 |
| 143 } // namespace | 143 } // namespace |
| 144 | 144 |
| 145 class UsbDeviceHandleImpl::InterfaceClaimer | 145 class UsbDeviceHandleImpl::InterfaceClaimer |
| (...skipping 653 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 799 blocking_task_runner_(blocking_task_runner) { | 799 blocking_task_runner_(blocking_task_runner) { |
| 800 DCHECK(handle) << "Cannot create device with NULL handle."; | 800 DCHECK(handle) << "Cannot create device with NULL handle."; |
| 801 } | 801 } |
| 802 | 802 |
| 803 UsbDeviceHandleImpl::~UsbDeviceHandleImpl() { | 803 UsbDeviceHandleImpl::~UsbDeviceHandleImpl() { |
| 804 DCHECK(!device_) << "UsbDeviceHandle must be closed before it is destroyed."; | 804 DCHECK(!device_) << "UsbDeviceHandle must be closed before it is destroyed."; |
| 805 | 805 |
| 806 // This class is RefCountedThreadSafe and so the destructor may be called on | 806 // This class is RefCountedThreadSafe and so the destructor may be called on |
| 807 // any thread. libusb is not safe to reentrancy so be sure not to try to close | 807 // any thread. libusb is not safe to reentrancy so be sure not to try to close |
| 808 // the device from inside a transfer completion callback. | 808 // the device from inside a transfer completion callback. |
| 809 if (blocking_task_runner_->RunsTasksOnCurrentThread()) { | 809 if (blocking_task_runner_->RunsTasksInCurrentSequence()) { |
| 810 libusb_close(handle_); | 810 libusb_close(handle_); |
| 811 } else { | 811 } else { |
| 812 blocking_task_runner_->PostTask(FROM_HERE, | 812 blocking_task_runner_->PostTask(FROM_HERE, |
| 813 base::Bind(&libusb_close, handle_)); | 813 base::Bind(&libusb_close, handle_)); |
| 814 } | 814 } |
| 815 } | 815 } |
| 816 | 816 |
| 817 void UsbDeviceHandleImpl::SetConfigurationOnBlockingThread( | 817 void UsbDeviceHandleImpl::SetConfigurationOnBlockingThread( |
| 818 int configuration_value, | 818 int configuration_value, |
| 819 const ResultCallback& callback) { | 819 const ResultCallback& callback) { |
| (...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1133 base::Bind(&Transfer::Submit, base::Unretained(transfer.release()))); | 1133 base::Bind(&Transfer::Submit, base::Unretained(transfer.release()))); |
| 1134 } | 1134 } |
| 1135 | 1135 |
| 1136 void UsbDeviceHandleImpl::TransferComplete(Transfer* transfer, | 1136 void UsbDeviceHandleImpl::TransferComplete(Transfer* transfer, |
| 1137 const base::Closure& callback) { | 1137 const base::Closure& callback) { |
| 1138 DCHECK(thread_checker_.CalledOnValidThread()); | 1138 DCHECK(thread_checker_.CalledOnValidThread()); |
| 1139 DCHECK(base::ContainsKey(transfers_, transfer)) | 1139 DCHECK(base::ContainsKey(transfers_, transfer)) |
| 1140 << "Missing transfer completed"; | 1140 << "Missing transfer completed"; |
| 1141 transfers_.erase(transfer); | 1141 transfers_.erase(transfer); |
| 1142 | 1142 |
| 1143 if (transfer->callback_task_runner()->RunsTasksOnCurrentThread()) { | 1143 if (transfer->callback_task_runner()->RunsTasksInCurrentSequence()) { |
| 1144 callback.Run(); | 1144 callback.Run(); |
| 1145 } else { | 1145 } else { |
| 1146 transfer->callback_task_runner()->PostTask(FROM_HERE, callback); | 1146 transfer->callback_task_runner()->PostTask(FROM_HERE, callback); |
| 1147 } | 1147 } |
| 1148 | 1148 |
| 1149 // libusb_free_transfer races with libusb_submit_transfer and only work- | 1149 // libusb_free_transfer races with libusb_submit_transfer and only work- |
| 1150 // around is to make sure to call them on the same thread. | 1150 // around is to make sure to call them on the same thread. |
| 1151 blocking_task_runner_->DeleteSoon(FROM_HERE, transfer); | 1151 blocking_task_runner_->DeleteSoon(FROM_HERE, transfer); |
| 1152 } | 1152 } |
| 1153 | 1153 |
| 1154 } // namespace device | 1154 } // namespace device |
| OLD | NEW |