nlecomposition: Fix race condition in seek handling causing deadlocks
authorSebastian Dröge <sebastian@centricular.com>
Tue, 31 May 2016 09:09:44 +0000 (12:09 +0300)
committerSebastian Dröge <sebastian@centricular.com>
Tue, 31 May 2016 14:30:25 +0000 (17:30 +0300)
We might receive another seek from the application while the action task is
handling a previous seek (and thus setting seeking_itself to TRUE). To prevent
this seek to go through directly instead of being added as an action, also
check if the seek event was received from our action task thread or some other
thread.

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

plugins/nle/nlecomposition.c

index f5856dcd08ec6d349a4cdf25359a279831e27667..cc138ca3ef89a4f2b984598114cab834e58c6a32 100644 (file)
@@ -1558,13 +1558,23 @@ nle_composition_event_handler (GstPad * ghostpad, GstObject * parent,
   switch (GST_EVENT_TYPE (event)) {
     case GST_EVENT_SEEK:
     {
-      if (!priv->seeking_itself) {
+      /* Queue up a seek action if this seek event does not come from
+       * ourselves. Due to a possible race condition around the
+       * seeking_itself flag, we also check if the seek comes from
+       * our task thread. The seeking_itself flag only works as an
+       * optimization */
+      GST_OBJECT_LOCK (comp);
+      if (!priv->seeking_itself || (comp->task
+              && gst_task_get_state (comp->task) != GST_TASK_STOPPED
+              && g_thread_self () != comp->task->thread)) {
+        GST_OBJECT_UNLOCK (comp);
         _add_seek_action (comp, event);
         event = NULL;
         GST_FIXME_OBJECT (comp, "HANDLE seeking errors!");
 
         return TRUE;
       }
+      GST_OBJECT_UNLOCK (comp);
       break;
     }
     case GST_EVENT_QOS: