1 | /*------------------------------------------------------------------------- |
2 | * |
3 | * fsm_internal.h |
4 | * internal functions for free space map |
5 | * |
6 | * |
7 | * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group |
8 | * Portions Copyright (c) 1994, Regents of the University of California |
9 | * |
10 | * src/include/storage/fsm_internals.h |
11 | * |
12 | *------------------------------------------------------------------------- |
13 | */ |
14 | #ifndef FSM_INTERNALS_H |
15 | #define FSM_INTERNALS_H |
16 | |
17 | #include "storage/buf.h" |
18 | #include "storage/bufpage.h" |
19 | |
20 | /* |
21 | * Structure of a FSM page. See src/backend/storage/freespace/README for |
22 | * details. |
23 | */ |
24 | typedef struct |
25 | { |
26 | /* |
27 | * fsm_search_avail() tries to spread the load of multiple backends by |
28 | * returning different pages to different backends in a round-robin |
29 | * fashion. fp_next_slot points to the next slot to be returned (assuming |
30 | * there's enough space on it for the request). It's defined as an int, |
31 | * because it's updated without an exclusive lock. uint16 would be more |
32 | * appropriate, but int is more likely to be atomically |
33 | * fetchable/storable. |
34 | */ |
35 | int fp_next_slot; |
36 | |
37 | /* |
38 | * fp_nodes contains the binary tree, stored in array. The first |
39 | * NonLeafNodesPerPage elements are upper nodes, and the following |
40 | * LeafNodesPerPage elements are leaf nodes. Unused nodes are zero. |
41 | */ |
42 | uint8 fp_nodes[FLEXIBLE_ARRAY_MEMBER]; |
43 | } FSMPageData; |
44 | |
45 | typedef FSMPageData *FSMPage; |
46 | |
47 | /* |
48 | * Number of non-leaf and leaf nodes, and nodes in total, on an FSM page. |
49 | * These definitions are internal to fsmpage.c. |
50 | */ |
51 | #define NodesPerPage (BLCKSZ - MAXALIGN(SizeOfPageHeaderData) - \ |
52 | offsetof(FSMPageData, fp_nodes)) |
53 | |
54 | #define NonLeafNodesPerPage (BLCKSZ / 2 - 1) |
55 | #define LeafNodesPerPage (NodesPerPage - NonLeafNodesPerPage) |
56 | |
57 | /* |
58 | * Number of FSM "slots" on a FSM page. This is what should be used |
59 | * outside fsmpage.c. |
60 | */ |
61 | #define SlotsPerFSMPage LeafNodesPerPage |
62 | |
63 | /* Prototypes for functions in fsmpage.c */ |
64 | extern int fsm_search_avail(Buffer buf, uint8 min_cat, bool advancenext, |
65 | bool exclusive_lock_held); |
66 | extern uint8 fsm_get_avail(Page page, int slot); |
67 | extern uint8 fsm_get_max_avail(Page page); |
68 | extern bool fsm_set_avail(Page page, int slot, uint8 value); |
69 | extern bool fsm_truncate_avail(Page page, int nslots); |
70 | extern bool fsm_rebuild_page(Page page); |
71 | |
72 | #endif /* FSM_INTERNALS_H */ |
73 | |