]> granicus.if.org Git - postgresql/blob - src/include/utils/palloc.h
Improve performance of numeric sum(), avg(), stddev(), variance(), etc.
[postgresql] / src / include / utils / palloc.h
1 /*-------------------------------------------------------------------------
2  *
3  * palloc.h
4  *        POSTGRES memory allocator definitions.
5  *
6  * This file contains the basic memory allocation interface that is
7  * needed by almost every backend module.  It is included directly by
8  * postgres.h, so the definitions here are automatically available
9  * everywhere.  Keep it lean!
10  *
11  * Memory allocation occurs within "contexts".  Every chunk obtained from
12  * palloc()/MemoryContextAlloc() is allocated within a specific context.
13  * The entire contents of a context can be freed easily and quickly by
14  * resetting or deleting the context --- this is both faster and less
15  * prone to memory-leakage bugs than releasing chunks individually.
16  * We organize contexts into context trees to allow fine-grain control
17  * over chunk lifetime while preserving the certainty that we will free
18  * everything that should be freed.  See utils/mmgr/README for more info.
19  *
20  *
21  * Portions Copyright (c) 1996-2013, PostgreSQL Global Development Group
22  * Portions Copyright (c) 1994, Regents of the University of California
23  *
24  * src/include/utils/palloc.h
25  *
26  *-------------------------------------------------------------------------
27  */
28 #ifndef PALLOC_H
29 #define PALLOC_H
30
31 /*
32  * Type MemoryContextData is declared in nodes/memnodes.h.      Most users
33  * of memory allocation should just treat it as an abstract type, so we
34  * do not provide the struct contents here.
35  */
36 typedef struct MemoryContextData *MemoryContext;
37
38 #ifndef FRONTEND
39
40 /*
41  * CurrentMemoryContext is the default allocation context for palloc().
42  * We declare it here so that palloc() can be a macro.  Avoid accessing it
43  * directly!  Instead, use MemoryContextSwitchTo() to change the setting.
44  */
45 extern PGDLLIMPORT MemoryContext CurrentMemoryContext;
46
47 /*
48  * Fundamental memory-allocation operations (more are in utils/memutils.h)
49  */
50 extern void *MemoryContextAlloc(MemoryContext context, Size size);
51 extern void *MemoryContextAllocZero(MemoryContext context, Size size);
52 extern void *MemoryContextAllocZeroAligned(MemoryContext context, Size size);
53
54 /* Higher-limit allocators. */
55 extern void *MemoryContextAllocHuge(MemoryContext context, Size size);
56 extern void *repalloc_huge(void *pointer, Size size);
57
58 /*
59  * The result of palloc() is always word-aligned, so we can skip testing
60  * alignment of the pointer when deciding which MemSet variant to use.
61  * Note that this variant does not offer any advantage, and should not be
62  * used, unless its "sz" argument is a compile-time constant; therefore, the
63  * issue that it evaluates the argument multiple times isn't a problem in
64  * practice.
65  */
66 #define palloc0fast(sz) \
67         ( MemSetTest(0, sz) ? \
68                 MemoryContextAllocZeroAligned(CurrentMemoryContext, sz) : \
69                 MemoryContextAllocZero(CurrentMemoryContext, sz) )
70
71 /*
72  * MemoryContextSwitchTo can't be a macro in standard C compilers.
73  * But we can make it an inline function if the compiler supports it.
74  * See STATIC_IF_INLINE in c.h.
75  */
76
77 #ifndef PG_USE_INLINE
78 extern MemoryContext MemoryContextSwitchTo(MemoryContext context);
79 #endif   /* !PG_USE_INLINE */
80 #if defined(PG_USE_INLINE) || defined(MCXT_INCLUDE_DEFINITIONS)
81 STATIC_IF_INLINE MemoryContext
82 MemoryContextSwitchTo(MemoryContext context)
83 {
84         MemoryContext old = CurrentMemoryContext;
85
86         CurrentMemoryContext = context;
87         return old;
88 }
89 #endif   /* PG_USE_INLINE || MCXT_INCLUDE_DEFINITIONS */
90
91 /*
92  * These are like standard strdup() except the copied string is
93  * allocated in a context, not with malloc().
94  */
95 extern char *MemoryContextStrdup(MemoryContext context, const char *string);
96 #endif   /* !FRONTEND */
97
98 extern char *pstrdup(const char *in);
99 extern char *pnstrdup(const char *in, Size len);
100
101 /* basic memory allocation functions */
102 extern void *palloc(Size size);
103 extern void *palloc0(Size size);
104 extern void pfree(void *pointer);
105 extern void *repalloc(void *pointer, Size size);
106
107 /* sprintf into a palloc'd buffer --- these are in psprintf.c */
108 extern char *psprintf(const char *fmt,...)
109 __attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 2)));
110 extern size_t pvsnprintf(char *buf, size_t len, const char *fmt, va_list args)
111 __attribute__((format(PG_PRINTF_ATTRIBUTE, 3, 0)));
112
113 #endif   /* PALLOC_H */