Rémi Bernon : winebus.sys: Create the IOHID bus thread in main.c.

Alexandre Julliard julliard at winehq.org
Wed Aug 25 15:21:43 CDT 2021


Module: wine
Branch: master
Commit: b4d8cd38918c3ec74d70d9d229f3d88de91e405c
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=b4d8cd38918c3ec74d70d9d229f3d88de91e405c

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Mon Aug 23 10:49:38 2021 +0200

winebus.sys: Create the IOHID bus thread in main.c.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winebus.sys/bus.h       |  7 +++---
 dlls/winebus.sys/bus_iohid.c | 59 +++++++++++++++++++++-----------------------
 dlls/winebus.sys/main.c      | 15 ++++++++++-
 3 files changed, 46 insertions(+), 35 deletions(-)

diff --git a/dlls/winebus.sys/bus.h b/dlls/winebus.sys/bus.h
index 6dc95a5b803..cecde2aa83c 100644
--- a/dlls/winebus.sys/bus.h
+++ b/dlls/winebus.sys/bus.h
@@ -28,9 +28,6 @@
 typedef int(*enum_func)(DEVICE_OBJECT *device, void *context);
 
 /* Buses */
-NTSTATUS iohid_driver_init(void) DECLSPEC_HIDDEN;
-void iohid_driver_unload( void ) DECLSPEC_HIDDEN;
-
 extern NTSTATUS sdl_bus_init(void *) DECLSPEC_HIDDEN;
 extern NTSTATUS sdl_bus_wait(void *) DECLSPEC_HIDDEN;
 extern NTSTATUS sdl_bus_stop(void *) DECLSPEC_HIDDEN;
@@ -39,6 +36,10 @@ extern NTSTATUS udev_bus_init(void *) DECLSPEC_HIDDEN;
 extern NTSTATUS udev_bus_wait(void *) DECLSPEC_HIDDEN;
 extern NTSTATUS udev_bus_stop(void *) DECLSPEC_HIDDEN;
 
+extern NTSTATUS iohid_bus_init(void *) DECLSPEC_HIDDEN;
+extern NTSTATUS iohid_bus_wait(void *) DECLSPEC_HIDDEN;
+extern NTSTATUS iohid_bus_stop(void *) DECLSPEC_HIDDEN;
+
 /* Native device function table */
 typedef struct
 {
diff --git a/dlls/winebus.sys/bus_iohid.c b/dlls/winebus.sys/bus_iohid.c
index 4eb0ea0e4b3..49774dd0662 100644
--- a/dlls/winebus.sys/bus_iohid.c
+++ b/dlls/winebus.sys/bus_iohid.c
@@ -96,7 +96,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(plugplay);
 
 static IOHIDManagerRef hid_manager;
 static CFRunLoopRef run_loop;
-static HANDLE run_loop_handle;
 
 static const WCHAR busidW[] = {'I','O','H','I','D',0};
 
@@ -385,63 +384,61 @@ static void handle_RemovalCallback(void *context, IOReturn result, void *sender,
     }
 }
 
-/* This puts the relevant run loop for event handling into a WINE thread */
-static DWORD CALLBACK runloop_thread(void *args)
+NTSTATUS iohid_bus_init(void *args)
 {
+    if (!(hid_manager = IOHIDManagerCreate(kCFAllocatorDefault, 0L)))
+    {
+        ERR("IOHID manager creation failed\n");
+        return STATUS_UNSUCCESSFUL;
+    }
+
     run_loop = CFRunLoopGetCurrent();
 
     IOHIDManagerSetDeviceMatching(hid_manager, NULL);
     IOHIDManagerRegisterDeviceMatchingCallback(hid_manager, handle_DeviceMatchingCallback, NULL);
     IOHIDManagerRegisterDeviceRemovalCallback(hid_manager, handle_RemovalCallback, NULL);
     IOHIDManagerScheduleWithRunLoop(hid_manager, run_loop, kCFRunLoopDefaultMode);
-
-    CFRunLoopRun();
-    TRACE("Run Loop exiting\n");
-    return 1;
-
+    return STATUS_SUCCESS;
 }
 
-NTSTATUS iohid_driver_init(void)
+NTSTATUS iohid_bus_wait(void *args)
 {
-    hid_manager = IOHIDManagerCreate(kCFAllocatorDefault, 0L);
-    if (!(run_loop_handle = CreateThread(NULL, 0, runloop_thread, NULL, 0, NULL)))
-    {
-        ERR("Failed to initialize IOHID Manager thread\n");
-        CFRelease(hid_manager);
-        return STATUS_UNSUCCESSFUL;
-    }
+    CFRunLoopRun();
 
-    TRACE("Initialization successful\n");
+    TRACE("IOHID main loop exiting\n");
+    IOHIDManagerRegisterDeviceMatchingCallback(hid_manager, NULL, NULL);
+    IOHIDManagerRegisterDeviceRemovalCallback(hid_manager, NULL, NULL);
+    CFRelease(hid_manager);
     return STATUS_SUCCESS;
 }
 
-void iohid_driver_unload( void )
+NTSTATUS iohid_bus_stop(void *args)
 {
-    TRACE("Unloading Driver\n");
-
-    if (!run_loop_handle)
-        return;
+    if (!run_loop) return STATUS_SUCCESS;
 
     IOHIDManagerUnscheduleFromRunLoop(hid_manager, run_loop, kCFRunLoopDefaultMode);
     CFRunLoopStop(run_loop);
-    WaitForSingleObject(run_loop_handle, INFINITE);
-    CloseHandle(run_loop_handle);
-    IOHIDManagerRegisterDeviceMatchingCallback(hid_manager, NULL, NULL);
-    IOHIDManagerRegisterDeviceRemovalCallback(hid_manager, NULL, NULL);
-    CFRelease(hid_manager);
-    TRACE("Driver Unloaded\n");
+    return STATUS_SUCCESS;
 }
 
 #else
 
-NTSTATUS iohid_driver_init(void)
+NTSTATUS iohid_bus_init(void *args)
+{
+    WARN("IOHID support not compiled in!\n");
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS iohid_bus_wait(void *args)
 {
+    WARN("IOHID support not compiled in!\n");
     return STATUS_NOT_IMPLEMENTED;
 }
 
-void iohid_driver_unload( void )
+NTSTATUS iohid_bus_stop(void *args)
 {
-    TRACE("Stub: Unload Driver\n");
+    WARN("IOHID support not compiled in!\n");
+    return STATUS_NOT_IMPLEMENTED;
 }
 
 #endif /* HAVE_IOHIDMANAGERCREATE */
diff --git a/dlls/winebus.sys/main.c b/dlls/winebus.sys/main.c
index 505fc131be4..9d57a0c4db2 100644
--- a/dlls/winebus.sys/main.c
+++ b/dlls/winebus.sys/main.c
@@ -699,6 +699,19 @@ static NTSTATUS udev_driver_init(void)
     return bus_main_thread_start(&bus);
 }
 
+static NTSTATUS iohid_driver_init(void)
+{
+    static const WCHAR bus_name[] = {'I','O','H','I','D'};
+    struct bus_main_params bus =
+    {
+        .name = bus_name,
+        .init_func = iohid_bus_init,
+        .wait_func = iohid_bus_wait,
+    };
+
+    return bus_main_thread_start(&bus);
+}
+
 static NTSTATUS fdo_pnp_dispatch(DEVICE_OBJECT *device, IRP *irp)
 {
     static const WCHAR SDL_enabledW[] = {'E','n','a','b','l','e',' ','S','D','L',0};
@@ -727,9 +740,9 @@ static NTSTATUS fdo_pnp_dispatch(DEVICE_OBJECT *device, IRP *irp)
         irp->IoStatus.Status = STATUS_SUCCESS;
         break;
     case IRP_MN_REMOVE_DEVICE:
-        iohid_driver_unload();
         sdl_bus_stop(NULL);
         udev_bus_stop(NULL);
+        iohid_bus_stop(NULL);
 
         WaitForMultipleObjects(bus_count, bus_thread, TRUE, INFINITE);
         while (bus_count--) CloseHandle(bus_thread[bus_count]);




More information about the wine-cvs mailing list