[gtk/css-lookup-caching: 1/3] wip: Count duplicate lookups
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/css-lookup-caching: 1/3] wip: Count duplicate lookups
- Date: Wed, 12 Feb 2020 00:12:16 +0000 (UTC)
commit c23cd3574dcc301b2f1fbbfb4fd83941da7aea25
Author: Matthias Clasen <mclasen redhat com>
Date: Tue Feb 11 18:55:17 2020 -0500
wip: Count duplicate lookups
gtk/gtkcsslookup.c | 113 ++++++++++++++++++++++++++++++++++++++++++++++
gtk/gtkcsslookupprivate.h | 2 +
gtk/gtkcssstaticstyle.c | 2 +
3 files changed, 117 insertions(+)
---
diff --git a/gtk/gtkcsslookup.c b/gtk/gtkcsslookup.c
index 7e52359b65..8be44da66f 100644
--- a/gtk/gtkcsslookup.c
+++ b/gtk/gtkcsslookup.c
@@ -25,6 +25,77 @@
#include "gtkprivate.h"
+static GHashTable *lookups;
+
+static gboolean
+gtk_css_lookup_equal (const GtkCssLookup *l1,
+ const GtkCssLookup *l2)
+{
+ int i;
+
+ if (!_gtk_bitmask_equals (l1->set_values, l2->set_values))
+ return FALSE;
+
+ if (l1->values == NULL && l2->values == NULL)
+ return TRUE;
+
+ if (l1->values == NULL || l2->values == NULL)
+ return FALSE;
+
+ if (l1->values->len != l2->values->len)
+ return FALSE;
+
+ for (i = 0; i < l1->values->len; i++)
+ {
+ GtkCssLookupValue *v1 = g_ptr_array_index (l1->values, i);
+ GtkCssLookupValue *v2 = g_ptr_array_index (l2->values, i);
+
+ if (!_gtk_css_value_equal (v1->value, v2->value))
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static guint
+gtk_css_lookup_hash (const GtkCssLookup *l)
+{
+ int i;
+ guint h;
+
+ if (l->values == NULL)
+ return 0;
+
+ h = 0;
+ for (i = 0; i < l->values->len; i++)
+ {
+ GtkCssLookupValue *v = g_ptr_array_index (l->values, i);
+ char *s = _gtk_css_value_to_string (v->value);
+ h += g_str_hash (s);
+ g_free (s);
+ }
+
+ return h;
+}
+
+static gboolean
+dump_lookups (gpointer data)
+{
+ GHashTableIter iter;
+ GtkCssLookup *key;
+ gpointer value;
+
+ g_print ("lookup counts: ");
+ g_hash_table_iter_init (&iter, lookups);
+ while (g_hash_table_iter_next (&iter, (gpointer *)&key, (gpointer *)&value))
+ {
+ g_print ("%d ", GPOINTER_TO_INT (value));
+ }
+ g_print ("\n");
+
+ return G_SOURCE_CONTINUE;
+}
+
GtkCssLookup *
gtk_css_lookup_new (void)
{
@@ -33,12 +104,50 @@ gtk_css_lookup_new (void)
lookup->ref_count = 1;
lookup->set_values = _gtk_bitmask_new ();
+ if (!lookups)
+ {
+ lookups = g_hash_table_new (gtk_css_lookup_hash, gtk_css_lookup_equal);
+ g_timeout_add (1000, dump_lookups, NULL);
+ }
+
return lookup;
}
+void
+gtk_css_lookup_register (GtkCssLookup *lookup)
+{
+ gint count;
+
+ count = GPOINTER_TO_INT (g_hash_table_lookup (lookups, lookup));
+ count++;
+
+ if (count == 1)
+ gtk_css_lookup_ref (lookup);
+
+ g_hash_table_insert (lookups, lookup, GINT_TO_POINTER (count));
+}
+
+static void
+gtk_css_lookup_unregister (GtkCssLookup *lookup)
+{
+ gint count;
+
+ count = GPOINTER_TO_INT (g_hash_table_lookup (lookups, lookup));
+ g_assert (count > 0);
+ if (count == 1)
+ g_hash_table_remove (lookups, lookup);
+ else
+ {
+ count--;
+ g_hash_table_insert (lookups, lookup, GINT_TO_POINTER (count));
+ }
+}
+
static void
gtk_css_lookup_free (GtkCssLookup *lookup)
{
+ gtk_css_lookup_unregister (lookup);
+
_gtk_bitmask_free (lookup->set_values);
if (lookup->values)
g_ptr_array_unref (lookup->values);
@@ -64,6 +173,10 @@ gtk_css_lookup_unref (GtkCssLookup *lookup)
lookup->ref_count--;
+ if (lookup->ref_count == 1 &&
+ GPOINTER_TO_INT (g_hash_table_lookup (lookups, lookup)) == 1)
+ lookup->ref_count--;
+
if (lookup->ref_count == 0)
gtk_css_lookup_free (lookup);
}
diff --git a/gtk/gtkcsslookupprivate.h b/gtk/gtkcsslookupprivate.h
index f73d8f56de..d2dd82cee4 100644
--- a/gtk/gtkcsslookupprivate.h
+++ b/gtk/gtkcsslookupprivate.h
@@ -77,6 +77,8 @@ gtk_css_lookup_get (GtkCssLookup *lookup,
return NULL;
}
+void gtk_css_lookup_register (GtkCssLookup *lookup);
+
G_END_DECLS
#endif /* __GTK_CSS_LOOKUP_PRIVATE_H__ */
diff --git a/gtk/gtkcssstaticstyle.c b/gtk/gtkcssstaticstyle.c
index 8ccc1fe9f0..d4c1df6b19 100644
--- a/gtk/gtkcssstaticstyle.c
+++ b/gtk/gtkcssstaticstyle.c
@@ -993,6 +993,8 @@ gtk_css_static_style_new_compute (GtkStyleProvider *provider,
node,
lookup,
change == 0 ? &change : NULL);
+
+ gtk_css_lookup_register (lookup);
}
result = g_object_new (GTK_TYPE_CSS_STATIC_STYLE, NULL);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]