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> 2007-03-06 Wim Taymans <wim@fluendo.com>
* gst/goom/gstgoom.c: (gst_goom_src_setcaps), (get_buffer), * gst/goom/gstgoom.c: (gst_goom_src_setcaps), (get_buffer),

View file

@ -100,19 +100,19 @@ static void
gst_switch_sink_dispose (GObject * object) gst_switch_sink_dispose (GObject * object)
{ {
GstSwitchSink *sink = GST_SWITCH_SINK (object); GstSwitchSink *sink = GST_SWITCH_SINK (object);
GstElement **p_kid; GstObject *new_kid, *kid;
GST_OBJECT_LOCK (sink); GST_OBJECT_LOCK (sink);
p_kid = &sink->new_kid; new_kid = GST_OBJECT_CAST (sink->new_kid);
gst_object_replace ((GstObject **) p_kid, NULL); sink->new_kid = NULL;
if (sink->new_kid) { kid = GST_OBJECT_CAST (sink->kid);
p_kid = &sink->kid; sink->kid = NULL;
gst_element_set_state (sink->kid, GST_STATE_NULL);
gst_object_replace ((GstObject **) p_kid, NULL);
}
GST_OBJECT_UNLOCK (sink); GST_OBJECT_UNLOCK (sink);
gst_object_replace (&new_kid, NULL);
gst_object_replace (&kid, NULL);
GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object)); GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object));
} }
@ -120,13 +120,20 @@ gboolean
gst_switch_commit_new_kid (GstSwitchSink * sink) gst_switch_commit_new_kid (GstSwitchSink * sink)
{ {
GstPad *targetpad; GstPad *targetpad;
GstState cur_state; GstState kid_state;
GstElement *new_kid, *old_kid; GstElement *new_kid, *old_kid;
gboolean is_fakesink = FALSE; gboolean is_fakesink = FALSE;
/* need locking around member accesses */ /* need locking around member accesses */
GST_OBJECT_LOCK (sink); 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; new_kid = sink->new_kid;
sink->new_kid = NULL; sink->new_kid = NULL;
GST_OBJECT_UNLOCK (sink); GST_OBJECT_UNLOCK (sink);
@ -143,7 +150,7 @@ gst_switch_commit_new_kid (GstSwitchSink * sink)
GST_DEBUG_OBJECT (sink, "Setting new kid"); 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), GST_ELEMENT_ERROR (sink, CORE, STATE_CHANGE, (NULL),
("Failed to set state on new child.")); ("Failed to set state on new child."));
gst_object_unref (new_kid); gst_object_unref (new_kid);