diff options
author | Benjamin Otte <otte@redhat.com> | 2011-05-16 22:46:59 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2011-05-18 22:17:57 +0200 |
commit | 82399bf45745f44008c9286b51bdc1df7f124b6c (patch) | |
tree | f3a1782095cc1aaf5695f3d95d1359c34f46c90b /gtk/gtkstyleproperties.c | |
parent | 4c92fb2b5dda6db8c78fc7da0a81722ceda92dbd (diff) | |
download | gtk+-82399bf45745f44008c9286b51bdc1df7f124b6c.tar.gz |
styleproperties: Speed up by not optimizing
g_quark_try_string() takes a lock and then does a hashtable lookup. So
just using a string hash table for properties is faster.
Diffstat (limited to 'gtk/gtkstyleproperties.c')
-rw-r--r-- | gtk/gtkstyleproperties.c | 81 |
1 files changed, 18 insertions, 63 deletions
diff --git a/gtk/gtkstyleproperties.c b/gtk/gtkstyleproperties.c index b1adea1874..aeabb95ff9 100644 --- a/gtk/gtkstyleproperties.c +++ b/gtk/gtkstyleproperties.c @@ -62,7 +62,6 @@ typedef struct ValueData ValueData; struct PropertyNode { - GQuark property_quark; GParamSpec *pspec; GtkStylePropertyParser parse_func; }; @@ -84,7 +83,7 @@ struct GtkStylePropertiesPrivate GHashTable *properties; }; -static GArray *properties = NULL; +static GHashTable *properties = NULL; static void gtk_style_properties_provider_init (GtkStyleProviderIface *iface); static void gtk_style_properties_finalize (GObject *object); @@ -382,36 +381,13 @@ gtk_style_properties_provider_init (GtkStyleProviderIface *iface) iface->get_style = gtk_style_properties_get_style; } -static int -compare_property (gconstpointer p1, - gconstpointer p2) -{ - PropertyNode *key = (PropertyNode *) p1; - PropertyNode *node = (PropertyNode *) p2; - - if (key->property_quark > node->property_quark) - return 1; - else if (key->property_quark < node->property_quark) - return -1; - - return 0; -} - static PropertyNode * -property_node_lookup (GQuark quark) +property_node_lookup (const char *name) { - PropertyNode key = { 0 }; - - if (!quark) - return NULL; - if (!properties) return NULL; - key.property_quark = quark; - - return bsearch (&key, properties->data, properties->len, - sizeof (PropertyNode), compare_property); + return g_hash_table_lookup (properties, name); } /* Property registration functions */ @@ -432,39 +408,26 @@ void gtk_style_properties_register_property (GtkStylePropertyParser parse_func, GParamSpec *pspec) { - PropertyNode *node, new = { 0 }; - GQuark quark; - gint i; + PropertyNode *node; g_return_if_fail (G_IS_PARAM_SPEC (pspec)); + /* stuff is never freed, so no need for free functions */ if (G_UNLIKELY (!properties)) - properties = g_array_new (FALSE, TRUE, sizeof (PropertyNode)); + properties = g_hash_table_new (g_str_hash, g_str_equal); - quark = g_quark_from_string (pspec->name); - - if ((node = property_node_lookup (quark)) != NULL) + if ((node = property_node_lookup (pspec->name)) != NULL) { g_warning ("Property \"%s\" was already registered with type %s", pspec->name, g_type_name (node->pspec->value_type)); return; } - new.property_quark = quark; - new.pspec = pspec; - - if (parse_func) - new.parse_func = parse_func; - - for (i = 0; i < properties->len; i++) - { - node = &g_array_index (properties, PropertyNode, i); - - if (node->property_quark > quark) - break; - } + node = g_slice_new0 (PropertyNode); + node->pspec = pspec; + node->parse_func = parse_func; - g_array_insert_val (properties, i, new); + g_hash_table_insert (properties, pspec->name, node); } /** @@ -489,20 +452,12 @@ gtk_style_properties_lookup_property (const gchar *property_name, PropertyNode *node; GtkStylePropertiesClass *klass; gboolean found = FALSE; - GQuark quark; g_return_val_if_fail (property_name != NULL, FALSE); klass = g_type_class_ref (GTK_TYPE_STYLE_PROPERTIES); - quark = g_quark_try_string (property_name); - - if (quark == 0) - { - g_type_class_unref (klass); - return FALSE; - } - node = property_node_lookup (quark); + node = property_node_lookup (property_name); if (node) { @@ -675,7 +630,7 @@ gtk_style_properties_set_property (GtkStyleProperties *props, g_return_if_fail (value != NULL); value_type = G_VALUE_TYPE (value); - node = property_node_lookup (g_quark_try_string (property)); + node = property_node_lookup (property); if (!node) { @@ -754,7 +709,7 @@ gtk_style_properties_set_valist (GtkStyleProperties *props, gchar *error = NULL; GValue *val; - node = property_node_lookup (g_quark_try_string (property_name)); + node = property_node_lookup (property_name); if (!node) { @@ -935,7 +890,7 @@ _gtk_style_properties_peek_property (GtkStyleProperties *props, g_return_val_if_fail (GTK_IS_STYLE_PROPERTIES (props), NULL); g_return_val_if_fail (prop_name != NULL, NULL); - node = property_node_lookup (g_quark_try_string (prop_name)); + node = property_node_lookup (prop_name); if (!node) { @@ -987,7 +942,7 @@ gtk_style_properties_get_property (GtkStyleProperties *props, g_return_val_if_fail (property != NULL, FALSE); g_return_val_if_fail (value != NULL, FALSE); - node = property_node_lookup (g_quark_try_string (property)); + node = property_node_lookup (property); if (!node) { @@ -1049,7 +1004,7 @@ gtk_style_properties_get_valist (GtkStyleProperties *props, gchar *error = NULL; GValue *val = NULL; - node = property_node_lookup (g_quark_try_string (property_name)); + node = property_node_lookup (property_name); if (!node) { @@ -1140,7 +1095,7 @@ gtk_style_properties_unset_property (GtkStyleProperties *props, g_return_if_fail (GTK_IS_STYLE_PROPERTIES (props)); g_return_if_fail (property != NULL); - node = property_node_lookup (g_quark_try_string (property)); + node = property_node_lookup (property); if (!node) { |