Module: wine Branch: master Commit: 8b34370d7cf870015d003ef8307d833f3f0c9600 URL: http://source.winehq.org/git/wine.git/?a=commit;h=8b34370d7cf870015d003ef830... Author: Aric Stewart <aric(a)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;