From 180ee3a0691bd1c7986f41dfec51673891e5cc06 Mon Sep 17 00:00:00 2001 From: Masahiko Sawada 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