diff --git a/gst/gstbin.c b/gst/gstbin.c index 0760ce14b0..810bacb278 100644 --- a/gst/gstbin.c +++ b/gst/gstbin.c @@ -498,20 +498,23 @@ static void gst_bin_real_destroy (GtkObject *object) { GstBin *bin = GST_BIN (object); - GList *children; + GList *children, *orig; GstElement *child; GST_DEBUG (GST_CAT_REFCOUNTING,"destroy()\n"); - children = bin->children; - while (children) { - child = GST_ELEMENT (children->data); - //gst_object_unref (GST_OBJECT (child)); - gst_object_unparent (GST_OBJECT (child)); - children = g_list_next (children); + if (bin->children) { + orig = children = g_list_copy (bin->children); + while (children) { + child = GST_ELEMENT (children->data); + //gst_object_unref (GST_OBJECT (child)); + //gst_object_unparent (GST_OBJECT (child)); + gst_bin_remove (bin, child); + children = g_list_next (children); + } + g_list_free (orig); + g_list_free (bin->children); } - - g_list_free (bin->children); bin->children = NULL; bin->numchildren = 0; diff --git a/gst/gstelement.c b/gst/gstelement.c index cb97f13b67..e186f2dd82 100644 --- a/gst/gstelement.c +++ b/gst/gstelement.c @@ -909,14 +909,17 @@ gst_element_real_destroy (GtkObject *object) orig = pads = g_list_copy (element->pads); while (pads) { pad = GST_PAD (pads->data); - gst_object_destroy (GST_OBJECT (pad)); + //gst_object_destroy (GST_OBJECT (pad)); + gst_object_ref (GST_OBJECT (pad)); + gst_element_remove_pad (element, pad); + gst_object_unref (GST_OBJECT (pad)); pads = g_list_next (pads); } g_list_free (orig); + g_list_free (element->pads); + element->pads = NULL; } - g_list_free (element->pads); - element->pads = NULL; element->numsrcpads = 0; element->numsinkpads = 0; diff --git a/gst/gstthread.c b/gst/gstthread.c index c24382dd77..ada65ec367 100644 --- a/gst/gstthread.c +++ b/gst/gstthread.c @@ -160,11 +160,11 @@ gst_thread_real_destroy (GtkObject *gtk_object) g_mutex_free (thread->lock); g_cond_free (thread->cond); - gst_object_destroy (GST_OBJECT (GST_ELEMENT_SCHED (thread))); - gst_object_unref (GST_OBJECT (GST_ELEMENT_SCHED (thread))); - if (GTK_OBJECT_CLASS (parent_class)->destroy) GTK_OBJECT_CLASS (parent_class)->destroy (gtk_object); + + gst_object_destroy (GST_OBJECT (GST_ELEMENT_SCHED (thread))); + gst_object_unref (GST_OBJECT (GST_ELEMENT_SCHED (thread))); } static void