Coverage Report

Created: 2025-07-03 06:49

/src/postgres/src/include/utils/memutils_internal.h
Line
Count
Source (jump to first uncovered line)
1
/*-------------------------------------------------------------------------
2
 *
3
 * memutils_internal.h
4
 *    This file contains declarations for memory allocation utility
5
 *    functions for internal use.
6
 *
7
 *
8
 * Portions Copyright (c) 2022-2025, PostgreSQL Global Development Group
9
 * Portions Copyright (c) 1994, Regents of the University of California
10
 *
11
 * src/include/utils/memutils_internal.h
12
 *
13
 *-------------------------------------------------------------------------
14
 */
15
16
#ifndef MEMUTILS_INTERNAL_H
17
#define MEMUTILS_INTERNAL_H
18
19
#include "utils/memutils.h"
20
21
/* These functions implement the MemoryContext API for AllocSet context. */
22
extern void *AllocSetAlloc(MemoryContext context, Size size, int flags);
23
extern void AllocSetFree(void *pointer);
24
extern void *AllocSetRealloc(void *pointer, Size size, int flags);
25
extern void AllocSetReset(MemoryContext context);
26
extern void AllocSetDelete(MemoryContext context);
27
extern MemoryContext AllocSetGetChunkContext(void *pointer);
28
extern Size AllocSetGetChunkSpace(void *pointer);
29
extern bool AllocSetIsEmpty(MemoryContext context);
30
extern void AllocSetStats(MemoryContext context,
31
              MemoryStatsPrintFunc printfunc, void *passthru,
32
              MemoryContextCounters *totals,
33
              bool print_to_stderr);
34
#ifdef MEMORY_CONTEXT_CHECKING
35
extern void AllocSetCheck(MemoryContext context);
36
#endif
37
38
/* These functions implement the MemoryContext API for Generation context. */
39
extern void *GenerationAlloc(MemoryContext context, Size size, int flags);
40
extern void GenerationFree(void *pointer);
41
extern void *GenerationRealloc(void *pointer, Size size, int flags);
42
extern void GenerationReset(MemoryContext context);
43
extern void GenerationDelete(MemoryContext context);
44
extern MemoryContext GenerationGetChunkContext(void *pointer);
45
extern Size GenerationGetChunkSpace(void *pointer);
46
extern bool GenerationIsEmpty(MemoryContext context);
47
extern void GenerationStats(MemoryContext context,
48
              MemoryStatsPrintFunc printfunc, void *passthru,
49
              MemoryContextCounters *totals,
50
              bool print_to_stderr);
51
#ifdef MEMORY_CONTEXT_CHECKING
52
extern void GenerationCheck(MemoryContext context);
53
#endif
54
55
56
/* These functions implement the MemoryContext API for Slab context. */
57
extern void *SlabAlloc(MemoryContext context, Size size, int flags);
58
extern void SlabFree(void *pointer);
59
extern void *SlabRealloc(void *pointer, Size size, int flags);
60
extern void SlabReset(MemoryContext context);
61
extern void SlabDelete(MemoryContext context);
62
extern MemoryContext SlabGetChunkContext(void *pointer);
63
extern Size SlabGetChunkSpace(void *pointer);
64
extern bool SlabIsEmpty(MemoryContext context);
65
extern void SlabStats(MemoryContext context,
66
            MemoryStatsPrintFunc printfunc, void *passthru,
67
            MemoryContextCounters *totals,
68
            bool print_to_stderr);
69
#ifdef MEMORY_CONTEXT_CHECKING
70
extern void SlabCheck(MemoryContext context);
71
#endif
72
73
/*
74
 * These functions support the implementation of palloc_aligned() and are not
75
 * part of a fully-fledged MemoryContext type.
76
 */
77
extern void AlignedAllocFree(void *pointer);
78
extern void *AlignedAllocRealloc(void *pointer, Size size, int flags);
79
extern MemoryContext AlignedAllocGetChunkContext(void *pointer);
80
extern Size AlignedAllocGetChunkSpace(void *pointer);
81
82
 /* These functions implement the MemoryContext API for the Bump context. */
83
extern void *BumpAlloc(MemoryContext context, Size size, int flags);
84
extern void BumpFree(void *pointer);
85
extern void *BumpRealloc(void *pointer, Size size, int flags);
86
extern void BumpReset(MemoryContext context);
87
extern void BumpDelete(MemoryContext context);
88
extern MemoryContext BumpGetChunkContext(void *pointer);
89
extern Size BumpGetChunkSpace(void *pointer);
90
extern bool BumpIsEmpty(MemoryContext context);
91
extern void BumpStats(MemoryContext context, MemoryStatsPrintFunc printfunc,
92
            void *passthru, MemoryContextCounters *totals,
93
            bool print_to_stderr);
94
#ifdef MEMORY_CONTEXT_CHECKING
95
extern void BumpCheck(MemoryContext context);
96
#endif
97
98
/*
99
 * How many extra bytes do we need to request in order to ensure that we can
100
 * align a pointer to 'alignto'.  Since palloc'd pointers are already aligned
101
 * to MAXIMUM_ALIGNOF we can subtract that amount.  We also need to make sure
102
 * there is enough space for the redirection MemoryChunk.
103
 */
104
#define PallocAlignedExtraBytes(alignto) \
105
0
  ((alignto) + (sizeof(MemoryChunk) - MAXIMUM_ALIGNOF))
106
107
/*
108
 * MemoryContextMethodID
109
 *    A unique identifier for each MemoryContext implementation which
110
 *    indicates the index into the mcxt_methods[] array. See mcxt.c.
111
 *
112
 * For robust error detection, ensure that MemoryContextMethodID has a value
113
 * for each possible bit-pattern of MEMORY_CONTEXT_METHODID_MASK, and make
114
 * dummy entries for unused IDs in the mcxt_methods[] array.  We also try
115
 * to avoid using bit-patterns as valid IDs if they are likely to occur in
116
 * garbage data, or if they could falsely match on chunks that are really from
117
 * malloc not palloc.  (We can't tell that for most malloc implementations,
118
 * but it happens that glibc stores flag bits in the same place where we put
119
 * the MemoryContextMethodID, so the possible values are predictable for it.)
120
 */
121
typedef enum MemoryContextMethodID
122
{
123
  MCTX_0_RESERVED_UNUSEDMEM_ID, /* 0000 occurs in never-used memory */
124
  MCTX_1_RESERVED_GLIBC_ID, /* glibc malloc'd chunks usually match 0001 */
125
  MCTX_2_RESERVED_GLIBC_ID, /* glibc malloc'd chunks > 128kB match 0010 */
126
  MCTX_ASET_ID,
127
  MCTX_GENERATION_ID,
128
  MCTX_SLAB_ID,
129
  MCTX_ALIGNED_REDIRECT_ID,
130
  MCTX_BUMP_ID,
131
  MCTX_8_UNUSED_ID,
132
  MCTX_9_UNUSED_ID,
133
  MCTX_10_UNUSED_ID,
134
  MCTX_11_UNUSED_ID,
135
  MCTX_12_UNUSED_ID,
136
  MCTX_13_UNUSED_ID,
137
  MCTX_14_UNUSED_ID,
138
  MCTX_15_RESERVED_WIPEDMEM_ID  /* 1111 occurs in wipe_mem'd memory */
139
} MemoryContextMethodID;
140
141
/*
142
 * The number of bits that 8-byte memory chunk headers can use to encode the
143
 * MemoryContextMethodID.
144
 */
145
35.8M
#define MEMORY_CONTEXT_METHODID_BITS 4
146
#define MEMORY_CONTEXT_METHODID_MASK \
147
27.5k
  ((((uint64) 1) << MEMORY_CONTEXT_METHODID_BITS) - 1)
148
149
/*
150
 * This routine handles the context-type-independent part of memory
151
 * context creation.  It's intended to be called from context-type-
152
 * specific creation routines, and noplace else.
153
 */
154
extern void MemoryContextCreate(MemoryContext node,
155
                NodeTag tag,
156
                MemoryContextMethodID method_id,
157
                MemoryContext parent,
158
                const char *name);
159
160
extern void *MemoryContextAllocationFailure(MemoryContext context, Size size,
161
                      int flags);
162
163
pg_noreturn extern void MemoryContextSizeFailure(MemoryContext context, Size size,
164
                         int flags);
165
166
static inline void
167
MemoryContextCheckSize(MemoryContext context, Size size, int flags)
168
5.82k
{
169
5.82k
  if (unlikely(!AllocSizeIsValid(size)))
170
0
  {
171
0
    if (!(flags & MCXT_ALLOC_HUGE) || !AllocHugeSizeIsValid(size))
172
0
      MemoryContextSizeFailure(context, size, flags);
173
0
  }
174
5.82k
}
Unexecuted instantiation: nodeAgg.c:MemoryContextCheckSize
Unexecuted instantiation: alignedalloc.c:MemoryContextCheckSize
aset.c:MemoryContextCheckSize
Line
Count
Source
168
5.82k
{
169
5.82k
  if (unlikely(!AllocSizeIsValid(size)))
170
0
  {
171
0
    if (!(flags & MCXT_ALLOC_HUGE) || !AllocHugeSizeIsValid(size))
172
0
      MemoryContextSizeFailure(context, size, flags);
173
0
  }
174
5.82k
}
Unexecuted instantiation: bump.c:MemoryContextCheckSize
Unexecuted instantiation: generation.c:MemoryContextCheckSize
Unexecuted instantiation: mcxt.c:MemoryContextCheckSize
Unexecuted instantiation: slab.c:MemoryContextCheckSize
175
176
#endif              /* MEMUTILS_INTERNAL_H */