summary refs log tree commit diff
path: root/usb_util
diff options
context:
space:
mode:
authorDaniel Verkamp <dverkamp@chromium.org>2019-07-22 13:52:19 -0700
committerCommit Bot <commit-bot@chromium.org>2019-09-09 18:20:40 +0000
commit13eea9f02870a05253f86e4fc9ba4e35367950de (patch)
tree2416bc631cf4dc3aee594a1d2f78380a849892e7 /usb_util
parentf5a52516b1496533ef75ef181575faf891f8dc1a (diff)
downloadcrosvm-13eea9f02870a05253f86e4fc9ba4e35367950de.tar
crosvm-13eea9f02870a05253f86e4fc9ba4e35367950de.tar.gz
crosvm-13eea9f02870a05253f86e4fc9ba4e35367950de.tar.bz2
crosvm-13eea9f02870a05253f86e4fc9ba4e35367950de.tar.lz
crosvm-13eea9f02870a05253f86e4fc9ba4e35367950de.tar.xz
crosvm-13eea9f02870a05253f86e4fc9ba4e35367950de.tar.zst
crosvm-13eea9f02870a05253f86e4fc9ba4e35367950de.zip
usb: clarify transfer cancellation API
Rather than having a get_canceller() function on UsbTransfer, make the
submit function return the canceller.  This makes it clear that the
transfer can't be cancelled before it is submitted.

BUG=None
TEST=None

Change-Id: Ice36c3096a1f8a5aafe93b5d5e27eb371183c19f
Signed-off-by: Daniel Verkamp <dverkamp@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1783599
Reviewed-by: Zach Reizner <zachr@chromium.org>
Tested-by: kokoro <noreply+kokoro@google.com>
Diffstat (limited to 'usb_util')
-rw-r--r--usb_util/src/device_handle.rs4
-rw-r--r--usb_util/src/usb_transfer.rs15
2 files changed, 7 insertions, 12 deletions
diff --git a/usb_util/src/device_handle.rs b/usb_util/src/device_handle.rs
index 77a91be..17b0f68 100644
--- a/usb_util/src/device_handle.rs
+++ b/usb_util/src/device_handle.rs
@@ -9,7 +9,7 @@ use crate::bindings;
 use crate::error::{Error, Result};
 use crate::libusb_context::LibUsbContextInner;
 use crate::libusb_device::LibUsbDevice;
-use crate::usb_transfer::{UsbTransfer, UsbTransferBuffer};
+use crate::usb_transfer::{TransferCanceller, UsbTransfer, UsbTransferBuffer};
 
 /// DeviceHandle wraps libusb_device_handle.
 pub struct DeviceHandle {
@@ -155,7 +155,7 @@ impl DeviceHandle {
     pub fn submit_async_transfer<T: UsbTransferBuffer>(
         &self,
         transfer: UsbTransfer<T>,
-    ) -> Result<()> {
+    ) -> Result<TransferCanceller> {
         unsafe { transfer.submit(self.handle) }
     }
 }
diff --git a/usb_util/src/usb_transfer.rs b/usb_util/src/usb_transfer.rs
index e08bc92..e3ca623 100644
--- a/usb_util/src/usb_transfer.rs
+++ b/usb_util/src/usb_transfer.rs
@@ -241,14 +241,6 @@ impl<T: UsbTransferBuffer> UsbTransfer<T> {
         UsbTransfer { inner }
     }
 
-    /// Get canceller of this transfer.
-    pub fn get_canceller(&self) -> TransferCanceller {
-        let weak_transfer = Arc::downgrade(&self.inner.transfer);
-        TransferCanceller {
-            transfer: weak_transfer,
-        }
-    }
-
     /// Set callback function for transfer completion.
     pub fn set_callback<C: 'static + Fn(UsbTransfer<T>) + Send>(&mut self, cb: C) {
         self.inner.callback = Some(Box::new(cb));
@@ -287,11 +279,14 @@ impl<T: UsbTransferBuffer> UsbTransfer<T> {
     ///
     /// Assumes libusb_device_handle is an handled opened by libusb, self.inner.transfer.ptr is
     /// initialized with correct buffer and length.
-    pub unsafe fn submit(self, handle: *mut libusb_device_handle) -> Result<()> {
+    pub unsafe fn submit(self, handle: *mut libusb_device_handle) -> Result<TransferCanceller> {
+        let weak_transfer = Arc::downgrade(&self.inner.transfer);
         let transfer = self.into_raw();
         (*transfer).dev_handle = handle;
         match Error::from(libusb_submit_transfer(transfer)) {
-            Error::Success(_e) => Ok(()),
+            Error::Success(_e) => Ok(TransferCanceller {
+                transfer: weak_transfer,
+            }),
             err => {
                 UsbTransfer::<T>::from_raw(transfer);
                 Err(err)