Signed-off-by: Rémi Bernon rbernon@codeweavers.com ---
This should fix a few leaks and potential race condition.
I'm not 100% sure about the last patch, as there's some questions about who's supposed to be shuting down the object. I think we set the _MF_TOPONODE_IMFActivate node when we activated the object, and after we called IMFTopologyNode_SetObject, so my understanding is that when they are set we should shutdown both the activation object and the object itself.
For the sample grabber, the tests show that shutting down the activation object should not automatically shutdown the sink, so it needs to be done separately.
dlls/mfplat/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/mfplat/main.c b/dlls/mfplat/main.c index 6fb8661dba4..9078702c854 100644 --- a/dlls/mfplat/main.c +++ b/dlls/mfplat/main.c @@ -7109,7 +7109,7 @@ static void queue_notify_subscriber(struct event_queue *queue) static HRESULT WINAPI eventqueue_BeginGetEvent(IMFMediaEventQueue *iface, IMFAsyncCallback *callback, IUnknown *state) { struct event_queue *queue = impl_from_IMFMediaEventQueue(iface); - MFASYNCRESULT *result_data = (MFASYNCRESULT *)queue->subscriber; + MFASYNCRESULT *result_data; HRESULT hr;
TRACE("%p, %p, %p.\n", iface, callback, state); @@ -7121,7 +7121,7 @@ static HRESULT WINAPI eventqueue_BeginGetEvent(IMFMediaEventQueue *iface, IMFAsy
if (queue->is_shut_down) hr = MF_E_SHUTDOWN; - else if (result_data) + else if ((result_data = (MFASYNCRESULT *)queue->subscriber)) { if (result_data->pCallback == callback) hr = IRtwqAsyncResult_GetStateNoAddRef(queue->subscriber) == state ?