[PATCH 2/3] mf/sar: Consistently check for shutdown flag within a lock.

Nikolay Sivov wine at gitlab.winehq.org
Mon Jul 4 14:06:41 CDT 2022


From: Nikolay Sivov <nsivov at codeweavers.com>

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/mf/sar.c | 52 ++++++++++++++++++++++++++++++---------------------
 1 file changed, 31 insertions(+), 21 deletions(-)

diff --git a/dlls/mf/sar.c b/dlls/mf/sar.c
index 33040be3ed0..5504cc17472 100644
--- a/dlls/mf/sar.c
+++ b/dlls/mf/sar.c
@@ -451,21 +451,26 @@ static HRESULT WINAPI audio_renderer_sink_GetPresentationClock(IMFMediaSink *ifa
 static HRESULT WINAPI audio_renderer_sink_Shutdown(IMFMediaSink *iface)
 {
     struct audio_renderer *renderer = impl_from_IMFMediaSink(iface);
+    HRESULT hr = S_OK;
 
     TRACE("%p.\n", iface);
 
+    EnterCriticalSection(&renderer->cs);
+
     if (renderer->flags & SAR_SHUT_DOWN)
-        return MF_E_SHUTDOWN;
+        hr = MF_E_SHUTDOWN;
+    else
+    {
+        renderer->flags |= SAR_SHUT_DOWN;
+        IMFMediaEventQueue_Shutdown(renderer->event_queue);
+        IMFMediaEventQueue_Shutdown(renderer->stream_event_queue);
+        audio_renderer_set_presentation_clock(renderer, NULL);
+        audio_renderer_release_audio_client(renderer);
+    }
 
-    EnterCriticalSection(&renderer->cs);
-    renderer->flags |= SAR_SHUT_DOWN;
-    IMFMediaEventQueue_Shutdown(renderer->event_queue);
-    IMFMediaEventQueue_Shutdown(renderer->stream_event_queue);
-    audio_renderer_set_presentation_clock(renderer, NULL);
-    audio_renderer_release_audio_client(renderer);
     LeaveCriticalSection(&renderer->cs);
 
-    return S_OK;
+    return hr;
 }
 
 static const IMFMediaSinkVtbl audio_renderer_sink_vtbl =
@@ -1364,19 +1369,22 @@ static HRESULT WINAPI audio_renderer_stream_ProcessSample(IMFStreamSink *iface,
     if (!sample)
         return E_POINTER;
 
-    if (renderer->flags & SAR_SHUT_DOWN)
-        return MF_E_STREAMSINK_REMOVED;
-
     EnterCriticalSection(&renderer->cs);
 
-    if (renderer->state == STREAM_STATE_RUNNING)
-        hr = stream_queue_sample(renderer, sample);
-    renderer->flags &= ~SAR_SAMPLE_REQUESTED;
-
-    if (renderer->queued_frames < renderer->max_frames && renderer->state == STREAM_STATE_RUNNING)
+    if (renderer->flags & SAR_SHUT_DOWN)
+        hr = MF_E_STREAMSINK_REMOVED;
+    else
     {
-        IMFMediaEventQueue_QueueEventParamVar(renderer->stream_event_queue, MEStreamSinkRequestSample, &GUID_NULL, S_OK, NULL);
-        renderer->flags |= SAR_SAMPLE_REQUESTED;
+        if (renderer->state == STREAM_STATE_RUNNING)
+            hr = stream_queue_sample(renderer, sample);
+        renderer->flags &= ~SAR_SAMPLE_REQUESTED;
+
+        if (renderer->queued_frames < renderer->max_frames && renderer->state == STREAM_STATE_RUNNING)
+        {
+            IMFMediaEventQueue_QueueEventParamVar(renderer->stream_event_queue, MEStreamSinkRequestSample,
+                    &GUID_NULL, S_OK, NULL);
+            renderer->flags |= SAR_SAMPLE_REQUESTED;
+        }
     }
 
     LeaveCriticalSection(&renderer->cs);
@@ -1414,11 +1422,13 @@ static HRESULT WINAPI audio_renderer_stream_PlaceMarker(IMFStreamSink *iface, MF
 
     TRACE("%p, %d, %p, %p.\n", iface, marker_type, marker_value, context_value);
 
+    EnterCriticalSection(&renderer->cs);
+
     if (renderer->flags & SAR_SHUT_DOWN)
-        return MF_E_STREAMSINK_REMOVED;
+        hr = MF_E_STREAMSINK_REMOVED;
+    else
+        hr = stream_place_marker(renderer, marker_type, context_value);
 
-    EnterCriticalSection(&renderer->cs);
-    hr = stream_place_marker(renderer, marker_type, context_value);
     LeaveCriticalSection(&renderer->cs);
 
     return hr;
-- 
GitLab


https://gitlab.winehq.org/wine/wine/-/merge_requests/372



More information about the wine-devel mailing list