[PATCH] user32: Call driver's DestroyWindow in destroy_thread_windows().

Paul Gofman pgofman at codeweavers.com
Wed Oct 13 05:39:18 CDT 2021


USER_Driver->pThreadDetach() destroys thread data part of which
(e. g., display) is still present in window data in winex11.drv
and accessible through hwnd. That causes all sort of hangs
and crashes when, for instance, the windows is still used for Vulkan
rendering (even if only to tear down the device and swapchain).

Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
---
 dlls/user32/user_main.c | 4 +++-
 dlls/user32/win.c       | 3 ++-
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/dlls/user32/user_main.c b/dlls/user32/user_main.c
index 30e5d154d3d..f4b0f110dc2 100644
--- a/dlls/user32/user_main.c
+++ b/dlls/user32/user_main.c
@@ -358,9 +358,11 @@ static void thread_detach(void)
     exiting_thread_id = GetCurrentThreadId();
 
     WDML_NotifyThreadDetach();
-    USER_Driver->pThreadDetach();
 
     destroy_thread_windows();
+
+    USER_Driver->pThreadDetach();
+
     CloseHandle( thread_info->server_queue );
     HeapFree( GetProcessHeap(), 0, thread_info->wmchar_data );
     HeapFree( GetProcessHeap(), 0, thread_info->key_state );
diff --git a/dlls/user32/win.c b/dlls/user32/win.c
index 5e89f4c2c97..bafd0a3a7f0 100644
--- a/dlls/user32/win.c
+++ b/dlls/user32/win.c
@@ -1218,7 +1218,6 @@ void destroy_thread_windows(void)
     while ((wndPtr = next_thread_window( &hwnd )))
     {
         /* destroy the client-side storage */
-
         list = WIN_ListChildren( hwnd );
         menu = ((wndPtr->dwStyle & (WS_CHILD | WS_POPUP)) != WS_CHILD) ? (HMENU)wndPtr->wIDmenu : 0;
         sys_menu = wndPtr->hSysMenu;
@@ -1235,6 +1234,8 @@ void destroy_thread_windows(void)
             window_surface_release( surface );
         }
 
+        USER_Driver->pDestroyWindow( hwnd );
+
         /* free child windows */
 
         if (!list) continue;
-- 
2.31.1




More information about the wine-devel mailing list