[PATCH 07/11] mfplat: Initialize COM in work queues.

Derek Lesho dlesho at codeweavers.com
Tue Feb 4 11:17:18 CST 2020


Signed-off-by: Derek Lesho <dlesho at codeweavers.com>
---
 dlls/mfplat/queue.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/dlls/mfplat/queue.c b/dlls/mfplat/queue.c
index 31b281a9a3..72a4752087 100644
--- a/dlls/mfplat/queue.c
+++ b/dlls/mfplat/queue.c
@@ -166,12 +166,15 @@ static void release_work_item(struct work_item *item)
     }
 }
 
+static DWORD init_tls_idx;
+
 static void init_work_queue(MFASYNC_WORKQUEUE_TYPE queue_type, struct queue *queue)
 {
     TP_CALLBACK_ENVIRON_V3 env;
     unsigned int max_thread, i;
 
     queue->pool = CreateThreadpool(NULL);
+    init_tls_idx = TlsAlloc();
 
     memset(&env, 0, sizeof(env));
     env.Version = 3;
@@ -286,6 +289,9 @@ static void shutdown_queue(struct queue *queue)
     CloseThreadpool(queue->pool);
     queue->pool = NULL;
 
+    if (init_tls_idx != TLS_OUT_OF_INDEXES)
+        TlsFree(init_tls_idx);
+
     EnterCriticalSection(&queue->cs);
     LIST_FOR_EACH_ENTRY_SAFE(item, item2, &queue->pending_items, struct work_item, entry)
     {
@@ -349,6 +355,12 @@ static void CALLBACK standard_queue_worker(TP_CALLBACK_INSTANCE *instance, void
 
     TRACE("result object %p.\n", result);
 
+    if (init_tls_idx != TLS_OUT_OF_INDEXES && TlsGetValue(init_tls_idx) == 0 && GetLastError() == ERROR_SUCCESS)
+    {
+        TlsSetValue(init_tls_idx, (LPVOID)0x1);
+        CoInitializeEx(NULL, COINIT_MULTITHREADED);
+    }
+
     IMFAsyncCallback_Invoke(result->pCallback, item->result);
 
     release_work_item(item);
-- 
2.25.0




More information about the wine-devel mailing list