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