Skip to content

Commit 4f4a1d8

Browse files
committed
Add const qualifiers to bufpage.h
This makes use of the new PageData type. PageGetSpecialPointer() had to be turned back into a macro, because it is used in a way that sometimes it takes const and returns const and sometimes takes non-const and returns non-const. Discussion: https://www.postgresql.org/message-id/flat/692ee0da-49da-4d32-8dca-da224cc2800e@eisentraut.org
1 parent 6e4df23 commit 4f4a1d8

File tree

2 files changed

+53
-54
lines changed

2 files changed

+53
-54
lines changed

src/backend/storage/page/bufpage.c

+16-16
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,9 @@ PageInit(Page page, Size pageSize, Size specialSize)
8585
* to pgstat.
8686
*/
8787
bool
88-
PageIsVerifiedExtended(Page page, BlockNumber blkno, int flags)
88+
PageIsVerifiedExtended(const PageData *page, BlockNumber blkno, int flags)
8989
{
90-
PageHeader p = (PageHeader) page;
90+
const PageHeaderData *p = (const PageHeaderData *) page;
9191
size_t *pagebytes;
9292
bool checksum_failure = false;
9393
bool header_sane = false;
@@ -351,7 +351,7 @@ PageAddItemExtended(Page page,
351351
* The returned page is not initialized at all; caller must do that.
352352
*/
353353
Page
354-
PageGetTempPage(Page page)
354+
PageGetTempPage(const PageData *page)
355355
{
356356
Size pageSize;
357357
Page temp;
@@ -368,7 +368,7 @@ PageGetTempPage(Page page)
368368
* The page is initialized by copying the contents of the given page.
369369
*/
370370
Page
371-
PageGetTempPageCopy(Page page)
371+
PageGetTempPageCopy(const PageData *page)
372372
{
373373
Size pageSize;
374374
Page temp;
@@ -388,7 +388,7 @@ PageGetTempPageCopy(Page page)
388388
* given page, and the special space is copied from the given page.
389389
*/
390390
Page
391-
PageGetTempPageCopySpecial(Page page)
391+
PageGetTempPageCopySpecial(const PageData *page)
392392
{
393393
Size pageSize;
394394
Page temp;
@@ -893,16 +893,16 @@ PageTruncateLinePointerArray(Page page)
893893
* PageGetHeapFreeSpace on heap pages.
894894
*/
895895
Size
896-
PageGetFreeSpace(Page page)
896+
PageGetFreeSpace(const PageData *page)
897897
{
898+
const PageHeaderData *phdr = (const PageHeaderData *) page;
898899
int space;
899900

900901
/*
901902
* Use signed arithmetic here so that we behave sensibly if pd_lower >
902903
* pd_upper.
903904
*/
904-
space = (int) ((PageHeader) page)->pd_upper -
905-
(int) ((PageHeader) page)->pd_lower;
905+
space = (int) phdr->pd_upper - (int) phdr->pd_lower;
906906

907907
if (space < (int) sizeof(ItemIdData))
908908
return 0;
@@ -920,16 +920,16 @@ PageGetFreeSpace(Page page)
920920
* PageGetHeapFreeSpace on heap pages.
921921
*/
922922
Size
923-
PageGetFreeSpaceForMultipleTuples(Page page, int ntups)
923+
PageGetFreeSpaceForMultipleTuples(const PageData *page, int ntups)
924924
{
925+
const PageHeaderData *phdr = (const PageHeaderData *) page;
925926
int space;
926927

927928
/*
928929
* Use signed arithmetic here so that we behave sensibly if pd_lower >
929930
* pd_upper.
930931
*/
931-
space = (int) ((PageHeader) page)->pd_upper -
932-
(int) ((PageHeader) page)->pd_lower;
932+
space = (int) phdr->pd_upper - (int) phdr->pd_lower;
933933

934934
if (space < (int) (ntups * sizeof(ItemIdData)))
935935
return 0;
@@ -944,16 +944,16 @@ PageGetFreeSpaceForMultipleTuples(Page page, int ntups)
944944
* without any consideration for adding/removing line pointers.
945945
*/
946946
Size
947-
PageGetExactFreeSpace(Page page)
947+
PageGetExactFreeSpace(const PageData *page)
948948
{
949+
const PageHeaderData *phdr = (const PageHeaderData *) page;
949950
int space;
950951

951952
/*
952953
* Use signed arithmetic here so that we behave sensibly if pd_lower >
953954
* pd_upper.
954955
*/
955-
space = (int) ((PageHeader) page)->pd_upper -
956-
(int) ((PageHeader) page)->pd_lower;
956+
space = (int) phdr->pd_upper - (int) phdr->pd_lower;
957957

958958
if (space < 0)
959959
return 0;
@@ -977,7 +977,7 @@ PageGetExactFreeSpace(Page page)
977977
* on the number of line pointers, we make this extra check.)
978978
*/
979979
Size
980-
PageGetHeapFreeSpace(Page page)
980+
PageGetHeapFreeSpace(const PageData *page)
981981
{
982982
Size space;
983983

@@ -1001,7 +1001,7 @@ PageGetHeapFreeSpace(Page page)
10011001
*/
10021002
for (offnum = FirstOffsetNumber; offnum <= nline; offnum = OffsetNumberNext(offnum))
10031003
{
1004-
ItemId lp = PageGetItemId(page, offnum);
1004+
ItemId lp = PageGetItemId(unconstify(PageData *, page), offnum);
10051005

10061006
if (!ItemIdIsUsed(lp))
10071007
break;

src/include/storage/bufpage.h

+37-38
Original file line numberDiff line numberDiff line change
@@ -222,19 +222,19 @@ typedef PageHeaderData *PageHeader;
222222
* returns true iff no itemid has been allocated on the page
223223
*/
224224
static inline bool
225-
PageIsEmpty(Page page)
225+
PageIsEmpty(const PageData *page)
226226
{
227-
return ((PageHeader) page)->pd_lower <= SizeOfPageHeaderData;
227+
return ((const PageHeaderData *) page)->pd_lower <= SizeOfPageHeaderData;
228228
}
229229

230230
/*
231231
* PageIsNew
232232
* returns true iff page has not been initialized (by PageInit)
233233
*/
234234
static inline bool
235-
PageIsNew(Page page)
235+
PageIsNew(const PageData *page)
236236
{
237-
return ((PageHeader) page)->pd_upper == 0;
237+
return ((const PageHeaderData *) page)->pd_upper == 0;
238238
}
239239

240240
/*
@@ -275,19 +275,19 @@ PageGetContents(Page page)
275275
* however, it can be called on a page that is not stored in a buffer.
276276
*/
277277
static inline Size
278-
PageGetPageSize(Page page)
278+
PageGetPageSize(const PageData *page)
279279
{
280-
return (Size) (((PageHeader) page)->pd_pagesize_version & (uint16) 0xFF00);
280+
return (Size) (((const PageHeaderData *) page)->pd_pagesize_version & (uint16) 0xFF00);
281281
}
282282

283283
/*
284284
* PageGetPageLayoutVersion
285285
* Returns the page layout version of a page.
286286
*/
287287
static inline uint8
288-
PageGetPageLayoutVersion(Page page)
288+
PageGetPageLayoutVersion(const PageData *page)
289289
{
290-
return (((PageHeader) page)->pd_pagesize_version & 0x00FF);
290+
return (((const PageHeaderData *) page)->pd_pagesize_version & 0x00FF);
291291
}
292292

293293
/*
@@ -315,9 +315,9 @@ PageSetPageSizeAndVersion(Page page, Size size, uint8 version)
315315
* Returns size of special space on a page.
316316
*/
317317
static inline uint16
318-
PageGetSpecialSize(Page page)
318+
PageGetSpecialSize(const PageData *page)
319319
{
320-
return (PageGetPageSize(page) - ((PageHeader) page)->pd_special);
320+
return (PageGetPageSize(page) - ((const PageHeaderData *) page)->pd_special);
321321
}
322322

323323
/*
@@ -326,23 +326,22 @@ PageGetSpecialSize(Page page)
326326
* This is intended to catch use of the pointer before page initialization.
327327
*/
328328
static inline void
329-
PageValidateSpecialPointer(Page page)
329+
PageValidateSpecialPointer(const PageData *page)
330330
{
331331
Assert(page);
332-
Assert(((PageHeader) page)->pd_special <= BLCKSZ);
333-
Assert(((PageHeader) page)->pd_special >= SizeOfPageHeaderData);
332+
Assert(((const PageHeaderData *) page)->pd_special <= BLCKSZ);
333+
Assert(((const PageHeaderData *) page)->pd_special >= SizeOfPageHeaderData);
334334
}
335335

336336
/*
337337
* PageGetSpecialPointer
338338
* Returns pointer to special space on a page.
339339
*/
340-
static inline char *
341-
PageGetSpecialPointer(Page page)
342-
{
343-
PageValidateSpecialPointer(page);
344-
return (char *) page + ((PageHeader) page)->pd_special;
345-
}
340+
#define PageGetSpecialPointer(page) \
341+
( \
342+
PageValidateSpecialPointer(page), \
343+
((page) + ((PageHeader) (page))->pd_special) \
344+
)
346345

347346
/*
348347
* PageGetItem
@@ -353,12 +352,12 @@ PageGetSpecialPointer(Page page)
353352
* The semantics may change in the future.
354353
*/
355354
static inline Item
356-
PageGetItem(Page page, ItemId itemId)
355+
PageGetItem(const PageData *page, const ItemIdData *itemId)
357356
{
358357
Assert(page);
359358
Assert(ItemIdHasStorage(itemId));
360359

361-
return (Item) (((char *) page) + ItemIdGetOffset(itemId));
360+
return (Item) (((const char *) page) + ItemIdGetOffset(itemId));
362361
}
363362

364363
/*
@@ -371,9 +370,9 @@ PageGetItem(Page page, ItemId itemId)
371370
* return zero to ensure sane behavior.
372371
*/
373372
static inline OffsetNumber
374-
PageGetMaxOffsetNumber(Page page)
373+
PageGetMaxOffsetNumber(const PageData *page)
375374
{
376-
PageHeader pageheader = (PageHeader) page;
375+
const PageHeaderData *pageheader = (const PageHeaderData *) page;
377376

378377
if (pageheader->pd_lower <= SizeOfPageHeaderData)
379378
return 0;
@@ -385,7 +384,7 @@ PageGetMaxOffsetNumber(Page page)
385384
* Additional functions for access to page headers.
386385
*/
387386
static inline XLogRecPtr
388-
PageGetLSN(const char *page)
387+
PageGetLSN(const PageData *page)
389388
{
390389
return PageXLogRecPtrGet(((const PageHeaderData *) page)->pd_lsn);
391390
}
@@ -396,9 +395,9 @@ PageSetLSN(Page page, XLogRecPtr lsn)
396395
}
397396

398397
static inline bool
399-
PageHasFreeLinePointers(Page page)
398+
PageHasFreeLinePointers(const PageData *page)
400399
{
401-
return ((PageHeader) page)->pd_flags & PD_HAS_FREE_LINES;
400+
return ((const PageHeaderData *) page)->pd_flags & PD_HAS_FREE_LINES;
402401
}
403402
static inline void
404403
PageSetHasFreeLinePointers(Page page)
@@ -412,9 +411,9 @@ PageClearHasFreeLinePointers(Page page)
412411
}
413412

414413
static inline bool
415-
PageIsFull(Page page)
414+
PageIsFull(const PageData *page)
416415
{
417-
return ((PageHeader) page)->pd_flags & PD_PAGE_FULL;
416+
return ((const PageHeaderData *) page)->pd_flags & PD_PAGE_FULL;
418417
}
419418
static inline void
420419
PageSetFull(Page page)
@@ -428,9 +427,9 @@ PageClearFull(Page page)
428427
}
429428

430429
static inline bool
431-
PageIsAllVisible(Page page)
430+
PageIsAllVisible(const PageData *page)
432431
{
433-
return ((PageHeader) page)->pd_flags & PD_ALL_VISIBLE;
432+
return ((const PageHeaderData *) page)->pd_flags & PD_ALL_VISIBLE;
434433
}
435434
static inline void
436435
PageSetAllVisible(Page page)
@@ -490,19 +489,19 @@ StaticAssertDecl(BLCKSZ == ((BLCKSZ / sizeof(size_t)) * sizeof(size_t)),
490489
"BLCKSZ has to be a multiple of sizeof(size_t)");
491490

492491
extern void PageInit(Page page, Size pageSize, Size specialSize);
493-
extern bool PageIsVerifiedExtended(Page page, BlockNumber blkno, int flags);
492+
extern bool PageIsVerifiedExtended(const PageData *page, BlockNumber blkno, int flags);
494493
extern OffsetNumber PageAddItemExtended(Page page, Item item, Size size,
495494
OffsetNumber offsetNumber, int flags);
496-
extern Page PageGetTempPage(Page page);
497-
extern Page PageGetTempPageCopy(Page page);
498-
extern Page PageGetTempPageCopySpecial(Page page);
495+
extern Page PageGetTempPage(const PageData *page);
496+
extern Page PageGetTempPageCopy(const PageData *page);
497+
extern Page PageGetTempPageCopySpecial(const PageData *page);
499498
extern void PageRestoreTempPage(Page tempPage, Page oldPage);
500499
extern void PageRepairFragmentation(Page page);
501500
extern void PageTruncateLinePointerArray(Page page);
502-
extern Size PageGetFreeSpace(Page page);
503-
extern Size PageGetFreeSpaceForMultipleTuples(Page page, int ntups);
504-
extern Size PageGetExactFreeSpace(Page page);
505-
extern Size PageGetHeapFreeSpace(Page page);
501+
extern Size PageGetFreeSpace(const PageData *page);
502+
extern Size PageGetFreeSpaceForMultipleTuples(const PageData *page, int ntups);
503+
extern Size PageGetExactFreeSpace(const PageData *page);
504+
extern Size PageGetHeapFreeSpace(const PageData *page);
506505
extern void PageIndexTupleDelete(Page page, OffsetNumber offnum);
507506
extern void PageIndexMultiDelete(Page page, OffsetNumber *itemnos, int nitems);
508507
extern void PageIndexTupleDeleteNoCompact(Page page, OffsetNumber offnum);

0 commit comments

Comments
 (0)