| 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 | */ |
| 29 | typedef 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 | |
| 54 | typedef void (*MemoryStatsPrintFunc) (MemoryContext context, void *passthru, |
| 55 | const char *stats_string); |
| 56 | |
| 57 | typedef 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 | |
| 76 | typedef 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 | |