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
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