From 0c5bf03eb829e51dcf19562fc4f745937235ea51 Mon Sep 17 00:00:00 2001 From: Vitali Lovich Date: Wed, 14 Sep 2011 07:02:06 +0200 Subject: 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. --- libusb/os/darwin_usb.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'libusb/os') 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 */ -- cgit v1.2.1