Alexandre Julliard : dinput: Only register the window class once to avoid race conditions.
Module: wine Branch: master Commit: 09371c75d5538131b6fd57db5c615165b356f23b URL: http://source.winehq.org/git/wine.git/?a=commit;h=09371c75d5538131b6fd57db5c... Author: Alexandre Julliard <julliard(a)winehq.org> Date: Thu Oct 5 17:45:45 2006 +0200 dinput: Only register the window class once to avoid race conditions. --- dlls/dinput/dinput_main.c | 25 +++++++++++++++---------- 1 files changed, 15 insertions(+), 10 deletions(-) diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c index b60cd89..5ac150b 100644 --- a/dlls/dinput/dinput_main.c +++ b/dlls/dinput/dinput_main.c @@ -754,20 +754,13 @@ static LRESULT CALLBACK dinput_hook_WndP static HWND hook_thread_hwnd; static LONG hook_thread_refcount; +static const WCHAR classW[]={'H','o','o','k','_','L','L','_','C','L',0}; + static DWORD WINAPI hook_thread_proc(void *param) { - static const WCHAR classW[]={'H','o','o','k','_','L','L','_','C','L',0}; MSG msg; - WNDCLASSEXW wcex; HWND hwnd; - memset(&wcex, 0, sizeof(wcex)); - wcex.cbSize = sizeof(wcex); - wcex.lpfnWndProc = dinput_hook_WndProc; - wcex.lpszClassName = classW; - wcex.hInstance = GetModuleHandleW(0); - - if (!RegisterClassExW(&wcex)) ERR("Error registering window class\n"); hwnd = CreateWindowExW(0, classW, NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, 0); hook_thread_hwnd = hwnd; @@ -783,7 +776,6 @@ static DWORD WINAPI hook_thread_proc(voi } else ERR("Error creating message window\n"); - UnregisterClassW(wcex.lpszClassName, wcex.hInstance); return 0; } @@ -799,8 +791,21 @@ static CRITICAL_SECTION dinput_hook_crit static BOOL create_hook_thread(void) { LONG ref; + static ATOM class_atom; EnterCriticalSection(&dinput_hook_crit); + + if (!class_atom) + { + WNDCLASSEXW wcex; + memset(&wcex, 0, sizeof(wcex)); + wcex.cbSize = sizeof(wcex); + wcex.lpfnWndProc = dinput_hook_WndProc; + wcex.lpszClassName = classW; + wcex.hInstance = GetModuleHandleW(0); + if (!(class_atom = RegisterClassExW(&wcex))) ERR("Error registering window class\n"); + } + ref = ++hook_thread_refcount; TRACE("Refcount %ld\n", ref); if (ref == 1)
participants (1)
-
Alexandre Julliard