gst/gstbus.c: Doc fix.

Original commit message from CVS:
* 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.
This commit is contained in:
Wim Taymans 2005-10-24 15:41:48 +00:00
parent 5867dff97d
commit bb8289979b
3 changed files with 13 additions and 29 deletions

View file

@ -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

View file

@ -522,8 +522,7 @@ gst_queue_handle_sink_event (GstPad * pad, GstEvent * event)
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 @@ gst_queue_handle_sink_event (GstPad * pad, GstEvent * event)
/* 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");
/* 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);
GST_QUEUE_MUTEX_LOCK (queue);
@ -557,7 +554,6 @@ gst_queue_handle_sink_event (GstPad * pad, GstEvent * event)
GST_QUEUE_MUTEX_UNLOCK (queue);
STATUS (queue, "after flush");
gst_event_unref (event);
goto done;
case GST_EVENT_EOS:
STATUS (queue, "received EOS");
@ -568,9 +564,7 @@ gst_queue_handle_sink_event (GstPad * pad, GstEvent * event)
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_unref:
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 @@ restart:
GST_QUEUE_MUTEX_UNLOCK (queue);
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;

View file

@ -522,8 +522,7 @@ gst_queue_handle_sink_event (GstPad * pad, GstEvent * event)
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 @@ gst_queue_handle_sink_event (GstPad * pad, GstEvent * event)
/* 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");
/* 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);
GST_QUEUE_MUTEX_LOCK (queue);
@ -557,7 +554,6 @@ gst_queue_handle_sink_event (GstPad * pad, GstEvent * event)
GST_QUEUE_MUTEX_UNLOCK (queue);
STATUS (queue, "after flush");
gst_event_unref (event);
goto done;
case GST_EVENT_EOS:
STATUS (queue, "received EOS");
@ -568,9 +564,7 @@ gst_queue_handle_sink_event (GstPad * pad, GstEvent * event)
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_unref:
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 @@ restart:
GST_QUEUE_MUTEX_UNLOCK (queue);
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;