autoconvert: Don't hold the object lock when pushing
authorJan Schmidt <thaytan@noraisin.net>
Wed, 21 Oct 2009 22:06:56 +0000 (23:06 +0100)
committerJan Schmidt <thaytan@noraisin.net>
Thu, 22 Oct 2009 10:41:07 +0000 (11:41 +0100)
When pushing out cached events, don't hold the object lock. Avoids
deadlocks starting up DVD playback.

gst/autoconvert/gstautoconvert.c

index 4675c4127ec05b40843ddaab5bc51b34aaec0fe8..2eaee62a09a08e74f04afee8d4182874385ee3c8 100644 (file)
@@ -931,20 +931,23 @@ gst_auto_convert_sink_chain (GstPad * pad, GstBuffer * buffer)
 
   internal_srcpad = gst_auto_convert_get_internal_srcpad (autoconvert);
   if (internal_srcpad) {
+    GList *events = NULL;
+    GList *l;
+
     GST_OBJECT_LOCK (autoconvert);
     if (autoconvert->cached_events) {
-      GList *l;
+      events = g_list_reverse (autoconvert->cached_events);
+      autoconvert->cached_events = NULL;
+    }
+    GST_OBJECT_UNLOCK (autoconvert);
 
+    if (events) {
       GST_DEBUG_OBJECT (autoconvert, "Sending cached events downstream");
-
-      autoconvert->cached_events = g_list_reverse (autoconvert->cached_events);
-
-      for (l = autoconvert->cached_events; l; l = l->next)
+      for (l = events; l; l = l->next)
         gst_pad_push_event (internal_srcpad, l->data);
-      g_list_free (autoconvert->cached_events);
-      autoconvert->cached_events = NULL;
+      g_list_free (events);
     }
-    GST_OBJECT_UNLOCK (autoconvert);
+
     ret = gst_pad_push (internal_srcpad, buffer);
     gst_object_unref (internal_srcpad);
   } else {