From 03eb4c38c9be7409ee622c60ffd9e08d2464522c Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Fri, 27 May 2011 16:36:07 +0200 Subject: [PATCH] widgetpath: Make structure refcounted I want to use widget paths in a way that make a lot more sense with a refcounted structure. See the following patches. --- docs/reference/gtk/gtk3-sections.txt | 2 ++ gtk/gtk.symbols | 2 ++ gtk/gtkwidgetpath.c | 52 +++++++++++++++++++++++++--- gtk/gtkwidgetpath.h | 2 ++ 4 files changed, 54 insertions(+), 4 deletions(-) diff --git a/docs/reference/gtk/gtk3-sections.txt b/docs/reference/gtk/gtk3-sections.txt index 291b219f78..45f17734bd 100644 --- a/docs/reference/gtk/gtk3-sections.txt +++ b/docs/reference/gtk/gtk3-sections.txt @@ -5417,6 +5417,8 @@ GTK_CHECK_VERSION GtkWidgetPath gtk_widget_path_append_type gtk_widget_path_copy +gtk_widget_path_ref +gtk_widget_path_unref gtk_widget_path_free gtk_widget_path_get_object_type gtk_widget_path_has_parent diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols index 51e07da4d6..4948e92d45 100644 --- a/gtk/gtk.symbols +++ b/gtk/gtk.symbols @@ -3578,6 +3578,8 @@ gtk_widget_override_symbolic_color gtk_widget_path gtk_widget_path_append_type gtk_widget_path_copy +gtk_widget_path_ref +gtk_widget_path_unref gtk_widget_path_free gtk_widget_path_get_type gtk_widget_path_get_object_type diff --git a/gtk/gtkwidgetpath.c b/gtk/gtkwidgetpath.c index 384cd5f82b..52ca7e0570 100644 --- a/gtk/gtkwidgetpath.c +++ b/gtk/gtkwidgetpath.c @@ -97,6 +97,8 @@ struct GtkPathElement struct _GtkWidgetPath { + volatile guint ref_count; + GArray *elems; /* First element contains the described widget */ }; @@ -116,6 +118,7 @@ gtk_widget_path_new (void) path = g_slice_new0 (GtkWidgetPath); path->elems = g_array_new (FALSE, TRUE, sizeof (GtkPathElement)); + path->ref_count = 1; return path; } @@ -174,20 +177,44 @@ gtk_widget_path_copy (const GtkWidgetPath *path) } /** - * gtk_widget_path_free: + * gtk_widget_path_ref: * @path: a #GtkWidgetPath * - * Frees a #GtkWidgetPath. + * Increments the reference count on @path. * - * Since: 3.0 + * Returns: @path itself. + * + * Since: 3.2 + **/ +GtkWidgetPath * +gtk_widget_path_ref (GtkWidgetPath *path) +{ + g_return_val_if_fail (path != NULL, path); + + g_atomic_int_add (&path->ref_count, 1); + + return path; +} + +/** + * gtk_widget_path_unref: + * @path: a #GtkWidgetPath + * + * Decrements the reference count on @path, freeing the structure + * if the reference count reaches 0. + * + * Since: 3.2 **/ void -gtk_widget_path_free (GtkWidgetPath *path) +gtk_widget_path_unref (GtkWidgetPath *path) { guint i; g_return_if_fail (path != NULL); + if (!g_atomic_int_dec_and_test (&path->ref_count)) + return; + for (i = 0; i < path->elems->len; i++) { GtkPathElement *elem; @@ -205,6 +232,23 @@ gtk_widget_path_free (GtkWidgetPath *path) g_slice_free (GtkWidgetPath, path); } +/** + * gtk_widget_path_free: + * @path: a #GtkWidgetPath + * + * Decrements the reference count on @path, freeing the structure + * if the reference count reaches 0. + * + * Since: 3.0 + **/ +void +gtk_widget_path_free (GtkWidgetPath *path) +{ + g_return_if_fail (path != NULL); + + gtk_widget_path_unref (path); +} + /** * gtk_widget_path_length: * @path: a #GtkWidgetPath diff --git a/gtk/gtkwidgetpath.h b/gtk/gtkwidgetpath.h index e44824fc52..12822a8c0d 100644 --- a/gtk/gtkwidgetpath.h +++ b/gtk/gtkwidgetpath.h @@ -41,6 +41,8 @@ GType gtk_widget_path_get_type (void) G_GNUC_CONST; GtkWidgetPath * gtk_widget_path_new (void); GtkWidgetPath * gtk_widget_path_copy (const GtkWidgetPath *path); +GtkWidgetPath * gtk_widget_path_ref (GtkWidgetPath *path); +void gtk_widget_path_unref (GtkWidgetPath *path); void gtk_widget_path_free (GtkWidgetPath *path); char * gtk_widget_path_to_string (const GtkWidgetPath *path);