Expand lock scope in libusb transfer callback.
This is required since cancel_transfers will also cancel the flush.
This commit is contained in:

committed by
Michael Ossmann

parent
770416f122
commit
1484b78c05
@ -1805,7 +1805,7 @@ static void LIBUSB_CALL
|
|||||||
hackrf_libusb_transfer_callback(struct libusb_transfer* usb_transfer)
|
hackrf_libusb_transfer_callback(struct libusb_transfer* usb_transfer)
|
||||||
{
|
{
|
||||||
hackrf_device* device = (hackrf_device*) usb_transfer->user_data;
|
hackrf_device* device = (hackrf_device*) usb_transfer->user_data;
|
||||||
bool success, resubmit;
|
bool success, resubmit = false;
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
hackrf_transfer transfer = {
|
hackrf_transfer transfer = {
|
||||||
@ -1822,13 +1822,12 @@ hackrf_libusb_transfer_callback(struct libusb_transfer* usb_transfer)
|
|||||||
device->tx_completion_callback(&transfer, success);
|
device->tx_completion_callback(&transfer, success);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (success) {
|
|
||||||
if (device->streaming && device->callback(&transfer) == 0) {
|
|
||||||
// Take lock to make sure that we don't restart a
|
// Take lock to make sure that we don't restart a
|
||||||
// transfer whilst cancel_transfers() is in the middle
|
// transfer whilst cancel_transfers() is in the middle
|
||||||
// of stopping them.
|
// of stopping them.
|
||||||
pthread_mutex_lock(&device->transfer_lock);
|
pthread_mutex_lock(&device->transfer_lock);
|
||||||
|
if (success) {
|
||||||
|
if (device->streaming && device->callback(&transfer) == 0) {
|
||||||
if ((resubmit = device->transfers_setup)) {
|
if ((resubmit = device->transfers_setup)) {
|
||||||
if (usb_transfer->endpoint == TX_ENDPOINT_ADDRESS) {
|
if (usb_transfer->endpoint == TX_ENDPOINT_ADDRESS) {
|
||||||
usb_transfer->length = transfer.valid_length;
|
usb_transfer->length = transfer.valid_length;
|
||||||
@ -1839,13 +1838,6 @@ hackrf_libusb_transfer_callback(struct libusb_transfer* usb_transfer)
|
|||||||
}
|
}
|
||||||
result = libusb_submit_transfer(usb_transfer);
|
result = libusb_submit_transfer(usb_transfer);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now we can release the lock. Our transfer was either
|
|
||||||
// cancelled or restarted, not both.
|
|
||||||
pthread_mutex_unlock(&device->transfer_lock);
|
|
||||||
|
|
||||||
if (resubmit && result == LIBUSB_SUCCESS)
|
|
||||||
return;
|
|
||||||
} else if (device->flush) {
|
} else if (device->flush) {
|
||||||
result = libusb_submit_transfer(device->flush_transfer);
|
result = libusb_submit_transfer(device->flush_transfer);
|
||||||
if (result != LIBUSB_SUCCESS) {
|
if (result != LIBUSB_SUCCESS) {
|
||||||
@ -1857,9 +1849,15 @@ hackrf_libusb_transfer_callback(struct libusb_transfer* usb_transfer)
|
|||||||
device->streaming = false;
|
device->streaming = false;
|
||||||
device->flush = false;
|
device->flush = false;
|
||||||
}
|
}
|
||||||
|
// Now we can release the lock. Our transfer was either
|
||||||
|
// cancelled or restarted, not both.
|
||||||
|
pthread_mutex_unlock(&device->transfer_lock);
|
||||||
|
|
||||||
// Unless we resubmitted this transfer and returned above,
|
// If a data transfer was resubmitted successfully, we're done.
|
||||||
// it's now finished.
|
if (resubmit && result == LIBUSB_SUCCESS)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Otherwise, a transfer has now finished.
|
||||||
transfer_finished(device, usb_transfer);
|
transfer_finished(device, usb_transfer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user