gstreamer_core/gst/gstobject.c
branchRCL_3
changeset 30 7e817e7e631c
parent 29 567bb019e3e3
--- a/gstreamer_core/gst/gstobject.c	Tue Aug 31 15:30:33 2010 +0300
+++ b/gstreamer_core/gst/gstobject.c	Wed Sep 01 12:16:41 2010 +0100
@@ -83,6 +83,7 @@
  * Last reviewed on 2005-11-09 (0.9.4)
  */
 
+
 #include "gst_private.h"
 
 #include "gstobject.h"
@@ -100,11 +101,10 @@
 static GstAllocTrace *_gst_object_trace;
 #endif
 
+
 #define DEBUG_REFCOUNT
 
 /* Object signals and args */
-/* FIXME-0.11: have a read-only parent property instead of the two signals
- * then we get notify::parent for free */
 enum
 {
   PARENT_SET,
@@ -145,6 +145,9 @@
 static guint gst_signal_object_signals[SO_LAST_SIGNAL] = { 0 };
 #endif
 
+static void gst_object_class_init (GstObjectClass * klass);
+static void gst_object_init (GTypeInstance * instance, gpointer g_class);
+
 static void gst_object_set_property (GObject * object, guint prop_id,
     const GValue * value, GParamSpec * pspec);
 static void gst_object_get_property (GObject * object, guint prop_id,
@@ -164,13 +167,43 @@
 
 static GObjectClass *parent_class = NULL;
 static guint gst_object_signals[LAST_SIGNAL] = { 0 };
+#ifdef __SYMBIAN32__
+EXPORT_C
+#endif
 
-G_DEFINE_ABSTRACT_TYPE (GstObject, gst_object, G_TYPE_OBJECT);
+
+GType
+gst_object_get_type (void)
+{
+  static GType gst_object_type = 0;
+
+  if (G_UNLIKELY (gst_object_type == 0)) {
+    static const GTypeInfo object_info = {
+      sizeof (GstObjectClass),
+      NULL,
+      NULL,
+      (GClassInitFunc) gst_object_class_init,
+      NULL,
+      NULL,
+      sizeof (GstObject),
+      0,
+      gst_object_init,
+      NULL
+    };
+
+    gst_object_type =
+        g_type_register_static (G_TYPE_OBJECT, "GstObject", &object_info,
+        G_TYPE_FLAG_ABSTRACT);
+  }
+  return gst_object_type;
+}
 
 static void
 gst_object_class_init (GstObjectClass * klass)
 {
-  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+  GObjectClass *gobject_class;
+
+  gobject_class = G_OBJECT_CLASS (klass);
 
   parent_class = g_type_class_peek_parent (klass);
 
@@ -183,8 +216,7 @@
 
   g_object_class_install_property (gobject_class, ARG_NAME,
       g_param_spec_string ("name", "Name", "The name of the object",
-          NULL,
-          G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS));
+          NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
 
   /**
    * GstObject::parent-set:
@@ -262,8 +294,10 @@
 }
 
 static void
-gst_object_init (GstObject * object)
+gst_object_init (GTypeInstance * instance, gpointer g_class)
 {
+  GstObject *object = GST_OBJECT (instance);
+
   object->lock = g_mutex_new ();
   object->parent = NULL;
   object->name = NULL;
@@ -294,7 +328,6 @@
 #ifdef __SYMBIAN32__
 EXPORT_C
 #endif
-
 gpointer
 gst_object_ref (gpointer object)
 {
@@ -340,43 +373,6 @@
 }
 
 /**
- * gst_object_ref_sink:
- * @object: a #GstObject to sink
- *
- * Increase the reference count of @object, and possibly remove the floating
- * reference, if @object has a floating reference.
- *
- * In other words, if the object is floating, then this call "assumes ownership"
- * of the floating reference, converting it to a normal reference by clearing
- * the floating flag while leaving the reference count unchanged. If the object
- * is not floating, then this call adds a new normal reference increasing the
- * reference count by one.
- *
- * MT safe. This function grabs and releases @object lock.
- *
- * Since: 0.10.24
- */
-#ifdef __SYMBIAN32__
-EXPORT_C
-#endif
-
-void
-gst_object_ref_sink (gpointer object)
-{
-  g_return_if_fail (GST_IS_OBJECT (object));
-
-  GST_OBJECT_LOCK (object);
-  if (G_LIKELY (GST_OBJECT_IS_FLOATING (object))) {
-    GST_CAT_LOG_OBJECT (GST_CAT_REFCOUNTING, object, "unsetting floating flag");
-    GST_OBJECT_FLAG_UNSET (object, GST_OBJECT_FLOATING);
-    GST_OBJECT_UNLOCK (object);
-  } else {
-    GST_OBJECT_UNLOCK (object);
-    gst_object_ref (object);
-  }
-}
-
-/**
  * gst_object_sink:
  * @object: a #GstObject to sink
  *
@@ -441,10 +437,10 @@
   g_return_if_fail (newobj == NULL || GST_IS_OBJECT (newobj));
 
 #ifdef DEBUG_REFCOUNT
-  GST_CAT_LOG (GST_CAT_REFCOUNTING, "replace %p %s (%d) with %p %s (%d)",
-      *oldobj, *oldobj ? GST_STR_NULL (GST_OBJECT_NAME (*oldobj)) : "(NONE)",
+  GST_CAT_LOG (GST_CAT_REFCOUNTING, "replace %s (%d) with %s (%d)",
+      *oldobj ? GST_STR_NULL (GST_OBJECT_NAME (*oldobj)) : "(NONE)",
       *oldobj ? G_OBJECT (*oldobj)->ref_count : 0,
-      newobj, newobj ? GST_STR_NULL (GST_OBJECT_NAME (newobj)) : "(NONE)",
+      newobj ? GST_STR_NULL (GST_OBJECT_NAME (newobj)) : "(NONE)",
       newobj ? G_OBJECT (newobj)->ref_count : 0);
 #endif
 
@@ -529,9 +525,16 @@
   GstObject *gst_object, *parent, *old_parent;
   guint i;
   gchar *name, *debug_name;
+  GstObjectClass *klass;
+
+  /* we fail when this is not a GstObject */
+  g_return_if_fail (GST_IS_OBJECT (object));
+
+  klass = GST_OBJECT_GET_CLASS (object);
 
   /* do the standard dispatching */
-  parent_class->dispatch_properties_changed (object, n_pspecs, pspecs);
+  G_OBJECT_CLASS (parent_class)->dispatch_properties_changed (object, n_pspecs,
+      pspecs);
 
   gst_object = GST_OBJECT_CAST (object);
   name = gst_object_get_name (gst_object);
@@ -541,11 +544,12 @@
   parent = gst_object_get_parent (gst_object);
   while (parent) {
     for (i = 0; i < n_pspecs; i++) {
-      GST_CAT_LOG_OBJECT (GST_CAT_PROPERTIES, parent,
-          "deep notification from %s (%s)", debug_name, pspecs[i]->name);
+      GST_LOG_OBJECT (parent, "deep notification from %s (%s)",
+          debug_name, pspecs[i]->name);
 
       g_signal_emit (parent, gst_object_signals[DEEP_NOTIFY],
-          g_quark_from_string (pspecs[i]->name), gst_object, pspecs[i]);
+          g_quark_from_string (pspecs[i]->name), GST_OBJECT_CAST (object),
+          pspecs[i]);
     }
 
     old_parent = parent;
@@ -593,16 +597,15 @@
     g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (pspec));
     g_object_get_property (G_OBJECT (orig), pspec->name, &value);
 
-    /* FIXME: handle flags */
     if (G_IS_PARAM_SPEC_ENUM (pspec)) {
       GEnumValue *enum_value;
-      GEnumClass *klass = G_ENUM_CLASS (g_type_class_ref (pspec->value_type));
 
-      enum_value = g_enum_get_value (klass, g_value_get_enum (&value));
+      enum_value =
+          g_enum_get_value (G_ENUM_CLASS (g_type_class_ref (pspec->value_type)),
+          g_value_get_enum (&value));
 
       str = g_strdup_printf ("%s (%d)", enum_value->value_nick,
           enum_value->value);
-      g_type_class_unref (klass);
     } else {
       str = g_strdup_value_contents (&value);
     }
@@ -646,7 +649,7 @@
   if (strncmp (type_name, "Gst", 3) == 0)
     type_name += 3;
   tmp = g_strdup_printf ("%s%d", type_name, count);
-  name = g_ascii_strdown (tmp, -1);
+  name = g_ascii_strdown (tmp, strlen (tmp));
   g_free (tmp);
 
   result = gst_object_set_name (object, name);
@@ -723,8 +726,7 @@
  */
 #ifdef __SYMBIAN32__
 EXPORT_C
-#endif
-
+#endif 
 gchar *
 gst_object_get_name (GstObject * object)
 {
@@ -812,11 +814,9 @@
  *
  * MT safe. Grabs and releases @object's LOCK.
  */
-
 #ifdef __SYMBIAN32__
 EXPORT_C
-#endif
-
+#endif 
 gboolean
 gst_object_set_parent (GstObject * object, GstObject * parent)
 {
@@ -844,7 +844,7 @@
     gst_object_ref (object);
   }
 
-  g_signal_emit (object, gst_object_signals[PARENT_SET], 0, parent);
+  g_signal_emit (G_OBJECT (object), gst_object_signals[PARENT_SET], 0, parent);
 
   return TRUE;
 
@@ -899,11 +899,9 @@
  *
  * MT safe. Grabs and releases @object's lock.
  */
-
 #ifdef __SYMBIAN32__
 EXPORT_C
-#endif
-
+#endif 
 void
 gst_object_unparent (GstObject * object)
 {
@@ -919,7 +917,8 @@
     object->parent = NULL;
     GST_OBJECT_UNLOCK (object);
 
-    g_signal_emit (object, gst_object_signals[PARENT_UNSET], 0, parent);
+    g_signal_emit (G_OBJECT (object), gst_object_signals[PARENT_UNSET], 0,
+        parent);
 
     gst_object_unref (object);
   } else {
@@ -1032,7 +1031,8 @@
   if (oclass->save_thyself)
     oclass->save_thyself (object, parent);
 
-  g_signal_emit (object, gst_object_signals[OBJECT_SAVED], 0, parent);
+  g_signal_emit (G_OBJECT (object), gst_object_signals[OBJECT_SAVED], 0,
+      parent);
 
   return parent;
 }
@@ -1128,7 +1128,6 @@
   GSList *parents;
   void *parent;
   gchar *prevpath, *path;
-  const gchar *typename;
   gchar *component;
   gchar *separator;
 
@@ -1157,27 +1156,16 @@
    * decrease the refcounting on each element after we handled
    * it. */
   for (parents = parentage; parents; parents = g_slist_next (parents)) {
-    if (G_IS_OBJECT (parents->data)) {
-      typename = G_OBJECT_TYPE_NAME (parents->data);
-    } else {
-      typename = NULL;
-    }
     if (GST_IS_OBJECT (parents->data)) {
       GstObject *item = GST_OBJECT_CAST (parents->data);
       GstObjectClass *oclass = GST_OBJECT_GET_CLASS (item);
-      gchar *objname = gst_object_get_name (item);
 
-      component = g_strdup_printf ("%s:%s", typename, objname);
+      component = gst_object_get_name (item);
       separator = oclass->path_string_separator;
       /* and unref now */
       gst_object_unref (item);
-      g_free (objname);
     } else {
-      if (typename) {
-        component = g_strdup_printf ("%s:%p", typename, parents->data);
-      } else {
-        component = g_strdup_printf ("%p", parents->data);
-      }
+      component = g_strdup_printf ("%p", parents->data);
       separator = "/";
     }
 
@@ -1209,51 +1197,39 @@
 #endif
 };
 
-
-//deviation for EXPORT_C issue Start
-#ifndef __SYMBIAN32__
-
-G_DEFINE_TYPE (GstSignalObject, gst_signal_object, G_TYPE_OBJECT);
-
-#else
-
-static void     gst_signal_object_init              (GstSignalObject        *self);
-static void     gst_signal_object_class_init        (GstSignalObjectClass *klass);
-static gpointer gst_signal_object_parent_class = NULL;
-static void     gst_signal_object_class_intern_init (gpointer klass)
-{
-  gst_signal_object_parent_class = g_type_class_peek_parent (klass);
-  gst_signal_object_class_init ((GstSignalObjectClass*) klass);
-}
-
 static GType
 gst_signal_object_get_type (void)
 {
-  static volatile gsize g_define_type_id__volatile = 0;
-  if (g_once_init_enter (&g_define_type_id__volatile)) 
-    {
-      GType g_define_type_id =
-        g_type_register_static_simple (G_TYPE_OBJECT,
-                                       g_intern_static_string ("GstSignalObject"),
-                                       sizeof (GstSignalObjectClass),
-                                       (GClassInitFunc) gst_signal_object_class_intern_init,
-                                       sizeof (GstSignalObject),
-                                       (GInstanceInitFunc) gst_signal_object_init,
-                                       (GTypeFlags) 0);
-      { /* custom code follows */
-      	//no code
-      }
-				
-      g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); 
-    }					
-  return g_define_type_id__volatile;	
-} /* closes gst_signal_object_get_type() */
+  static GType signal_object_type = 0;
 
-#endif //deviation for EXPORT_C issue end
+  if (G_UNLIKELY (signal_object_type == 0)) {
+    static const GTypeInfo signal_object_info = {
+      sizeof (GstSignalObjectClass),
+      NULL,
+      NULL,
+      (GClassInitFunc) gst_signal_object_class_init,
+      NULL,
+      NULL,
+      sizeof (GstSignalObject),
+      0,
+      (GInstanceInitFunc) gst_signal_object_init,
+      NULL
+    };
+
+    signal_object_type =
+        g_type_register_static (G_TYPE_OBJECT, "GstSignalObject",
+        &signal_object_info, 0);
+  }
+  return signal_object_type;
+}
 
 static void
 gst_signal_object_class_init (GstSignalObjectClass * klass)
 {
+  GObjectClass *gobject_class;
+
+  gobject_class = (GObjectClass *) klass;
+
   parent_class = g_type_class_peek_parent (klass);
 
 #ifndef GST_DISABLE_LOADSAVE