From ea60952f0605fa8c29187455117f1f74daaa88b8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Tim-Philipp=20M=C3=BCller?= Date: Fri, 7 Jul 2006 17:16:26 +0000 Subject: [PATCH] gst/gstobject.c: Random micro-optimisation: don't use a hash table with strings as keys and the usual strdup/strcmp i... Original commit message from CVS: * gst/gstobject.c: (gst_object_set_name_default), (gst_object_set_name): Random micro-optimisation: don't use a hash table with strings as keys and the usual strdup/strcmp involved, but rather just use the GQuark of the type name as key, since it needs to be looked up anyway to get the type name string. * tests/check/gst/gstobject.c: (GST_START_TEST): Fix various leaks. --- ChangeLog | 13 +++++++++++++ gst/gstobject.c | 22 ++++++++++++---------- tests/check/gst/gstobject.c | 8 ++++++++ 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 807dc91..5624a14 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,18 @@ 2006-07-07 Tim-Philipp Müller + * gst/gstobject.c: (gst_object_set_name_default), + (gst_object_set_name): + Random micro-optimisation: don't use a hash table + with strings as keys and the usual strdup/strcmp + involved, but rather just use the GQuark of the + type name as key, since it needs to be looked up + anyway to get the type name string. + + * tests/check/gst/gstobject.c: (GST_START_TEST): + Fix various leaks. + +2006-07-07 Tim-Philipp Müller + * gst/gstbin.c: (compare_interface), (gst_bin_get_by_interface), (gst_bin_iterate_all_by_interface): Can't use GPOINTER_TO_INT and GINT_TO_POINTER with GTypes. diff --git a/gst/gstobject.c b/gst/gstobject.c index f472de0..2c636fa 100644 --- a/gst/gstobject.c +++ b/gst/gstobject.c @@ -122,7 +122,8 @@ enum SO_LAST_SIGNAL }; -static GHashTable *object_name_counts = NULL; +/* maps type name quark => count */ +static GData *object_name_counts = NULL; G_LOCK_DEFINE_STATIC (object_name_mutex); @@ -150,8 +151,7 @@ static void gst_object_dispatch_properties_changed (GObject * object, static void gst_object_dispose (GObject * object); static void gst_object_finalize (GObject * object); -static gboolean gst_object_set_name_default (GstObject * object, - const gchar * type_name); +static gboolean gst_object_set_name_default (GstObject * object); #ifndef GST_DISABLE_LOADSAVE_REGISTRY static void gst_object_real_restore_thyself (GstObject * object, @@ -600,28 +600,30 @@ gst_object_default_deep_notify (GObject * object, GstObject * orig, } static gboolean -gst_object_set_name_default (GstObject * object, const gchar * type_name) +gst_object_set_name_default (GstObject * object) { + const gchar *type_name; gint count; gchar *name, *tmp; gboolean result; + GQuark q; /* to ensure guaranteed uniqueness across threads, only one thread * may ever assign a name */ G_LOCK (object_name_mutex); if (!object_name_counts) { - object_name_counts = g_hash_table_new_full (g_str_hash, g_str_equal, - g_free, NULL); + g_datalist_init (&object_name_counts); } - count = GPOINTER_TO_INT (g_hash_table_lookup (object_name_counts, type_name)); - g_hash_table_insert (object_name_counts, g_strdup (type_name), - GINT_TO_POINTER (count + 1)); + q = g_type_qname (G_OBJECT_TYPE (object)); + count = GPOINTER_TO_INT (g_datalist_id_get_data (&object_name_counts, q)); + g_datalist_id_set_data (&object_name_counts, q, GINT_TO_POINTER (count + 1)); G_UNLOCK (object_name_mutex); /* GstFooSink -> foosinkN */ + type_name = g_quark_to_string (q); if (strncmp (type_name, "Gst", 3) == 0) type_name += 3; tmp = g_strdup_printf ("%s%d", type_name, count); @@ -670,7 +672,7 @@ gst_object_set_name (GstObject * object, const gchar * name) result = TRUE; } else { GST_OBJECT_UNLOCK (object); - result = gst_object_set_name_default (object, G_OBJECT_TYPE_NAME (object)); + result = gst_object_set_name_default (object); } return result; diff --git a/tests/check/gst/gstobject.c b/tests/check/gst/gstobject.c index d9a9d94..ea08fb5 100644 --- a/tests/check/gst/gstobject.c +++ b/tests/check/gst/gstobject.c @@ -85,6 +85,7 @@ GST_START_TEST (test_fake_object_new) fail_if (object == NULL, "Failed to create instance of GstFakeObject"); fail_unless (GST_IS_OBJECT (object), "GstFakeObject instance is not a GstObject"); + gst_object_unref (object); } GST_END_TEST @@ -101,6 +102,7 @@ GST_START_TEST (test_fake_object_name) fail_if (name == NULL, "Newly created object has no name"); fail_if (strncmp (name, "fakeobject", 10) != 0, "Random name %s does not start with Gst", name); + g_free (name); /* give a random name by setting with NULL; * GstFakeObject class -> fakeobject%d */ @@ -123,6 +125,8 @@ GST_START_TEST (test_fake_object_name) "Copy of object name affected actual object name"); g_free (name); g_free (name2); + + gst_object_unref (object); } GST_END_TEST @@ -185,6 +189,8 @@ GST_START_TEST (test_fake_object_name_threaded_wrong) } MAIN_STOP_THREADS (); + gst_object_unref (object); + fail_unless (expected_failure, "name did not get changed"); } @@ -220,6 +226,7 @@ GST_START_TEST (test_fake_object_name_threaded_right) g_free (name); } MAIN_STOP_THREADS (); + gst_object_unref (object); } GST_END_TEST @@ -322,6 +329,7 @@ GST_START_TEST (test_fake_object_name_threaded_unique) g_free (name1); name1 = name2; } + g_free (name1); /* free stuff */ g_list_foreach (object_list, (GFunc) g_object_unref, NULL); -- 2.7.4