gst/gstpad.c: Add fallback when calling the deprecated function on an element that implements the new internal_link h...

Original commit message from CVS:
* gst/gstpad.c: (add_unref_pad_to_list),
(gst_pad_get_internal_links_default):
Add fallback when calling the deprecated function on an element that
implements the new internal_link handler.
This commit is contained in:
Wim Taymans 2008-09-01 14:05:45 +00:00
parent ce1f50ae11
commit 7cf8be7fd8
2 changed files with 77 additions and 20 deletions

View file

@ -1,3 +1,10 @@
2008-09-01 Wim Taymans <wim.taymans@collabora.co.uk>
* gst/gstpad.c: (add_unref_pad_to_list),
(gst_pad_get_internal_links_default):
Add fallback when calling the deprecated function on an element that
implements the new internal_link handler.
2008-09-01 Stefan Kost <ensonic@users.sf.net> 2008-09-01 Stefan Kost <ensonic@users.sf.net>
* docs/gst/gstreamer-sections.txt: * docs/gst/gstreamer-sections.txt:

View file

@ -3066,6 +3066,15 @@ gst_pad_iterate_internal_links (GstPad * pad)
return res; return res;
} }
#ifndef GST_REMOVE_DEPRECATED
static void
add_unref_pad_to_list (GstPad * pad, GList * list)
{
list = g_list_prepend (list, pad);
gst_object_unref (pad);
}
#endif
/** /**
* gst_pad_get_internal_links_default: * gst_pad_get_internal_links_default:
* @pad: the #GstPad to get the internal links of. * @pad: the #GstPad to get the internal links of.
@ -3081,8 +3090,11 @@ gst_pad_iterate_internal_links (GstPad * pad)
* *
* Not MT safe. * Not MT safe.
* *
* Deprecated: use the thread-safe gst_pad_iterate_internal_links() functions * Deprecated: This function does not ref the pads in the list so that they
* instead. * could become invalid by the time the application accesses them. It's also
* possible that the list changes while handling the pads, which the caller of
* this function is unable to know. Use the thread-safe
* gst_pad_iterate_internal_links_default() instead.
*/ */
#ifndef GST_REMOVE_DEPRECATED #ifndef GST_REMOVE_DEPRECATED
GList * GList *
@ -3093,29 +3105,63 @@ gst_pad_get_internal_links_default (GstPad * pad)
g_return_val_if_fail (GST_IS_PAD (pad), NULL); g_return_val_if_fail (GST_IS_PAD (pad), NULL);
/* lock pad, check and ref parent */ GST_WARNING_OBJECT (pad, "Unsafe internal links used");
GST_OBJECT_LOCK (pad);
parent = GST_PAD_PARENT (pad);
if (!parent || !GST_IS_ELEMENT (parent))
goto no_parent;
parent = gst_object_ref (parent); /* when we get here, the default handler for get_internal_links is called,
GST_OBJECT_UNLOCK (pad); * which means that the user has not installed a custom one. We first check if
* there is maybe a custom iterate function we can call. */
if (GST_PAD_ITERINTLINKFUNC (pad) &&
GST_PAD_ITERINTLINKFUNC (pad) != gst_pad_iterate_internal_links_default) {
GstIterator *it;
GstIteratorResult ires;
gboolean done = FALSE;
/* now lock the parent while we copy the pads */ it = gst_pad_iterate_internal_links (pad);
GST_OBJECT_LOCK (parent); /* loop over the iterator and put all elements into a list, we also
if (pad->direction == GST_PAD_SRC) * immediatly unref them, which is bad. */
res = g_list_copy (parent->sinkpads); do {
else ires = gst_iterator_foreach (it, (GFunc) add_unref_pad_to_list, res);
res = g_list_copy (parent->srcpads); switch (ires) {
GST_OBJECT_UNLOCK (parent); case GST_ITERATOR_OK:
case GST_ITERATOR_DONE:
case GST_ITERATOR_ERROR:
done = TRUE;
break;
case GST_ITERATOR_RESYNC:
/* restart, discard previous list */
gst_iterator_resync (it);
g_list_free (res);
res = NULL;
break;
}
} while (!done);
gst_iterator_free (it);
} else {
/* lock pad, check and ref parent */
GST_OBJECT_LOCK (pad);
parent = GST_PAD_PARENT (pad);
if (!parent || !GST_IS_ELEMENT (parent))
goto no_parent;
parent = gst_object_ref (parent);
GST_OBJECT_UNLOCK (pad);
/* now lock the parent while we copy the pads */
GST_OBJECT_LOCK (parent);
if (pad->direction == GST_PAD_SRC)
res = g_list_copy (parent->sinkpads);
else
res = g_list_copy (parent->srcpads);
GST_OBJECT_UNLOCK (parent);
gst_object_unref (parent);
}
/* At this point pads can be changed and unreffed. Nothing we can do about it /* At this point pads can be changed and unreffed. Nothing we can do about it
* because for compatibility reasons this function cannot ref the pads or * because for compatibility reasons this function cannot ref the pads or
* notify the app that the list changed. */ * notify the app that the list changed. */
gst_object_unref (parent);
return res; return res;
no_parent: no_parent:
@ -3135,11 +3181,15 @@ no_parent:
* inside of the parent element. * inside of the parent element.
* The caller must free this list after use. * The caller must free this list after use.
* *
* Returns: a newly allocated #GList of pads. * Returns: a newly allocated #GList of pads, free with g_list_free().
* *
* Not MT safe. * Not MT safe.
* *
* Deprecated: Use the thread-safe gst_pad_iterate_internal_links() instead. * Deprecated: This function does not ref the pads in the list so that they
* could become invalid by the time the application accesses them. It's also
* possible that the list changes while handling the pads, which the caller of
* this function is unable to know. Use the thread-safe
* gst_pad_iterate_internal_links() instead.
*/ */
#ifndef GST_REMOVE_DEPRECATED #ifndef GST_REMOVE_DEPRECATED
GList * GList *