Skip to content

Commit 8848619

Browse files
varumugam123eocanha
authored andcommitted
[GStreamer] Fix delayed dispatch of async task post MediaPlayer destruction
https://bugs.webkit.org/show_bug.cgi?id=266715 Reviewed by Xabier Rodriguez-Calvar. When the media player is destroyed, there can still be async tasks (from AbortableTaskQueue) ongoing, some of them related to tracks. Those tasks should be aborted, because they depend on objects that are no longer there. This patch aborts all pending tasks on AbortableTaskQueue destruction and also unregisters all pending callbacks from TrackPrivateBaseGStreamer (and asserts that they're no longer there). See: #1231 Original author: "Vivek.A" <Vivek_Arumugam@comcast.com> * Source/WebCore/platform/AbortableTaskQueue.h: Abort tasks on destruction. * Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp: (WebCore::TrackPrivateBaseGStreamer::disconnect): Disconnect handlers and assert. Canonical link: https://commits.webkit.org/272410@main
1 parent b56a9c7 commit 8848619

2 files changed

Lines changed: 8 additions & 2 deletions

File tree

Source/WebCore/platform/AbortableTaskQueue.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ class AbortableTaskQueue final {
7575
ASSERT(isMainThread());
7676
ASSERT(!m_lock.isHeld());
7777
ASSERT(m_channel.isEmpty());
78+
startAborting();
7879
}
7980

8081
// ===========================

Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,10 @@ TrackPrivateBaseGStreamer::~TrackPrivateBaseGStreamer()
142142

143143
void TrackPrivateBaseGStreamer::disconnect()
144144
{
145-
if (m_stream)
145+
if (m_stream) {
146146
g_signal_handlers_disconnect_matched(m_stream.get(), G_SIGNAL_MATCH_DATA, 0, 0, nullptr, nullptr, this);
147+
ASSERT(!g_signal_handler_find(m_stream.get(), G_SIGNAL_MATCH_UNBLOCKED, 0, 0, nullptr, nullptr, nullptr));
148+
}
147149

148150
m_tags.clear();
149151

@@ -155,8 +157,11 @@ void TrackPrivateBaseGStreamer::disconnect()
155157
m_bestUpstreamPad.clear();
156158
}
157159

158-
if (m_pad)
160+
if (m_pad) {
161+
g_signal_handlers_disconnect_matched(m_pad.get(), G_SIGNAL_MATCH_DATA, 0, 0, nullptr, nullptr, this);
162+
ASSERT(!g_signal_handler_find(m_pad.get(), G_SIGNAL_MATCH_UNBLOCKED, 0, 0, nullptr, nullptr, nullptr));
159163
m_pad.clear();
164+
}
160165
}
161166

162167
void TrackPrivateBaseGStreamer::tagsChanged()

0 commit comments

Comments
 (0)