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 |