[PATCH 1/2] strmbase: Leave critical section when waiting for the renderer state change.

Anton Baskanov baskanov at gmail.com
Fri May 28 02:05:57 CDT 2021


Sometimes streaming thread gets stuck in IPin::EndOfStream trying to
acquire the filter critical section for more than 1 second, causing
intermittent test failures.

Signed-off-by: Anton Baskanov <baskanov at gmail.com>
---
 dlls/strmbase/renderer.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c
index 01fabfc98de..150d712806a 100644
--- a/dlls/strmbase/renderer.c
+++ b/dlls/strmbase/renderer.c
@@ -290,10 +290,14 @@ static HRESULT renderer_cleanup_stream(struct strmbase_filter *iface)
 static HRESULT renderer_wait_state(struct strmbase_filter *iface, DWORD timeout)
 {
     struct strmbase_renderer *filter = impl_from_strmbase_filter(iface);
+    HRESULT hr = S_OK;
 
+    LeaveCriticalSection(&filter->filter.filter_cs);
     if (WaitForSingleObject(filter->state_event, timeout) == WAIT_TIMEOUT)
-        return VFW_S_STATE_INTERMEDIATE;
-    return S_OK;
+        hr = VFW_S_STATE_INTERMEDIATE;
+    EnterCriticalSection(&filter->filter.filter_cs);
+
+    return hr;
 }
 
 static const struct strmbase_filter_ops filter_ops =
-- 
2.25.1




More information about the wine-devel mailing list