+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),
/* 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);
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;
}
}
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);