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),
(gst_bin_iterate_all_by_interface):
Can't use GPOINTER_TO_INT and GINT_TO_POINTER with GTypes.
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);
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,
}
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);
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;
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
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 */
"Copy of object name affected actual object name");
g_free (name);
g_free (name2);
+
+ gst_object_unref (object);
}
GST_END_TEST
}
MAIN_STOP_THREADS ();
+ gst_object_unref (object);
+
fail_unless (expected_failure, "name did not get changed");
}
g_free (name);
}
MAIN_STOP_THREADS ();
+ gst_object_unref (object);
}
GST_END_TEST
g_free (name1);
name1 = name2;
}
+ g_free (name1);
/* free stuff */
g_list_foreach (object_list, (GFunc) g_object_unref, NULL);