Alexandre Julliard : imm32: Simplify the helper functions to retrieve the thread data.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Feb 26 09:17:00 CST 2015


Module: wine
Branch: master
Commit: c84fd8586a21e665db18dcaaa46d5c185fddb403
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=c84fd8586a21e665db18dcaaa46d5c185fddb403

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Feb 26 22:59:51 2015 +0900

imm32: Simplify the helper functions to retrieve the thread data.

---

 dlls/imm32/imm.c | 50 ++++++++++++++++----------------------------------
 1 file changed, 16 insertions(+), 34 deletions(-)

diff --git a/dlls/imm32/imm.c b/dlls/imm32/imm.c
index 07ab598..1fc553d 100644
--- a/dlls/imm32/imm.c
+++ b/dlls/imm32/imm.c
@@ -225,43 +225,29 @@ static DWORD convert_candidatelist_AtoW(
     return ret;
 }
 
-static IMMThreadData* IMM_GetThreadData(DWORD id)
+static IMMThreadData *IMM_GetThreadData(HWND hwnd)
 {
     IMMThreadData *data;
+    DWORD process, thread;
 
-    if (!id) id = GetCurrentThreadId();
+    if (hwnd)
+    {
+        if (!(thread = GetWindowThreadProcessId(hwnd, &process))) return NULL;
+        if (process != GetCurrentProcessId()) return NULL;
+    }
+    else thread = GetCurrentThreadId();
 
     EnterCriticalSection(&threaddata_cs);
     LIST_FOR_EACH_ENTRY(data, &ImmThreadDataList, IMMThreadData, entry)
-    {
-        if (data->threadID == id)
-            return data;
-    }
+        if (data->threadID == thread) return data;
 
-    data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
-                     sizeof(IMMThreadData));
-    data->threadID = id;
+    data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*data));
+    data->threadID = thread;
     list_add_head(&ImmThreadDataList,&data->entry);
-    TRACE("Thread Data Created (%x)\n",id);
-
+    TRACE("Thread Data Created (%x)\n",thread);
     return data;
 }
 
-static IMMThreadData* IMM_GetThreadDataForWindow(HWND hwnd)
-{
-    DWORD process;
-    DWORD thread = 0;
-
-    if (hwnd)
-    {
-        thread = GetWindowThreadProcessId(hwnd, &process);
-        if (process != GetCurrentProcessId())
-            return NULL;
-    }
-
-    return IMM_GetThreadData(thread);
-}
-
 static BOOL IMM_IsDefaultContext(HIMC imc)
 {
     InputContextData *data = get_imc_data(imc);
@@ -497,7 +483,7 @@ static InputContextData* get_imc_data(HIMC hIMC)
 static HIMC get_default_context( HWND hwnd )
 {
     HIMC ret;
-    IMMThreadData* thread_data = IMM_GetThreadDataForWindow( hwnd );
+    IMMThreadData* thread_data = IMM_GetThreadData( hwnd );
 
     if (!thread_data) return 0;
 
@@ -1625,7 +1611,7 @@ BOOL WINAPI ImmGetConversionStatus(
 HWND WINAPI ImmGetDefaultIMEWnd(HWND hWnd)
 {
     HWND ret, new = NULL;
-    IMMThreadData* thread_data = IMM_GetThreadDataForWindow(hWnd);
+    IMMThreadData* thread_data = IMM_GetThreadData(hWnd);
     if (!thread_data)
         return NULL;
     if (thread_data->hwndDefault == NULL && thread_data->threadID == GetCurrentThreadId())
@@ -1634,12 +1620,8 @@ HWND WINAPI ImmGetDefaultIMEWnd(HWND hWnd)
         LeaveCriticalSection(&threaddata_cs);
         new = CreateWindowExW( WS_EX_TOOLWINDOW,
                     szwIME, NULL, WS_POPUP, 0, 0, 1, 1, 0, 0, 0, 0);
-        thread_data = IMM_GetThreadDataForWindow(hWnd);
-        if (!thread_data)
-        {
-            DestroyWindow(new);
-            return NULL;
-        }
+        /* thread_data is in the current thread so we can assume it's still valid */
+        EnterCriticalSection(&threaddata_cs);
         /* See if anyone beat us */
         if (thread_data->hwndDefault == NULL)
         {




More information about the wine-cvs mailing list