| 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 |