v10-0005-PoC-tag-the-node-kind-to-rt_pointer.patch

application/octet-stream

Filename: v10-0005-PoC-tag-the-node-kind-to-rt_pointer.patch
Type: application/octet-stream
Part: 2
Message: Re: [PoC] Improve dead tuple storage for lazy vacuum

Patch

Format: format-patch
Series: patch v10-0005
Subject: PoC: tag the node kind to rt_pointer.
File+
src/backend/lib/radixtree.c 11 8
From 180ee3a0691bd1c7986f41dfec51673891e5cc06 Mon Sep 17 00:00:00 2001
From: Masahiko Sawada <sawada.mshk@gmail.com>
Date: Thu, 17 Nov 2022 11:16:06 +0900
Subject: [PATCH v10 5/7] PoC: tag the node kind to rt_pointer.

---
 src/backend/lib/radixtree.c | 19 +++++++++++--------
 1 file changed, 11 insertions(+), 8 deletions(-)

diff --git a/src/backend/lib/radixtree.c b/src/backend/lib/radixtree.c
index 67f4dc646e..08d580a899 100644
--- a/src/backend/lib/radixtree.c
+++ b/src/backend/lib/radixtree.c
@@ -141,6 +141,8 @@ typedef enum
 typedef uintptr_t rt_pointer;
 #define InvalidRTPointer		((rt_pointer) 0)
 #define RTPointerIsValid(x) 	(((rt_pointer) (x)) != InvalidRTPointer)
+#define RTPointerTagKind(x, k)	((rt_pointer) (x) | ((k) & RT_POINTER_KIND_MASK))
+#define RTPointerUnTagKind(x) 	((rt_pointer) (x) & ~RT_POINTER_KIND_MASK)
 
 /* Common type for all nodes types */
 typedef struct rt_node
@@ -159,8 +161,10 @@ typedef struct rt_node
 	uint8		shift;
 	uint8		chunk;
 
-	/* Size kind of the node */
-	uint8		kind;
+	/*
+	 * The node kind is tagged into the rt_pointer, see the comments of
+	 * rt_pointer for details.
+	 */
 } rt_node;
 #define RT_NODE_IS_LEAF(n)	(((rt_node *) (n))->shift == 0)
 
@@ -303,7 +307,7 @@ typedef struct rt_node_ptr
 #define NODE_RAW(n)			(((rt_node_ptr) (n)).decoded)
 #define NODE_IS_LEAF(n)		(NODE_RAW(n)->shift == 0)
 #define NODE_IS_EMPTY(n)	(NODE_COUNT(n) == 0)
-#define NODE_KIND(n)	(NODE_RAW(n)->kind)
+#define NODE_KIND(n)	((uint8) (((rt_node_ptr) (n)).encoded & RT_POINTER_KIND_MASK))
 #define NODE_COUNT(n)	(NODE_RAW(n)->count)
 #define NODE_SHIFT(n)	(NODE_RAW(n)->shift)
 #define NODE_CHUNK(n)	(NODE_RAW(n)->chunk)
@@ -444,13 +448,13 @@ static void rt_verify_node(rt_node_ptr node);
 static inline rt_node *
 rt_pointer_decode(rt_pointer encoded)
 {
-	return (rt_node *) encoded;
+	return (rt_node *) RTPointerUnTagKind(encoded);
 }
 
 static inline rt_pointer
-rt_pointer_encode(rt_node *decoded)
+rt_pointer_encode(rt_node *decoded, uint8 kind)
 {
-	return (rt_pointer) decoded;
+	return (rt_pointer) RTPointerTagKind(decoded, kind);
 }
 
 /* Return a rt_pointer created from the given encoded pointer */
@@ -923,8 +927,7 @@ rt_alloc_node(radix_tree *tree, int kind, uint8 shift, uint8 chunk, bool inner)
 		newnode.decoded = (rt_node *) MemoryContextAllocZero(tree->leaf_slabs[kind],
 															 rt_node_kind_info[kind].leaf_size);
 
-	newnode.encoded = rt_pointer_encode(newnode.decoded);
-	NODE_KIND(newnode) = kind;
+	newnode.encoded = rt_pointer_encode(newnode.decoded, kind);
 	NODE_SHIFT(newnode) = shift;
 	NODE_CHUNK(newnode) = chunk;
 
-- 
2.31.1