1/*-------------------------------------------------------------------------
2 *
3 * memnodes.h
4 * POSTGRES memory context node definitions.
5 *
6 *
7 * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group
8 * Portions Copyright (c) 1994, Regents of the University of California
9 *
10 * src/include/nodes/memnodes.h
11 *
12 *-------------------------------------------------------------------------
13 */
14#ifndef MEMNODES_H
15#define MEMNODES_H
16
17#include "nodes/nodes.h"
18
19/*
20 * MemoryContextCounters
21 * Summarization state for MemoryContextStats collection.
22 *
23 * The set of counters in this struct is biased towards AllocSet; if we ever
24 * add any context types that are based on fundamentally different approaches,
25 * we might need more or different counters here. A possible API spec then
26 * would be to print only nonzero counters, but for now we just summarize in
27 * the format historically used by AllocSet.
28 */
29typedef struct MemoryContextCounters
30{
31 Size nblocks; /* Total number of malloc blocks */
32 Size freechunks; /* Total number of free chunks */
33 Size totalspace; /* Total bytes requested from malloc */
34 Size freespace; /* The unused portion of totalspace */
35} MemoryContextCounters;
36
37/*
38 * MemoryContext
39 * A logical context in which memory allocations occur.
40 *
41 * MemoryContext itself is an abstract type that can have multiple
42 * implementations.
43 * The function pointers in MemoryContextMethods define one specific
44 * implementation of MemoryContext --- they are a virtual function table
45 * in C++ terms.
46 *
47 * Node types that are actual implementations of memory contexts must
48 * begin with the same fields as MemoryContextData.
49 *
50 * Note: for largely historical reasons, typedef MemoryContext is a pointer
51 * to the context struct rather than the struct type itself.
52 */
53
54typedef void (*MemoryStatsPrintFunc) (MemoryContext context, void *passthru,
55 const char *stats_string);
56
57typedef struct MemoryContextMethods
58{
59 void *(*alloc) (MemoryContext context, Size size);
60 /* call this free_p in case someone #define's free() */
61 void (*free_p) (MemoryContext context, void *pointer);
62 void *(*realloc) (MemoryContext context, void *pointer, Size size);
63 void (*reset) (MemoryContext context);
64 void (*delete_context) (MemoryContext context);
65 Size (*get_chunk_space) (MemoryContext context, void *pointer);
66 bool (*is_empty) (MemoryContext context);
67 void (*stats) (MemoryContext context,
68 MemoryStatsPrintFunc printfunc, void *passthru,
69 MemoryContextCounters *totals);
70#ifdef MEMORY_CONTEXT_CHECKING
71 void (*check) (MemoryContext context);
72#endif
73} MemoryContextMethods;
74
75
76typedef struct MemoryContextData
77{
78 NodeTag type; /* identifies exact kind of context */
79 /* these two fields are placed here to minimize alignment wastage: */
80 bool isReset; /* T = no space alloced since last reset */
81 bool allowInCritSection; /* allow palloc in critical section */
82 const MemoryContextMethods *methods; /* virtual function table */
83 MemoryContext parent; /* NULL if no parent (toplevel context) */
84 MemoryContext firstchild; /* head of linked list of children */
85 MemoryContext prevchild; /* previous child of same parent */
86 MemoryContext nextchild; /* next child of same parent */
87 const char *name; /* context name (just for debugging) */
88 const char *ident; /* context ID if any (just for debugging) */
89 MemoryContextCallback *reset_cbs; /* list of reset/delete callbacks */
90} MemoryContextData;
91
92/* utils/palloc.h contains typedef struct MemoryContextData *MemoryContext */
93
94
95/*
96 * MemoryContextIsValid
97 * True iff memory context is valid.
98 *
99 * Add new context types to the set accepted by this macro.
100 */
101#define MemoryContextIsValid(context) \
102 ((context) != NULL && \
103 (IsA((context), AllocSetContext) || \
104 IsA((context), SlabContext) || \
105 IsA((context), GenerationContext)))
106
107#endif /* MEMNODES_H */
108