diff -r 567bb019e3e3 -r 7e817e7e631c gstreamer_core/gst/gstobject.c --- 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