usb-transfer: Work around libgusb cancellation issue
We have plenty of code paths where a transfer may be cancelled before it is submitted. Unfortunately, libgusb up to and including version 0.3.6 are not handling that case correctly (due to libusb ignoring cancellation on transfers that are not yet submitted). Work around this, but do so in a somewhat lazy fashion that is not entirely race free. Closes: #306
This commit is contained in:
parent
a63dcc96d5
commit
c7cab77fc1
1 changed files with 30 additions and 0 deletions
|
@ -354,6 +354,24 @@ transfer_finish_cb (GObject *source_object, GAsyncResult *res, gpointer user_dat
|
||||||
fpi_usb_transfer_unref (transfer);
|
fpi_usb_transfer_unref (transfer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
transfer_cancel_cb (FpiUsbTransfer *transfer)
|
||||||
|
{
|
||||||
|
GError *error;
|
||||||
|
FpiUsbTransferCallback callback;
|
||||||
|
|
||||||
|
error = g_error_new_literal (G_IO_ERROR,
|
||||||
|
G_IO_ERROR_CANCELLED,
|
||||||
|
"Transfer was cancelled before being started");
|
||||||
|
callback = transfer->callback;
|
||||||
|
transfer->callback = NULL;
|
||||||
|
transfer->actual_length = -1;
|
||||||
|
callback (transfer, transfer->device, transfer->user_data, error);
|
||||||
|
|
||||||
|
fpi_usb_transfer_unref (transfer);
|
||||||
|
|
||||||
|
return G_SOURCE_REMOVE;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fpi_usb_transfer_submit:
|
* fpi_usb_transfer_submit:
|
||||||
|
@ -387,6 +405,18 @@ fpi_usb_transfer_submit (FpiUsbTransfer *transfer,
|
||||||
|
|
||||||
log_transfer (transfer, TRUE, NULL);
|
log_transfer (transfer, TRUE, NULL);
|
||||||
|
|
||||||
|
/* Work around libgusb cancellation issue, see
|
||||||
|
* https://github.com/hughsie/libgusb/pull/42
|
||||||
|
* should be fixed with libgusb 0.3.7.
|
||||||
|
* Note that this is not race free, we rely on libfprint and API users
|
||||||
|
* not cancelling from a different thread here.
|
||||||
|
*/
|
||||||
|
if (cancellable && g_cancellable_is_cancelled (cancellable))
|
||||||
|
{
|
||||||
|
g_idle_add ((GSourceFunc) transfer_cancel_cb, transfer);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
switch (transfer->type)
|
switch (transfer->type)
|
||||||
{
|
{
|
||||||
case FP_TRANSFER_BULK:
|
case FP_TRANSFER_BULK:
|
||||||
|
|
Loading…
Reference in a new issue