Age Owner Branch data TLA Line data Source code
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-2024, 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 : : ((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 : : #define MEMORY_CONTEXT_METHODID_BITS 4
146 : : #define MEMORY_CONTEXT_METHODID_MASK \
147 : : ((((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 : : extern void MemoryContextSizeFailure(MemoryContext context, Size size,
164 : : int flags) pg_attribute_noreturn();
165 : :
166 : : static inline void
47 drowley@postgresql.o 167 :GNC 7699793 : MemoryContextCheckSize(MemoryContext context, Size size, int flags)
168 : : {
169 [ - + ]: 7699793 : if (unlikely(!AllocSizeIsValid(size)))
170 : : {
47 drowley@postgresql.o 171 [ # # # # ]:UNC 0 : if (!(flags & MCXT_ALLOC_HUGE) || !AllocHugeSizeIsValid(size))
172 : 0 : MemoryContextSizeFailure(context, size, flags);
173 : : }
47 drowley@postgresql.o 174 :GNC 7699793 : }
175 : :
176 : : #endif /* MEMUTILS_INTERNAL_H */
|