Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(245)

Side by Side Diff: device/usb/usb_device_handle_impl.cc

Issue 827433002: Resolve two USB transfer handling regressions. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
151 return rv == LIBUSB_SUCCESS; 151 return rv == LIBUSB_SUCCESS;
152 } 152 }
153 153
154 // This inner class owns the underlying libusb_transfer and may outlast 154 // This inner class owns the underlying libusb_transfer and may outlast
155 // the UsbDeviceHandle that created it. 155 // the UsbDeviceHandle that created it.
156 class UsbDeviceHandleImpl::Transfer { 156 class UsbDeviceHandleImpl::Transfer {
157 public: 157 public:
158 static scoped_ptr<Transfer> CreateControlTransfer( 158 static scoped_ptr<Transfer> CreateControlTransfer(
159 uint8 type, 159 uint8 type,
160 uint8 request, 160 uint8 request,
161 uint8 value, 161 uint16 value,
162 uint8 index, 162 uint16 index,
163 uint16 length, 163 uint16 length,
164 scoped_refptr<net::IOBuffer> buffer, 164 scoped_refptr<net::IOBuffer> buffer,
165 unsigned int timeout, 165 unsigned int timeout,
166 const UsbTransferCallback& callback); 166 const UsbTransferCallback& callback);
167 static scoped_ptr<Transfer> CreateBulkTransfer( 167 static scoped_ptr<Transfer> CreateBulkTransfer(
168 uint8 endpoint, 168 uint8 endpoint,
169 scoped_refptr<net::IOBuffer> buffer, 169 scoped_refptr<net::IOBuffer> buffer,
170 int length, 170 int length,
171 unsigned int timeout, 171 unsigned int timeout,
172 const UsbTransferCallback& callback); 172 const UsbTransferCallback& callback);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
213 size_t length_; 213 size_t length_;
214 UsbTransferCallback callback_; 214 UsbTransferCallback callback_;
215 scoped_refptr<base::SingleThreadTaskRunner> callback_task_runner_; 215 scoped_refptr<base::SingleThreadTaskRunner> callback_task_runner_;
216 }; 216 };
217 217
218 // static 218 // static
219 scoped_ptr<UsbDeviceHandleImpl::Transfer> 219 scoped_ptr<UsbDeviceHandleImpl::Transfer>
220 UsbDeviceHandleImpl::Transfer::CreateControlTransfer( 220 UsbDeviceHandleImpl::Transfer::CreateControlTransfer(
221 uint8 type, 221 uint8 type,
222 uint8 request, 222 uint8 request,
223 uint8 value, 223 uint16 value,
224 uint8 index, 224 uint16 index,
225 uint16 length, 225 uint16 length,
226 scoped_refptr<net::IOBuffer> buffer, 226 scoped_refptr<net::IOBuffer> buffer,
227 unsigned int timeout, 227 unsigned int timeout,
228 const UsbTransferCallback& callback) { 228 const UsbTransferCallback& callback) {
229 scoped_ptr<Transfer> transfer(new Transfer(USB_TRANSFER_CONTROL, buffer, 229 scoped_ptr<Transfer> transfer(new Transfer(USB_TRANSFER_CONTROL, buffer,
230 length + LIBUSB_CONTROL_SETUP_SIZE, 230 length + LIBUSB_CONTROL_SETUP_SIZE,
231 callback)); 231 callback));
232 232
233 transfer->platform_transfer_ = libusb_alloc_transfer(0); 233 transfer->platform_transfer_ = libusb_alloc_transfer(0);
234 if (!transfer->platform_transfer_) { 234 if (!transfer->platform_transfer_) {
235 LOG(ERROR) << "Failed to allocate control transfer.";
235 return nullptr; 236 return nullptr;
236 } 237 }
237 238
238 libusb_fill_control_setup(reinterpret_cast<uint8*>(buffer->data()), type, 239 libusb_fill_control_setup(reinterpret_cast<uint8*>(buffer->data()), type,
239 request, value, index, length); 240 request, value, index, length);
240 libusb_fill_control_transfer(transfer->platform_transfer_, 241 libusb_fill_control_transfer(transfer->platform_transfer_,
241 nullptr, /* filled in by Submit() */ 242 nullptr, /* filled in by Submit() */
242 reinterpret_cast<uint8*>(buffer->data()), 243 reinterpret_cast<uint8*>(buffer->data()),
243 &UsbDeviceHandleImpl::Transfer::PlatformCallback, 244 &UsbDeviceHandleImpl::Transfer::PlatformCallback,
244 transfer.get(), timeout); 245 transfer.get(), timeout);
245 246
246 return transfer.Pass(); 247 return transfer.Pass();
247 } 248 }
248 249
249 // static 250 // static
250 scoped_ptr<UsbDeviceHandleImpl::Transfer> 251 scoped_ptr<UsbDeviceHandleImpl::Transfer>
251 UsbDeviceHandleImpl::Transfer::CreateBulkTransfer( 252 UsbDeviceHandleImpl::Transfer::CreateBulkTransfer(
252 uint8 endpoint, 253 uint8 endpoint,
253 scoped_refptr<net::IOBuffer> buffer, 254 scoped_refptr<net::IOBuffer> buffer,
254 int length, 255 int length,
255 unsigned int timeout, 256 unsigned int timeout,
256 const UsbTransferCallback& callback) { 257 const UsbTransferCallback& callback) {
257 scoped_ptr<Transfer> transfer( 258 scoped_ptr<Transfer> transfer(
258 new Transfer(USB_TRANSFER_BULK, buffer, length, callback)); 259 new Transfer(USB_TRANSFER_BULK, buffer, length, callback));
259 260
260 transfer->platform_transfer_ = libusb_alloc_transfer(0); 261 transfer->platform_transfer_ = libusb_alloc_transfer(0);
261 if (!transfer->platform_transfer_) { 262 if (!transfer->platform_transfer_) {
263 LOG(ERROR) << "Failed to allocate bulk transfer.";
262 return nullptr; 264 return nullptr;
263 } 265 }
264 266
265 libusb_fill_bulk_transfer(transfer->platform_transfer_, 267 libusb_fill_bulk_transfer(transfer->platform_transfer_,
266 nullptr, /* filled in by Submit() */ 268 nullptr, /* filled in by Submit() */
267 endpoint, reinterpret_cast<uint8*>(buffer->data()), 269 endpoint, reinterpret_cast<uint8*>(buffer->data()),
268 static_cast<int>(length), 270 static_cast<int>(length),
269 &UsbDeviceHandleImpl::Transfer::PlatformCallback, 271 &UsbDeviceHandleImpl::Transfer::PlatformCallback,
270 transfer.get(), timeout); 272 transfer.get(), timeout);
271 273
272 return transfer.Pass(); 274 return transfer.Pass();
273 } 275 }
274 276
275 // static 277 // static
276 scoped_ptr<UsbDeviceHandleImpl::Transfer> 278 scoped_ptr<UsbDeviceHandleImpl::Transfer>
277 UsbDeviceHandleImpl::Transfer::CreateInterruptTransfer( 279 UsbDeviceHandleImpl::Transfer::CreateInterruptTransfer(
278 uint8 endpoint, 280 uint8 endpoint,
279 scoped_refptr<net::IOBuffer> buffer, 281 scoped_refptr<net::IOBuffer> buffer,
280 int length, 282 int length,
281 unsigned int timeout, 283 unsigned int timeout,
282 const UsbTransferCallback& callback) { 284 const UsbTransferCallback& callback) {
283 scoped_ptr<Transfer> transfer( 285 scoped_ptr<Transfer> transfer(
284 new Transfer(USB_TRANSFER_INTERRUPT, buffer, length, callback)); 286 new Transfer(USB_TRANSFER_INTERRUPT, buffer, length, callback));
285 287
286 transfer->platform_transfer_ = libusb_alloc_transfer(0); 288 transfer->platform_transfer_ = libusb_alloc_transfer(0);
287 if (!transfer->platform_transfer_) { 289 if (!transfer->platform_transfer_) {
290 LOG(ERROR) << "Failed to allocate interrupt transfer.";
288 return nullptr; 291 return nullptr;
289 } 292 }
290 293
291 libusb_fill_interrupt_transfer( 294 libusb_fill_interrupt_transfer(
292 transfer->platform_transfer_, nullptr, /* filled in by Submit() */ 295 transfer->platform_transfer_, nullptr, /* filled in by Submit() */
293 endpoint, reinterpret_cast<uint8*>(buffer->data()), 296 endpoint, reinterpret_cast<uint8*>(buffer->data()),
294 static_cast<int>(length), 297 static_cast<int>(length),
295 &UsbDeviceHandleImpl::Transfer::PlatformCallback, transfer.get(), 298 &UsbDeviceHandleImpl::Transfer::PlatformCallback, transfer.get(),
296 timeout); 299 timeout);
297 300
298 return transfer.Pass(); 301 return transfer.Pass();
299 } 302 }
300 303
301 // static 304 // static
302 scoped_ptr<UsbDeviceHandleImpl::Transfer> 305 scoped_ptr<UsbDeviceHandleImpl::Transfer>
303 UsbDeviceHandleImpl::Transfer::CreateIsochronousTransfer( 306 UsbDeviceHandleImpl::Transfer::CreateIsochronousTransfer(
304 uint8 endpoint, 307 uint8 endpoint,
305 scoped_refptr<net::IOBuffer> buffer, 308 scoped_refptr<net::IOBuffer> buffer,
306 size_t length, 309 size_t length,
307 unsigned int packets, 310 unsigned int packets,
308 unsigned int packet_length, 311 unsigned int packet_length,
309 unsigned int timeout, 312 unsigned int timeout,
310 const UsbTransferCallback& callback) { 313 const UsbTransferCallback& callback) {
311 DCHECK(packets <= length && (packets * packet_length) <= length) 314 DCHECK(packets <= length && (packets * packet_length) <= length)
312 << "transfer length is too small"; 315 << "transfer length is too small";
313 316
314 scoped_ptr<Transfer> transfer( 317 scoped_ptr<Transfer> transfer(
315 new Transfer(USB_TRANSFER_ISOCHRONOUS, buffer, length, callback)); 318 new Transfer(USB_TRANSFER_ISOCHRONOUS, buffer, length, callback));
316 319
317 transfer->platform_transfer_ = libusb_alloc_transfer(0); 320 transfer->platform_transfer_ = libusb_alloc_transfer(packets);
318 if (!transfer->platform_transfer_) { 321 if (!transfer->platform_transfer_) {
322 LOG(ERROR) << "Failed to allocate isochronous transfer.";
319 return nullptr; 323 return nullptr;
320 } 324 }
321 325
322 libusb_fill_iso_transfer( 326 libusb_fill_iso_transfer(
323 transfer->platform_transfer_, nullptr, /* filled in by Submit() */ 327 transfer->platform_transfer_, nullptr, /* filled in by Submit() */
324 endpoint, reinterpret_cast<uint8*>(buffer->data()), 328 endpoint, reinterpret_cast<uint8*>(buffer->data()),
325 static_cast<int>(length), packets, &Transfer::PlatformCallback, 329 static_cast<int>(length), packets, &Transfer::PlatformCallback,
326 transfer.get(), timeout); 330 transfer.get(), timeout);
327 libusb_set_iso_packet_lengths(transfer->platform_transfer_, packet_length); 331 libusb_set_iso_packet_lengths(transfer->platform_transfer_, packet_length);
328 332
(...skipping 504 matching lines...) Expand 10 before | Expand all | Expand 10 after
833 // Attempt-release all the interfaces. 837 // Attempt-release all the interfaces.
834 // It will be retained until the transfer cancellation is finished. 838 // It will be retained until the transfer cancellation is finished.
835 claimed_interfaces_.clear(); 839 claimed_interfaces_.clear();
836 840
837 // Cannot close device handle here. Need to wait for libusb_cancel_transfer to 841 // Cannot close device handle here. Need to wait for libusb_cancel_transfer to
838 // finish. 842 // finish.
839 device_ = NULL; 843 device_ = NULL;
840 } 844 }
841 845
842 } // namespace device 846 } // namespace device
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698