mirror of
https://github.com/postgres/postgres.git
synced 2025-09-08 00:47:37 +03:00
avoids the overhead of one function call when calling MemoryContextReset(), and it seems like the isReset optimization would be applicable to any new memory context we might invent in the future anyway. This buys back the overhead I just added in previous patch to always call MemoryContextReset() in ExecScan, even when there's no quals or projections.
79 lines
2.6 KiB
C
79 lines
2.6 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* memnodes.h
|
|
* POSTGRES memory context node definitions.
|
|
*
|
|
*
|
|
* Portions Copyright (c) 1996-2011, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* src/include/nodes/memnodes.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef MEMNODES_H
|
|
#define MEMNODES_H
|
|
|
|
#include "nodes/nodes.h"
|
|
|
|
/*
|
|
* MemoryContext
|
|
* A logical context in which memory allocations occur.
|
|
*
|
|
* MemoryContext itself is an abstract type that can have multiple
|
|
* implementations, though for now we have only AllocSetContext.
|
|
* The function pointers in MemoryContextMethods define one specific
|
|
* implementation of MemoryContext --- they are a virtual function table
|
|
* in C++ terms.
|
|
*
|
|
* Node types that are actual implementations of memory contexts must
|
|
* begin with the same fields as MemoryContext.
|
|
*
|
|
* Note: for largely historical reasons, typedef MemoryContext is a pointer
|
|
* to the context struct rather than the struct type itself.
|
|
*/
|
|
|
|
typedef struct MemoryContextMethods
|
|
{
|
|
void *(*alloc) (MemoryContext context, Size size);
|
|
/* call this free_p in case someone #define's free() */
|
|
void (*free_p) (MemoryContext context, void *pointer);
|
|
void *(*realloc) (MemoryContext context, void *pointer, Size size);
|
|
void (*init) (MemoryContext context);
|
|
void (*reset) (MemoryContext context);
|
|
void (*delete_context) (MemoryContext context);
|
|
Size (*get_chunk_space) (MemoryContext context, void *pointer);
|
|
bool (*is_empty) (MemoryContext context);
|
|
void (*stats) (MemoryContext context, int level);
|
|
#ifdef MEMORY_CONTEXT_CHECKING
|
|
void (*check) (MemoryContext context);
|
|
#endif
|
|
} MemoryContextMethods;
|
|
|
|
|
|
typedef struct MemoryContextData
|
|
{
|
|
NodeTag type; /* identifies exact kind of context */
|
|
MemoryContextMethods *methods; /* virtual function table */
|
|
MemoryContext parent; /* NULL if no parent (toplevel context) */
|
|
MemoryContext firstchild; /* head of linked list of children */
|
|
MemoryContext nextchild; /* next child of same parent */
|
|
char *name; /* context name (just for debugging) */
|
|
bool isReset; /* T = no space alloced since last reset */
|
|
} MemoryContextData;
|
|
|
|
/* utils/palloc.h contains typedef struct MemoryContextData *MemoryContext */
|
|
|
|
|
|
/*
|
|
* MemoryContextIsValid
|
|
* True iff memory context is valid.
|
|
*
|
|
* Add new context types to the set accepted by this macro.
|
|
*/
|
|
#define MemoryContextIsValid(context) \
|
|
((context) != NULL && \
|
|
(IsA((context), AllocSetContext)))
|
|
|
|
#endif /* MEMNODES_H */
|