[gtk/css-lookup-caching: 32/39] Make lookups refcounted
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/css-lookup-caching: 32/39] Make lookups refcounted
- Date: Tue, 11 Feb 2020 16:59:22 +0000 (UTC)
commit 893e9cb374582735e715f73081eb9657c1f1cb09
Author: Matthias Clasen <mclasen redhat com>
Date: Mon Feb 10 18:10:42 2020 -0500
Make lookups refcounted
This will be useful when we share lookups.
gtk/gtkcsslookup.c | 37 ++++++++++++++++++++++++++++++++-----
gtk/gtkcsslookupprivate.h | 7 +++++--
gtk/gtkcssstaticstyle.c | 10 +++++-----
3 files changed, 42 insertions(+), 12 deletions(-)
---
diff --git a/gtk/gtkcsslookup.c b/gtk/gtkcsslookup.c
index 68551fb3c4..11f15e837f 100644
--- a/gtk/gtkcsslookup.c
+++ b/gtk/gtkcsslookup.c
@@ -24,18 +24,45 @@
#include "gtkprivatetypebuiltins.h"
#include "gtkprivate.h"
-void
-gtk_css_lookup_init (GtkCssLookup *lookup)
+GtkCssLookup *
+gtk_css_lookup_new (void)
{
- memset (lookup, 0, sizeof (*lookup));
+ GtkCssLookup *lookup = g_new0 (GtkCssLookup, 1);
+ lookup->ref_count = 1;
lookup->set_values = _gtk_bitmask_new ();
+
+ return lookup;
}
-void
-gtk_css_lookup_destroy (GtkCssLookup *lookup)
+static void
+gtk_css_lookup_free (GtkCssLookup *lookup)
{
_gtk_bitmask_free (lookup->set_values);
+ g_free (lookup);
+}
+
+GtkCssLookup *
+gtk_css_lookup_ref (GtkCssLookup *lookup)
+{
+ gtk_internal_return_val_if_fail (lookup != NULL, NULL);
+ gtk_internal_return_val_if_fail (lookup->ref_count > 0, NULL);
+
+ lookup->ref_count++;
+
+ return lookup;
+}
+
+void
+gtk_css_lookup_unref (GtkCssLookup *lookup)
+{
+ gtk_internal_return_if_fail (lookup != NULL);
+ gtk_internal_return_if_fail (lookup->ref_count > 0);
+
+ lookup->ref_count--;
+
+ if (lookup->ref_count == 0)
+ gtk_css_lookup_free (lookup);
}
gboolean
diff --git a/gtk/gtkcsslookupprivate.h b/gtk/gtkcsslookupprivate.h
index 344995810a..aab2a3d197 100644
--- a/gtk/gtkcsslookupprivate.h
+++ b/gtk/gtkcsslookupprivate.h
@@ -36,12 +36,15 @@ typedef struct {
} GtkCssLookupValue;
struct _GtkCssLookup {
+ int ref_count;
GtkBitmask *set_values;
GtkCssLookupValue values[GTK_CSS_PROPERTY_N_PROPERTIES];
};
-void gtk_css_lookup_init (GtkCssLookup *lookup);
-void gtk_css_lookup_destroy (GtkCssLookup *lookup);
+GtkCssLookup * gtk_css_lookup_new (void);
+GtkCssLookup * gtk_css_lookup_ref (GtkCssLookup *lookup);
+void gtk_css_lookup_unref (GtkCssLookup *lookup);
+
gboolean gtk_css_lookup_is_missing (const GtkCssLookup *lookup,
guint id);
void gtk_css_lookup_set (GtkCssLookup *lookup,
diff --git a/gtk/gtkcssstaticstyle.c b/gtk/gtkcssstaticstyle.c
index adc8eb524a..e8d7d6367d 100644
--- a/gtk/gtkcssstaticstyle.c
+++ b/gtk/gtkcssstaticstyle.c
@@ -993,16 +993,16 @@ gtk_css_static_style_new_compute (GtkStyleProvider *provider,
GtkCssChange change)
{
GtkCssStaticStyle *result;
- GtkCssLookup lookup;
+ GtkCssLookup *lookup;
GtkCssNode *parent;
- gtk_css_lookup_init (&lookup);
+ lookup = gtk_css_lookup_new ();
if (node)
gtk_style_provider_lookup (provider,
filter,
node,
- &lookup,
+ lookup,
change == 0 ? &change : NULL);
result = g_object_new (GTK_TYPE_CSS_STATIC_STYLE, NULL);
@@ -1014,12 +1014,12 @@ gtk_css_static_style_new_compute (GtkStyleProvider *provider,
else
parent = NULL;
- gtk_css_lookup_resolve (&lookup,
+ gtk_css_lookup_resolve (lookup,
provider,
result,
parent ? gtk_css_node_get_style (parent) : NULL);
- gtk_css_lookup_destroy (&lookup);
+ gtk_css_lookup_unref (lookup);
return GTK_CSS_STYLE (result);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]