imm32: Lazily allocated thread-local data.
diff --git a/dlls/imm32/imm.c b/dlls/imm32/imm.c
index 82868be..c7d170c 100644
--- a/dlls/imm32/imm.c
+++ b/dlls/imm32/imm.c
@@ -220,19 +220,15 @@
 
 static IMMThreadData* IMM_GetThreadData(void)
 {
-    return TlsGetValue(tlsIndex);
-}
-
-static BOOL IMM_InitThreadData(void)
-{
-    IMMThreadData* data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
-                                    sizeof(IMMThreadData));
-    if (!data) return FALSE;
-
-    TlsSetValue(tlsIndex,data);
-
-    TRACE("Thread Data Created\n");
-    return TRUE;
+    IMMThreadData* data = TlsGetValue(tlsIndex);
+    if (!data)
+    {
+        data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+                         sizeof(IMMThreadData));
+        TlsSetValue(tlsIndex,data);
+        TRACE("Thread Data Created\n");
+    }
+    return data;
 }
 
 static void IMM_FreeThreadData(void)
@@ -384,11 +380,10 @@
         case DLL_PROCESS_ATTACH:
             IMM_RegisterMessages();
             tlsIndex = TlsAlloc();
-            if (tlsIndex == TLS_OUT_OF_INDEXES || !IMM_InitThreadData())
+            if (tlsIndex == TLS_OUT_OF_INDEXES)
                 return FALSE;
             break;
         case DLL_THREAD_ATTACH:
-            IMM_InitThreadData();
             break;
         case DLL_THREAD_DETACH:
             IMM_FreeThreadData();