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 812 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
823 << ": " << ConvertPlatformUsbErrorToString(rv); | 823 << ": " << ConvertPlatformUsbErrorToString(rv); |
824 } | 824 } |
825 task_runner_->PostTask( | 825 task_runner_->PostTask( |
826 FROM_HERE, base::Bind(&UsbDeviceHandleImpl::SetConfigurationComplete, | 826 FROM_HERE, base::Bind(&UsbDeviceHandleImpl::SetConfigurationComplete, |
827 this, rv == LIBUSB_SUCCESS, callback)); | 827 this, rv == LIBUSB_SUCCESS, callback)); |
828 } | 828 } |
829 | 829 |
830 void UsbDeviceHandleImpl::SetConfigurationComplete( | 830 void UsbDeviceHandleImpl::SetConfigurationComplete( |
831 bool success, | 831 bool success, |
832 const ResultCallback& callback) { | 832 const ResultCallback& callback) { |
| 833 if (!device_) { |
| 834 callback.Run(false); |
| 835 return; |
| 836 } |
| 837 |
833 if (success) { | 838 if (success) { |
834 device_->RefreshActiveConfiguration(); | 839 device_->RefreshActiveConfiguration(); |
835 RefreshEndpointMap(); | 840 RefreshEndpointMap(); |
836 } | 841 } |
837 callback.Run(success); | 842 callback.Run(success); |
838 } | 843 } |
839 | 844 |
840 void UsbDeviceHandleImpl::ClaimInterfaceOnBlockingThread( | 845 void UsbDeviceHandleImpl::ClaimInterfaceOnBlockingThread( |
841 int interface_number, | 846 int interface_number, |
842 const ResultCallback& callback) { | 847 const ResultCallback& callback) { |
843 int rv = libusb_claim_interface(handle_, interface_number); | 848 int rv = libusb_claim_interface(handle_, interface_number); |
844 scoped_refptr<InterfaceClaimer> interface_claimer; | 849 scoped_refptr<InterfaceClaimer> interface_claimer; |
845 if (rv == LIBUSB_SUCCESS) { | 850 if (rv == LIBUSB_SUCCESS) { |
846 interface_claimer = | 851 interface_claimer = |
847 new InterfaceClaimer(this, interface_number, task_runner_); | 852 new InterfaceClaimer(this, interface_number, task_runner_); |
848 } else { | 853 } else { |
849 USB_LOG(EVENT) << "Failed to claim interface: " | 854 USB_LOG(EVENT) << "Failed to claim interface: " |
850 << ConvertPlatformUsbErrorToString(rv); | 855 << ConvertPlatformUsbErrorToString(rv); |
851 } | 856 } |
852 task_runner_->PostTask( | 857 task_runner_->PostTask( |
853 FROM_HERE, base::Bind(&UsbDeviceHandleImpl::ClaimInterfaceComplete, this, | 858 FROM_HERE, base::Bind(&UsbDeviceHandleImpl::ClaimInterfaceComplete, this, |
854 interface_claimer, callback)); | 859 interface_claimer, callback)); |
855 } | 860 } |
856 | 861 |
857 void UsbDeviceHandleImpl::ClaimInterfaceComplete( | 862 void UsbDeviceHandleImpl::ClaimInterfaceComplete( |
858 scoped_refptr<InterfaceClaimer> interface_claimer, | 863 scoped_refptr<InterfaceClaimer> interface_claimer, |
859 const ResultCallback& callback) { | 864 const ResultCallback& callback) { |
| 865 if (!device_) { |
| 866 // Ensure that the InterfaceClaimer is released on the blocking thread. |
| 867 InterfaceClaimer* raw_interface_claimer = interface_claimer.get(); |
| 868 interface_claimer->AddRef(); |
| 869 interface_claimer = nullptr; |
| 870 blocking_task_runner_->ReleaseSoon(FROM_HERE, raw_interface_claimer); |
| 871 callback.Run(false); |
| 872 return; |
| 873 } |
| 874 |
860 if (interface_claimer) { | 875 if (interface_claimer) { |
861 claimed_interfaces_[interface_claimer->interface_number()] = | 876 claimed_interfaces_[interface_claimer->interface_number()] = |
862 interface_claimer; | 877 interface_claimer; |
863 RefreshEndpointMap(); | 878 RefreshEndpointMap(); |
864 } | 879 } |
865 callback.Run(static_cast<bool>(interface_claimer)); | 880 callback.Run(static_cast<bool>(interface_claimer)); |
866 } | 881 } |
867 | 882 |
868 void UsbDeviceHandleImpl::SetInterfaceAlternateSettingOnBlockingThread( | 883 void UsbDeviceHandleImpl::SetInterfaceAlternateSettingOnBlockingThread( |
869 int interface_number, | 884 int interface_number, |
(...skipping 11 matching lines...) Expand all Loading... |
881 base::Bind(&UsbDeviceHandleImpl::SetInterfaceAlternateSettingComplete, | 896 base::Bind(&UsbDeviceHandleImpl::SetInterfaceAlternateSettingComplete, |
882 this, interface_number, alternate_setting, | 897 this, interface_number, alternate_setting, |
883 rv == LIBUSB_SUCCESS, callback)); | 898 rv == LIBUSB_SUCCESS, callback)); |
884 } | 899 } |
885 | 900 |
886 void UsbDeviceHandleImpl::SetInterfaceAlternateSettingComplete( | 901 void UsbDeviceHandleImpl::SetInterfaceAlternateSettingComplete( |
887 int interface_number, | 902 int interface_number, |
888 int alternate_setting, | 903 int alternate_setting, |
889 bool success, | 904 bool success, |
890 const ResultCallback& callback) { | 905 const ResultCallback& callback) { |
| 906 if (!device_) { |
| 907 callback.Run(false); |
| 908 return; |
| 909 } |
| 910 |
891 if (success) { | 911 if (success) { |
892 claimed_interfaces_[interface_number]->set_alternate_setting( | 912 claimed_interfaces_[interface_number]->set_alternate_setting( |
893 alternate_setting); | 913 alternate_setting); |
894 RefreshEndpointMap(); | 914 RefreshEndpointMap(); |
895 } | 915 } |
896 callback.Run(success); | 916 callback.Run(success); |
897 } | 917 } |
898 | 918 |
899 void UsbDeviceHandleImpl::ResetDeviceOnBlockingThread( | 919 void UsbDeviceHandleImpl::ResetDeviceOnBlockingThread( |
900 const ResultCallback& callback) { | 920 const ResultCallback& callback) { |
(...skipping 11 matching lines...) Expand all Loading... |
912 int rv = libusb_clear_halt(handle_, endpoint); | 932 int rv = libusb_clear_halt(handle_, endpoint); |
913 if (rv != LIBUSB_SUCCESS) { | 933 if (rv != LIBUSB_SUCCESS) { |
914 USB_LOG(EVENT) << "Failed to clear halt: " | 934 USB_LOG(EVENT) << "Failed to clear halt: " |
915 << ConvertPlatformUsbErrorToString(rv); | 935 << ConvertPlatformUsbErrorToString(rv); |
916 } | 936 } |
917 task_runner_->PostTask(FROM_HERE, base::Bind(callback, rv == LIBUSB_SUCCESS)); | 937 task_runner_->PostTask(FROM_HERE, base::Bind(callback, rv == LIBUSB_SUCCESS)); |
918 } | 938 } |
919 | 939 |
920 void UsbDeviceHandleImpl::RefreshEndpointMap() { | 940 void UsbDeviceHandleImpl::RefreshEndpointMap() { |
921 DCHECK(thread_checker_.CalledOnValidThread()); | 941 DCHECK(thread_checker_.CalledOnValidThread()); |
| 942 DCHECK(device_); |
922 endpoint_map_.clear(); | 943 endpoint_map_.clear(); |
923 const UsbConfigDescriptor* config = device_->active_configuration(); | 944 const UsbConfigDescriptor* config = device_->active_configuration(); |
924 if (config) { | 945 if (config) { |
925 for (const auto& map_entry : claimed_interfaces_) { | 946 for (const auto& map_entry : claimed_interfaces_) { |
926 int interface_number = map_entry.first; | 947 int interface_number = map_entry.first; |
927 const scoped_refptr<InterfaceClaimer>& claimed_iface = map_entry.second; | 948 const scoped_refptr<InterfaceClaimer>& claimed_iface = map_entry.second; |
928 | 949 |
929 for (const UsbInterfaceDescriptor& iface : config->interfaces) { | 950 for (const UsbInterfaceDescriptor& iface : config->interfaces) { |
930 if (iface.interface_number == interface_number && | 951 if (iface.interface_number == interface_number && |
931 iface.alternate_setting == claimed_iface->alternate_setting()) { | 952 iface.alternate_setting == claimed_iface->alternate_setting()) { |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1122 } else { | 1143 } else { |
1123 transfer->callback_task_runner()->PostTask(FROM_HERE, callback); | 1144 transfer->callback_task_runner()->PostTask(FROM_HERE, callback); |
1124 } | 1145 } |
1125 | 1146 |
1126 // libusb_free_transfer races with libusb_submit_transfer and only work- | 1147 // libusb_free_transfer races with libusb_submit_transfer and only work- |
1127 // around is to make sure to call them on the same thread. | 1148 // around is to make sure to call them on the same thread. |
1128 blocking_task_runner_->DeleteSoon(FROM_HERE, transfer); | 1149 blocking_task_runner_->DeleteSoon(FROM_HERE, transfer); |
1129 } | 1150 } |
1130 | 1151 |
1131 } // namespace device | 1152 } // namespace device |
OLD | NEW |