Sebastian Lackner : winebus.sys: Spawn a device loop thread and add synchronization.

Alexandre Julliard julliard at winehq.org
Mon Oct 3 14:07:18 CDT 2016


Module: wine
Branch: master
Commit: 35d9d5f40a6e4ef82e13c5703349b33054c4daab
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=35d9d5f40a6e4ef82e13c5703349b33054c4daab

Author: Sebastian Lackner <sebastian at fds-team.de>
Date:   Mon Oct  3 13:24:44 2016 +0200

winebus.sys: Spawn a device loop thread and add synchronization.

Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
Signed-off-by: Aric Stewart <aric at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winebus.sys/bus_udev.c | 38 ++++++++++++++++++++++++++++++++++++--
 1 file changed, 36 insertions(+), 2 deletions(-)

diff --git a/dlls/winebus.sys/bus_udev.c b/dlls/winebus.sys/bus_udev.c
index 1525861..1f6df6f 100644
--- a/dlls/winebus.sys/bus_udev.c
+++ b/dlls/winebus.sys/bus_udev.c
@@ -164,8 +164,21 @@ static void build_initial_deviceset(void)
     udev_enumerate_unref(enumerate);
 }
 
+static DWORD CALLBACK deviceloop_thread(void *args)
+{
+    HANDLE init_done = args;
+
+    build_initial_deviceset();
+    SetEvent(init_done);
+
+    return 0;
+}
+
 NTSTATUS WINAPI udev_driver_init(DRIVER_OBJECT *driver, UNICODE_STRING *registry_path)
 {
+    HANDLE events[2];
+    DWORD result;
+
     TRACE("(%p, %s)\n", driver, debugstr_w(registry_path->Buffer));
 
     if (!(udev_context = udev_new()))
@@ -177,8 +190,29 @@ NTSTATUS WINAPI udev_driver_init(DRIVER_OBJECT *driver, UNICODE_STRING *registry
     udev_driver_obj = driver;
     driver->MajorFunction[IRP_MJ_PNP] = common_pnp_dispatch;
 
-    build_initial_deviceset();
-    return STATUS_SUCCESS;
+    if (!(events[0] = CreateEventW(NULL, TRUE, FALSE, NULL)))
+        goto error;
+    if (!(events[1] = CreateThread(NULL, 0, deviceloop_thread, events[0], 0, NULL)))
+    {
+        CloseHandle(events[0]);
+        goto error;
+    }
+
+    result = WaitForMultipleObjects(2, events, FALSE, INFINITE);
+    CloseHandle(events[0]);
+    CloseHandle(events[1]);
+    if (result == WAIT_OBJECT_0)
+    {
+        TRACE("Initialization successful\n");
+        return STATUS_SUCCESS;
+    }
+
+error:
+    ERR("Failed to initialize udev device thread\n");
+    udev_unref(udev_context);
+    udev_context = NULL;
+    udev_driver_obj = NULL;
+    return STATUS_UNSUCCESSFUL;
 }
 
 #else




More information about the wine-cvs mailing list