diff options
author | Vitali Lovich <vlovich@aliph.com> | 2011-09-14 07:02:06 +0200 |
---|---|---|
committer | Peter Stuge <peter@stuge.se> | 2011-09-22 11:26:17 +0200 |
commit | 25dbf6afe4570a06b8a410458172099cde9df88e (patch) | |
tree | ddd6d985fbf7d929ef2d70a8b5f1adb30ca8e1d1 | |
parent | 5925f9ae8003700e153150ef28774ee0bf1e1925 (diff) | |
download | libusb-25dbf6afe4570a06b8a410458172099cde9df88e.tar.gz |
Darwin: Reduce race likelihood between cancellation and device disconnect
References #88. The race condition still remains, but this change
makes it less likely to trigger.
-rw-r--r-- | libusb/os/darwin_usb.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/libusb/os/darwin_usb.c b/libusb/os/darwin_usb.c index 9ebb150..1f356ee 100644 --- a/libusb/os/darwin_usb.c +++ b/libusb/os/darwin_usb.c @@ -1449,6 +1449,9 @@ static int cancel_control_transfer(struct usbi_transfer *itransfer) { usbi_info (ITRANSFER_CTX (itransfer), "WARNING: aborting all transactions control pipe"); + if (!dpriv->device) + return LIBUSB_ERROR_NO_DEVICE; + kresult = (*(dpriv->device))->USBDeviceAbortPipeZero (dpriv->device); return darwin_to_libusb (kresult); @@ -1456,6 +1459,7 @@ static int cancel_control_transfer(struct usbi_transfer *itransfer) { static int darwin_abort_transfers (struct usbi_transfer *itransfer) { struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); + struct darwin_device_priv *dpriv = (struct darwin_device_priv *)transfer->dev_handle->dev->os_priv; struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)transfer->dev_handle->os_priv; struct darwin_interface *cInterface; uint8_t pipeRef, iface; @@ -1469,6 +1473,9 @@ static int darwin_abort_transfers (struct usbi_transfer *itransfer) { cInterface = &priv->interfaces[iface]; + if (!dpriv->device) + return LIBUSB_ERROR_NO_DEVICE; + usbi_info (ITRANSFER_CTX (itransfer), "WARNING: aborting all transactions on interface %d pipe %d", iface, pipeRef); /* abort transactions */ |