mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-03 15:06:34 +00:00
gst/gstbin.c: Take the (recursive) state lock between getting the locked state of an element and changing the element...
Original commit message from CVS: * gst/gstbin.c: (gst_bin_element_set_state): Take the (recursive) state lock between getting the locked state of an element and changing the element state. This allows the application to lock an element's state and then change its state without races.
This commit is contained in:
parent
a6b1feccd0
commit
f716d86e48
2 changed files with 13 additions and 0 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
2008-08-25 Wim Taymans <wim.taymans@collabora.co.uk>
|
||||||
|
|
||||||
|
* gst/gstbin.c: (gst_bin_element_set_state):
|
||||||
|
Take the (recursive) state lock between getting the locked state of an
|
||||||
|
element and changing the element state. This allows the application to
|
||||||
|
lock an element's state and then change its state without races.
|
||||||
|
|
||||||
2008-08-25 Wim Taymans <wim.taymans@collabora.co.uk>
|
2008-08-25 Wim Taymans <wim.taymans@collabora.co.uk>
|
||||||
|
|
||||||
* gst/gstbin.c: (gst_bin_element_set_state):
|
* gst/gstbin.c: (gst_bin_element_set_state):
|
||||||
|
|
|
@ -1871,6 +1871,8 @@ gst_bin_element_set_state (GstBin * bin, GstElement * element,
|
||||||
/* set base_time on child */
|
/* set base_time on child */
|
||||||
gst_element_set_base_time (element, base_time);
|
gst_element_set_base_time (element, base_time);
|
||||||
|
|
||||||
|
GST_STATE_LOCK (element);
|
||||||
|
|
||||||
/* peel off the locked flag */
|
/* peel off the locked flag */
|
||||||
GST_OBJECT_LOCK (element);
|
GST_OBJECT_LOCK (element);
|
||||||
locked = GST_OBJECT_FLAG_IS_SET (element, GST_ELEMENT_LOCKED_STATE);
|
locked = GST_OBJECT_FLAG_IS_SET (element, GST_ELEMENT_LOCKED_STATE);
|
||||||
|
@ -1929,6 +1931,8 @@ no_preroll:
|
||||||
/* change state */
|
/* change state */
|
||||||
ret = gst_element_set_state (element, next);
|
ret = gst_element_set_state (element, next);
|
||||||
|
|
||||||
|
GST_STATE_UNLOCK (element);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
locked:
|
locked:
|
||||||
|
@ -1936,12 +1940,14 @@ locked:
|
||||||
GST_DEBUG_OBJECT (element,
|
GST_DEBUG_OBJECT (element,
|
||||||
"element is locked, return previous return %s",
|
"element is locked, return previous return %s",
|
||||||
gst_element_state_change_return_get_name (ret));
|
gst_element_state_change_return_get_name (ret));
|
||||||
|
GST_STATE_UNLOCK (element);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
was_busy:
|
was_busy:
|
||||||
{
|
{
|
||||||
GST_DEBUG_OBJECT (element, "element was busy, delaying state change");
|
GST_DEBUG_OBJECT (element, "element was busy, delaying state change");
|
||||||
GST_OBJECT_UNLOCK (bin);
|
GST_OBJECT_UNLOCK (bin);
|
||||||
|
GST_STATE_UNLOCK (element);
|
||||||
return GST_STATE_CHANGE_ASYNC;
|
return GST_STATE_CHANGE_ASYNC;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue