OSDN Git Service

Split MemSet into three parts to constant comparisons can be optimized
[pg-rex/syncrep.git] / 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-2002, PostgreSQL Global Development Group
22  * Portions Copyright (c) 1994, Regents of the University of California
23  *
24  * $Id: palloc.h,v 1.23 2002/11/13 00:37:06 momjian Exp $
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 /*
39  * CurrentMemoryContext is the default allocation context for palloc().
40  * We declare it here so that palloc() can be a macro.  Avoid accessing it
41  * directly!  Instead, use MemoryContextSwitchTo() to change the setting.
42  */
43 extern DLLIMPORT MemoryContext CurrentMemoryContext;
44
45 /*
46  * Fundamental memory-allocation operations (more are in utils/memutils.h)
47  */
48 extern void *MemoryContextAlloc(MemoryContext context, Size size);
49 extern void *MemoryContextAllocPalloc0(MemoryContext context, Size size);
50
51 #define palloc(sz)      MemoryContextAlloc(CurrentMemoryContext, (sz))
52
53 /* We assume palloc() is already int-aligned */
54 #define palloc0(sz)     \
55         ( MemSetTest(0, (sz)) ? \
56                 MemoryContextAllocPalloc0(CurrentMemoryContext, (sz)) : \
57                 memset(palloc(sz), 0, (sz)))
58
59 extern void pfree(void *pointer);
60
61 extern void *repalloc(void *pointer, Size size);
62
63 extern MemoryContext MemoryContextSwitchTo(MemoryContext context);
64
65 /*
66  * These are like standard strdup() except the copied string is
67  * allocated in a context, not with malloc().
68  */
69 extern char *MemoryContextStrdup(MemoryContext context, const char *string);
70
71 #define pstrdup(str)  MemoryContextStrdup(CurrentMemoryContext, (str))
72
73 #endif   /* PALLOC_H */