mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-10-05 10:12:20 +00:00
source: Atomically change the probe ID
Avoiding races where the probe would be removed 2 times Co-Authored by: Thibault Saunier <tsaunier@gnome.org>
This commit is contained in:
parent
7d9ed1f185
commit
6dae885161
1 changed files with 18 additions and 14 deletions
|
@ -55,7 +55,7 @@ struct _GnlSourcePrivate
|
||||||
|
|
||||||
gulong padremovedid; /* signal handler for element pad-removed signal */
|
gulong padremovedid; /* signal handler for element pad-removed signal */
|
||||||
gulong padaddedid; /* signal handler for element pad-added signal */
|
gulong padaddedid; /* signal handler for element pad-added signal */
|
||||||
gulong probeid; /* source pad probe id */
|
gint probeid; /* source pad probe id */
|
||||||
|
|
||||||
gboolean pendingblock; /* We have a pending pad_block */
|
gboolean pendingblock; /* We have a pending pad_block */
|
||||||
gboolean is_blocked; /* We already got blocked */
|
gboolean is_blocked; /* We already got blocked */
|
||||||
|
@ -161,6 +161,20 @@ gnl_source_dispose (GObject * object)
|
||||||
G_OBJECT_CLASS (parent_class)->dispose (object);
|
G_OBJECT_CLASS (parent_class)->dispose (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_remove_pad_probe (GnlSource * source, GstPad * pad)
|
||||||
|
{
|
||||||
|
gint tmp_probe_id;
|
||||||
|
|
||||||
|
tmp_probe_id = source->priv->probeid;
|
||||||
|
if (g_atomic_int_compare_and_exchange (&source->priv->probeid,
|
||||||
|
tmp_probe_id, 0)) {
|
||||||
|
if (tmp_probe_id)
|
||||||
|
gst_pad_remove_probe (pad, tmp_probe_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
element_pad_added_cb (GstElement * element G_GNUC_UNUSED, GstPad * pad,
|
element_pad_added_cb (GstElement * element G_GNUC_UNUSED, GstPad * pad,
|
||||||
GnlSource * source)
|
GnlSource * source)
|
||||||
|
@ -219,11 +233,7 @@ element_pad_removed_cb (GstElement * element G_GNUC_UNUSED, GstPad * pad,
|
||||||
GST_DEBUG_OBJECT (source, "Clearing up ghostpad");
|
GST_DEBUG_OBJECT (source, "Clearing up ghostpad");
|
||||||
|
|
||||||
priv->is_blocked = FALSE;
|
priv->is_blocked = FALSE;
|
||||||
if (priv->probeid) {
|
_remove_pad_probe (source, pad);
|
||||||
gst_pad_remove_probe (pad, priv->probeid);
|
|
||||||
priv->probeid = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
gnl_object_ghost_pad_set_target (GNL_OBJECT (source), gnlobject->srcpad,
|
gnl_object_ghost_pad_set_target (GNL_OBJECT (source), gnlobject->srcpad,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
|
@ -315,10 +325,7 @@ ghost_seek_pad (GnlSource * source)
|
||||||
}
|
}
|
||||||
|
|
||||||
priv->is_blocked = FALSE;
|
priv->is_blocked = FALSE;
|
||||||
if (priv->probeid) {
|
_remove_pad_probe (source, pad);
|
||||||
gst_pad_remove_probe (pad, priv->probeid);
|
|
||||||
priv->probeid = 0;
|
|
||||||
}
|
|
||||||
gst_element_no_more_pads (GST_ELEMENT (source));
|
gst_element_no_more_pads (GST_ELEMENT (source));
|
||||||
|
|
||||||
priv->pendingblock = FALSE;
|
priv->pendingblock = FALSE;
|
||||||
|
@ -549,10 +556,7 @@ gnl_source_cleanup (GnlObject * object)
|
||||||
GstPad *target = gst_ghost_pad_get_target ((GstGhostPad *) object->srcpad);
|
GstPad *target = gst_ghost_pad_get_target ((GstGhostPad *) object->srcpad);
|
||||||
|
|
||||||
if (target) {
|
if (target) {
|
||||||
if (priv->probeid) {
|
_remove_pad_probe (source, target);
|
||||||
gst_pad_remove_probe (target, priv->probeid);
|
|
||||||
priv->probeid = 0;
|
|
||||||
}
|
|
||||||
gst_object_unref (target);
|
gst_object_unref (target);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue