From 1cca54b44c209403decd7c2eb9c21f0b45e17109 Mon Sep 17 00:00:00 2001 From: Jan Schmidt Date: Thu, 7 Dec 2006 12:11:14 +0000 Subject: [PATCH] Fix refcounting of gst_plugin_feature_load to match the docs. Original commit message from CVS: * gst/gstelementfactory.c: (gst_element_factory_create): * gst/gstpluginfeature.c: (gst_plugin_feature_load): * gst/gsttypefindfactory.c: (gst_type_find_factory_call_function): * tools/gst-inspect.c: (print_element_info): Fix refcounting of gst_plugin_feature_load to match the docs. Fixes: #380129 --- ChangeLog | 9 +++++++++ gst/gstelementfactory.c | 12 +++++++++--- gst/gstpluginfeature.c | 2 +- gst/gsttypefindfactory.c | 1 + tools/gst-inspect.c | 1 + 5 files changed, 21 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index c0f30e2..4c4af1c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2006-12-07 Jan Schmidt + + * gst/gstelementfactory.c: (gst_element_factory_create): + * gst/gstpluginfeature.c: (gst_plugin_feature_load): + * gst/gsttypefindfactory.c: (gst_type_find_factory_call_function): + * tools/gst-inspect.c: (print_element_info): + Fix refcounting of gst_plugin_feature_load to match the docs. + Fixes: #380129 + 2006-12-07 Wim Taymans * libs/gst/base/gstbasesink.c: (gst_base_sink_event), diff --git a/gst/gstelementfactory.c b/gst/gstelementfactory.c index 55de1c43..d62ac2f 100644 --- a/gst/gstelementfactory.c +++ b/gst/gstelementfactory.c @@ -379,14 +379,18 @@ gst_element_factory_create (GstElementFactory * factory, const gchar * name) /* create an instance of the element, cast so we don't assert on NULL */ element = GST_ELEMENT_CAST (g_object_new (factory->type, NULL)); - if (element == NULL) + if (G_UNLIKELY (element == NULL)) goto no_element; /* fill in the pointer to the factory in the element class. The - * class will not be unreffed currently. */ + * class will not be unreffed currently. + * FIXME: This isn't safe and may leak a refcount on the factory if 2 threads + * create the first instance of an element at the same moment */ oclass = GST_ELEMENT_GET_CLASS (element); - if (oclass->elementfactory == NULL) + if (G_UNLIKELY (oclass->elementfactory == NULL)) oclass->elementfactory = factory; + else + gst_object_unref (factory); if (name) gst_object_set_name (GST_OBJECT (element), name); @@ -404,11 +408,13 @@ load_failed: no_type: { GST_WARNING_OBJECT (factory, "factory has no type"); + gst_object_unref (factory); return NULL; } no_element: { GST_WARNING_OBJECT (factory, "could not create element"); + gst_object_unref (factory); return NULL; } } diff --git a/gst/gstpluginfeature.c b/gst/gstpluginfeature.c index cc35e5d..72eee90 100644 --- a/gst/gstpluginfeature.c +++ b/gst/gstpluginfeature.c @@ -107,7 +107,7 @@ gst_plugin_feature_load (GstPluginFeature * feature) GST_DEBUG ("loading plugin for feature %p; '%s'", feature, GST_PLUGIN_FEATURE_NAME (feature)); if (feature->loaded) - return feature; + return gst_object_ref (feature); GST_DEBUG ("loading plugin %s", feature->plugin_name); plugin = gst_plugin_load_by_name (feature->plugin_name); diff --git a/gst/gsttypefindfactory.c b/gst/gsttypefindfactory.c index 0a1cf15..607106b 100644 --- a/gst/gsttypefindfactory.c +++ b/gst/gsttypefindfactory.c @@ -241,5 +241,6 @@ gst_type_find_factory_call_function (GstTypeFindFactory * factory, g_assert (new_factory->function != NULL); new_factory->function (find, new_factory->user_data); + gst_object_unref (new_factory); } } diff --git a/tools/gst-inspect.c b/tools/gst-inspect.c index 5cb5f3a..6c5332c 100644 --- a/tools/gst-inspect.c +++ b/tools/gst-inspect.c @@ -1097,6 +1097,7 @@ print_element_info (GstElementFactory * factory, gboolean print_names) print_signal_info (element); print_children_info (element); + gst_object_unref (factory); if (_name[0] != '\0') g_free (_name); -- 2.7.4