Module: wine Branch: master Commit: 35d9d5f40a6e4ef82e13c5703349b33054c4daab URL: http://source.winehq.org/git/wine.git/?a=commit;h=35d9d5f40a6e4ef82e13c57033...
Author: Sebastian Lackner sebastian@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@fds-team.de Signed-off-by: Aric Stewart aric@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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