| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /*------------------------------------------------------------------------- |
| * |
| * memnodes.h |
| * POSTGRES memory context node definitions. |
| * |
| * |
| * Portions Copyright (c) 2007-2008, Greenplum inc |
| * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group |
| * Portions Copyright (c) 1994, Regents of the University of California |
| * |
| * $PostgreSQL: pgsql/src/include/nodes/memnodes.h,v 1.31 2006/03/05 15:58:56 momjian Exp $ |
| * |
| *------------------------------------------------------------------------- |
| */ |
| #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, uint64 *nBlocks, uint64 *nChunks, uint64 *currentAvailable, uint64 *allAllocated, uint64 *allFreed, uint64 *maxHeld); |
| void (*release_accounting)(MemoryContext context); |
| void (*update_generation)(MemoryContext context); |
| #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) */ |
| /* CDB: Lifetime cumulative stats for this context and all descendants */ |
| uint64 allBytesAlloc; /* bytes allocated from lower level mem mgr */ |
| uint64 allBytesFreed; /* bytes returned to lower level mem mgr */ |
| Size maxBytesHeld; /* high-water mark for total bytes held */ |
| Size localMinHeld; /* low-water mark since last increase in hwm */ |
| #ifdef CDB_PALLOC_CALLER_ID |
| const char *callerFile; /* __FILE__ of most recent caller */ |
| int callerLine; /* __LINE__ of most recent caller */ |
| #endif |
| } 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) || \ |
| IsA((context), AsetDirectContext) || \ |
| IsA((context), MPoolContext) )) |
| |
| |
| #endif /* MEMNODES_H */ |