PostgreSQL Source Code  git master
memutils_internal.h
Go to the documentation of this file.
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-2023, 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);
23 extern void AllocSetFree(void *pointer);
24 extern void *AllocSetRealloc(void *pointer, Size size);
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);
40 extern void GenerationFree(void *pointer);
41 extern void *GenerationRealloc(void *pointer, Size size);
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);
58 extern void SlabFree(void *pointer);
59 extern void *SlabRealloc(void *pointer, Size size);
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);
79 extern MemoryContext AlignedAllocGetChunkContext(void *pointer);
80 extern Size AlignedAllocGetChunkSpace(void *pointer);
81 
82 /*
83  * How many extra bytes do we need to request in order to ensure that we can
84  * align a pointer to 'alignto'. Since palloc'd pointers are already aligned
85  * to MAXIMUM_ALIGNOF we can subtract that amount. We also need to make sure
86  * there is enough space for the redirection MemoryChunk.
87  */
88 #define PallocAlignedExtraBytes(alignto) \
89  ((alignto) + (sizeof(MemoryChunk) - MAXIMUM_ALIGNOF))
90 
91 /*
92  * MemoryContextMethodID
93  * A unique identifier for each MemoryContext implementation which
94  * indicates the index into the mcxt_methods[] array. See mcxt.c.
95  *
96  * For robust error detection, ensure that MemoryContextMethodID has a value
97  * for each possible bit-pattern of MEMORY_CONTEXT_METHODID_MASK, and make
98  * dummy entries for unused IDs in the mcxt_methods[] array. We also try
99  * to avoid using bit-patterns as valid IDs if they are likely to occur in
100  * garbage data, or if they could falsely match on chunks that are really from
101  * malloc not palloc. (We can't tell that for most malloc implementations,
102  * but it happens that glibc stores flag bits in the same place where we put
103  * the MemoryContextMethodID, so the possible values are predictable for it.)
104  */
106 {
107  MCTX_UNUSED1_ID, /* 000 occurs in never-used memory */
108  MCTX_UNUSED2_ID, /* glibc malloc'd chunks usually match 001 */
109  MCTX_UNUSED3_ID, /* glibc malloc'd chunks > 128kB match 010 */
114  MCTX_UNUSED4_ID, /* 111 occurs in wipe_mem'd memory */
116 
117 /*
118  * The number of bits that 8-byte memory chunk headers can use to encode the
119  * MemoryContextMethodID.
120  */
121 #define MEMORY_CONTEXT_METHODID_BITS 3
122 #define MEMORY_CONTEXT_METHODID_MASK \
123  ((((uint64) 1) << MEMORY_CONTEXT_METHODID_BITS) - 1)
124 
125 /*
126  * This routine handles the context-type-independent part of memory
127  * context creation. It's intended to be called from context-type-
128  * specific creation routines, and noplace else.
129  */
130 extern void MemoryContextCreate(MemoryContext node,
131  NodeTag tag,
132  MemoryContextMethodID method_id,
133  MemoryContext parent,
134  const char *name);
135 
136 #endif /* MEMUTILS_INTERNAL_H */
size_t Size
Definition: c.h:594
void(* MemoryStatsPrintFunc)(MemoryContext context, void *passthru, const char *stats_string, bool print_to_stderr)
Definition: memnodes.h:54
void AllocSetReset(MemoryContext context)
Definition: aset.c:537
MemoryContext AlignedAllocGetChunkContext(void *pointer)
Definition: alignedalloc.c:118
void MemoryContextCreate(MemoryContext node, NodeTag tag, MemoryContextMethodID method_id, MemoryContext parent, const char *name)
Definition: mcxt.c:973
Size AllocSetGetChunkSpace(void *pointer)
Definition: aset.c:1399
void GenerationReset(MemoryContext context)
Definition: generation.c:278
MemoryContext AllocSetGetChunkContext(void *pointer)
Definition: aset.c:1370
void AllocSetStats(MemoryContext context, MemoryStatsPrintFunc printfunc, void *passthru, MemoryContextCounters *totals, bool print_to_stderr)
Definition: aset.c:1458
void GenerationFree(void *pointer)
Definition: generation.c:623
MemoryContext GenerationGetChunkContext(void *pointer)
Definition: generation.c:880
Size GenerationGetChunkSpace(void *pointer)
Definition: generation.c:906
void * SlabAlloc(MemoryContext context, Size size)
Definition: slab.c:499
void * AlignedAllocRealloc(void *pointer, Size size)
Definition: alignedalloc.c:60
void SlabFree(void *pointer)
Definition: slab.c:648
void SlabReset(MemoryContext context)
Definition: slab.c:431
bool AllocSetIsEmpty(MemoryContext context)
Definition: aset.c:1433
void * AllocSetRealloc(void *pointer, Size size)
Definition: aset.c:1109
void * GenerationAlloc(MemoryContext context, Size size)
Definition: generation.c:345
Size SlabGetChunkSpace(void *pointer)
Definition: slab.c:834
bool GenerationIsEmpty(MemoryContext context)
Definition: generation.c:935
void GenerationStats(MemoryContext context, MemoryStatsPrintFunc printfunc, void *passthru, MemoryContextCounters *totals, bool print_to_stderr)
Definition: generation.c:966
void AllocSetFree(void *pointer)
Definition: aset.c:1002
bool SlabIsEmpty(MemoryContext context)
Definition: slab.c:859
MemoryContext SlabGetChunkContext(void *pointer)
Definition: slab.c:810
void AllocSetDelete(MemoryContext context)
Definition: aset.c:607
void SlabStats(MemoryContext context, MemoryStatsPrintFunc printfunc, void *passthru, MemoryContextCounters *totals, bool print_to_stderr)
Definition: slab.c:876
MemoryContextMethodID
@ MCTX_GENERATION_ID
@ MCTX_UNUSED4_ID
@ MCTX_UNUSED3_ID
@ MCTX_UNUSED1_ID
@ MCTX_UNUSED2_ID
@ MCTX_SLAB_ID
@ MCTX_ASET_ID
@ MCTX_ALIGNED_REDIRECT_ID
void * SlabRealloc(void *pointer, Size size)
Definition: slab.c:773
void SlabDelete(MemoryContext context)
Definition: slab.c:485
void * GenerationRealloc(void *pointer, Size size)
Definition: generation.c:738
Size AlignedAllocGetChunkSpace(void *pointer)
Definition: alignedalloc.c:140
void GenerationDelete(MemoryContext context)
Definition: generation.c:323
void * AllocSetAlloc(MemoryContext context, Size size)
Definition: aset.c:703
void AlignedAllocFree(void *pointer)
Definition: alignedalloc.c:29
NodeTag
Definition: nodes.h:27
const char * name