From b1bfae286f24303e0ca254e92c4859d55dce8b23 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 31 Mar 2007 20:13:08 -0700 Subject: [PATCH] quartz: Use a safe APC to kill the PullPin thread when the PullPin is being released. --- dlls/quartz/pin.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/dlls/quartz/pin.c b/dlls/quartz/pin.c index 84a2c30507e..06313e4503d 100644 --- a/dlls/quartz/pin.c +++ b/dlls/quartz/pin.c @@ -1121,6 +1121,15 @@ HRESULT WINAPI PullPin_ReceiveConnection(IPin * iface, IPin * pReceivePin, const return hr; } +static void CALLBACK PullPin_SafeThreadStop(ULONG_PTR handle) +{ + HANDLE hThread = (HANDLE)handle; + + if (hThread) + CloseHandle(hThread); + ExitThread(0); +} + HRESULT WINAPI PullPin_QueryInterface(IPin * iface, REFIID riid, LPVOID * ppv) { PullPin *This = (PullPin *)iface; @@ -1155,7 +1164,14 @@ ULONG WINAPI PullPin_Release(IPin * iface) if (!refCount) { if (This->hThread) - PullPin_StopProcessing(This); + { + HRESULT hr; + + if (!QueueUserAPC(PullPin_SafeThreadStop, This->hThread, (ULONG_PTR)This->hThread)) + ERR("Cannot stop PullPin thread (GetLastError() = %d)!", GetLastError()); + if (This->pAlloc && FAILED(hr = IMemAllocator_Decommit(This->pAlloc))) + ERR("Allocator decommit failed with error %x. Possible memory leak\n", hr); + } if(This->pAlloc) IMemAllocator_Release(This->pAlloc); if(This->pReader) -- 2.11.4.GIT