Rémi Bernon : dinput: Wait for the internal thread to complete unacquiring.

Alexandre Julliard julliard at winehq.org
Wed Oct 13 15:59:26 CDT 2021


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

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Wed Oct 13 09:21:19 2021 +0200

dinput: Wait for the internal thread to complete unacquiring.

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

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

---

 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 46c18ed55dd..985dae1ab36 100644
--- a/dlls/dinput/dinput_main.c
+++ b/dlls/dinput/dinput_main.c
@@ -1381,8 +1381,7 @@ static DWORD WINAPI hook_thread_proc(void *param)
                 mouse_hook = NULL;
             }
 
-            if (finished_event)
-                SetEvent(finished_event);
+            SetEvent(finished_event);
         }
     }
 
@@ -1504,17 +1503,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 cf50dd32fb9..87a2a9a7a3c 100644
--- a/dlls/dinput8/tests/hid.c
+++ b/dlls/dinput8/tests/hid.c
@@ -4758,9 +4758,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 );
 
@@ -7227,9 +7224,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 );
 




More information about the wine-cvs mailing list