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

Unified Diff: device/usb/usb_device_handle_usbfs.cc

Issue 2584093002: Prevent timed-out USB transfers from being cancelled twice. (Closed)
Patch Set: Reset callbacks after they are run. Created 4 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: device/usb/usb_device_handle_usbfs.cc
diff --git a/device/usb/usb_device_handle_usbfs.cc b/device/usb/usb_device_handle_usbfs.cc
index cddb2f69678982c517c90a3ac1d927da9f2ad5f2..de4d92f5a0c8ac9040042e04bf95e39dd421c2a7 100644
--- a/device/usb/usb_device_handle_usbfs.cc
+++ b/device/usb/usb_device_handle_usbfs.cc
@@ -236,9 +236,6 @@ struct UsbDeviceHandleUsbfs::Transfer {
scoped_refptr<net::IOBuffer> control_transfer_buffer;
scoped_refptr<net::IOBuffer> buffer;
- TransferCallback callback;
- IsochronousTransferCallback isoc_callback;
- scoped_refptr<base::SingleThreadTaskRunner> callback_runner;
base::CancelableClosure timeout_closure;
bool cancelled = false;
@@ -254,6 +251,10 @@ struct UsbDeviceHandleUsbfs::Transfer {
usbdevfs_urb urb;
private:
+ TransferCallback callback;
juncai 2016/12/20 18:18:54 The comment for the above |urb| variable says: "Th
Reilly Grant (use Gerrit) 2016/12/20 20:28:59 Done, good catch.
+ IsochronousTransferCallback isoc_callback;
+ scoped_refptr<base::SingleThreadTaskRunner> callback_runner;
+
DISALLOW_COPY_AND_ASSIGN(Transfer);
};
@@ -292,20 +293,22 @@ void* UsbDeviceHandleUsbfs::Transfer::operator new(
void UsbDeviceHandleUsbfs::Transfer::RunCallback(UsbTransferStatus status,
size_t bytes_transferred) {
DCHECK_NE(urb.type, USBDEVFS_URB_TYPE_ISO);
- DCHECK(!callback.is_null());
+ DCHECK(callback);
if (!callback_runner || callback_runner->BelongsToCurrentThread()) {
callback.Run(status, buffer, bytes_transferred);
} else {
callback_runner->PostTask(
FROM_HERE, base::Bind(callback, status, buffer, bytes_transferred));
}
+ callback.Reset();
}
void UsbDeviceHandleUsbfs::Transfer::RunIsochronousCallback(
const std::vector<IsochronousPacket>& packets) {
DCHECK_EQ(urb.type, USBDEVFS_URB_TYPE_ISO);
- DCHECK(!isoc_callback.is_null());
+ DCHECK(isoc_callback);
isoc_callback.Run(buffer, packets);
+ isoc_callback.Reset();
}
UsbDeviceHandleUsbfs::UsbDeviceHandleUsbfs(
@@ -339,10 +342,12 @@ void UsbDeviceHandleUsbfs::Close() {
// On the |task_runner_| thread check |device_| to see if the handle is
// closed. On the |blocking_task_runner_| thread check |fd_.is_valid()| to
// see if the handle is closed.
- for (const auto& transfer : transfers_)
- CancelTransfer(transfer.get(), USB_TRANSFER_CANCELLED);
device_->HandleClosed(this);
device_ = nullptr;
+
+ for (const auto& transfer : transfers_)
+ CancelTransfer(transfer.get(), USB_TRANSFER_CANCELLED);
+
blocking_task_runner_->PostTask(
FROM_HERE, base::Bind(&UsbDeviceHandleUsbfs::CloseBlocking, this));
}
@@ -848,6 +853,9 @@ UsbDeviceHandleUsbfs::RemoveFromTransferList(Transfer* transfer_ptr) {
void UsbDeviceHandleUsbfs::CancelTransfer(Transfer* transfer,
UsbTransferStatus status) {
+ if (transfer->cancelled)
+ return;
+
// |transfer| must stay in |transfers_| as it is still being processed by the
// kernel and will be reaped later.
transfer->cancelled = true;
« 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