mirror of https://github.com/xemu-project/xemu.git
usb-host: workaround libusb bug
libusb seems to no allways call the completion callback for requests canceled (which it is supposed to do according to the docs). So add a limit to avoid qemu waiting forever. Tested-by: BALATON Zoltan <balaton@eik.bme.hu> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Message-Id: <20200529072225.3195-1-kraxel@redhat.com>
This commit is contained in:
parent
9f815e83e9
commit
54cdfe5112
|
@ -972,6 +972,7 @@ fail:
|
||||||
static void usb_host_abort_xfers(USBHostDevice *s)
|
static void usb_host_abort_xfers(USBHostDevice *s)
|
||||||
{
|
{
|
||||||
USBHostRequest *r, *rtmp;
|
USBHostRequest *r, *rtmp;
|
||||||
|
int limit = 100;
|
||||||
|
|
||||||
QTAILQ_FOREACH_SAFE(r, &s->requests, next, rtmp) {
|
QTAILQ_FOREACH_SAFE(r, &s->requests, next, rtmp) {
|
||||||
usb_host_req_abort(r);
|
usb_host_req_abort(r);
|
||||||
|
@ -982,6 +983,19 @@ static void usb_host_abort_xfers(USBHostDevice *s)
|
||||||
memset(&tv, 0, sizeof(tv));
|
memset(&tv, 0, sizeof(tv));
|
||||||
tv.tv_usec = 2500;
|
tv.tv_usec = 2500;
|
||||||
libusb_handle_events_timeout(ctx, &tv);
|
libusb_handle_events_timeout(ctx, &tv);
|
||||||
|
if (--limit == 0) {
|
||||||
|
/*
|
||||||
|
* Don't wait forever for libusb calling the complete
|
||||||
|
* callback (which will unlink and free the request).
|
||||||
|
*
|
||||||
|
* Leaking memory here, to make sure libusb will not
|
||||||
|
* access memory which we have released already.
|
||||||
|
*/
|
||||||
|
QTAILQ_FOREACH_SAFE(r, &s->requests, next, rtmp) {
|
||||||
|
QTAILQ_REMOVE(&s->requests, r, next);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue