PostgreSQL Source Code  git master
block.h
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------
2  *
3  * block.h
4  * POSTGRES disk block definitions.
5  *
6  *
7  * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
8  * Portions Copyright (c) 1994, Regents of the University of California
9  *
10  * src/include/storage/block.h
11  *
12  *-------------------------------------------------------------------------
13  */
14 #ifndef BLOCK_H
15 #define BLOCK_H
16 
17 /*
18  * BlockNumber:
19  *
20  * each data file (heap or index) is divided into postgres disk blocks
21  * (which may be thought of as the unit of i/o -- a postgres buffer
22  * contains exactly one disk block). the blocks are numbered
23  * sequentially, 0 to 0xFFFFFFFE.
24  *
25  * InvalidBlockNumber is the same thing as P_NEW in bufmgr.h.
26  *
27  * the access methods, the buffer manager and the storage manager are
28  * more or less the only pieces of code that should be accessing disk
29  * blocks directly.
30  */
32 
33 #define InvalidBlockNumber ((BlockNumber) 0xFFFFFFFF)
34 
35 #define MaxBlockNumber ((BlockNumber) 0xFFFFFFFE)
36 
37 /*
38  * BlockId:
39  *
40  * this is a storage type for BlockNumber. in other words, this type
41  * is used for on-disk structures (e.g., in HeapTupleData) whereas
42  * BlockNumber is the type on which calculations are performed (e.g.,
43  * in access method code).
44  *
45  * there doesn't appear to be any reason to have separate types except
46  * for the fact that BlockIds can be SHORTALIGN'd (and therefore any
47  * structures that contains them, such as ItemPointerData, can also be
48  * SHORTALIGN'd). this is an important consideration for reducing the
49  * space requirements of the line pointer (ItemIdData) array on each
50  * page and the header of each heap or index tuple, so it doesn't seem
51  * wise to change this without good reason.
52  */
53 typedef struct BlockIdData
54 {
58 
59 typedef BlockIdData *BlockId; /* block identifier */
60 
61 /* ----------------
62  * support functions
63  * ----------------
64  */
65 
66 /*
67  * BlockNumberIsValid
68  * True iff blockNumber is valid.
69  */
70 static inline bool
72 {
73  return blockNumber != InvalidBlockNumber;
74 }
75 
76 /*
77  * BlockIdSet
78  * Sets a block identifier to the specified value.
79  */
80 static inline void
81 BlockIdSet(BlockIdData *blockId, BlockNumber blockNumber)
82 {
83  blockId->bi_hi = blockNumber >> 16;
84  blockId->bi_lo = blockNumber & 0xffff;
85 }
86 
87 /*
88  * BlockIdEquals
89  * Check for block number equality.
90  */
91 static inline bool
92 BlockIdEquals(const BlockIdData *blockId1, const BlockIdData *blockId2)
93 {
94  return (blockId1->bi_hi == blockId2->bi_hi &&
95  blockId1->bi_lo == blockId2->bi_lo);
96 }
97 
98 /*
99  * BlockIdGetBlockNumber
100  * Retrieve the block number from a block identifier.
101  */
102 static inline BlockNumber
104 {
105  return (((BlockNumber) blockId->bi_hi) << 16) | ((BlockNumber) blockId->bi_lo);
106 }
107 
108 #endif /* BLOCK_H */
static bool BlockIdEquals(const BlockIdData *blockId1, const BlockIdData *blockId2)
Definition: block.h:92
uint32 BlockNumber
Definition: block.h:31
struct BlockIdData BlockIdData
#define InvalidBlockNumber
Definition: block.h:33
static void BlockIdSet(BlockIdData *blockId, BlockNumber blockNumber)
Definition: block.h:81
BlockIdData * BlockId
Definition: block.h:59
static bool BlockNumberIsValid(BlockNumber blockNumber)
Definition: block.h:71
static BlockNumber BlockIdGetBlockNumber(const BlockIdData *blockId)
Definition: block.h:103
unsigned short uint16
Definition: c.h:441
unsigned int uint32
Definition: c.h:442
uint16 bi_lo
Definition: block.h:56
uint16 bi_hi
Definition: block.h:55