From 28e97f028ad4cc26ecda4dde6735f28967e0f2cb Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Tue, 26 Sep 2023 18:28:11 -0700 Subject: [PATCH] gsk: remove excessive type checking within GSK Anything that includes gskrendernodeprivate.h will get an alternate form of ref/unref for render nodes which does not need to do type checking on the parameter. We can expect that things are correct within GTK itself and this saves excessive amounts of TypeNode conformities checking. --- gsk/gskrendernode.c | 17 +++++++++++------ gsk/gskrendernodeprivate.h | 11 +++++++++++ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/gsk/gskrendernode.c b/gsk/gskrendernode.c index bd640c6179..ed7ec05f97 100644 --- a/gsk/gskrendernode.c +++ b/gsk/gskrendernode.c @@ -287,15 +287,21 @@ gsk_render_node_alloc (GskRenderNodeType node_type) * Returns: (transfer full): the `GskRenderNode` with an additional reference */ GskRenderNode * -gsk_render_node_ref (GskRenderNode *node) +(gsk_render_node_ref) (GskRenderNode *node) { g_return_val_if_fail (GSK_IS_RENDER_NODE (node), NULL); - g_atomic_ref_count_inc (&node->ref_count); + return _gsk_render_node_ref (node); +} - return node; +void +_gsk_render_node_unref (GskRenderNode *node) +{ + if G_UNLIKELY (g_atomic_ref_count_dec (&node->ref_count)) + GSK_RENDER_NODE_GET_CLASS (node)->finalize (node); } + /** * gsk_render_node_unref: * @node: (transfer full): a `GskRenderNode` @@ -306,12 +312,11 @@ gsk_render_node_ref (GskRenderNode *node) * freed. */ void -gsk_render_node_unref (GskRenderNode *node) +(gsk_render_node_unref) (GskRenderNode *node) { g_return_if_fail (GSK_IS_RENDER_NODE (node)); - if (g_atomic_ref_count_dec (&node->ref_count)) - GSK_RENDER_NODE_GET_CLASS (node)->finalize (node); + _gsk_render_node_unref (node); } diff --git a/gsk/gskrendernodeprivate.h b/gsk/gskrendernodeprivate.h index 4ad79bd593..9cf453d13f 100644 --- a/gsk/gskrendernodeprivate.h +++ b/gsk/gskrendernodeprivate.h @@ -57,6 +57,8 @@ GType gsk_render_node_type_register_static (const char gpointer gsk_render_node_alloc (GskRenderNodeType node_type); +void _gsk_render_node_unref (GskRenderNode *node); + gboolean gsk_render_node_can_diff (const GskRenderNode *node1, const GskRenderNode *node2) G_GNUC_PURE; void gsk_render_node_diff (GskRenderNode *node1, @@ -87,6 +89,15 @@ gboolean gsk_container_node_is_disjoint (const GskRenderNode gboolean gsk_render_node_use_offscreen_for_opacity (const GskRenderNode *node); +#define gsk_render_node_ref(node) _gsk_render_node_ref(node) +#define gsk_render_node_unref(node) _gsk_render_node_unref(node) + +static inline GskRenderNode * +_gsk_render_node_ref (GskRenderNode *node) +{ + g_atomic_ref_count_inc (&node->ref_count); + return node; +} G_END_DECLS -- 2.30.2