Skip to content

Commit 58dae86

Browse files
committed
[GStreamer][MediaStream] Reference cycle in webkitmediastreamsrc preventing its disposal
https://bugs.webkit.org/show_bug.cgi?id=292924 Reviewed by Xabier Rodriguez-Calvar. The src pad probe data storing a strong reference of the src element introduced a reference cycle, so use a weak reference instead. Also, remove a useless refcount increment/decrement in webkitMediaStreamSrcEnsureStreamCollectionPosted, the callOnMainThreadAndWait call is blocking so there is no need to increase the element refcount before calling the closure. * Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp: (webkitMediaStreamSrcEnsureStreamCollectionPosted): (webkitMediaStreamSrcPadProbeCb): (webkitMediaStreamSrcAddTrack): Canonical link: https://commits.webkit.org/294886@main
1 parent 3050d75 commit 58dae86

File tree

1 file changed

+11
-7
lines changed

1 file changed

+11
-7
lines changed

Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
#include <gst/app/gstappsrc.h>
4545
#include <gst/base/gstflowcombiner.h>
4646
#include <wtf/UUID.h>
47+
#include <wtf/glib/GThreadSafeWeakPtr.h>
4748
#include <wtf/glib/WTFGType.h>
4849
#include <wtf/text/MakeString.h>
4950

@@ -1077,17 +1078,16 @@ static void webkitMediaStreamSrcEnsureStreamCollectionPosted(WebKitMediaStreamSr
10771078
{
10781079
GST_DEBUG_OBJECT(self, "Posting stream collection");
10791080
DisableMallocRestrictionsForCurrentThreadScope disableMallocRestrictions;
1080-
callOnMainThreadAndWait([element = GRefPtr<GstElement>(GST_ELEMENT_CAST(self))] {
1081-
auto self = WEBKIT_MEDIA_STREAM_SRC_CAST(element.get());
1081+
callOnMainThreadAndWait([&] {
10821082
auto streamCollection = webkitMediaStreamSrcCreateStreamCollection(self);
10831083
GST_DEBUG_OBJECT(self, "Posting stream collection message containing %u streams", gst_stream_collection_get_size(streamCollection.get()));
1084-
gst_element_post_message(element.get(), gst_message_new_stream_collection(GST_OBJECT_CAST(self), streamCollection.get()));
1084+
gst_element_post_message(GST_ELEMENT_CAST(self), gst_message_new_stream_collection(GST_OBJECT_CAST(self), streamCollection.get()));
10851085
});
10861086
GST_DEBUG_OBJECT(self, "Stream collection posted");
10871087
}
10881088

10891089
struct ProbeData {
1090-
GRefPtr<GstElement> element;
1090+
GThreadSafeWeakPtr<GstElement> element;
10911091
RealtimeMediaSource::Type sourceType;
10921092
GRefPtr<GstEvent> streamStartEvent;
10931093
GRefPtr<GstStreamCollection> collection;
@@ -1096,9 +1096,13 @@ WEBKIT_DEFINE_ASYNC_DATA_STRUCT(ProbeData);
10961096

10971097
static GstPadProbeReturn webkitMediaStreamSrcPadProbeCb(GstPad* pad, GstPadProbeInfo* info, ProbeData* data)
10981098
{
1099-
GstEvent* event = GST_PAD_PROBE_INFO_EVENT(info);
1100-
[[maybe_unused]] WebKitMediaStreamSrc* self = WEBKIT_MEDIA_STREAM_SRC_CAST(data->element.get());
1099+
auto element = data->element.get();
1100+
if (!element)
1101+
return GST_PAD_PROBE_REMOVE;
11011102

1103+
[[maybe_unused]] WebKitMediaStreamSrc* self = WEBKIT_MEDIA_STREAM_SRC_CAST(element.get());
1104+
1105+
auto event = GST_PAD_PROBE_INFO_EVENT(info);
11021106
GST_DEBUG_OBJECT(self, "Event %" GST_PTR_FORMAT, event);
11031107
switch (GST_EVENT_TYPE(event)) {
11041108
case GST_EVENT_STREAM_START: {
@@ -1164,7 +1168,7 @@ void webkitMediaStreamSrcAddTrack(WebKitMediaStreamSrc* self, MediaStreamTrackPr
11641168

11651169
auto pad = adoptGRef(gst_element_get_static_pad(element, "src"));
11661170
auto data = createProbeData();
1167-
data->element = GST_ELEMENT_CAST(self);
1171+
data->element.reset(GST_ELEMENT_CAST(self));
11681172
data->sourceType = track->source().type();
11691173
data->collection = webkitMediaStreamSrcCreateStreamCollection(self);
11701174
data->streamStartEvent = adoptGRef(gst_event_new_stream_start(gst_stream_get_stream_id(stream.get())));

0 commit comments

Comments
 (0)