collectpads: Use private pad list in set_flushing_unlocked
authorMathieu Duponchelle <mathieu.duponchelle@epitech.eu>
Tue, 17 Sep 2013 21:23:34 +0000 (23:23 +0200)
committerSebastian Dröge <slomo@circular-chaos.org>
Tue, 24 Sep 2013 08:44:34 +0000 (10:44 +0200)
pads->data is the public list. It is dynamically rebuilt at each call to
check_collected, in check_pads to be specific. When you add a pad and
collectpads have been started, it is not added to the public list.

Thus there exists a possible race where :

1) You would add a pad to collectpads while running.
2) You set collectpads to flushing before check_collected has been called again
-> the pad is not set to flushing
3) the pad starts pushing data as downstream might not be prepared, in the case
of adder it then returns FLOW_FLUSHING.
4) elements like demuxers, when they get a FLOW_FLUSHING, stop their tasks,
never to be seen again.

https://bugzilla.gnome.org/show_bug.cgi?id=708636

libs/gst/base/gstcollectpads.c

index d24e03b..c61b472 100644 (file)
@@ -735,7 +735,7 @@ gst_collect_pads_set_flushing_unlocked (GstCollectPads * pads,
   GSList *walk = NULL;
 
   /* Update the pads flushing flag */
-  for (walk = pads->data; walk; walk = g_slist_next (walk)) {
+  for (walk = pads->priv->pad_list; walk; walk = g_slist_next (walk)) {
     GstCollectData *cdata = walk->data;
 
     if (GST_IS_PAD (cdata->pad)) {