ext/gconf/gstswitchsink.c: Fix up the dispose logic so it doesn't leak, and fix setting of the child state so that we...

Original commit message from CVS:
* ext/gconf/gstswitchsink.c: (gst_switch_sink_dispose),
(gst_switch_commit_new_kid):
Fix up the dispose logic so it doesn't leak, and fix setting of
the child state so that we don't set a child to our current state
just as we are changing it to something else.
This commit is contained in:
Jan Schmidt 2007-03-06 14:53:04 +00:00
parent 57145cecf3
commit c71db98b91
2 changed files with 26 additions and 11 deletions

View file

@ -1,3 +1,11 @@
2007-03-06 Jan Schmidt <thaytan@mad.scientist.com>
* ext/gconf/gstswitchsink.c: (gst_switch_sink_dispose),
(gst_switch_commit_new_kid):
Fix up the dispose logic so it doesn't leak, and fix setting of
the child state so that we don't set a child to our current state
just as we are changing it to something else.
2007-03-06 Wim Taymans <wim@fluendo.com>
* gst/goom/gstgoom.c: (gst_goom_src_setcaps), (get_buffer),

View file

@ -100,19 +100,19 @@ static void
gst_switch_sink_dispose (GObject * object)
{
GstSwitchSink *sink = GST_SWITCH_SINK (object);
GstElement **p_kid;
GstObject *new_kid, *kid;
GST_OBJECT_LOCK (sink);
p_kid = &sink->new_kid;
gst_object_replace ((GstObject **) p_kid, NULL);
new_kid = GST_OBJECT_CAST (sink->new_kid);
sink->new_kid = NULL;
if (sink->new_kid) {
p_kid = &sink->kid;
gst_element_set_state (sink->kid, GST_STATE_NULL);
gst_object_replace ((GstObject **) p_kid, NULL);
}
kid = GST_OBJECT_CAST (sink->kid);
sink->kid = NULL;
GST_OBJECT_UNLOCK (sink);
gst_object_replace (&new_kid, NULL);
gst_object_replace (&kid, NULL);
GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object));
}
@ -120,13 +120,20 @@ gboolean
gst_switch_commit_new_kid (GstSwitchSink * sink)
{
GstPad *targetpad;
GstState cur_state;
GstState kid_state;
GstElement *new_kid, *old_kid;
gboolean is_fakesink = FALSE;
/* need locking around member accesses */
GST_OBJECT_LOCK (sink);
cur_state = GST_STATE (sink);
/* If we're currently changing state, set the child to the next state
* we're transitioning too, rather than our current state which is
* about to change */
if (GST_STATE_NEXT (sink) != GST_STATE_VOID_PENDING)
kid_state = GST_STATE_NEXT (sink);
else
kid_state = GST_STATE (sink);
new_kid = sink->new_kid;
sink->new_kid = NULL;
GST_OBJECT_UNLOCK (sink);
@ -143,7 +150,7 @@ gst_switch_commit_new_kid (GstSwitchSink * sink)
GST_DEBUG_OBJECT (sink, "Setting new kid");
}
if (gst_element_set_state (new_kid, cur_state) == GST_STATE_CHANGE_FAILURE) {
if (gst_element_set_state (new_kid, kid_state) == GST_STATE_CHANGE_FAILURE) {
GST_ELEMENT_ERROR (sink, CORE, STATE_CHANGE, (NULL),
("Failed to set state on new child."));
gst_object_unref (new_kid);