Fix refcounting of gst_plugin_feature_load to match the docs.
authorJan Schmidt <thaytan@mad.scientist.com>
Thu, 7 Dec 2006 12:11:14 +0000 (12:11 +0000)
committerJan Schmidt <thaytan@mad.scientist.com>
Thu, 7 Dec 2006 12:11:14 +0000 (12:11 +0000)
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
gst/gstelementfactory.c
gst/gstpluginfeature.c
gst/gsttypefindfactory.c
tools/gst-inspect.c

index c0f30e2..4c4af1c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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),
index 55de1c4..d62ac2f 100644 (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;
   }
 }
index cc35e5d..72eee90 100644 (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);
index 0a1cf15..607106b 100644 (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);
   }
 }
index 5cb5f3a..6c5332c 100644 (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);