[PATCH 4/4] wineusb.sys: Complete IRPs through the event thread.
Zebediah Figura
wine at gitlab.winehq.org
Mon Jul 4 14:58:08 CDT 2022
From: Zebediah Figura <zfigura at codeweavers.com>
---
dlls/wineusb.sys/wineusb.c | 26 ++++++++++++++++++++------
1 file changed, 20 insertions(+), 6 deletions(-)
diff --git a/dlls/wineusb.sys/wineusb.c b/dlls/wineusb.sys/wineusb.c
index 37434074b91..0b8af43a3dc 100644
--- a/dlls/wineusb.sys/wineusb.c
+++ b/dlls/wineusb.sys/wineusb.c
@@ -115,6 +115,7 @@ enum usb_event_type
{
USB_EVENT_ADD_DEVICE,
USB_EVENT_REMOVE_DEVICE,
+ USB_EVENT_TRANSFER_COMPLETE,
USB_EVENT_SHUTDOWN,
};
@@ -126,6 +127,7 @@ struct usb_event
{
struct unix_device *added_device;
struct unix_device *removed_device;
+ IRP *completed_irp;
} u;
};
@@ -407,6 +409,16 @@ static DWORD CALLBACK libusb_event_thread_proc(void *arg)
return 0;
}
+static void complete_irp(IRP *irp)
+{
+ EnterCriticalSection(&wineusb_cs);
+ RemoveEntryList(&irp->Tail.Overlay.ListEntry);
+ LeaveCriticalSection(&wineusb_cs);
+
+ irp->IoStatus.Status = STATUS_SUCCESS;
+ IoCompleteRequest(irp, IO_NO_INCREMENT);
+}
+
static DWORD CALLBACK event_thread_proc(void *arg)
{
struct usb_event event;
@@ -427,6 +439,10 @@ static DWORD CALLBACK event_thread_proc(void *arg)
remove_unix_device(event.u.removed_device);
break;
+ case USB_EVENT_TRANSFER_COMPLETE:
+ complete_irp(event.u.completed_irp);
+ break;
+
case USB_EVENT_SHUTDOWN:
TRACE("Shutting down client event thread.\n");
return 0;
@@ -772,6 +788,7 @@ static void LIBUSB_CALL transfer_cb(struct libusb_transfer *transfer)
{
IRP *irp = transfer->user_data;
URB *urb = IoGetCurrentIrpStackLocation(irp)->Parameters.Others.Argument1;
+ struct usb_event event;
TRACE("Completing IRP %p, status %#x.\n", irp, transfer->status);
@@ -807,12 +824,9 @@ static void LIBUSB_CALL transfer_cb(struct libusb_transfer *transfer)
}
}
- EnterCriticalSection(&wineusb_cs);
- RemoveEntryList(&irp->Tail.Overlay.ListEntry);
- LeaveCriticalSection(&wineusb_cs);
-
- irp->IoStatus.Status = STATUS_SUCCESS;
- IoCompleteRequest(irp, IO_NO_INCREMENT);
+ event.type = USB_EVENT_TRANSFER_COMPLETE;
+ event.u.completed_irp = irp;
+ queue_event(&event);
}
static void queue_irp(struct usb_device *device, IRP *irp, struct libusb_transfer *transfer)
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/373
More information about the wine-devel
mailing list