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
This commit is contained in:
Jan Schmidt 2006-12-07 12:11:14 +00:00
parent 8dbb58093f
commit 1cca54b44c
5 changed files with 21 additions and 4 deletions

View file

@ -1,3 +1,12 @@
2006-12-07 Jan Schmidt <thaytan@mad.scientist.com>
* 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 <wim@fluendo.com>
* libs/gst/base/gstbasesink.c: (gst_base_sink_event),

View file

@ -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;
}
}

View file

@ -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);

View file

@ -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);
}
}

View file

@ -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);