From 7a0d963df34b68804214470c00a6eb7dd0d2d871 Mon Sep 17 00:00:00 2001 From: Zebediah Figura Date: Tue, 3 Dec 2019 10:14:50 -0600 Subject: [PATCH] winegstreamer: Don't hold the filter lock from the pad-added or pad-removed callbacks. These may be called from the streaming thread, so it's not safe to do so. Nor does it seem necessary. We expect that no streaming thread should ever call methods on our pad or pin, and as long as we hold the filter lock and wait for the no-more-pads signal when connecting or starting the stream, we cannot race with application threads. Signed-off-by: Zebediah Figura Signed-off-by: Alexandre Julliard --- dlls/winegstreamer/gstdemux.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c index 41e3a05418b..623974642d2 100644 --- a/dlls/winegstreamer/gstdemux.c +++ b/dlls/winegstreamer/gstdemux.c @@ -814,13 +814,17 @@ static void removed_decoded_pad(GstElement *bin, GstPad *pad, gpointer user) TRACE("%p %p %p\n", This, bin, pad); - EnterCriticalSection(&This->filter.csFilter); for (x = 0; x < This->cStreams; ++x) { if (This->ppPins[x]->their_src == pad) break; } if (x == This->cStreams) - goto out; + { + char *name = gst_pad_get_name(pad); + WARN("No pin matching pad %s found.\n", debugstr_a(name)); + g_free(name); + return; + } pin = This->ppPins[x]; @@ -831,9 +835,6 @@ static void removed_decoded_pad(GstElement *bin, GstPad *pad, gpointer user) gst_object_unref(pin->their_src); pin->their_src = NULL; -out: - TRACE("Removed %i/%i\n", x, This->cStreams); - LeaveCriticalSection(&This->filter.csFilter); } static void init_new_decoded_pad(GstElement *bin, GstPad *pad, struct gstdemux *This) @@ -971,7 +972,6 @@ static void existing_new_pad(GstElement *bin, GstPad *pad, gpointer user) return; } - EnterCriticalSection(&This->filter.csFilter); for (x = 0; x < This->cStreams; ++x) { struct gstdemux_source *pin = This->ppPins[x]; if (!pin->their_src) { @@ -986,13 +986,11 @@ static void existing_new_pad(GstElement *bin, GstPad *pad, gpointer user) pin->their_src = pad; gst_object_ref(pin->their_src); TRACE("Relinked\n"); - LeaveCriticalSection(&This->filter.csFilter); return; } } } init_new_decoded_pad(bin, pad, This); - LeaveCriticalSection(&This->filter.csFilter); } static gboolean query_function(GstPad *pad, GstObject *parent, GstQuery *query)