From: <wt...@fr...> - 2005-10-24 15:42:04
|
CVS Root: /cvs/gstreamer Module: gstreamer Changes by: wtay Date: Mon Oct 24 2005 08:42:00 PDT Log message: * gst/gstbus.c: Doc fix. * gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain), (gst_queue_loop): Fix potential deadlock when QUEUE_LOCK is taken before STREAM_LOCK. Modified files: gst : gstbus.c gstqueue.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstbus.c.diff?r1=1.42&r2=1.43 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/gst/gstqueue.c.diff?r1=1.155&r2=1.156 ====Begin Diffs==== Index: gstbus.c =================================================================== RCS file: /cvs/gstreamer/gstreamer/gst/gstbus.c,v retrieving revision 1.42 retrieving revision 1.43 diff -u -d -r1.42 -r1.43 --- gstbus.c 15 Oct 2005 16:01:56 -0000 1.42 +++ gstbus.c 24 Oct 2005 15:41:48 -0000 1.43 @@ -39,7 +39,7 @@ * convert all bus messages into signal emissions. * * A message is posted on the bus with the gst_bus_post() method. With the - * gst_bus_peek() and _pop() methods one can look at or retrieve a previously + * gst_bus_peek() and gst_bus_pop() methods one can look at or retrieve a previously * posted message. * The bus can be polled with the gst_bus_poll() method. This methods blocks Index: gstqueue.c RCS file: /cvs/gstreamer/gstreamer/gst/gstqueue.c,v retrieving revision 1.155 retrieving revision 1.156 diff -u -d -r1.155 -r1.156 --- gstqueue.c 24 Oct 2005 09:13:27 -0000 1.155 +++ gstqueue.c 24 Oct 2005 15:41:48 -0000 1.156 @@ -522,8 +522,7 @@ switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_START: STATUS (queue, "received flush start event"); - /* forward event, ref first as we're going to use it still */ - gst_event_ref (event); + /* forward event */ gst_pad_push_event (queue->srcpad, event); /* now unblock the chain function */ @@ -537,12 +536,10 @@ /* make sure it pauses */ gst_pad_pause_task (queue->srcpad); GST_CAT_LOG_OBJECT (queue_dataflow, queue, "loop stopped"); - gst_event_unref (event); goto done; case GST_EVENT_FLUSH_STOP: STATUS (queue, "received flush stop event"); GST_QUEUE_MUTEX_LOCK (queue); @@ -557,7 +554,6 @@ GST_QUEUE_MUTEX_UNLOCK (queue); STATUS (queue, "after flush"); case GST_EVENT_EOS: STATUS (queue, "received EOS"); @@ -568,9 +564,7 @@ GST_CAT_LOG_OBJECT (queue_dataflow, queue, "adding event %p of type %d", event, GST_EVENT_TYPE (event)); } else { - gst_event_ref (event); gst_pad_push_event (queue->srcpad, event); - gst_event_unref (event); goto done; } break; @@ -739,11 +733,9 @@ out_flushing: { GstFlowReturn ret = queue->srcresult; - const gchar *flowname = gst_flow_get_name (ret); - gst_pad_pause_task (queue->srcpad); GST_CAT_LOG_OBJECT (queue_dataflow, queue, - "exit because task paused, reason: %s", flowname); + "exit because task paused, reason: %s", gst_flow_get_name (ret)); GST_QUEUE_MUTEX_UNLOCK (queue); gst_buffer_unref (buffer); @@ -810,9 +802,9 @@ result = gst_pad_push (pad, GST_BUFFER (data)); - GST_QUEUE_MUTEX_LOCK (queue); - /* can opt to check for srcresult here but the push should - * return an error value that is more accurate */ + /* need to check for srcresult here as well */ + GST_QUEUE_MUTEX_LOCK_CHECK (queue, out_flushing); + /* else result of push indicates what happens */ if (result != GST_FLOW_OK) { const gchar *flowname; |