Aric Stewart : msctf: Only 1 ITfThreadMgr is created per thread.

Alexandre Julliard julliard at winehq.org
Tue Feb 3 09:13:22 CST 2009


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

Author: Aric Stewart <aric at codeweavers.com>
Date:   Mon Feb  2 10:24:47 2009 -0600

msctf: Only 1 ITfThreadMgr is created per thread.

---

 dlls/msctf/msctf.c          |    7 ++++++-
 dlls/msctf/msctf_internal.h |    1 +
 dlls/msctf/threadmgr.c      |   11 +++++++++++
 3 files changed, 18 insertions(+), 1 deletions(-)

diff --git a/dlls/msctf/msctf.c b/dlls/msctf/msctf.c
index 254444b..7dc1bcd 100644
--- a/dlls/msctf/msctf.c
+++ b/dlls/msctf/msctf.c
@@ -43,6 +43,8 @@ static LONG MSCTF_refCount;
 
 static HINSTANCE MSCTF_hinstance;
 
+DWORD tlsIndex = 0;
+
 typedef HRESULT (*LPFNCONSTRUCTOR)(IUnknown *pUnkOuter, IUnknown **ppvOut);
 
 static const struct {
@@ -159,8 +161,11 @@ BOOL WINAPI DllMain(HINSTANCE hinst, DWORD fdwReason, LPVOID fImpLoad)
         case DLL_WINE_PREATTACH:
             return FALSE;   /* prefer native version */
         case DLL_PROCESS_ATTACH:
-            DisableThreadLibraryCalls(hinst);
             MSCTF_hinstance = hinst;
+            tlsIndex = TlsAlloc();
+            break;
+        case DLL_PROCESS_DETACH:
+            TlsFree(tlsIndex);
             break;
     }
     return TRUE;
diff --git a/dlls/msctf/msctf_internal.h b/dlls/msctf/msctf_internal.h
index ee87a50..fa4a6ef 100644
--- a/dlls/msctf/msctf_internal.h
+++ b/dlls/msctf/msctf_internal.h
@@ -20,6 +20,7 @@
 
 #ifndef __WINE_MSCTF_I_H
 #define __WINE_MSCTF_I_H
+extern DWORD tlsIndex;
 
 extern HRESULT ThreadMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut);
 extern HRESULT DocumentMgr_Constructor(ITfDocumentMgr **ppOut);
diff --git a/dlls/msctf/threadmgr.c b/dlls/msctf/threadmgr.c
index b16f7ec..7385f0b 100644
--- a/dlls/msctf/threadmgr.c
+++ b/dlls/msctf/threadmgr.c
@@ -49,6 +49,7 @@ typedef struct tagACLMulti {
 
 static void ThreadMgr_Destructor(ThreadMgr *This)
 {
+    TlsSetValue(tlsIndex,NULL);
     TRACE("destroying %p\n", This);
     if (This->focus)
         ITfDocumentMgr_Release(This->focus);
@@ -227,12 +228,22 @@ HRESULT ThreadMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut)
     if (pUnkOuter)
         return CLASS_E_NOAGGREGATION;
 
+    /* Only 1 ThreadMgr is created per thread */
+    This = TlsGetValue(tlsIndex);
+    if (This)
+    {
+        ThreadMgr_AddRef((ITfThreadMgr*)This);
+        *ppOut = (IUnknown*)This;
+        return S_OK;
+    }
+
     This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(ThreadMgr));
     if (This == NULL)
         return E_OUTOFMEMORY;
 
     This->ThreadMgrVtbl= &ThreadMgr_ThreadMgrVtbl;
     This->refCount = 1;
+    TlsSetValue(tlsIndex,This);
 
     TRACE("returning %p\n", This);
     *ppOut = (IUnknown *)This;




More information about the wine-cvs mailing list