[PATCH] dinput: Wait for internal thread to compelte unacquiring.

Rémi Bernon rbernon at codeweavers.com
Tue Oct 12 05:40:46 CDT 2021


Otherwise we may close the read event before it has finished removing it
from the wait handles, causing the internal thread wait to return an
error and terminate.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/dinput/dinput_main.c | 13 ++++---------
 dlls/dinput8/tests/hid.c  |  6 ------
 2 files changed, 4 insertions(+), 15 deletions(-)

diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c
index 534e0ca8f86..12bc3a1f1dc 100644
--- a/dlls/dinput/dinput_main.c
+++ b/dlls/dinput/dinput_main.c
@@ -1379,8 +1379,7 @@ static DWORD WINAPI hook_thread_proc(void *param)
                 mouse_hook = NULL;
             }
 
-            if (finished_event)
-                SetEvent(finished_event);
+            SetEvent(finished_event);
         }
     }
 
@@ -1502,17 +1501,13 @@ void check_dinput_hooks(LPDIRECTINPUTDEVICE8W iface, BOOL acquired)
             WARN( "Unable to (un)register raw device %x:%x\n", dev->raw_device.usUsagePage, dev->raw_device.usUsage );
     }
 
-    if (acquired)
-        hook_change_finished_event = CreateEventW( NULL, FALSE, FALSE, NULL );
+    hook_change_finished_event = CreateEventW( NULL, FALSE, FALSE, NULL );
     PostThreadMessageW( hook_thread_id, WM_USER+0x10, 1, (LPARAM)hook_change_finished_event );
 
     LeaveCriticalSection(&dinput_hook_crit);
 
-    if (acquired)
-    {
-        WaitForSingleObject(hook_change_finished_event, INFINITE);
-        CloseHandle(hook_change_finished_event);
-    }
+    WaitForSingleObject(hook_change_finished_event, INFINITE);
+    CloseHandle(hook_change_finished_event);
 }
 
 void check_dinput_events(void)
diff --git a/dlls/dinput8/tests/hid.c b/dlls/dinput8/tests/hid.c
index cd6ce5c425b..8242544f0f9 100644
--- a/dlls/dinput8/tests/hid.c
+++ b/dlls/dinput8/tests/hid.c
@@ -4759,9 +4759,6 @@ static void test_simple_joystick(void)
     todo_wine
     ok( hr == DIERR_UNSUPPORTED, "Escape returned: %#x\n", hr );
 
-    /* FIXME: we have to wait a bit because Wine DInput internal thread keeps a reference */
-    Sleep( 100 );
-
     ref = IDirectInputDevice8_Release( device );
     ok( ref == 0, "Release returned %d\n", ref );
 
@@ -7228,9 +7225,6 @@ static void test_force_feedback_joystick( void )
     ok( hr == DI_OK, "Unacquire returned: %#x\n", hr );
     set_hid_expect( file, NULL, 0 );
 
-    /* FIXME: we have to wait a bit because Wine DInput internal thread keeps a reference */
-    Sleep( 100 );
-
     ref = IDirectInputDevice8_Release( device );
     ok( ref == 0, "Release returned %d\n", ref );
 
-- 
2.33.0




More information about the wine-devel mailing list