Module: wine Branch: stable Commit: 4dc5606c35e2ce9763299087342d29dee29d8b58 URL: https://source.winehq.org/git/wine.git/?a=commit;h=4dc5606c35e2ce97632990873...
Author: Rémi Bernon rbernon@codeweavers.com Date: Fri Mar 26 18:36:01 2021 +0100
dinput: Wait for the hook thread to exit when stopping it.
FlatOut2 demo calls FreeLibrary on the dinput8 module more times than it has loaded it, and the module reference that the internal thread has is getting decremented before its exit.
Having an internal window to destroy also makes it more likely to crash as it takes more time to exit calls the window procedure function.
Waiting for the thread to complete when all the dinput instances are destroyed ensures that the thread isn't alive when the game frees the DLL, and prevents the thread from crashing.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50673 Signed-off-by: Rémi Bernon rbernon@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org (cherry picked from commit b71cea76ed24ca940783e01da54917eefa0bb36b) Signed-off-by: Michael Stefaniuc mstefani@winehq.org
---
dlls/dinput/dinput_main.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c index 45023fc104a..5da60cf1f7c 100644 --- a/dlls/dinput/dinput_main.c +++ b/dlls/dinput/dinput_main.c @@ -1861,6 +1861,7 @@ static BOOL check_hook_thread(void) { static HANDLE hook_thread; HMODULE module; + HANDLE wait_handle = NULL;
EnterCriticalSection(&dinput_hook_crit);
@@ -1884,11 +1885,17 @@ static BOOL check_hook_thread(void)
hook_thread_id = 0; PostThreadMessageW(tid, WM_USER+0x10, 0, 0); - CloseHandle(hook_thread); + wait_handle = hook_thread; hook_thread = NULL; }
LeaveCriticalSection(&dinput_hook_crit); + + if (wait_handle) + { + WaitForSingleObject(wait_handle, INFINITE); + CloseHandle(wait_handle); + } return hook_thread_id != 0; }