From cfff3306049af5f29a168489cf8fe791b1d493d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Bernon?= Date: Fri, 12 May 2023 09:38:47 +0200 Subject: [PATCH] rtworkq: Release thread pool work object when work_item is destroyed (Valgrind). --- dlls/rtworkq/queue.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/dlls/rtworkq/queue.c b/dlls/rtworkq/queue.c index d6c28ca4566..baf648bf771 100644 --- a/dlls/rtworkq/queue.c +++ b/dlls/rtworkq/queue.c @@ -131,6 +131,7 @@ struct work_item RTWQWORKITEM_KEY key; LONG priority; DWORD flags; + TP_WORK *work_object; PTP_SIMPLE_CALLBACK finalization_callback; union { @@ -374,7 +375,6 @@ static void pool_queue_submit(struct queue *queue, struct work_item *item) { TP_CALLBACK_PRIORITY callback_priority; TP_CALLBACK_ENVIRON_V3 env; - TP_WORK *work_object; if (item->priority == 0) callback_priority = TP_CALLBACK_PRIORITY_NORMAL; @@ -389,8 +389,8 @@ static void pool_queue_submit(struct queue *queue, struct work_item *item) we need finalization callback. */ if (item->finalization_callback) IUnknown_AddRef(&item->IUnknown_iface); - work_object = CreateThreadpoolWork(standard_queue_worker, item, (TP_CALLBACK_ENVIRON *)&env); - SubmitThreadpoolWork(work_object); + item->work_object = CreateThreadpoolWork(standard_queue_worker, item, (TP_CALLBACK_ENVIRON *)&env); + SubmitThreadpoolWork(item->work_object); TRACE("dispatched %p.\n", item->result); } @@ -551,6 +551,8 @@ static ULONG WINAPI work_item_Release(IUnknown *iface) if (!refcount) { + if (item->work_object) + CloseThreadpoolWork(item->work_object); if (item->reply_result) IRtwqAsyncResult_Release(item->reply_result); IRtwqAsyncResult_Release(item->result);