mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-23 08:46:40 +00:00
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.
This commit is contained in:
parent
99f16655f4
commit
ea60952f06
3 changed files with 33 additions and 10 deletions
13
ChangeLog
13
ChangeLog
|
@ -1,3 +1,16 @@
|
|||
2006-07-07 Tim-Philipp Müller <tim at centricular dot net>
|
||||
|
||||
* 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 <tim at centricular dot net>
|
||||
|
||||
* gst/gstbin.c: (compare_interface), (gst_bin_get_by_interface),
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue