Nikolay Sivov : combase: Move thread data cleanup.

Alexandre Julliard julliard at winehq.org
Fri Aug 28 15:17:58 CDT 2020


Module: wine
Branch: master
Commit: 2452c8c6cdf2206933b95c742f56cfb6190a579e
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=2452c8c6cdf2206933b95c742f56cfb6190a579e

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Fri Aug 28 11:05:20 2020 +0300

combase: Move thread data cleanup.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/combase/combase.c | 33 +++++++++++++++++++++++++++++++++
 dlls/ole32/compobj.c   | 29 -----------------------------
 2 files changed, 33 insertions(+), 29 deletions(-)

diff --git a/dlls/combase/combase.c b/dlls/combase/combase.c
index da8e97df93..da91d66cc5 100644
--- a/dlls/combase/combase.c
+++ b/dlls/combase/combase.c
@@ -403,6 +403,36 @@ HRESULT WINAPI InternalTlsAllocData(struct tlsdata **data)
     return S_OK;
 }
 
+static void com_cleanup_tlsdata(void)
+{
+    struct tlsdata *tlsdata = NtCurrentTeb()->ReservedForOle;
+    struct init_spy *cursor, *cursor2;
+
+    if (!tlsdata)
+        return;
+
+    if (tlsdata->apt)
+        apartment_release(tlsdata->apt);
+    if (tlsdata->errorinfo)
+        IErrorInfo_Release(tlsdata->errorinfo);
+    if (tlsdata->state)
+        IUnknown_Release(tlsdata->state);
+
+    LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, &tlsdata->spies, struct init_spy, entry)
+    {
+        list_remove(&cursor->entry);
+        if (cursor->spy)
+            IInitializeSpy_Release(cursor->spy);
+        heap_free(cursor);
+    }
+
+    if (tlsdata->context_token)
+        IObjContext_Release(tlsdata->context_token);
+
+    heap_free(tlsdata);
+    NtCurrentTeb()->ReservedForOle = NULL;
+}
+
 /***********************************************************************
  *           FreePropVariantArray    (combase.@)
  */
@@ -2955,6 +2985,9 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD reason, LPVOID reserved)
         apartment_global_cleanup();
         DeleteCriticalSection(&registered_classes_cs);
         break;
+    case DLL_THREAD_DETACH:
+        com_cleanup_tlsdata();
+        break;
     }
 
     return TRUE;
diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c
index 748c5c1bdf..39ccc86b35 100644
--- a/dlls/ole32/compobj.c
+++ b/dlls/ole32/compobj.c
@@ -489,31 +489,6 @@ HRESULT WINAPI ManualResetEvent_CreateInstance(IClassFactory *iface, IUnknown *o
     return hr;
 }
 
-static void COM_TlsDestroy(void)
-{
-    struct oletls *info = NtCurrentTeb()->ReservedForOle;
-    if (info)
-    {
-        struct init_spy *cursor, *cursor2;
-
-        if (info->apt) apartment_release(info->apt);
-        if (info->errorinfo) IErrorInfo_Release(info->errorinfo);
-        if (info->state) IUnknown_Release(info->state);
-
-        LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, &info->spies, struct init_spy, entry)
-        {
-            list_remove(&cursor->entry);
-            if (cursor->spy) IInitializeSpy_Release(cursor->spy);
-            heap_free(cursor);
-        }
-
-        if (info->context_token) IObjContext_Release(info->context_token);
-
-        HeapFree(GetProcessHeap(), 0, info);
-        NtCurrentTeb()->ReservedForOle = NULL;
-    }
-}
-
 /******************************************************************************
  *           CoBuildVersion [OLE32.@]
  *
@@ -1324,10 +1299,6 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID reserved)
         release_std_git();
         RPC_UnregisterAllChannelHooks();
         break;
-
-    case DLL_THREAD_DETACH:
-        COM_TlsDestroy();
-        break;
     }
     return TRUE;
 }




More information about the wine-cvs mailing list