From a027beef853213ebbbe5344c7bd5bc791ab678ac Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 22 Sep 2025 14:47:48 +0200 Subject: [PATCH 16/23] C11 anonymous unions [freepage] --- src/backend/utils/mmgr/freepage.c | 144 +++++++++++++++--------------- 1 file changed, 72 insertions(+), 72 deletions(-) diff --git a/src/backend/utils/mmgr/freepage.c b/src/backend/utils/mmgr/freepage.c index 52fa78dc586..a112807cbdd 100644 --- a/src/backend/utils/mmgr/freepage.c +++ b/src/backend/utils/mmgr/freepage.c @@ -112,7 +112,7 @@ struct FreePageBtree { FreePageBtreeInternalKey internal_key[FPM_ITEMS_PER_INTERNAL_PAGE]; FreePageBtreeLeafKey leaf_key[FPM_ITEMS_PER_LEAF_PAGE]; - } u; + }; }; /* Results of a btree search */ @@ -265,7 +265,7 @@ sum_free_pages_recurse(FreePageManager *fpm, FreePageBtree *btp, Size *sum) { FreePageBtree *child; - child = relptr_access(base, btp->u.internal_key[index].child); + child = relptr_access(base, btp->internal_key[index].child); sum_free_pages_recurse(fpm, child, sum); } } @@ -510,13 +510,13 @@ FreePageBtreeAdjustAncestorKeys(FreePageManager *fpm, FreePageBtree *btp) if (btp->hdr.magic == FREE_PAGE_LEAF_MAGIC) { Assert(btp->hdr.nused <= FPM_ITEMS_PER_LEAF_PAGE); - first_page = btp->u.leaf_key[0].first_page; + first_page = btp->leaf_key[0].first_page; } else { Assert(btp->hdr.magic == FREE_PAGE_INTERNAL_MAGIC); Assert(btp->hdr.nused <= FPM_ITEMS_PER_INTERNAL_PAGE); - first_page = btp->u.internal_key[0].first_page; + first_page = btp->internal_key[0].first_page; } child = btp; @@ -540,7 +540,7 @@ FreePageBtreeAdjustAncestorKeys(FreePageManager *fpm, FreePageBtree *btp) { FreePageBtree *check; - check = relptr_access(base, parent->u.internal_key[s].child); + check = relptr_access(base, parent->internal_key[s].child); if (check != child) { Assert(s > 0); @@ -553,14 +553,14 @@ FreePageBtreeAdjustAncestorKeys(FreePageManager *fpm, FreePageBtree *btp) { FreePageBtree *check; - check = relptr_access(base, parent->u.internal_key[s].child); + check = relptr_access(base, parent->internal_key[s].child); Assert(s < parent->hdr.nused); Assert(child == check); } #endif /* Update the parent key. */ - parent->u.internal_key[s].first_page = first_page; + parent->internal_key[s].first_page = first_page; /* * If this is the first key in the parent, go up another level; else @@ -597,8 +597,8 @@ FreePageBtreeCleanup(FreePageManager *fpm) { /* If root is a leaf, convert only entry to singleton range. */ relptr_store(base, fpm->btree_root, (FreePageBtree *) NULL); - fpm->singleton_first_page = root->u.leaf_key[0].first_page; - fpm->singleton_npages = root->u.leaf_key[0].npages; + fpm->singleton_first_page = root->leaf_key[0].first_page; + fpm->singleton_npages = root->leaf_key[0].npages; } else { @@ -606,7 +606,7 @@ FreePageBtreeCleanup(FreePageManager *fpm) /* If root is an internal page, make only child the root. */ Assert(root->hdr.magic == FREE_PAGE_INTERNAL_MAGIC); - relptr_copy(fpm->btree_root, root->u.internal_key[0].child); + relptr_copy(fpm->btree_root, root->internal_key[0].child); newroot = relptr_access(base, fpm->btree_root); relptr_store(base, newroot->hdr.parent, (FreePageBtree *) NULL); } @@ -618,9 +618,9 @@ FreePageBtreeCleanup(FreePageManager *fpm) Size end_of_first; Size start_of_second; - end_of_first = root->u.leaf_key[0].first_page + - root->u.leaf_key[0].npages; - start_of_second = root->u.leaf_key[1].first_page; + end_of_first = root->leaf_key[0].first_page + + root->leaf_key[0].npages; + start_of_second = root->leaf_key[1].first_page; if (end_of_first + 1 == start_of_second) { @@ -628,11 +628,11 @@ FreePageBtreeCleanup(FreePageManager *fpm) if (end_of_first == root_page) { - FreePagePopSpanLeader(fpm, root->u.leaf_key[0].first_page); - FreePagePopSpanLeader(fpm, root->u.leaf_key[1].first_page); - fpm->singleton_first_page = root->u.leaf_key[0].first_page; - fpm->singleton_npages = root->u.leaf_key[0].npages + - root->u.leaf_key[1].npages + 1; + FreePagePopSpanLeader(fpm, root->leaf_key[0].first_page); + FreePagePopSpanLeader(fpm, root->leaf_key[1].first_page); + fpm->singleton_first_page = root->leaf_key[0].first_page; + fpm->singleton_npages = root->leaf_key[0].npages + + root->leaf_key[1].npages + 1; fpm->btree_depth = 0; relptr_store(base, fpm->btree_root, (FreePageBtree *) NULL); @@ -725,13 +725,13 @@ FreePageBtreeConsolidate(FreePageManager *fpm, FreePageBtree *btp) { if (btp->hdr.magic == FREE_PAGE_LEAF_MAGIC) { - memcpy(&btp->u.leaf_key[btp->hdr.nused], &np->u.leaf_key[0], + memcpy(&btp->leaf_key[btp->hdr.nused], &np->leaf_key[0], sizeof(FreePageBtreeLeafKey) * np->hdr.nused); btp->hdr.nused += np->hdr.nused; } else { - memcpy(&btp->u.internal_key[btp->hdr.nused], &np->u.internal_key[0], + memcpy(&btp->internal_key[btp->hdr.nused], &np->internal_key[0], sizeof(FreePageBtreeInternalKey) * np->hdr.nused); btp->hdr.nused += np->hdr.nused; FreePageBtreeUpdateParentPointers(base, btp); @@ -750,13 +750,13 @@ FreePageBtreeConsolidate(FreePageManager *fpm, FreePageBtree *btp) { if (btp->hdr.magic == FREE_PAGE_LEAF_MAGIC) { - memcpy(&np->u.leaf_key[np->hdr.nused], &btp->u.leaf_key[0], + memcpy(&np->leaf_key[np->hdr.nused], &btp->leaf_key[0], sizeof(FreePageBtreeLeafKey) * btp->hdr.nused); np->hdr.nused += btp->hdr.nused; } else { - memcpy(&np->u.internal_key[np->hdr.nused], &btp->u.internal_key[0], + memcpy(&np->internal_key[np->hdr.nused], &btp->internal_key[0], sizeof(FreePageBtreeInternalKey) * btp->hdr.nused); np->hdr.nused += btp->hdr.nused; FreePageBtreeUpdateParentPointers(base, np); @@ -791,8 +791,8 @@ FreePageBtreeFindLeftSibling(char *base, FreePageBtree *btp) index = FreePageBtreeSearchInternal(p, first_page); if (index > 0) { - Assert(p->u.internal_key[index].first_page == first_page); - p = relptr_access(base, p->u.internal_key[index - 1].child); + Assert(p->internal_key[index].first_page == first_page); + p = relptr_access(base, p->internal_key[index - 1].child); break; } Assert(index == 0); @@ -803,7 +803,7 @@ FreePageBtreeFindLeftSibling(char *base, FreePageBtree *btp) while (levels > 0) { Assert(p->hdr.magic == FREE_PAGE_INTERNAL_MAGIC); - p = relptr_access(base, p->u.internal_key[p->hdr.nused - 1].child); + p = relptr_access(base, p->internal_key[p->hdr.nused - 1].child); --levels; } Assert(p->hdr.magic == btp->hdr.magic); @@ -836,8 +836,8 @@ FreePageBtreeFindRightSibling(char *base, FreePageBtree *btp) index = FreePageBtreeSearchInternal(p, first_page); if (index < p->hdr.nused - 1) { - Assert(p->u.internal_key[index].first_page == first_page); - p = relptr_access(base, p->u.internal_key[index + 1].child); + Assert(p->internal_key[index].first_page == first_page); + p = relptr_access(base, p->internal_key[index + 1].child); break; } Assert(index == p->hdr.nused - 1); @@ -848,7 +848,7 @@ FreePageBtreeFindRightSibling(char *base, FreePageBtree *btp) while (levels > 0) { Assert(p->hdr.magic == FREE_PAGE_INTERNAL_MAGIC); - p = relptr_access(base, p->u.internal_key[0].child); + p = relptr_access(base, p->internal_key[0].child); --levels; } Assert(p->hdr.magic == btp->hdr.magic); @@ -865,11 +865,11 @@ FreePageBtreeFirstKey(FreePageBtree *btp) Assert(btp->hdr.nused > 0); if (btp->hdr.magic == FREE_PAGE_LEAF_MAGIC) - return btp->u.leaf_key[0].first_page; + return btp->leaf_key[0].first_page; else { Assert(btp->hdr.magic == FREE_PAGE_INTERNAL_MAGIC); - return btp->u.internal_key[0].first_page; + return btp->internal_key[0].first_page; } } @@ -903,10 +903,10 @@ FreePageBtreeInsertInternal(char *base, FreePageBtree *btp, Size index, Assert(btp->hdr.magic == FREE_PAGE_INTERNAL_MAGIC); Assert(btp->hdr.nused <= FPM_ITEMS_PER_INTERNAL_PAGE); Assert(index <= btp->hdr.nused); - memmove(&btp->u.internal_key[index + 1], &btp->u.internal_key[index], + memmove(&btp->internal_key[index + 1], &btp->internal_key[index], sizeof(FreePageBtreeInternalKey) * (btp->hdr.nused - index)); - btp->u.internal_key[index].first_page = first_page; - relptr_store(base, btp->u.internal_key[index].child, child); + btp->internal_key[index].first_page = first_page; + relptr_store(base, btp->internal_key[index].child, child); ++btp->hdr.nused; } @@ -920,10 +920,10 @@ FreePageBtreeInsertLeaf(FreePageBtree *btp, Size index, Size first_page, Assert(btp->hdr.magic == FREE_PAGE_LEAF_MAGIC); Assert(btp->hdr.nused <= FPM_ITEMS_PER_LEAF_PAGE); Assert(index <= btp->hdr.nused); - memmove(&btp->u.leaf_key[index + 1], &btp->u.leaf_key[index], + memmove(&btp->leaf_key[index + 1], &btp->leaf_key[index], sizeof(FreePageBtreeLeafKey) * (btp->hdr.nused - index)); - btp->u.leaf_key[index].first_page = first_page; - btp->u.leaf_key[index].npages = npages; + btp->leaf_key[index].first_page = first_page; + btp->leaf_key[index].npages = npages; ++btp->hdr.nused; } @@ -967,7 +967,7 @@ FreePageBtreeRemove(FreePageManager *fpm, FreePageBtree *btp, Size index) /* Physically remove the key from the page. */ --btp->hdr.nused; if (index < btp->hdr.nused) - memmove(&btp->u.leaf_key[index], &btp->u.leaf_key[index + 1], + memmove(&btp->leaf_key[index], &btp->leaf_key[index + 1], sizeof(FreePageBtreeLeafKey) * (btp->hdr.nused - index)); /* If we just removed the first key, adjust ancestor keys. */ @@ -1021,8 +1021,8 @@ FreePageBtreeRemovePage(FreePageManager *fpm, FreePageBtree *btp) index = FreePageBtreeSearchLeaf(parent, first_page); Assert(index < parent->hdr.nused); if (index < parent->hdr.nused - 1) - memmove(&parent->u.leaf_key[index], - &parent->u.leaf_key[index + 1], + memmove(&parent->leaf_key[index], + &parent->leaf_key[index + 1], sizeof(FreePageBtreeLeafKey) * (parent->hdr.nused - index - 1)); } @@ -1031,8 +1031,8 @@ FreePageBtreeRemovePage(FreePageManager *fpm, FreePageBtree *btp) index = FreePageBtreeSearchInternal(parent, first_page); Assert(index < parent->hdr.nused); if (index < parent->hdr.nused - 1) - memmove(&parent->u.internal_key[index], - &parent->u.internal_key[index + 1], + memmove(&parent->internal_key[index], + &parent->internal_key[index + 1], sizeof(FreePageBtreeInternalKey) * (parent->hdr.nused - index - 1)); } @@ -1086,7 +1086,7 @@ FreePageBtreeSearch(FreePageManager *fpm, Size first_page, index = FreePageBtreeSearchInternal(btp, first_page); found_exact = index < btp->hdr.nused && - btp->u.internal_key[index].first_page == first_page; + btp->internal_key[index].first_page == first_page; /* * If we found an exact match we descend directly. Otherwise, we @@ -1107,7 +1107,7 @@ FreePageBtreeSearch(FreePageManager *fpm, Size first_page, /* Descend to appropriate child page. */ Assert(index < btp->hdr.nused); - child = relptr_access(base, btp->u.internal_key[index].child); + child = relptr_access(base, btp->internal_key[index].child); Assert(relptr_access(base, child->hdr.parent) == btp); btp = child; } @@ -1128,7 +1128,7 @@ FreePageBtreeSearch(FreePageManager *fpm, Size first_page, result->page = btp; result->index = index; result->found = index < btp->hdr.nused && - first_page == btp->u.leaf_key[index].first_page; + first_page == btp->leaf_key[index].first_page; } /* @@ -1148,7 +1148,7 @@ FreePageBtreeSearchInternal(FreePageBtree *btp, Size first_page) while (low < high) { Size mid = (low + high) / 2; - Size val = btp->u.internal_key[mid].first_page; + Size val = btp->internal_key[mid].first_page; if (first_page == val) return mid; @@ -1178,7 +1178,7 @@ FreePageBtreeSearchLeaf(FreePageBtree *btp, Size first_page) while (low < high) { Size mid = (low + high) / 2; - Size val = btp->u.leaf_key[mid].first_page; + Size val = btp->leaf_key[mid].first_page; if (first_page == val) return mid; @@ -1209,14 +1209,14 @@ FreePageBtreeSplitPage(FreePageManager *fpm, FreePageBtree *btp) btp->hdr.nused -= newsibling->hdr.nused; if (btp->hdr.magic == FREE_PAGE_LEAF_MAGIC) - memcpy(&newsibling->u.leaf_key, - &btp->u.leaf_key[btp->hdr.nused], + memcpy(&newsibling->leaf_key, + &btp->leaf_key[btp->hdr.nused], sizeof(FreePageBtreeLeafKey) * newsibling->hdr.nused); else { Assert(btp->hdr.magic == FREE_PAGE_INTERNAL_MAGIC); - memcpy(&newsibling->u.internal_key, - &btp->u.internal_key[btp->hdr.nused], + memcpy(&newsibling->internal_key, + &btp->internal_key[btp->hdr.nused], sizeof(FreePageBtreeInternalKey) * newsibling->hdr.nused); FreePageBtreeUpdateParentPointers(fpm_segment_base(fpm), newsibling); } @@ -1238,7 +1238,7 @@ FreePageBtreeUpdateParentPointers(char *base, FreePageBtree *btp) { FreePageBtree *child; - child = relptr_access(base, btp->u.internal_key[i].child); + child = relptr_access(base, btp->internal_key[i].child); relptr_store(base, child->hdr.parent, btp); } } @@ -1268,12 +1268,12 @@ FreePageManagerDumpBtree(FreePageManager *fpm, FreePageBtree *btp, { if (btp->hdr.magic == FREE_PAGE_INTERNAL_MAGIC) appendStringInfo(buf, " %zu->%zu", - btp->u.internal_key[index].first_page, - relptr_offset(btp->u.internal_key[index].child) / FPM_PAGE_SIZE); + btp->internal_key[index].first_page, + relptr_offset(btp->internal_key[index].child) / FPM_PAGE_SIZE); else appendStringInfo(buf, " %zu(%zu)", - btp->u.leaf_key[index].first_page, - btp->u.leaf_key[index].npages); + btp->leaf_key[index].first_page, + btp->leaf_key[index].npages); } appendStringInfoChar(buf, '\n'); @@ -1283,7 +1283,7 @@ FreePageManagerDumpBtree(FreePageManager *fpm, FreePageBtree *btp, { FreePageBtree *child; - child = relptr_access(base, btp->u.internal_key[index].child); + child = relptr_access(base, btp->internal_key[index].child); FreePageManagerDumpBtree(fpm, child, btp, level + 1, buf); } } @@ -1445,7 +1445,7 @@ FreePageManagerGetInternal(FreePageManager *fpm, Size npages, Size *first_page) /* Adjust btree to reflect remaining pages. */ Assert(victim->npages > npages); - key = &result.page->u.leaf_key[result.index]; + key = &result.page->leaf_key[result.index]; Assert(key->npages == victim->npages); key->first_page += npages; key->npages -= npages; @@ -1538,8 +1538,8 @@ FreePageManagerPutInternal(FreePageManager *fpm, Size first_page, Size npages, root->hdr.magic = FREE_PAGE_LEAF_MAGIC; root->hdr.nused = 1; relptr_store(base, root->hdr.parent, (FreePageBtree *) NULL); - root->u.leaf_key[0].first_page = fpm->singleton_first_page; - root->u.leaf_key[0].npages = fpm->singleton_npages; + root->leaf_key[0].first_page = fpm->singleton_first_page; + root->leaf_key[0].npages = fpm->singleton_npages; relptr_store(base, fpm->btree_root, root); fpm->singleton_first_page = 0; fpm->singleton_npages = 0; @@ -1551,10 +1551,10 @@ FreePageManagerPutInternal(FreePageManager *fpm, Size first_page, Size npages, * page run, which is invalid. Overwrite it with the entry we're * trying to insert and get out. */ - if (root->u.leaf_key[0].npages == 0) + if (root->leaf_key[0].npages == 0) { - root->u.leaf_key[0].first_page = first_page; - root->u.leaf_key[0].npages = npages; + root->leaf_key[0].first_page = first_page; + root->leaf_key[0].npages = npages; FreePagePushSpanLeader(fpm, first_page, npages); return npages; } @@ -1567,19 +1567,19 @@ FreePageManagerPutInternal(FreePageManager *fpm, Size first_page, Size npages, FreePageBtreeSearch(fpm, first_page, &result); Assert(!result.found); if (result.index > 0) - prevkey = &result.page->u.leaf_key[result.index - 1]; + prevkey = &result.page->leaf_key[result.index - 1]; if (result.index < result.page->hdr.nused) { np = result.page; nindex = result.index; - nextkey = &result.page->u.leaf_key[result.index]; + nextkey = &result.page->leaf_key[result.index]; } else { np = FreePageBtreeFindRightSibling(base, result.page); nindex = 0; if (np != NULL) - nextkey = &np->u.leaf_key[0]; + nextkey = &np->leaf_key[0]; } /* Consolidate with the previous entry if possible. */ @@ -1742,7 +1742,7 @@ FreePageManagerPutInternal(FreePageManager *fpm, Size first_page, Size npages, Size index; FreePageBtree *insert_into; - insert_into = key < newsibling->u.leaf_key[0].first_page ? + insert_into = key < newsibling->leaf_key[0].first_page ? split_target : newsibling; index = FreePageBtreeSearchLeaf(insert_into, key); FreePageBtreeInsertLeaf(insert_into, index, key, npages); @@ -1755,7 +1755,7 @@ FreePageManagerPutInternal(FreePageManager *fpm, Size first_page, Size npages, FreePageBtree *insert_into; insert_into = - key < newsibling->u.internal_key[0].first_page ? + key < newsibling->internal_key[0].first_page ? split_target : newsibling; index = FreePageBtreeSearchInternal(insert_into, key); FreePageBtreeInsertInternal(base, insert_into, index, @@ -1775,14 +1775,14 @@ FreePageManagerPutInternal(FreePageManager *fpm, Size first_page, Size npages, newroot->hdr.nused = 2; relptr_store(base, newroot->hdr.parent, (FreePageBtree *) NULL); - newroot->u.internal_key[0].first_page = + newroot->internal_key[0].first_page = FreePageBtreeFirstKey(split_target); - relptr_store(base, newroot->u.internal_key[0].child, + relptr_store(base, newroot->internal_key[0].child, split_target); relptr_store(base, split_target->hdr.parent, newroot); - newroot->u.internal_key[1].first_page = + newroot->internal_key[1].first_page = FreePageBtreeFirstKey(newsibling); - relptr_store(base, newroot->u.internal_key[1].child, + relptr_store(base, newroot->internal_key[1].child, newsibling); relptr_store(base, newsibling->hdr.parent, newroot); relptr_store(base, fpm->btree_root, newroot); @@ -1792,7 +1792,7 @@ FreePageManagerPutInternal(FreePageManager *fpm, Size first_page, Size npages, } /* If the parent page isn't full, insert the downlink. */ - key = newsibling->u.internal_key[0].first_page; + key = newsibling->internal_key[0].first_page; if (parent->hdr.nused < FPM_ITEMS_PER_INTERNAL_PAGE) { Size index; -- 2.51.0