Boo!
authorAndy Wingo <wingo@pobox.com>
Mon, 31 Oct 2005 09:52:13 +0000 (09:52 +0000)
committerAndy Wingo <wingo@pobox.com>
Mon, 31 Oct 2005 09:52:13 +0000 (09:52 +0000)
Original commit message from CVS:
2005-10-31  Andy Wingo  <wingo@pobox.com>

* Boo!

* gst/gstqueue.c (gst_queue_chain): Fix downstream leaky mode.

* gst/gstobject.c (gst_object_dispatch_properties_changed): No
need to serialize property notifications on GLib 2.8. GLib 2.6 has
the possibility of deadlocks here if code calling notify() or
set() has a lock that can be taken in another notify handler (ABBA
with class lock and e.g. python GIL state lock).

ChangeLog
gst/gstobject.c
gst/gstqueue.c
plugins/elements/gstqueue.c

index 659da8d8319d5add2abc2dc26aaf9288f498ac13..57802b732763a907df7d3f22cd288d9077f1dbaa 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2005-10-31  Andy Wingo  <wingo@pobox.com>
+
+       * Boo!
+
+       * gst/gstqueue.c (gst_queue_chain): Fix downstream leaky mode.
+
+       * gst/gstobject.c (gst_object_dispatch_properties_changed): No
+       need to serialize property notifications on GLib 2.8. GLib 2.6 has
+       the possibility of deadlocks here if code calling notify() or
+       set() has a lock that can be taken in another notify handler (ABBA
+       with class lock and e.g. python GIL state lock).
+
 2005-10-28  Julien MOUTTE  <julien@moutte.net>
 
        * gst/gstbus.c: Doc updates.
index c771f6c1c97d4576d1d8c5a2cabb504ba07aec6b..f0a60a19fb1ebca6b6fa5a1e3ab86e85b991f3b9 100644 (file)
@@ -575,7 +575,10 @@ gst_object_dispatch_properties_changed (GObject * object,
 
   klass = GST_OBJECT_GET_CLASS (object);
 
+#ifndef GST_HAVE_GLIB_2_8
   GST_CLASS_LOCK (klass);
+#endif
+
   /* do the standard dispatching */
   PATCH_REFCOUNT (object);
   G_OBJECT_CLASS (parent_class)->dispatch_properties_changed (object, n_pspecs,
@@ -617,7 +620,10 @@ gst_object_dispatch_properties_changed (GObject * object,
     gst_object_unref (old_parent);
   }
   g_free (name);
+
+#ifndef GST_HAVE_GLIB_2_8
   GST_CLASS_UNLOCK (klass);
+#endif
 }
 
 /**
index 599b8491f4f7dd1f948193407e27de9e937586a1..1f47d800ea692b4ba3192bf6b468cd2b0157b7cf 100644 (file)
@@ -653,7 +653,8 @@ gst_queue_chain (GstPad * pad, GstBuffer * buffer)
         GST_CAT_DEBUG_OBJECT (queue_dataflow, queue,
             "queue is full, leaking buffer on downstream end");
 
-        for (item = queue->queue->head; item != NULL; item = item->next) {
+        for (item = g_queue_peek_head_link (queue->queue); item;
+            item = item->next) {
           if (GST_IS_BUFFER (item->data)) {
             leak = item->data;
             break;
@@ -664,22 +665,17 @@ gst_queue_chain (GstPad * pad, GstBuffer * buffer)
          * in here. That cannot happen, since we had >= 1 bufs */
         g_assert (leak);
 
-        /* Now remove it from the list, fixing up the GQueue
-         * CHECKME: is a queue->head the first or the last item? */
-        item = g_list_delete_link (queue->queue->head, item);
-        queue->queue->head = g_list_first (item);
-        queue->queue->tail = g_list_last (item);
-        queue->queue->length--;
+        /* Now remove the link from the queue */
+        g_queue_delete_link (queue->queue, item);
 
         /* and unref the buffer at the end. Twice, because we keep a ref
          * to make things read-only. Also keep our list uptodate. */
-        queue->cur_level.bytes -= GST_BUFFER_SIZE (buffer);
+        queue->cur_level.bytes -= GST_BUFFER_SIZE (leak);
         queue->cur_level.buffers--;
-        if (GST_BUFFER_DURATION (buffer) != GST_CLOCK_TIME_NONE)
-          queue->cur_level.time -= GST_BUFFER_DURATION (buffer);
+        if (GST_BUFFER_DURATION (leak) != GST_CLOCK_TIME_NONE)
+          queue->cur_level.time -= GST_BUFFER_DURATION (leak);
 
-        gst_buffer_unref (buffer);
-        gst_buffer_unref (buffer);
+        gst_buffer_unref (leak);
         break;
       }
 
index 599b8491f4f7dd1f948193407e27de9e937586a1..1f47d800ea692b4ba3192bf6b468cd2b0157b7cf 100644 (file)
@@ -653,7 +653,8 @@ gst_queue_chain (GstPad * pad, GstBuffer * buffer)
         GST_CAT_DEBUG_OBJECT (queue_dataflow, queue,
             "queue is full, leaking buffer on downstream end");
 
-        for (item = queue->queue->head; item != NULL; item = item->next) {
+        for (item = g_queue_peek_head_link (queue->queue); item;
+            item = item->next) {
           if (GST_IS_BUFFER (item->data)) {
             leak = item->data;
             break;
@@ -664,22 +665,17 @@ gst_queue_chain (GstPad * pad, GstBuffer * buffer)
          * in here. That cannot happen, since we had >= 1 bufs */
         g_assert (leak);
 
-        /* Now remove it from the list, fixing up the GQueue
-         * CHECKME: is a queue->head the first or the last item? */
-        item = g_list_delete_link (queue->queue->head, item);
-        queue->queue->head = g_list_first (item);
-        queue->queue->tail = g_list_last (item);
-        queue->queue->length--;
+        /* Now remove the link from the queue */
+        g_queue_delete_link (queue->queue, item);
 
         /* and unref the buffer at the end. Twice, because we keep a ref
          * to make things read-only. Also keep our list uptodate. */
-        queue->cur_level.bytes -= GST_BUFFER_SIZE (buffer);
+        queue->cur_level.bytes -= GST_BUFFER_SIZE (leak);
         queue->cur_level.buffers--;
-        if (GST_BUFFER_DURATION (buffer) != GST_CLOCK_TIME_NONE)
-          queue->cur_level.time -= GST_BUFFER_DURATION (buffer);
+        if (GST_BUFFER_DURATION (leak) != GST_CLOCK_TIME_NONE)
+          queue->cur_level.time -= GST_BUFFER_DURATION (leak);
 
-        gst_buffer_unref (buffer);
-        gst_buffer_unref (buffer);
+        gst_buffer_unref (leak);
         break;
       }