[PATCH] winegstreamer: Check the callback list before waiting.

Rémi Bernon rbernon at codeweavers.com
Wed Mar 25 18:03:18 CDT 2020


Some callbacks may be pushed during pipeline initialization and before
the dispatch thread is actually started and waiting for them, which
sometimes causes some hangs.

This fixes Fallout 3 and Panzer Corps -and possibly others- intro videos
hanging forever.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/winegstreamer/gst_cbs.c | 12 ++++--------
 1 file changed, 4 insertions(+), 8 deletions(-)

diff --git a/dlls/winegstreamer/gst_cbs.c b/dlls/winegstreamer/gst_cbs.c
index a0618798d895..bf7103b1606b 100644
--- a/dlls/winegstreamer/gst_cbs.c
+++ b/dlls/winegstreamer/gst_cbs.c
@@ -66,15 +66,11 @@ static DWORD WINAPI dispatch_thread(void *user)
 
     while (1)
     {
-        pthread_cond_wait(&cb_list_cond, &cb_list_lock);
+        while (list_empty(&cb_list)) pthread_cond_wait(&cb_list_cond, &cb_list_lock);
 
-        while (!list_empty(&cb_list))
-        {
-            cbdata = LIST_ENTRY(list_head(&cb_list), struct cb_data, entry);
-            list_remove(&cbdata->entry);
-
-            TrySubmitThreadpoolCallback(&perform_cb, cbdata, NULL);
-        }
+        cbdata = LIST_ENTRY(list_head(&cb_list), struct cb_data, entry);
+        list_remove(&cbdata->entry);
+        TrySubmitThreadpoolCallback(&perform_cb, cbdata, NULL);
     }
 
     pthread_mutex_unlock(&cb_list_lock);
-- 
2.26.0.rc2




More information about the wine-devel mailing list