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 <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
478 reinterpret_cast<Transfer*>(platform_transfer->user_data); | 478 reinterpret_cast<Transfer*>(platform_transfer->user_data); |
479 DCHECK(transfer->platform_transfer_ == platform_transfer); | 479 DCHECK(transfer->platform_transfer_ == platform_transfer); |
480 transfer->ProcessCompletion(); | 480 transfer->ProcessCompletion(); |
481 } | 481 } |
482 | 482 |
483 void UsbDeviceHandleImpl::Transfer::TransferComplete(UsbTransferStatus status, | 483 void UsbDeviceHandleImpl::Transfer::TransferComplete(UsbTransferStatus status, |
484 size_t bytes_transferred) { | 484 size_t bytes_transferred) { |
485 task_runner_->PostTask( | 485 task_runner_->PostTask( |
486 FROM_HERE, | 486 FROM_HERE, |
487 base::Bind(&UsbDeviceHandleImpl::TransferComplete, device_handle_, | 487 base::Bind(&UsbDeviceHandleImpl::TransferComplete, device_handle_, |
488 base::Owned(this), | 488 base::Unretained(this), |
489 base::Bind(callback_, status, buffer_, bytes_transferred))); | 489 base::Bind(callback_, status, buffer_, bytes_transferred))); |
490 } | 490 } |
491 | 491 |
492 scoped_refptr<UsbDevice> UsbDeviceHandleImpl::GetDevice() const { | 492 scoped_refptr<UsbDevice> UsbDeviceHandleImpl::GetDevice() const { |
493 return device_; | 493 return device_; |
494 } | 494 } |
495 | 495 |
496 void UsbDeviceHandleImpl::Close() { | 496 void UsbDeviceHandleImpl::Close() { |
497 DCHECK(thread_checker_.CalledOnValidThread()); | 497 DCHECK(thread_checker_.CalledOnValidThread()); |
498 if (device_) | 498 if (device_) |
(...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
963 const base::Closure& callback) { | 963 const base::Closure& callback) { |
964 DCHECK(thread_checker_.CalledOnValidThread()); | 964 DCHECK(thread_checker_.CalledOnValidThread()); |
965 DCHECK(ContainsKey(transfers_, transfer)) << "Missing transfer completed"; | 965 DCHECK(ContainsKey(transfers_, transfer)) << "Missing transfer completed"; |
966 transfers_.erase(transfer); | 966 transfers_.erase(transfer); |
967 | 967 |
968 if (transfer->callback_task_runner()->RunsTasksOnCurrentThread()) { | 968 if (transfer->callback_task_runner()->RunsTasksOnCurrentThread()) { |
969 callback.Run(); | 969 callback.Run(); |
970 } else { | 970 } else { |
971 transfer->callback_task_runner()->PostTask(FROM_HERE, callback); | 971 transfer->callback_task_runner()->PostTask(FROM_HERE, callback); |
972 } | 972 } |
| 973 |
| 974 // libusb_free_transfer races with libusb_submit_transfer and only work- |
| 975 // around is to make sure to call them on the same thread. |
| 976 blocking_task_runner_->DeleteSoon(FROM_HERE, transfer); |
973 } | 977 } |
974 | 978 |
975 void UsbDeviceHandleImpl::InternalClose() { | 979 void UsbDeviceHandleImpl::InternalClose() { |
976 DCHECK(thread_checker_.CalledOnValidThread()); | 980 DCHECK(thread_checker_.CalledOnValidThread()); |
977 if (!device_) | 981 if (!device_) |
978 return; | 982 return; |
979 | 983 |
980 // Cancel all the transfers. | 984 // Cancel all the transfers. |
981 for (Transfer* transfer : transfers_) { | 985 for (Transfer* transfer : transfers_) { |
982 // The callback will be called some time later. | 986 // The callback will be called some time later. |
983 transfer->Cancel(); | 987 transfer->Cancel(); |
984 } | 988 } |
985 | 989 |
986 // Attempt-release all the interfaces. | 990 // Attempt-release all the interfaces. |
987 // It will be retained until the transfer cancellation is finished. | 991 // It will be retained until the transfer cancellation is finished. |
988 claimed_interfaces_.clear(); | 992 claimed_interfaces_.clear(); |
989 | 993 |
990 // Cannot close device handle here. Need to wait for libusb_cancel_transfer to | 994 // Cannot close device handle here. Need to wait for libusb_cancel_transfer to |
991 // finish. | 995 // finish. |
992 device_ = NULL; | 996 device_ = NULL; |
993 } | 997 } |
994 | 998 |
995 } // namespace device | 999 } // namespace device |
OLD | NEW |