YugabyteDB (2.13.0.0-b42, bfc6a6643e7399ac8a0e81d06a3ee6d6571b33ab)

Coverage Report

Created: 2022-03-09 17:30

/Users/deen/code/yugabyte-db/src/postgres/src/include/utils/freepage.h
Line
Count
Source (jump to first uncovered line)
1
/*-------------------------------------------------------------------------
2
 *
3
 * freepage.h
4
 *    Management of page-organized free memory.
5
 *
6
 * Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
7
 * Portions Copyright (c) 1994, Regents of the University of California
8
 *
9
 * src/include/utils/freepage.h
10
 *
11
 *-------------------------------------------------------------------------
12
 */
13
14
#ifndef FREEPAGE_H
15
#define FREEPAGE_H
16
17
#include "storage/lwlock.h"
18
#include "utils/relptr.h"
19
20
/* Forward declarations. */
21
typedef struct FreePageSpanLeader FreePageSpanLeader;
22
typedef struct FreePageBtree FreePageBtree;
23
typedef struct FreePageManager FreePageManager;
24
25
/*
26
 * PostgreSQL normally uses 8kB pages for most things, but many common
27
 * architecture/operating system pairings use a 4kB page size for memory
28
 * allocation, so we do that here also.
29
 */
30
0
#define FPM_PAGE_SIZE     4096
31
32
/*
33
 * Each freelist except for the last contains only spans of one particular
34
 * size.  Everything larger goes on the last one.  In some sense this seems
35
 * like a waste since most allocations are in a few common sizes, but it
36
 * means that small allocations can simply pop the head of the relevant list
37
 * without needing to worry about whether the object we find there is of
38
 * precisely the correct size (because we know it must be).
39
 */
40
0
#define FPM_NUM_FREELISTS   129
41
42
/* Define relative pointer types. */
43
relptr_declare(FreePageBtree, RelptrFreePageBtree);
44
relptr_declare(FreePageManager, RelptrFreePageManager);
45
relptr_declare(FreePageSpanLeader, RelptrFreePageSpanLeader);
46
47
/* Everything we need in order to manage free pages (see freepage.c) */
48
struct FreePageManager
49
{
50
  RelptrFreePageManager self;
51
  RelptrFreePageBtree btree_root;
52
  RelptrFreePageSpanLeader btree_recycle;
53
  unsigned  btree_depth;
54
  unsigned  btree_recycle_count;
55
  Size    singleton_first_page;
56
  Size    singleton_npages;
57
  Size    contiguous_pages;
58
  bool    contiguous_pages_dirty;
59
  RelptrFreePageSpanLeader freelist[FPM_NUM_FREELISTS];
60
#ifdef FPM_EXTRA_ASSERTS
61
  /* For debugging only, pages put minus pages gotten. */
62
  Size    free_pages;
63
#endif
64
};
65
66
/* Macros to convert between page numbers (expressed as Size) and pointers. */
67
#define fpm_page_to_pointer(base, page) \
68
0
  (AssertVariableIsOfTypeMacro(page, Size), \
69
0
   (base) + FPM_PAGE_SIZE * (page))
70
#define fpm_pointer_to_page(base, ptr)    \
71
0
  (((Size) (((char *) (ptr)) - (base))) / FPM_PAGE_SIZE)
72
73
/* Macro to convert an allocation size to a number of pages. */
74
#define fpm_size_to_pages(sz) \
75
0
  (((sz) + FPM_PAGE_SIZE - 1) / FPM_PAGE_SIZE)
76
77
/* Macros to check alignment of absolute and relative pointers. */
78
#define fpm_pointer_is_page_aligned(base, ptr)    \
79
  (((Size) (((char *) (ptr)) - (base))) % FPM_PAGE_SIZE == 0)
80
#define fpm_relptr_is_page_aligned(base, relptr)    \
81
  ((relptr).relptr_off % FPM_PAGE_SIZE == 0)
82
83
/* Macro to find base address of the segment containing a FreePageManager. */
84
#define fpm_segment_base(fpm) \
85
0
  (((char *) fpm) - fpm->self.relptr_off)
86
87
/* Macro to access a FreePageManager's largest consecutive run of pages. */
88
#define fpm_largest(fpm) \
89
0
  (fpm->contiguous_pages)
90
91
/* Functions to manipulate the free page map. */
92
extern void FreePageManagerInitialize(FreePageManager *fpm, char *base);
93
extern bool FreePageManagerGet(FreePageManager *fpm, Size npages,
94
           Size *first_page);
95
extern void FreePageManagerPut(FreePageManager *fpm, Size first_page,
96
           Size npages);
97
extern char *FreePageManagerDump(FreePageManager *fpm);
98
99
#endif              /* FREEPAGE_H */