fix bug in _dispose of element/pads

Original commit message from CVS:
fix bug in _dispose of element/pads
This commit is contained in:
Benjamin Otte 2002-01-27 22:35:08 +00:00
parent 49ae4007af
commit 9e1fa5e574
2 changed files with 19 additions and 8 deletions

View file

@ -328,8 +328,15 @@ gst_element_remove_pad (GstElement *element, GstPad *pad)
g_return_if_fail (GST_IS_PAD (pad));
g_return_if_fail (GST_PAD_PARENT (pad) == element);
/* add it to the list */
/* check to see if the pad is still connected */
/* FIXME: what if someone calls _remove_pad instead of
_remove_ghost_pad? */
if (GST_IS_REAL_PAD (pad))
{
g_return_if_fail (GST_RPAD_PEER (pad) == NULL);
}
/* remove it from the list */
element->pads = g_list_remove (element->pads, pad);
element->numpads--;
if (gst_pad_get_direction (pad) == GST_PAD_SRC)
@ -1188,7 +1195,12 @@ gst_element_dispose (GObject *object)
orig = pads = g_list_copy (element->pads);
while (pads) {
pad = GST_PAD (pads->data);
gst_object_destroy (GST_OBJECT (pad));
if (GST_PAD_PEER (pad))
{
GST_DEBUG (GST_CAT_REFCOUNTING, "disconnecting pad '%s'\n",GST_OBJECT_NAME(GST_OBJECT (GST_PAD (GST_PAD_PEER (pad)))));
gst_pad_disconnect (pad, GST_PAD (GST_PAD_PEER (pad)));
}
gst_element_remove_pad (element, pad);
pads = g_list_next (pads);
}
g_list_free (orig);

View file

@ -1427,6 +1427,10 @@ gst_real_pad_dispose (GObject *object)
{
GstPad *pad = GST_PAD (object);
/* No connected pad can ever be disposed.
* It has to have a parent to be connected and a parent would hold a reference */
g_assert (GST_PAD_PEER (pad) == NULL);
GST_DEBUG (GST_CAT_REFCOUNTING, "dispose %s:%s\n", GST_DEBUG_PAD_NAME(pad));
if (GST_PAD_PADTEMPLATE (pad)){
@ -1435,11 +1439,6 @@ gst_real_pad_dispose (GObject *object)
GST_PAD_PADTEMPLATE (pad) = NULL;
}
if (GST_PAD_PEER (pad)){
GST_DEBUG (GST_CAT_REFCOUNTING, "disconnecting pad '%s'\n", GST_OBJECT_NAME (GST_OBJECT (GST_PAD (GST_PAD_PEER (pad)))));
gst_pad_disconnect (pad, GST_PAD (GST_PAD_PEER (pad)));
}
/* we destroy the ghostpads, because they are nothing without the real pad */
if (GST_REAL_PAD (pad)->ghostpads) {
GList *orig, *ghostpads;