diff options
Diffstat (limited to 'src/backend/utils/mmgr')
-rw-r--r-- | src/backend/utils/mmgr/aset.c | 411 | ||||
-rw-r--r-- | src/backend/utils/mmgr/mcxt.c | 517 | ||||
-rw-r--r-- | src/backend/utils/mmgr/oset.c | 126 | ||||
-rw-r--r-- | src/backend/utils/mmgr/palloc.c | 82 | ||||
-rw-r--r-- | src/backend/utils/mmgr/portalmem.c | 1222 |
5 files changed, 1206 insertions, 1152 deletions
diff --git a/src/backend/utils/mmgr/aset.c b/src/backend/utils/mmgr/aset.c index 8e0482de38c..c07fb1bd587 100644 --- a/src/backend/utils/mmgr/aset.c +++ b/src/backend/utils/mmgr/aset.c @@ -1,33 +1,34 @@ /*------------------------------------------------------------------------- * * aset.c-- - * Allocation set definitions. + * Allocation set definitions. * * Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/mmgr/aset.c,v 1.5 1997/08/19 21:35:54 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/mmgr/aset.c,v 1.6 1997/09/07 04:54:01 momjian Exp $ * * NOTE - * XXX This is a preliminary implementation which lacks fail-fast - * XXX validity checking of arguments. + * XXX This is a preliminary implementation which lacks fail-fast + * XXX validity checking of arguments. * *------------------------------------------------------------------------- */ #include <stdio.h> #include "postgres.h" -#include "utils/excid.h" /* for ExhaustedMemory */ -#include "utils/memutils.h" /* where funnction declarations go */ +#include "utils/excid.h" /* for ExhaustedMemory */ +#include "utils/memutils.h" /* where funnction declarations go */ #ifndef HAVE_MEMMOVE -# include <regex/utils.h> +#include <regex/utils.h> #else -# include <string.h> +#include <string.h> #endif -static void AllocPointerDump(AllocPointer pointer); -static int AllocSetIterate(AllocSet set, - void (*function)(AllocPointer pointer)); +static void AllocPointerDump(AllocPointer pointer); +static int +AllocSetIterate(AllocSet set, + void (*function) (AllocPointer pointer)); #undef AllocSetReset #undef malloc @@ -39,12 +40,13 @@ static int AllocSetIterate(AllocSet set, /* * AllocElem -- - * Allocation element. + * Allocation element. */ -typedef struct AllocElemData { - OrderedElemData elemData; /* elem in AllocSet */ - Size size; -} AllocElemData; +typedef struct AllocElemData +{ + OrderedElemData elemData; /* elem in AllocSet */ + Size size; +} AllocElemData; typedef AllocElemData *AllocElem; @@ -55,21 +57,21 @@ typedef AllocElemData *AllocElem; /* * AllocPointerGetAllocElem -- - * Returns allocation (internal) elem given (external) pointer. + * Returns allocation (internal) elem given (external) pointer. */ -#define AllocPointerGetAllocElem(pointer) (&((AllocElem)(pointer))[-1]) +#define AllocPointerGetAllocElem(pointer) (&((AllocElem)(pointer))[-1]) /* * AllocElemGetAllocPointer -- - * Returns allocation (external) pointer given (internal) elem. + * Returns allocation (external) pointer given (internal) elem. */ -#define AllocElemGetAllocPointer(alloc) ((AllocPointer)&(alloc)[1]) +#define AllocElemGetAllocPointer(alloc) ((AllocPointer)&(alloc)[1]) /* * AllocElemIsValid -- - * True iff alloc is valid. + * True iff alloc is valid. */ -#define AllocElemIsValid(alloc) PointerIsValid(alloc) +#define AllocElemIsValid(alloc) PointerIsValid(alloc) /* non-export function prototypes */ static AllocPointer AllocSetGetFirst(AllocSet set); @@ -79,242 +81,250 @@ static AllocPointer AllocPointerGetNext(AllocPointer pointer); * Public routines */ -/* - * AllocPointerIsValid(pointer) - * AllocSetIsValid(set) +/* + * AllocPointerIsValid(pointer) + * AllocSetIsValid(set) * - * .. are now macros in aset.h -cim 4/27/91 + * .. are now macros in aset.h -cim 4/27/91 */ /* * AllocSetInit -- - * Initializes given allocation set. + * Initializes given allocation set. * * Note: - * The semantics of the mode are explained above. Limit is ignored - * for dynamic and static modes. + * The semantics of the mode are explained above. Limit is ignored + * for dynamic and static modes. * * Exceptions: - * BadArg if set is invalid pointer. - * BadArg if mode is invalid. + * BadArg if set is invalid pointer. + * BadArg if mode is invalid. */ void AllocSetInit(AllocSet set, AllocMode mode, Size limit) { - AssertArg(PointerIsValid(set)); - AssertArg((int)DynamicAllocMode <= (int)mode); - AssertArg((int)mode <= (int)BoundedAllocMode); - - /* - * XXX mode is currently ignored and treated as DynamicAllocMode. - * XXX limit is also ignored. This affects this whole file. - */ - - OrderedSetInit(&set->setData, offsetof(AllocElemData, elemData)); + AssertArg(PointerIsValid(set)); + AssertArg((int) DynamicAllocMode <= (int) mode); + AssertArg((int) mode <= (int) BoundedAllocMode); + + /* + * XXX mode is currently ignored and treated as DynamicAllocMode. XXX + * limit is also ignored. This affects this whole file. + */ + + OrderedSetInit(&set->setData, offsetof(AllocElemData, elemData)); } /* * AllocSetReset -- - * Frees memory which is allocated in the given set. + * Frees memory which is allocated in the given set. * * Exceptions: - * BadArg if set is invalid. + * BadArg if set is invalid. */ void AllocSetReset(AllocSet set) { - AllocPointer pointer; - - AssertArg(AllocSetIsValid(set)); - - while (AllocPointerIsValid(pointer = AllocSetGetFirst(set))) { - AllocSetFree(set, pointer); - } + AllocPointer pointer; + + AssertArg(AllocSetIsValid(set)); + + while (AllocPointerIsValid(pointer = AllocSetGetFirst(set))) + { + AllocSetFree(set, pointer); + } } #ifdef NOT_USED void AllocSetReset_debug(char *file, int line, AllocSet set) { - AllocPointer pointer; - - AssertArg(AllocSetIsValid(set)); - - while (AllocPointerIsValid(pointer = AllocSetGetFirst(set))) { - AllocSetFree(set, pointer); - } + AllocPointer pointer; + + AssertArg(AllocSetIsValid(set)); + + while (AllocPointerIsValid(pointer = AllocSetGetFirst(set))) + { + AllocSetFree(set, pointer); + } } + #endif /* * AllocSetContains -- - * True iff allocation set contains given allocation element. + * True iff allocation set contains given allocation element. * * Exceptions: - * BadArg if set is invalid. - * BadArg if pointer is invalid. + * BadArg if set is invalid. + * BadArg if pointer is invalid. */ bool AllocSetContains(AllocSet set, AllocPointer pointer) { - AssertArg(AllocSetIsValid(set)); - AssertArg(AllocPointerIsValid(pointer)); - - return (OrderedSetContains(&set->setData, - &AllocPointerGetAllocElem(pointer)->elemData)); + AssertArg(AllocSetIsValid(set)); + AssertArg(AllocPointerIsValid(pointer)); + + return (OrderedSetContains(&set->setData, + &AllocPointerGetAllocElem(pointer)->elemData)); } /* * AllocSetAlloc -- - * Returns pointer to allocated memory of given size; memory is added - * to the set. + * Returns pointer to allocated memory of given size; memory is added + * to the set. * * Exceptions: - * BadArg if set is invalid. - * MemoryExhausted if allocation fails. + * BadArg if set is invalid. + * MemoryExhausted if allocation fails. */ AllocPointer AllocSetAlloc(AllocSet set, Size size) { - AllocElem alloc; - - AssertArg(AllocSetIsValid(set)); - - /* allocate */ - alloc = (AllocElem)malloc(sizeof (*alloc) + size); - - if (!PointerIsValid(alloc)) { - elog (FATAL, "palloc failure: memory exhausted"); - } - - /* add to allocation list */ - OrderedElemPushInto(&alloc->elemData, &set->setData); - - /* set size */ - alloc->size = size; - - return (AllocElemGetAllocPointer(alloc)); + AllocElem alloc; + + AssertArg(AllocSetIsValid(set)); + + /* allocate */ + alloc = (AllocElem) malloc(sizeof(*alloc) + size); + + if (!PointerIsValid(alloc)) + { + elog(FATAL, "palloc failure: memory exhausted"); + } + + /* add to allocation list */ + OrderedElemPushInto(&alloc->elemData, &set->setData); + + /* set size */ + alloc->size = size; + + return (AllocElemGetAllocPointer(alloc)); } /* * AllocSetFree -- - * Frees allocated memory; memory is removed from the set. + * Frees allocated memory; memory is removed from the set. * * Exceptions: - * BadArg if set is invalid. - * BadArg if pointer is invalid. - * BadArg if pointer is not member of set. + * BadArg if set is invalid. + * BadArg if pointer is invalid. + * BadArg if pointer is not member of set. */ void AllocSetFree(AllocSet set, AllocPointer pointer) { - AllocElem alloc; - - /* AssertArg(AllocSetIsValid(set)); */ - /* AssertArg(AllocPointerIsValid(pointer)); */ - AssertArg(AllocSetContains(set, pointer)); - - alloc = AllocPointerGetAllocElem(pointer); - - /* remove from allocation set */ - OrderedElemPop(&alloc->elemData); - - /* free storage */ - free(alloc); + AllocElem alloc; + + /* AssertArg(AllocSetIsValid(set)); */ + /* AssertArg(AllocPointerIsValid(pointer)); */ + AssertArg(AllocSetContains(set, pointer)); + + alloc = AllocPointerGetAllocElem(pointer); + + /* remove from allocation set */ + OrderedElemPop(&alloc->elemData); + + /* free storage */ + free(alloc); } /* * AllocSetRealloc -- - * Returns new pointer to allocated memory of given size; this memory - * is added to the set. Memory associated with given pointer is copied - * into the new memory, and the old memory is freed. + * Returns new pointer to allocated memory of given size; this memory + * is added to the set. Memory associated with given pointer is copied + * into the new memory, and the old memory is freed. * * Exceptions: - * BadArg if set is invalid. - * BadArg if pointer is invalid. - * BadArg if pointer is not member of set. - * MemoryExhausted if allocation fails. + * BadArg if set is invalid. + * BadArg if pointer is invalid. + * BadArg if pointer is not member of set. + * MemoryExhausted if allocation fails. */ AllocPointer AllocSetRealloc(AllocSet set, AllocPointer pointer, Size size) { - AllocPointer newPointer; - AllocElem alloc; - - /* AssertArg(AllocSetIsValid(set)); */ - /* AssertArg(AllocPointerIsValid(pointer)); */ - AssertArg(AllocSetContains(set, pointer)); - - /* - * Calling realloc(3) directly is not be possible (unless we use - * our own hacked version of malloc) since we must keep the - * allocations in the allocation set. - */ - - alloc = AllocPointerGetAllocElem(pointer); - - /* allocate new pointer */ - newPointer = AllocSetAlloc(set, size); - - /* fill new memory */ - memmove(newPointer, pointer, (alloc->size < size) ? alloc->size : size); - - /* free old pointer */ - AllocSetFree(set, pointer); - - return (newPointer); + AllocPointer newPointer; + AllocElem alloc; + + /* AssertArg(AllocSetIsValid(set)); */ + /* AssertArg(AllocPointerIsValid(pointer)); */ + AssertArg(AllocSetContains(set, pointer)); + + /* + * Calling realloc(3) directly is not be possible (unless we use our + * own hacked version of malloc) since we must keep the allocations in + * the allocation set. + */ + + alloc = AllocPointerGetAllocElem(pointer); + + /* allocate new pointer */ + newPointer = AllocSetAlloc(set, size); + + /* fill new memory */ + memmove(newPointer, pointer, (alloc->size < size) ? alloc->size : size); + + /* free old pointer */ + AllocSetFree(set, pointer); + + return (newPointer); } /* * AllocSetIterate -- - * Returns size of set. Iterates through set elements calling function - * (if valid) on each. + * Returns size of set. Iterates through set elements calling function + * (if valid) on each. * * Note: - * This was written as an aid to debugging. It is intended for - * debugging use only. + * This was written as an aid to debugging. It is intended for + * debugging use only. * * Exceptions: - * BadArg if set is invalid. + * BadArg if set is invalid. */ static int AllocSetIterate(AllocSet set, - void (*function)(AllocPointer pointer)) + void (*function) (AllocPointer pointer)) { - int count = 0; - AllocPointer pointer; - - AssertArg(AllocSetIsValid(set)); - - for (pointer = AllocSetGetFirst(set); - AllocPointerIsValid(pointer); - pointer = AllocPointerGetNext(pointer)) { - - if (PointerIsValid(function)) { - (*function)(pointer); + int count = 0; + AllocPointer pointer; + + AssertArg(AllocSetIsValid(set)); + + for (pointer = AllocSetGetFirst(set); + AllocPointerIsValid(pointer); + pointer = AllocPointerGetNext(pointer)) + { + + if (PointerIsValid(function)) + { + (*function) (pointer); + } + count += 1; } - count += 1; - } - - return (count); + + return (count); } #ifdef NOT_USED int AllocSetCount(AllocSet set) { - int count = 0; - AllocPointer pointer; - - AssertArg(AllocSetIsValid(set)); - - for (pointer = AllocSetGetFirst(set); - AllocPointerIsValid(pointer); - pointer = AllocPointerGetNext(pointer)) { - count++; - } - return count; + int count = 0; + AllocPointer pointer; + + AssertArg(AllocSetIsValid(set)); + + for (pointer = AllocSetGetFirst(set); + AllocPointerIsValid(pointer); + pointer = AllocPointerGetNext(pointer)) + { + count++; + } + return count; } + #endif /* @@ -323,45 +333,47 @@ AllocSetCount(AllocSet set) /* * AllocSetGetFirst -- - * Returns "first" allocation pointer in a set. + * Returns "first" allocation pointer in a set. * * Note: - * Assumes set is valid. + * Assumes set is valid. */ -static AllocPointer +static AllocPointer AllocSetGetFirst(AllocSet set) { - AllocElem alloc; - - alloc = (AllocElem)OrderedSetGetHead(&set->setData); - - if (!AllocElemIsValid(alloc)) { - return (NULL); - } - - return (AllocElemGetAllocPointer(alloc)); + AllocElem alloc; + + alloc = (AllocElem) OrderedSetGetHead(&set->setData); + + if (!AllocElemIsValid(alloc)) + { + return (NULL); + } + + return (AllocElemGetAllocPointer(alloc)); } /* * AllocPointerGetNext -- - * Returns "successor" allocation pointer. + * Returns "successor" allocation pointer. * * Note: - * Assumes pointer is valid. + * Assumes pointer is valid. */ -static AllocPointer +static AllocPointer AllocPointerGetNext(AllocPointer pointer) { - AllocElem alloc; - - alloc = (AllocElem) - OrderedElemGetSuccessor(&AllocPointerGetAllocElem(pointer)->elemData); - - if (!AllocElemIsValid(alloc)) { - return (NULL); - } - - return (AllocElemGetAllocPointer(alloc)); + AllocElem alloc; + + alloc = (AllocElem) + OrderedElemGetSuccessor(&AllocPointerGetAllocElem(pointer)->elemData); + + if (!AllocElemIsValid(alloc)) + { + return (NULL); + } + + return (AllocElemGetAllocPointer(alloc)); } @@ -371,22 +383,23 @@ AllocPointerGetNext(AllocPointer pointer) /* * XXX AllocPointerDump -- - * Displays allocated pointer. + * Displays allocated pointer. */ static void AllocPointerDump(AllocPointer pointer) { - printf("\t%-10ld@ %0#lx\n", ((long*)pointer)[-1], (long)pointer); /* XXX */ + printf("\t%-10ld@ %0#lx\n", ((long *) pointer)[-1], (long) pointer); /* XXX */ } /* * AllocSetDump -- - * Displays allocated set. + * Displays allocated set. */ void AllocSetDump(AllocSet set) { - int count; - count = AllocSetIterate(set, AllocPointerDump); - printf("\ttotal %d allocations\n", count); + int count; + + count = AllocSetIterate(set, AllocPointerDump); + printf("\ttotal %d allocations\n", count); } diff --git a/src/backend/utils/mmgr/mcxt.c b/src/backend/utils/mmgr/mcxt.c index df2eb480817..dbd1b6e19f6 100644 --- a/src/backend/utils/mmgr/mcxt.c +++ b/src/backend/utils/mmgr/mcxt.c @@ -1,17 +1,17 @@ /*------------------------------------------------------------------------- * * mcxt.c-- - * POSTGRES memory context code. + * POSTGRES memory context code. * * Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/mmgr/mcxt.c,v 1.3 1997/08/19 21:35:57 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/mmgr/mcxt.c,v 1.4 1997/09/07 04:54:08 momjian Exp $ * *------------------------------------------------------------------------- */ -#include <stdio.h> /* XXX for printf debugging */ +#include <stdio.h> /* XXX for printf debugging */ #include "postgres.h" @@ -35,90 +35,93 @@ /* * Global State */ -static int MemoryContextEnableCount = 0; +static int MemoryContextEnableCount = 0; + #define MemoryContextEnabled (MemoryContextEnableCount > 0) -static OrderedSetData ActiveGlobalMemorySetData; /* uninitialized */ +static OrderedSetData ActiveGlobalMemorySetData; /* uninitialized */ + #define ActiveGlobalMemorySet (&ActiveGlobalMemorySetData) /* * description of allocated memory representation goes here */ -#define PSIZE(PTR) (*((int32 *)(PTR) - 1)) +#define PSIZE(PTR) (*((int32 *)(PTR) - 1)) #define PSIZEALL(PTR) (*((int32 *)(PTR) - 1) + sizeof (int32)) #define PSIZESKIP(PTR) ((char *)((int32 *)(PTR) + 1)) #define PSIZEFIND(PTR) ((char *)((int32 *)(PTR) - 1)) -#define PSIZESPACE(LEN) ((LEN) + sizeof (int32)) +#define PSIZESPACE(LEN) ((LEN) + sizeof (int32)) /* * AllocSizeIsValid -- - * True iff 0 < size and size <= MaxAllocSize. + * True iff 0 < size and size <= MaxAllocSize. */ -#define AllocSizeIsValid(size) (0 < (size) && (size) <= MaxAllocSize) +#define AllocSizeIsValid(size) (0 < (size) && (size) <= MaxAllocSize) /***************************************************************************** - * GLOBAL MEMORY * + * GLOBAL MEMORY * *****************************************************************************/ /* * CurrentMemoryContext -- - * Memory context for general global allocations. + * Memory context for general global allocations. */ MemoryContext CurrentMemoryContext = NULL; /***************************************************************************** - * PRIVATE DEFINITIONS * + * PRIVATE DEFINITIONS * *****************************************************************************/ -static Pointer GlobalMemoryAlloc(GlobalMemory this, Size size); -static void GlobalMemoryFree(GlobalMemory this, Pointer pointer); -static Pointer GlobalMemoryRealloc(GlobalMemory this, Pointer pointer, - Size size); -static char *GlobalMemoryGetName(GlobalMemory this); -static void GlobalMemoryDump(GlobalMemory this); +static Pointer GlobalMemoryAlloc(GlobalMemory this, Size size); +static void GlobalMemoryFree(GlobalMemory this, Pointer pointer); +static Pointer +GlobalMemoryRealloc(GlobalMemory this, Pointer pointer, + Size size); +static char *GlobalMemoryGetName(GlobalMemory this); +static void GlobalMemoryDump(GlobalMemory this); + #ifdef NOT_USED -static void DumpGlobalMemories(void); +static void DumpGlobalMemories(void); + #endif /* * Global Memory Methods */ -static struct MemoryContextMethodsData GlobalContextMethodsData = { - GlobalMemoryAlloc, /* Pointer (*)(this, uint32) palloc */ - GlobalMemoryFree, /* void (*)(this, Pointer) pfree */ - GlobalMemoryRealloc, /* Pointer (*)(this, Pointer) repalloc */ - GlobalMemoryGetName, /* char* (*)(this) getName */ - GlobalMemoryDump /* void (*)(this) dump */ +static struct MemoryContextMethodsData GlobalContextMethodsData = { + GlobalMemoryAlloc, /* Pointer (*)(this, uint32) palloc */ + GlobalMemoryFree, /* void (*)(this, Pointer) pfree */ + GlobalMemoryRealloc, /* Pointer (*)(this, Pointer) repalloc */ + GlobalMemoryGetName, /* char* (*)(this) getName */ + GlobalMemoryDump /* void (*)(this) dump */ }; /* * Note: - * TopGlobalMemory is handled specially because of bootstrapping. + * TopGlobalMemory is handled specially because of bootstrapping. */ /* extern bool EqualGlobalMemory(); */ static struct GlobalMemory TopGlobalMemoryData = { - T_GlobalMemory, /* NodeTag tag */ - &GlobalContextMethodsData, /* ContextMethods method */ - { { 0 } }, /* uninitialized - * OrderedSetData allocSetD - */ - "TopGlobal", /* char* name */ - { 0 } /* uninitialized OrderedElemData elemD */ + T_GlobalMemory, /* NodeTag tag */ + &GlobalContextMethodsData, /* ContextMethods method */ + {{0}}, /* uninitialized OrderedSetData allocSetD */ + "TopGlobal", /* char* name */ + {0} /* uninitialized OrderedElemData elemD */ }; /* * TopMemoryContext -- - * Memory context for general global allocations. + * Memory context for general global allocations. * * Note: - * Don't use this memory context for random allocations. If you - * allocate something here, you are expected to clean it up when - * appropriate. + * Don't use this memory context for random allocations. If you + * allocate something here, you are expected to clean it up when + * appropriate. */ -MemoryContext TopMemoryContext = (MemoryContext)&TopGlobalMemoryData; +MemoryContext TopMemoryContext = (MemoryContext) & TopGlobalMemoryData; @@ -129,213 +132,223 @@ MemoryContext TopMemoryContext = (MemoryContext)&TopGlobalMemoryData; /* * EnableMemoryContext -- - * Enables/disables memory management and global contexts. + * Enables/disables memory management and global contexts. * * Note: - * This must be called before creating contexts or allocating memory. - * This must be called before other contexts are created. + * This must be called before creating contexts or allocating memory. + * This must be called before other contexts are created. * * Exceptions: - * BadArg if on is invalid. - * BadState if on is false when disabled. + * BadArg if on is invalid. + * BadState if on is false when disabled. */ void EnableMemoryContext(bool on) { - static bool processing = false; - - AssertState(!processing); - AssertArg(BoolIsValid(on)); - - if (BypassEnable(&MemoryContextEnableCount, on)) { - return; - } - - processing = true; - - if (on) { /* initialize */ - /* initialize TopGlobalMemoryData.setData */ - AllocSetInit(&TopGlobalMemoryData.setData, DynamicAllocMode, - (Size)0); - - /* make TopGlobalMemoryData member of ActiveGlobalMemorySet */ - OrderedSetInit(ActiveGlobalMemorySet, - offsetof(struct GlobalMemory, elemData)); - OrderedElemPushInto(&TopGlobalMemoryData.elemData, - ActiveGlobalMemorySet); - - /* initialize CurrentMemoryContext */ - CurrentMemoryContext = TopMemoryContext; - - } else { /* cleanup */ - GlobalMemory context; - - /* walk the list of allocations */ - while (PointerIsValid(context = (GlobalMemory) - OrderedSetGetHead(ActiveGlobalMemorySet))) { - - if (context == &TopGlobalMemoryData) { - /* don't free it and clean it last */ - OrderedElemPop(&TopGlobalMemoryData.elemData); - } else { - GlobalMemoryDestroy(context); - } - /* what is needed for the top? */ + static bool processing = false; + + AssertState(!processing); + AssertArg(BoolIsValid(on)); + + if (BypassEnable(&MemoryContextEnableCount, on)) + { + return; } - - /* - * Freeing memory here should be safe as this is called - * only after all modules which allocate in TopMemoryContext - * have been disabled. - */ - - /* step through remaining allocations and log */ - /* AllocSetStep(...); */ - - /* deallocate whatever is left */ - AllocSetReset(&TopGlobalMemoryData.setData); - } - - processing = false; + + processing = true; + + if (on) + { /* initialize */ + /* initialize TopGlobalMemoryData.setData */ + AllocSetInit(&TopGlobalMemoryData.setData, DynamicAllocMode, + (Size) 0); + + /* make TopGlobalMemoryData member of ActiveGlobalMemorySet */ + OrderedSetInit(ActiveGlobalMemorySet, + offsetof(struct GlobalMemory, elemData)); + OrderedElemPushInto(&TopGlobalMemoryData.elemData, + ActiveGlobalMemorySet); + + /* initialize CurrentMemoryContext */ + CurrentMemoryContext = TopMemoryContext; + + } + else + { /* cleanup */ + GlobalMemory context; + + /* walk the list of allocations */ + while (PointerIsValid(context = (GlobalMemory) + OrderedSetGetHead(ActiveGlobalMemorySet))) + { + + if (context == &TopGlobalMemoryData) + { + /* don't free it and clean it last */ + OrderedElemPop(&TopGlobalMemoryData.elemData); + } + else + { + GlobalMemoryDestroy(context); + } + /* what is needed for the top? */ + } + + /* + * Freeing memory here should be safe as this is called only after + * all modules which allocate in TopMemoryContext have been + * disabled. + */ + + /* step through remaining allocations and log */ + /* AllocSetStep(...); */ + + /* deallocate whatever is left */ + AllocSetReset(&TopGlobalMemoryData.setData); + } + + processing = false; } /* * MemoryContextAlloc -- - * Returns pointer to aligned allocated memory in the given context. + * Returns pointer to aligned allocated memory in the given context. * * Note: - * none + * none * * Exceptions: - * BadState if called before InitMemoryManager. - * BadArg if context is invalid or if size is 0. - * BadAllocSize if size is larger than MaxAllocSize. + * BadState if called before InitMemoryManager. + * BadArg if context is invalid or if size is 0. + * BadAllocSize if size is larger than MaxAllocSize. */ Pointer MemoryContextAlloc(MemoryContext context, Size size) { - AssertState(MemoryContextEnabled); - AssertArg(MemoryContextIsValid(context)); - - LogTrap(!AllocSizeIsValid(size), BadAllocSize, - ("size=%d [0x%x]", size, size)); - - return (context->method->alloc(context, size)); + AssertState(MemoryContextEnabled); + AssertArg(MemoryContextIsValid(context)); + + LogTrap(!AllocSizeIsValid(size), BadAllocSize, + ("size=%d [0x%x]", size, size)); + + return (context->method->alloc(context, size)); } /* * MemoryContextFree -- - * Frees allocated memory referenced by pointer in the given context. + * Frees allocated memory referenced by pointer in the given context. * * Note: - * none + * none * * Exceptions: - * ??? - * BadArgumentsErr if firstTime is true for subsequent calls. + * ??? + * BadArgumentsErr if firstTime is true for subsequent calls. */ void MemoryContextFree(MemoryContext context, Pointer pointer) { - AssertState(MemoryContextEnabled); - AssertArg(MemoryContextIsValid(context)); - AssertArg(PointerIsValid(pointer)); - - context->method->free_p(context, pointer); + AssertState(MemoryContextEnabled); + AssertArg(MemoryContextIsValid(context)); + AssertArg(PointerIsValid(pointer)); + + context->method->free_p(context, pointer); } /* * MemoryContextRelloc -- - * Returns pointer to aligned allocated memory in the given context. + * Returns pointer to aligned allocated memory in the given context. * * Note: - * none + * none * * Exceptions: - * ??? - * BadArgumentsErr if firstTime is true for subsequent calls. + * ??? + * BadArgumentsErr if firstTime is true for subsequent calls. */ Pointer MemoryContextRealloc(MemoryContext context, - Pointer pointer, - Size size) + Pointer pointer, + Size size) { - AssertState(MemoryContextEnabled); - AssertArg(MemoryContextIsValid(context)); - AssertArg(PointerIsValid(pointer)); - - LogTrap(!AllocSizeIsValid(size), BadAllocSize, - ("size=%d [0x%x]", size, size)); - - return (context->method->realloc(context, pointer, size)); + AssertState(MemoryContextEnabled); + AssertArg(MemoryContextIsValid(context)); + AssertArg(PointerIsValid(pointer)); + + LogTrap(!AllocSizeIsValid(size), BadAllocSize, + ("size=%d [0x%x]", size, size)); + + return (context->method->realloc(context, pointer, size)); } /* * MemoryContextGetName -- - * Returns pointer to aligned allocated memory in the given context. + * Returns pointer to aligned allocated memory in the given context. * * Note: - * none + * none * * Exceptions: - * ??? - * BadArgumentsErr if firstTime is true for subsequent calls. + * ??? + * BadArgumentsErr if firstTime is true for subsequent calls. */ #ifdef NOT_USED -char* +char * MemoryContextGetName(MemoryContext context) { - AssertState(MemoryContextEnabled); - AssertArg(MemoryContextIsValid(context)); - - return (context->method->getName(context)); + AssertState(MemoryContextEnabled); + AssertArg(MemoryContextIsValid(context)); + + return (context->method->getName(context)); } + #endif /* * PointerGetAllocSize -- - * Returns size of aligned allocated memory given pointer to it. + * Returns size of aligned allocated memory given pointer to it. * * Note: - * none + * none * * Exceptions: - * ??? - * BadArgumentsErr if firstTime is true for subsequent calls. + * ??? + * BadArgumentsErr if firstTime is true for subsequent calls. */ #ifdef NOT_USED Size PointerGetAllocSize(Pointer pointer) { - AssertState(MemoryContextEnabled); - AssertArg(PointerIsValid(pointer)); - - return (PSIZE(pointer)); + AssertState(MemoryContextEnabled); + AssertArg(PointerIsValid(pointer)); + + return (PSIZE(pointer)); } + #endif /* * MemoryContextSwitchTo -- - * Returns the current context; installs the given context. + * Returns the current context; installs the given context. * * Note: - * none + * none * * Exceptions: - * BadState if called when disabled. - * BadArg if context is invalid. + * BadState if called when disabled. + * BadArg if context is invalid. */ MemoryContext MemoryContextSwitchTo(MemoryContext context) { - MemoryContext old; - - AssertState(MemoryContextEnabled); - AssertArg(MemoryContextIsValid(context)); - - old = CurrentMemoryContext; - CurrentMemoryContext = context; - return (old); + MemoryContext old; + + AssertState(MemoryContextEnabled); + AssertArg(MemoryContextIsValid(context)); + + old = CurrentMemoryContext; + CurrentMemoryContext = context; + return (old); } /* @@ -343,174 +356,178 @@ MemoryContextSwitchTo(MemoryContext context) */ /* * CreateGlobalMemory -- - * Returns new global memory context. + * Returns new global memory context. * * Note: - * Assumes name is static. + * Assumes name is static. * * Exceptions: - * BadState if called when disabled. - * BadState if called outside TopMemoryContext (TopGlobalMemory). - * BadArg if name is invalid. + * BadState if called when disabled. + * BadState if called outside TopMemoryContext (TopGlobalMemory). + * BadArg if name is invalid. */ GlobalMemory -CreateGlobalMemory(char *name) /* XXX MemoryContextName */ +CreateGlobalMemory(char *name) /* XXX MemoryContextName */ { - GlobalMemory context; - MemoryContext savecxt; - - AssertState(MemoryContextEnabled); - - savecxt = MemoryContextSwitchTo(TopMemoryContext); - - context = (GlobalMemory)newNode(sizeof(struct GlobalMemory), T_GlobalMemory); - context->method = &GlobalContextMethodsData; - context->name = name; /* assumes name is static */ - AllocSetInit(&context->setData, DynamicAllocMode, (Size)0); - - /* link the context */ - OrderedElemPushInto(&context->elemData, ActiveGlobalMemorySet); - - MemoryContextSwitchTo(savecxt); - return (context); + GlobalMemory context; + MemoryContext savecxt; + + AssertState(MemoryContextEnabled); + + savecxt = MemoryContextSwitchTo(TopMemoryContext); + + context = (GlobalMemory) newNode(sizeof(struct GlobalMemory), T_GlobalMemory); + context->method = &GlobalContextMethodsData; + context->name = name; /* assumes name is static */ + AllocSetInit(&context->setData, DynamicAllocMode, (Size) 0); + + /* link the context */ + OrderedElemPushInto(&context->elemData, ActiveGlobalMemorySet); + + MemoryContextSwitchTo(savecxt); + return (context); } /* * GlobalMemoryDestroy -- - * Destroys given global memory context. + * Destroys given global memory context. * * Exceptions: - * BadState if called when disabled. - * BadState if called outside TopMemoryContext (TopGlobalMemory). - * BadArg if context is invalid GlobalMemory. - * BadArg if context is TopMemoryContext (TopGlobalMemory). + * BadState if called when disabled. + * BadState if called outside TopMemoryContext (TopGlobalMemory). + * BadArg if context is invalid GlobalMemory. + * BadArg if context is TopMemoryContext (TopGlobalMemory). */ void GlobalMemoryDestroy(GlobalMemory context) { - AssertState(MemoryContextEnabled); - AssertArg(IsA(context,GlobalMemory)); - AssertArg(context != &TopGlobalMemoryData); - - AllocSetReset(&context->setData); - - /* unlink and delete the context */ - OrderedElemPop(&context->elemData); - MemoryContextFree(TopMemoryContext, (Pointer)context); + AssertState(MemoryContextEnabled); + AssertArg(IsA(context, GlobalMemory)); + AssertArg(context != &TopGlobalMemoryData); + + AllocSetReset(&context->setData); + + /* unlink and delete the context */ + OrderedElemPop(&context->elemData); + MemoryContextFree(TopMemoryContext, (Pointer) context); } /***************************************************************************** - * PRIVATE * + * PRIVATE * *****************************************************************************/ /* * GlobalMemoryAlloc -- - * Returns pointer to aligned space in the global context. + * Returns pointer to aligned space in the global context. * * Exceptions: - * ExhaustedMemory if allocation fails. + * ExhaustedMemory if allocation fails. */ -static Pointer +static Pointer GlobalMemoryAlloc(GlobalMemory this, Size size) { - return (AllocSetAlloc(&this->setData, size)); + return (AllocSetAlloc(&this->setData, size)); } /* * GlobalMemoryFree -- - * Frees allocated memory in the global context. + * Frees allocated memory in the global context. * * Exceptions: - * BadContextErr if current context is not the global context. - * BadArgumentsErr if pointer is invalid. + * BadContextErr if current context is not the global context. + * BadArgumentsErr if pointer is invalid. */ static void GlobalMemoryFree(GlobalMemory this, - Pointer pointer) + Pointer pointer) { - AllocSetFree(&this->setData, pointer); + AllocSetFree(&this->setData, pointer); } /* * GlobalMemoryRealloc -- - * Returns pointer to aligned space in the global context. + * Returns pointer to aligned space in the global context. * * Note: - * Memory associated with the pointer is freed before return. + * Memory associated with the pointer is freed before return. * * Exceptions: - * BadContextErr if current context is not the global context. - * BadArgumentsErr if pointer is invalid. - * NoMoreMemoryErr if allocation fails. + * BadContextErr if current context is not the global context. + * BadArgumentsErr if pointer is invalid. + * NoMoreMemoryErr if allocation fails. */ -static Pointer +static Pointer GlobalMemoryRealloc(GlobalMemory this, - Pointer pointer, - Size size) + Pointer pointer, + Size size) { - return (AllocSetRealloc(&this->setData, pointer, size)); + return (AllocSetRealloc(&this->setData, pointer, size)); } /* * GlobalMemoryGetName -- - * Returns name string for context. + * Returns name string for context. * * Exceptions: - * ??? + * ??? */ -static char* +static char * GlobalMemoryGetName(GlobalMemory this) { - return (this->name); + return (this->name); } /* * GlobalMemoryDump -- - * Dumps global memory context for debugging. + * Dumps global memory context for debugging. * * Exceptions: - * ??? + * ??? */ static void GlobalMemoryDump(GlobalMemory this) { - GlobalMemory context; - - printf("--\n%s:\n", GlobalMemoryGetName(this)); - - context = (GlobalMemory)OrderedElemGetPredecessor(&this->elemData); - if (PointerIsValid(context)) { - printf("\tpredecessor=%s\n", GlobalMemoryGetName(context)); - } - - context = (GlobalMemory)OrderedElemGetSuccessor(&this->elemData); - if (PointerIsValid(context)) { - printf("\tsucessor=%s\n", GlobalMemoryGetName(context)); - } - - AllocSetDump(&this->setData); /* XXX is this right interface */ + GlobalMemory context; + + printf("--\n%s:\n", GlobalMemoryGetName(this)); + + context = (GlobalMemory) OrderedElemGetPredecessor(&this->elemData); + if (PointerIsValid(context)) + { + printf("\tpredecessor=%s\n", GlobalMemoryGetName(context)); + } + + context = (GlobalMemory) OrderedElemGetSuccessor(&this->elemData); + if (PointerIsValid(context)) + { + printf("\tsucessor=%s\n", GlobalMemoryGetName(context)); + } + + AllocSetDump(&this->setData); /* XXX is this right interface */ } /* * DumpGlobalMemories -- - * Dumps all global memory contexts for debugging. + * Dumps all global memory contexts for debugging. * * Exceptions: - * ??? + * ??? */ #ifdef NOT_USED static void DumpGlobalMemories() { - GlobalMemory context; - - context = (GlobalMemory)OrderedSetGetHead(&ActiveGlobalMemorySetData); - - while (PointerIsValid(context)) { - GlobalMemoryDump(context); - - context = (GlobalMemory)OrderedElemGetSuccessor( - &context->elemData); - } + GlobalMemory context; + + context = (GlobalMemory) OrderedSetGetHead(&ActiveGlobalMemorySetData); + + while (PointerIsValid(context)) + { + GlobalMemoryDump(context); + + context = (GlobalMemory) OrderedElemGetSuccessor( + &context->elemData); + } } + #endif diff --git a/src/backend/utils/mmgr/oset.c b/src/backend/utils/mmgr/oset.c index 6b42ee45d72..758b701ff55 100644 --- a/src/backend/utils/mmgr/oset.c +++ b/src/backend/utils/mmgr/oset.c @@ -1,39 +1,39 @@ /*------------------------------------------------------------------------- * * oset.c-- - * Fixed format ordered set definitions. + * Fixed format ordered set definitions. * * Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/mmgr/Attic/oset.c,v 1.3 1997/08/24 23:07:50 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/mmgr/Attic/oset.c,v 1.4 1997/09/07 04:54:11 momjian Exp $ * * NOTE - * XXX This is a preliminary implementation which lacks fail-fast - * XXX validity checking of arguments. + * XXX This is a preliminary implementation which lacks fail-fast + * XXX validity checking of arguments. * *------------------------------------------------------------------------- */ #include "c.h" -#include "utils/memutils.h" /* where declarations of this file goes */ +#include "utils/memutils.h" /* where declarations of this file goes */ -static Pointer OrderedElemGetBase(OrderedElem elem); -static void OrderedElemPush(OrderedElem elem); -static void OrderedElemPushHead(OrderedElem elem); +static Pointer OrderedElemGetBase(OrderedElem elem); +static void OrderedElemPush(OrderedElem elem); +static void OrderedElemPushHead(OrderedElem elem); /* * OrderedElemGetBase -- - * Returns base of enclosing structure. + * Returns base of enclosing structure. */ -static Pointer +static Pointer OrderedElemGetBase(OrderedElem elem) { - if (elem == (OrderedElem) NULL) - return (Pointer) NULL; - - return ((Pointer)((char*)(elem) - (elem)->set->offset)); + if (elem == (OrderedElem) NULL) + return (Pointer) NULL; + + return ((Pointer) ((char *) (elem) - (elem)->set->offset)); } /* @@ -42,20 +42,20 @@ OrderedElemGetBase(OrderedElem elem) void OrderedSetInit(OrderedSet set, Offset offset) { - set->head = (OrderedElem)&set->dummy; - set->dummy = NULL; - set->tail = (OrderedElem)&set->head; - set->offset = offset; + set->head = (OrderedElem) & set->dummy; + set->dummy = NULL; + set->tail = (OrderedElem) & set->head; + set->offset = offset; } /* * OrderedSetContains -- - * True iff ordered set contains given element. + * True iff ordered set contains given element. */ bool OrderedSetContains(OrderedSet set, OrderedElem elem) { - return ((bool)(elem->set == set && (elem->next || elem->prev))); + return ((bool) (elem->set == set && (elem->next || elem->prev))); } /* @@ -64,13 +64,14 @@ OrderedSetContains(OrderedSet set, OrderedElem elem) Pointer OrderedSetGetHead(OrderedSet set) { - register OrderedElem elem; - - elem = set->head; - if (elem->next) { - return (OrderedElemGetBase(elem)); - } - return (NULL); + register OrderedElem elem; + + elem = set->head; + if (elem->next) + { + return (OrderedElemGetBase(elem)); + } + return (NULL); } /* @@ -80,14 +81,16 @@ OrderedSetGetHead(OrderedSet set) Pointer OrderedSetGetTail(OrderedSet set) { - register OrderedElem elem; - - elem = set->tail; - if (elem->prev) { - return (OrderedElemGetBase(elem)); - } - return (NULL); + register OrderedElem elem; + + elem = set->tail; + if (elem->prev) + { + return (OrderedElemGetBase(elem)); + } + return (NULL); } + #endif /* @@ -96,11 +99,12 @@ OrderedSetGetTail(OrderedSet set) Pointer OrderedElemGetPredecessor(OrderedElem elem) { - elem = elem->prev; - if (elem->prev) { - return (OrderedElemGetBase(elem)); - } - return (NULL); + elem = elem->prev; + if (elem->prev) + { + return (OrderedElemGetBase(elem)); + } + return (NULL); } /* @@ -109,24 +113,25 @@ OrderedElemGetPredecessor(OrderedElem elem) Pointer OrderedElemGetSuccessor(OrderedElem elem) { - elem = elem->next; - if (elem->next) { - return (OrderedElemGetBase(elem)); - } - return (NULL); + elem = elem->next; + if (elem->next) + { + return (OrderedElemGetBase(elem)); + } + return (NULL); } /* * OrderedElemPop -- */ -void +void OrderedElemPop(OrderedElem elem) { - elem->next->prev = elem->prev; - elem->prev->next = elem->next; - /* assignments used only for error detection */ - elem->next = NULL; - elem->prev = NULL; + elem->next->prev = elem->prev; + elem->prev->next = elem->next; + /* assignments used only for error detection */ + elem->next = NULL; + elem->prev = NULL; } /* @@ -135,11 +140,11 @@ OrderedElemPop(OrderedElem elem) void OrderedElemPushInto(OrderedElem elem, OrderedSet set) { - elem->set = set; - /* mark as unattached */ - elem->next = NULL; - elem->prev = NULL; - OrderedElemPush(elem); + elem->set = set; + /* mark as unattached */ + elem->next = NULL; + elem->prev = NULL; + OrderedElemPush(elem); } /* @@ -148,7 +153,7 @@ OrderedElemPushInto(OrderedElem elem, OrderedSet set) static void OrderedElemPush(OrderedElem elem) { - OrderedElemPushHead(elem); + OrderedElemPushHead(elem); } /* @@ -157,9 +162,8 @@ OrderedElemPush(OrderedElem elem) static void OrderedElemPushHead(OrderedElem elem) { - elem->next = elem->set->head; - elem->prev = (OrderedElem)&elem->set->head; - elem->next->prev = elem; - elem->prev->next = elem; + elem->next = elem->set->head; + elem->prev = (OrderedElem) & elem->set->head; + elem->next->prev = elem; + elem->prev->next = elem; } - diff --git a/src/backend/utils/mmgr/palloc.c b/src/backend/utils/mmgr/palloc.c index 8830a21f40a..f644706c911 100644 --- a/src/backend/utils/mmgr/palloc.c +++ b/src/backend/utils/mmgr/palloc.c @@ -1,13 +1,13 @@ /*------------------------------------------------------------------------- * * palloc.c-- - * POSTGRES memory allocator code. + * POSTGRES memory allocator code. * * Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/mmgr/Attic/palloc.c,v 1.3 1996/11/26 03:19:12 bryanh Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/mmgr/Attic/palloc.c,v 1.4 1997/09/07 04:54:12 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -25,7 +25,7 @@ #include "utils/palloc.h" /* ---------------------------------------------------------------- - * User library functions + * User library functions * ---------------------------------------------------------------- */ @@ -36,84 +36,84 @@ #undef malloc #undef free -/* define PALLOC_IS_MALLOC if you want palloc to go straight to the +/* define PALLOC_IS_MALLOC if you want palloc to go straight to the raw malloc, without concern for the extra bookkeeping needed to ensure garbage is collected at the end of transactions - jolly 1/12/94 */ /* * palloc -- - * Returns pointer to aligned memory of specified size. + * Returns pointer to aligned memory of specified size. * * Exceptions: - * BadArgument if size < 1 or size >= MaxAllocSize. - * ExhaustedMemory if allocation fails. - * NonallocatedPointer if pointer was not returned by palloc or repalloc - * or may have been freed already. + * BadArgument if size < 1 or size >= MaxAllocSize. + * ExhaustedMemory if allocation fails. + * NonallocatedPointer if pointer was not returned by palloc or repalloc + * or may have been freed already. * * pfree -- - * Frees memory associated with pointer returned from palloc or repalloc. + * Frees memory associated with pointer returned from palloc or repalloc. * * Exceptions: - * BadArgument if pointer is invalid. - * FreeInWrongContext if pointer was allocated in a different "context." - * NonallocatedPointer if pointer was not returned by palloc or repalloc - * or may have been subsequently freed. + * BadArgument if pointer is invalid. + * FreeInWrongContext if pointer was allocated in a different "context." + * NonallocatedPointer if pointer was not returned by palloc or repalloc + * or may have been subsequently freed. */ -void* +void * palloc(Size size) { #ifdef PALLOC_IS_MALLOC - return malloc(size); + return malloc(size); #else - return (MemoryContextAlloc(CurrentMemoryContext, size)); -#endif /* PALLOC_IS_MALLOC */ + return (MemoryContextAlloc(CurrentMemoryContext, size)); +#endif /* PALLOC_IS_MALLOC */ } void pfree(void *pointer) -{ +{ #ifdef PALLOC_IS_MALLOC - free(pointer); + free(pointer); #else - MemoryContextFree(CurrentMemoryContext, pointer); -#endif /* PALLOC_IS_MALLOC */ + MemoryContextFree(CurrentMemoryContext, pointer); +#endif /* PALLOC_IS_MALLOC */ } /* * repalloc -- - * Returns pointer to aligned memory of specified size. + * Returns pointer to aligned memory of specified size. * * Side effects: - * The returned memory is first filled with the contents of *pointer - * up to the minimum of size and psize(pointer). Pointer is freed. + * The returned memory is first filled with the contents of *pointer + * up to the minimum of size and psize(pointer). Pointer is freed. * * Exceptions: - * BadArgument if pointer is invalid or size < 1 or size >= MaxAllocSize. - * ExhaustedMemory if allocation fails. - * NonallocatedPointer if pointer was not returned by palloc or repalloc - * or may have been freed already. + * BadArgument if pointer is invalid or size < 1 or size >= MaxAllocSize. + * ExhaustedMemory if allocation fails. + * NonallocatedPointer if pointer was not returned by palloc or repalloc + * or may have been freed already. */ -void * +void * repalloc(void *pointer, Size size) { #ifdef PALLOC_IS_MALLOC - return realloc(pointer, size); + return realloc(pointer, size); #else - return (MemoryContextRealloc(CurrentMemoryContext, pointer, size)); + return (MemoryContextRealloc(CurrentMemoryContext, pointer, size)); #endif } -/* pstrdup - allocates space for and copies a string - just like strdup except it uses palloc instead of malloc */ -char* -pstrdup(char* string) +/* pstrdup + allocates space for and copies a string + just like strdup except it uses palloc instead of malloc */ +char * +pstrdup(char *string) { - char *nstr; + char *nstr; - nstr = (char *)palloc(strlen(string)+1); - strcpy(nstr, string); + nstr = (char *) palloc(strlen(string) + 1); + strcpy(nstr, string); - return nstr; + return nstr; } diff --git a/src/backend/utils/mmgr/portalmem.c b/src/backend/utils/mmgr/portalmem.c index 7f1674d88db..595153b0ce6 100644 --- a/src/backend/utils/mmgr/portalmem.c +++ b/src/backend/utils/mmgr/portalmem.c @@ -1,86 +1,86 @@ /*------------------------------------------------------------------------- * * portalmem.c-- - * backend portal memory context management stuff + * backend portal memory context management stuff * * Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/mmgr/portalmem.c,v 1.5 1997/08/19 21:36:04 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/mmgr/portalmem.c,v 1.6 1997/09/07 04:54:13 momjian Exp $ * *------------------------------------------------------------------------- */ /* * NOTES - * Do not confuse "Portal" with "PortalEntry" (or "PortalBuffer"). - * When a PQexec() routine is run, the resulting tuples - * find their way into a "PortalEntry". The contents of the resulting - * "PortalEntry" can then be inspected by other PQxxx functions. - * - * A "Portal" is a structure used to keep track of queries of the - * form: - * retrieve portal FOO ( blah... ) where blah... - * - * When the backend sees a "retrieve portal" query, it allocates - * a "PortalD" structure, plans the query and then stores the query - * in the portal without executing it. Later, when the backend - * sees a - * fetch 1 into FOO - * - * the system looks up the portal named "FOO" in the portal table, - * gets the planned query and then calls the executor with a feature of - * '(EXEC_FOR 1). The executor then runs the query and returns a single - * tuple. The problem is that we have to hold onto the state of the - * portal query until we see a "close p". This means we have to be - * careful about memory management. - * - * Having said all that, here is what a PortalD currently looks like: + * Do not confuse "Portal" with "PortalEntry" (or "PortalBuffer"). + * When a PQexec() routine is run, the resulting tuples + * find their way into a "PortalEntry". The contents of the resulting + * "PortalEntry" can then be inspected by other PQxxx functions. + * + * A "Portal" is a structure used to keep track of queries of the + * form: + * retrieve portal FOO ( blah... ) where blah... + * + * When the backend sees a "retrieve portal" query, it allocates + * a "PortalD" structure, plans the query and then stores the query + * in the portal without executing it. Later, when the backend + * sees a + * fetch 1 into FOO + * + * the system looks up the portal named "FOO" in the portal table, + * gets the planned query and then calls the executor with a feature of + * '(EXEC_FOR 1). The executor then runs the query and returns a single + * tuple. The problem is that we have to hold onto the state of the + * portal query until we see a "close p". This means we have to be + * careful about memory management. + * + * Having said all that, here is what a PortalD currently looks like: * * struct PortalD { - * char* name; - * classObj(PortalVariableMemory) variable; - * classObj(PortalHeapMemory) heap; - * List queryDesc; - * EState state; - * void (*cleanup) ARGS((Portal portal)); + * char* name; + * classObj(PortalVariableMemory) variable; + * classObj(PortalHeapMemory) heap; + * List queryDesc; + * EState state; + * void (*cleanup) ARGS((Portal portal)); * }; * - * I hope this makes things clearer to whoever reads this -cim 2/22/91 + * I hope this makes things clearer to whoever reads this -cim 2/22/91 * - * Here is an old comment taken from nodes/memnodes.h + * Here is an old comment taken from nodes/memnodes.h * * MemoryContext -- - * A logical context in which memory allocations occur. + * A logical context in which memory allocations occur. * * The types of memory contexts can be thought of as members of the * following inheritance hierarchy with properties summarized below. * - * Node - * | - * MemoryContext___ - * / \ - * GlobalMemory PortalMemoryContext - * / \ - * PortalVariableMemory PortalHeapMemory + * Node + * | + * MemoryContext___ + * / \ + * GlobalMemory PortalMemoryContext + * / \ + * PortalVariableMemory PortalHeapMemory * - * Flushed at Flushed at Checkpoints - * Transaction Portal - * Commit Close + * Flushed at Flushed at Checkpoints + * Transaction Portal + * Commit Close * - * GlobalMemory n n n - * PortalVariableMemory n y n - * PortalHeapMemory y y y * + * GlobalMemory n n n + * PortalVariableMemory n y n + * PortalHeapMemory y y y * * */ -#include <stdio.h> /* for sprintf() */ -#include <string.h> /* for strlen, strncpy */ +#include <stdio.h> /* for sprintf() */ +#include <string.h> /* for strlen, strncpy */ #include "postgres.h" #include "lib/hasht.h" #include "utils/module.h" -#include "utils/excid.h" /* for Unimplemented */ +#include "utils/excid.h" /* for Unimplemented */ #include "utils/mcxt.h" #include "utils/hsearch.h" @@ -91,324 +91,330 @@ #include "utils/portal.h" -static void CollectNamedPortals(Portal *portalP, int destroy); -static Portal PortalHeapMemoryGetPortal(PortalHeapMemory context); +static void CollectNamedPortals(Portal * portalP, int destroy); +static Portal PortalHeapMemoryGetPortal(PortalHeapMemory context); static PortalVariableMemory PortalHeapMemoryGetVariableMemory(PortalHeapMemory context); -static void PortalResetHeapMemory(Portal portal); -static Portal PortalVariableMemoryGetPortal(PortalVariableMemory context); +static void PortalResetHeapMemory(Portal portal); +static Portal PortalVariableMemoryGetPortal(PortalVariableMemory context); /* ---------------- - * ALLOCFREE_ERROR_ABORT - * define this if you want a core dump when you try to - * free memory already freed -cim 2/9/91 + * ALLOCFREE_ERROR_ABORT + * define this if you want a core dump when you try to + * free memory already freed -cim 2/9/91 * ---------------- */ #undef ALLOCFREE_ERROR_ABORT /* ---------------- - * Global state + * Global state * ---------------- */ -static int PortalManagerEnableCount = 0; -#define MAX_PORTALNAME_LEN 64 /* XXX LONGALIGNable value */ +static int PortalManagerEnableCount = 0; -typedef struct portalhashent { - char portalname[MAX_PORTALNAME_LEN]; - Portal portal; -} PortalHashEnt; +#define MAX_PORTALNAME_LEN 64 /* XXX LONGALIGNable value */ + +typedef struct portalhashent +{ + char portalname[MAX_PORTALNAME_LEN]; + Portal portal; +} PortalHashEnt; #define PortalManagerEnabled (PortalManagerEnableCount >= 1) -static HTAB *PortalHashTable = NULL; +static HTAB *PortalHashTable = NULL; + #define PortalHashTableLookup(NAME, PORTAL) \ - { PortalHashEnt *hentry; bool found; char key[MAX_PORTALNAME_LEN]; \ - memset(key, 0, MAX_PORTALNAME_LEN); \ - sprintf(key, "%s", NAME); \ - hentry = (PortalHashEnt*)hash_search(PortalHashTable, \ - key, HASH_FIND, &found); \ - if (hentry == NULL) \ - elog(FATAL, "error in PortalHashTable"); \ - if (found) \ - PORTAL = hentry->portal; \ - else \ - PORTAL = NULL; \ - } + { PortalHashEnt *hentry; bool found; char key[MAX_PORTALNAME_LEN]; \ + memset(key, 0, MAX_PORTALNAME_LEN); \ + sprintf(key, "%s", NAME); \ + hentry = (PortalHashEnt*)hash_search(PortalHashTable, \ + key, HASH_FIND, &found); \ + if (hentry == NULL) \ + elog(FATAL, "error in PortalHashTable"); \ + if (found) \ + PORTAL = hentry->portal; \ + else \ + PORTAL = NULL; \ + } #define PortalHashTableInsert(PORTAL) \ - { PortalHashEnt *hentry; bool found; char key[MAX_PORTALNAME_LEN]; \ - memset(key, 0, MAX_PORTALNAME_LEN); \ - sprintf(key, "%s", PORTAL->name); \ - hentry = (PortalHashEnt*)hash_search(PortalHashTable, \ - key, HASH_ENTER, &found); \ - if (hentry == NULL) \ - elog(FATAL, "error in PortalHashTable"); \ - if (found) \ - elog(NOTICE, "trying to insert a portal name that exists."); \ - hentry->portal = PORTAL; \ - } + { PortalHashEnt *hentry; bool found; char key[MAX_PORTALNAME_LEN]; \ + memset(key, 0, MAX_PORTALNAME_LEN); \ + sprintf(key, "%s", PORTAL->name); \ + hentry = (PortalHashEnt*)hash_search(PortalHashTable, \ + key, HASH_ENTER, &found); \ + if (hentry == NULL) \ + elog(FATAL, "error in PortalHashTable"); \ + if (found) \ + elog(NOTICE, "trying to insert a portal name that exists."); \ + hentry->portal = PORTAL; \ + } #define PortalHashTableDelete(PORTAL) \ - { PortalHashEnt *hentry; bool found; char key[MAX_PORTALNAME_LEN]; \ - memset(key, 0, MAX_PORTALNAME_LEN); \ - sprintf(key, "%s", PORTAL->name); \ - hentry = (PortalHashEnt*)hash_search(PortalHashTable, \ - key, HASH_REMOVE, &found); \ - if (hentry == NULL) \ - elog(FATAL, "error in PortalHashTable"); \ - if (!found) \ - elog(NOTICE, "trying to delete portal name that does not exist."); \ - } - -static GlobalMemory PortalMemory = NULL; + { PortalHashEnt *hentry; bool found; char key[MAX_PORTALNAME_LEN]; \ + memset(key, 0, MAX_PORTALNAME_LEN); \ + sprintf(key, "%s", PORTAL->name); \ + hentry = (PortalHashEnt*)hash_search(PortalHashTable, \ + key, HASH_REMOVE, &found); \ + if (hentry == NULL) \ + elog(FATAL, "error in PortalHashTable"); \ + if (!found) \ + elog(NOTICE, "trying to delete portal name that does not exist."); \ + } + +static GlobalMemory PortalMemory = NULL; static char PortalMemoryName[] = "Portal"; -static Portal BlankPortal = NULL; +static Portal BlankPortal = NULL; /* ---------------- - * Internal class definitions + * Internal class definitions * ---------------- */ -typedef struct HeapMemoryBlockData { - AllocSetData setData; - FixedItemData itemData; -} HeapMemoryBlockData; +typedef struct HeapMemoryBlockData +{ + AllocSetData setData; + FixedItemData itemData; +} HeapMemoryBlockData; -typedef HeapMemoryBlockData *HeapMemoryBlock; +typedef HeapMemoryBlockData *HeapMemoryBlock; #define HEAPMEMBLOCK(context) \ - ((HeapMemoryBlock)(context)->block) + ((HeapMemoryBlock)(context)->block) /* ---------------------------------------------------------------- - * Variable and heap memory methods + * Variable and heap memory methods * ---------------------------------------------------------------- */ /* ---------------- - * PortalVariableMemoryAlloc + * PortalVariableMemoryAlloc * ---------------- */ -static Pointer +static Pointer PortalVariableMemoryAlloc(PortalVariableMemory this, - Size size) + Size size) { - return (AllocSetAlloc(&this->setData, size)); + return (AllocSetAlloc(&this->setData, size)); } /* ---------------- - * PortalVariableMemoryFree + * PortalVariableMemoryFree * ---------------- */ static void PortalVariableMemoryFree(PortalVariableMemory this, - Pointer pointer) + Pointer pointer) { - AllocSetFree(&this->setData, pointer); + AllocSetFree(&this->setData, pointer); } /* ---------------- - * PortalVariableMemoryRealloc + * PortalVariableMemoryRealloc * ---------------- */ -static Pointer +static Pointer PortalVariableMemoryRealloc(PortalVariableMemory this, - Pointer pointer, - Size size) + Pointer pointer, + Size size) { - return (AllocSetRealloc(&this->setData, pointer, size)); + return (AllocSetRealloc(&this->setData, pointer, size)); } /* ---------------- - * PortalVariableMemoryGetName + * PortalVariableMemoryGetName * ---------------- */ -static char* +static char * PortalVariableMemoryGetName(PortalVariableMemory this) { - return (form("%s-var", PortalVariableMemoryGetPortal(this)->name)); + return (form("%s-var", PortalVariableMemoryGetPortal(this)->name)); } /* ---------------- - * PortalVariableMemoryDump + * PortalVariableMemoryDump * ---------------- */ static void PortalVariableMemoryDump(PortalVariableMemory this) { - printf("--\n%s:\n", PortalVariableMemoryGetName(this)); - - AllocSetDump(&this->setData); /* XXX is this the right interface */ + printf("--\n%s:\n", PortalVariableMemoryGetName(this)); + + AllocSetDump(&this->setData); /* XXX is this the right interface */ } /* ---------------- - * PortalHeapMemoryAlloc + * PortalHeapMemoryAlloc * ---------------- */ -static Pointer +static Pointer PortalHeapMemoryAlloc(PortalHeapMemory this, - Size size) + Size size) { - HeapMemoryBlock block = HEAPMEMBLOCK(this); - - AssertState(PointerIsValid(block)); - - return (AllocSetAlloc(&block->setData, size)); + HeapMemoryBlock block = HEAPMEMBLOCK(this); + + AssertState(PointerIsValid(block)); + + return (AllocSetAlloc(&block->setData, size)); } /* ---------------- - * PortalHeapMemoryFree + * PortalHeapMemoryFree * ---------------- */ static void PortalHeapMemoryFree(PortalHeapMemory this, - Pointer pointer) -{ - HeapMemoryBlock block = HEAPMEMBLOCK(this); - - AssertState(PointerIsValid(block)); - - if (AllocSetContains(&block->setData, pointer)) - AllocSetFree(&block->setData, pointer); - else { - elog(NOTICE, - "PortalHeapMemoryFree: 0x%x not in alloc set!", - pointer); + Pointer pointer) +{ + HeapMemoryBlock block = HEAPMEMBLOCK(this); + + AssertState(PointerIsValid(block)); + + if (AllocSetContains(&block->setData, pointer)) + AllocSetFree(&block->setData, pointer); + else + { + elog(NOTICE, + "PortalHeapMemoryFree: 0x%x not in alloc set!", + pointer); #ifdef ALLOCFREE_ERROR_ABORT - Assert(AllocSetContains(&block->setData, pointer)); -#endif /* ALLOCFREE_ERROR_ABORT*/ - } + Assert(AllocSetContains(&block->setData, pointer)); +#endif /* ALLOCFREE_ERROR_ABORT */ + } } /* ---------------- - * PortalHeapMemoryRealloc + * PortalHeapMemoryRealloc * ---------------- */ -static Pointer +static Pointer PortalHeapMemoryRealloc(PortalHeapMemory this, - Pointer pointer, - Size size) + Pointer pointer, + Size size) { - HeapMemoryBlock block = HEAPMEMBLOCK(this); - - AssertState(PointerIsValid(block)); - - return (AllocSetRealloc(&block->setData, pointer, size)); + HeapMemoryBlock block = HEAPMEMBLOCK(this); + + AssertState(PointerIsValid(block)); + + return (AllocSetRealloc(&block->setData, pointer, size)); } /* ---------------- - * PortalHeapMemoryGetName + * PortalHeapMemoryGetName * ---------------- */ -static char* +static char * PortalHeapMemoryGetName(PortalHeapMemory this) { - return (form("%s-heap", PortalHeapMemoryGetPortal(this)->name)); + return (form("%s-heap", PortalHeapMemoryGetPortal(this)->name)); } /* ---------------- - * PortalHeapMemoryDump + * PortalHeapMemoryDump * ---------------- */ static void PortalHeapMemoryDump(PortalHeapMemory this) { - HeapMemoryBlock block; - - printf("--\n%s:\n", PortalHeapMemoryGetName(this)); - - /* XXX is this the right interface */ - if (PointerIsValid(this->block)) - AllocSetDump(&HEAPMEMBLOCK(this)->setData); - - /* dump the stack too */ - for (block = (HeapMemoryBlock)FixedStackGetTop(&this->stackData); - PointerIsValid(block); - block = (HeapMemoryBlock) - FixedStackGetNext(&this->stackData, (Pointer)block)) { - - printf("--\n"); - AllocSetDump(&block->setData); - } + HeapMemoryBlock block; + + printf("--\n%s:\n", PortalHeapMemoryGetName(this)); + + /* XXX is this the right interface */ + if (PointerIsValid(this->block)) + AllocSetDump(&HEAPMEMBLOCK(this)->setData); + + /* dump the stack too */ + for (block = (HeapMemoryBlock) FixedStackGetTop(&this->stackData); + PointerIsValid(block); + block = (HeapMemoryBlock) + FixedStackGetNext(&this->stackData, (Pointer) block)) + { + + printf("--\n"); + AllocSetDump(&block->setData); + } } /* ---------------------------------------------------------------- - * variable / heap context method tables + * variable / heap context method tables * ---------------------------------------------------------------- */ -static struct MemoryContextMethodsData PortalVariableContextMethodsData = { - PortalVariableMemoryAlloc, /* Pointer (*)(this, uint32) palloc */ - PortalVariableMemoryFree, /* void (*)(this, Pointer) pfree */ - PortalVariableMemoryRealloc,/* Pointer (*)(this, Pointer) repalloc */ - PortalVariableMemoryGetName,/* char* (*)(this) getName */ - PortalVariableMemoryDump /* void (*)(this) dump */ +static struct MemoryContextMethodsData PortalVariableContextMethodsData = { + PortalVariableMemoryAlloc, /* Pointer (*)(this, uint32) palloc */ + PortalVariableMemoryFree, /* void (*)(this, Pointer) pfree */ + PortalVariableMemoryRealloc,/* Pointer (*)(this, Pointer) repalloc */ + PortalVariableMemoryGetName,/* char* (*)(this) getName */ + PortalVariableMemoryDump /* void (*)(this) dump */ }; -static struct MemoryContextMethodsData PortalHeapContextMethodsData = { - PortalHeapMemoryAlloc, /* Pointer (*)(this, uint32) palloc */ - PortalHeapMemoryFree, /* void (*)(this, Pointer) pfree */ - PortalHeapMemoryRealloc, /* Pointer (*)(this, Pointer) repalloc */ - PortalHeapMemoryGetName, /* char* (*)(this) getName */ - PortalHeapMemoryDump /* void (*)(this) dump */ +static struct MemoryContextMethodsData PortalHeapContextMethodsData = { + PortalHeapMemoryAlloc, /* Pointer (*)(this, uint32) palloc */ + PortalHeapMemoryFree, /* void (*)(this, Pointer) pfree */ + PortalHeapMemoryRealloc, /* Pointer (*)(this, Pointer) repalloc */ + PortalHeapMemoryGetName, /* char* (*)(this) getName */ + PortalHeapMemoryDump /* void (*)(this) dump */ }; /* ---------------------------------------------------------------- - * private internal support routines + * private internal support routines * ---------------------------------------------------------------- */ /* ---------------- - * CreateNewBlankPortal + * CreateNewBlankPortal * ---------------- */ static void CreateNewBlankPortal() { - Portal portal; - - AssertState(!PortalIsValid(BlankPortal)); - - /* - * make new portal structure - */ - portal = (Portal) - MemoryContextAlloc((MemoryContext)PortalMemory, sizeof *portal); - - /* - * initialize portal variable context - */ - NodeSetTag((Node*)&portal->variable, T_PortalVariableMemory); - AllocSetInit(&portal->variable.setData, DynamicAllocMode, (Size)0); - portal->variable.method = &PortalVariableContextMethodsData; - - /* - * initialize portal heap context - */ - NodeSetTag((Node*)&portal->heap, T_PortalHeapMemory); - portal->heap.block = NULL; - FixedStackInit(&portal->heap.stackData, - offsetof (HeapMemoryBlockData, itemData)); - portal->heap.method = &PortalHeapContextMethodsData; - - /* - * set bogus portal name - */ - portal->name = "** Blank Portal **"; - - /* initialize portal query */ - portal->queryDesc = NULL; - portal->attinfo = NULL; - portal->state = NULL; - portal->cleanup = NULL; - - /* - * install blank portal - */ - BlankPortal = portal; + Portal portal; + + AssertState(!PortalIsValid(BlankPortal)); + + /* + * make new portal structure + */ + portal = (Portal) + MemoryContextAlloc((MemoryContext) PortalMemory, sizeof *portal); + + /* + * initialize portal variable context + */ + NodeSetTag((Node *) & portal->variable, T_PortalVariableMemory); + AllocSetInit(&portal->variable.setData, DynamicAllocMode, (Size) 0); + portal->variable.method = &PortalVariableContextMethodsData; + + /* + * initialize portal heap context + */ + NodeSetTag((Node *) & portal->heap, T_PortalHeapMemory); + portal->heap.block = NULL; + FixedStackInit(&portal->heap.stackData, + offsetof(HeapMemoryBlockData, itemData)); + portal->heap.method = &PortalHeapContextMethodsData; + + /* + * set bogus portal name + */ + portal->name = "** Blank Portal **"; + + /* initialize portal query */ + portal->queryDesc = NULL; + portal->attinfo = NULL; + portal->state = NULL; + portal->cleanup = NULL; + + /* + * install blank portal + */ + BlankPortal = portal; } bool PortalNameIsSpecial(char *pname) { - if (strcmp(pname, VACPNAME) == 0) - return true; - return false; + if (strcmp(pname, VACPNAME) == 0) + return true; + return false; } /* @@ -420,572 +426,586 @@ PortalNameIsSpecial(char *pname) * and screws up the sequential walk of the table). -mer 17 Aug 1992 */ static void -CollectNamedPortals(Portal *portalP, int destroy) -{ - static Portal *portalList = (Portal *)NULL; - static int listIndex = 0; - static int maxIndex = 9; - - if (portalList == (Portal *)NULL) - portalList = (Portal *)malloc(10*sizeof(Portal)); - - if (destroy != 0) +CollectNamedPortals(Portal * portalP, int destroy) +{ + static Portal *portalList = (Portal *) NULL; + static int listIndex = 0; + static int maxIndex = 9; + + if (portalList == (Portal *) NULL) + portalList = (Portal *) malloc(10 * sizeof(Portal)); + + if (destroy != 0) { - int i; - - for (i = 0; i < listIndex; i++) - PortalDestroy(&portalList[i]); - listIndex = 0; + int i; + + for (i = 0; i < listIndex; i++) + PortalDestroy(&portalList[i]); + listIndex = 0; } - else + else { - Assert(portalP); - Assert(*portalP); - - /* - * Don't delete special portals, up to portal creator to do this - */ - if (PortalNameIsSpecial((*portalP)->name)) - return; - - portalList[listIndex] = *portalP; - listIndex++; - if (listIndex == maxIndex) + Assert(portalP); + Assert(*portalP); + + /* + * Don't delete special portals, up to portal creator to do this + */ + if (PortalNameIsSpecial((*portalP)->name)) + return; + + portalList[listIndex] = *portalP; + listIndex++; + if (listIndex == maxIndex) { - portalList = (Portal *) - realloc(portalList, (maxIndex+11)*sizeof(Portal)); - maxIndex += 10; + portalList = (Portal *) + realloc(portalList, (maxIndex + 11) * sizeof(Portal)); + maxIndex += 10; } } - return; + return; } void AtEOXact_portals() { - HashTableWalk(PortalHashTable, CollectNamedPortals, 0); - CollectNamedPortals(NULL, 1); + HashTableWalk(PortalHashTable, CollectNamedPortals, 0); + CollectNamedPortals(NULL, 1); } /* ---------------- - * PortalDump + * PortalDump * ---------------- */ #ifdef NOT_USED static void -PortalDump(Portal *thisP) +PortalDump(Portal * thisP) { - /* XXX state/argument checking here */ - - PortalVariableMemoryDump(PortalGetVariableMemory(*thisP)); - PortalHeapMemoryDump(PortalGetHeapMemory(*thisP)); + /* XXX state/argument checking here */ + + PortalVariableMemoryDump(PortalGetVariableMemory(*thisP)); + PortalHeapMemoryDump(PortalGetHeapMemory(*thisP)); } + #endif /* ---------------- - * DumpPortals + * DumpPortals * ---------------- */ #ifdef NOT_USED static void DumpPortals() { - /* XXX state checking here */ - - HashTableWalk(PortalHashTable, PortalDump, 0); + /* XXX state checking here */ + + HashTableWalk(PortalHashTable, PortalDump, 0); } + #endif - + /* ---------------------------------------------------------------- - * public portal interface functions + * public portal interface functions * ---------------------------------------------------------------- */ /* * EnablePortalManager -- - * Enables/disables the portal management module. + * Enables/disables the portal management module. */ void EnablePortalManager(bool on) { - static bool processing = false; - HASHCTL ctl; - - AssertState(!processing); - AssertArg(BoolIsValid(on)); - - if (BypassEnable(&PortalManagerEnableCount, on)) - return; - - processing = true; - - if (on) { /* initialize */ - EnableMemoryContext(true); - - PortalMemory = CreateGlobalMemory(PortalMemoryName); - - ctl.keysize = MAX_PORTALNAME_LEN; - ctl.datasize = sizeof(Portal); - - /* use PORTALS_PER_USER, defined in utils/portal.h - * as a guess of how many hash table entries to create, initially - */ - PortalHashTable = hash_create(PORTALS_PER_USER * 3, &ctl, HASH_ELEM); - - CreateNewBlankPortal(); - - } else { /* cleanup */ - if (PortalIsValid(BlankPortal)) { - PortalDestroy(&BlankPortal); - MemoryContextFree((MemoryContext)PortalMemory, - (Pointer)BlankPortal); - BlankPortal = NULL; + static bool processing = false; + HASHCTL ctl; + + AssertState(!processing); + AssertArg(BoolIsValid(on)); + + if (BypassEnable(&PortalManagerEnableCount, on)) + return; + + processing = true; + + if (on) + { /* initialize */ + EnableMemoryContext(true); + + PortalMemory = CreateGlobalMemory(PortalMemoryName); + + ctl.keysize = MAX_PORTALNAME_LEN; + ctl.datasize = sizeof(Portal); + + /* + * use PORTALS_PER_USER, defined in utils/portal.h as a guess of + * how many hash table entries to create, initially + */ + PortalHashTable = hash_create(PORTALS_PER_USER * 3, &ctl, HASH_ELEM); + + CreateNewBlankPortal(); + } - /* - * Each portal must free its non-memory resources specially. - */ - HashTableWalk(PortalHashTable, PortalDestroy, 0); - hash_destroy(PortalHashTable); - PortalHashTable = NULL; - - GlobalMemoryDestroy(PortalMemory); - PortalMemory = NULL; - - EnableMemoryContext(true); - } - - processing = false; + else + { /* cleanup */ + if (PortalIsValid(BlankPortal)) + { + PortalDestroy(&BlankPortal); + MemoryContextFree((MemoryContext) PortalMemory, + (Pointer) BlankPortal); + BlankPortal = NULL; + } + + /* + * Each portal must free its non-memory resources specially. + */ + HashTableWalk(PortalHashTable, PortalDestroy, 0); + hash_destroy(PortalHashTable); + PortalHashTable = NULL; + + GlobalMemoryDestroy(PortalMemory); + PortalMemory = NULL; + + EnableMemoryContext(true); + } + + processing = false; } /* * GetPortalByName -- - * Returns a portal given a portal name; returns blank portal given + * Returns a portal given a portal name; returns blank portal given * NULL; returns invalid portal if portal not found. * * Exceptions: - * BadState if called when disabled. + * BadState if called when disabled. */ Portal GetPortalByName(char *name) { - Portal portal; - - AssertState(PortalManagerEnabled); - - if (PointerIsValid(name)) { - PortalHashTableLookup(name, portal); - } - else { - if (!PortalIsValid(BlankPortal)) - CreateNewBlankPortal(); - portal = BlankPortal; - } - - return (portal); + Portal portal; + + AssertState(PortalManagerEnabled); + + if (PointerIsValid(name)) + { + PortalHashTableLookup(name, portal); + } + else + { + if (!PortalIsValid(BlankPortal)) + CreateNewBlankPortal(); + portal = BlankPortal; + } + + return (portal); } /* * BlankPortalAssignName -- - * Returns former blank portal as portal with given name. + * Returns former blank portal as portal with given name. * * Side effect: - * All references to the former blank portal become incorrect. + * All references to the former blank portal become incorrect. * * Exceptions: - * BadState if called when disabled. - * BadState if called without an intervening call to GetPortalByName(NULL). - * BadArg if portal name is invalid. - * "WARN" if portal name is in use. + * BadState if called when disabled. + * BadState if called without an intervening call to GetPortalByName(NULL). + * BadArg if portal name is invalid. + * "WARN" if portal name is in use. */ Portal -BlankPortalAssignName(char *name) /* XXX PortalName */ -{ - Portal portal; - uint16 length; - - AssertState(PortalManagerEnabled); - AssertState(PortalIsValid(BlankPortal)); - AssertArg(PointerIsValid(name)); /* XXX PortalName */ - - portal = GetPortalByName(name); - if (PortalIsValid(portal)) { - elog(NOTICE, "BlankPortalAssignName: portal %s already exists", name); +BlankPortalAssignName(char *name) /* XXX PortalName */ +{ + Portal portal; + uint16 length; + + AssertState(PortalManagerEnabled); + AssertState(PortalIsValid(BlankPortal)); + AssertArg(PointerIsValid(name)); /* XXX PortalName */ + + portal = GetPortalByName(name); + if (PortalIsValid(portal)) + { + elog(NOTICE, "BlankPortalAssignName: portal %s already exists", name); + return (portal); + } + + /* + * remove blank portal + */ + portal = BlankPortal; + BlankPortal = NULL; + + /* + * initialize portal name + */ + length = 1 + strlen(name); + portal->name = (char *) + MemoryContextAlloc((MemoryContext) & portal->variable, length); + + strncpy(portal->name, name, length); + + /* + * put portal in table + */ + PortalHashTableInsert(portal); + return (portal); - } - - /* - * remove blank portal - */ - portal = BlankPortal; - BlankPortal = NULL; - - /* - * initialize portal name - */ - length = 1 + strlen(name); - portal->name = (char*) - MemoryContextAlloc((MemoryContext)&portal->variable, length); - - strncpy(portal->name, name, length); - - /* - * put portal in table - */ - PortalHashTableInsert(portal); - - return (portal); } /* * PortalSetQuery -- - * Attaches a "query" to portal. + * Attaches a "query" to portal. * * Exceptions: - * BadState if called when disabled. - * BadArg if portal is invalid. - * BadArg if queryDesc is "invalid." - * BadArg if state is "invalid." + * BadState if called when disabled. + * BadArg if portal is invalid. + * BadArg if queryDesc is "invalid." + * BadArg if state is "invalid." */ void PortalSetQuery(Portal portal, - QueryDesc *queryDesc, - TupleDesc attinfo, - EState *state, - void (*cleanup)(Portal portal)) + QueryDesc * queryDesc, + TupleDesc attinfo, + EState * state, + void (*cleanup) (Portal portal)) { - AssertState(PortalManagerEnabled); - AssertArg(PortalIsValid(portal)); - AssertArg(IsA((Node*)state,EState)); - - portal->queryDesc = queryDesc; - portal->state = state; - portal->attinfo = attinfo; - portal->cleanup = cleanup; + AssertState(PortalManagerEnabled); + AssertArg(PortalIsValid(portal)); + AssertArg(IsA((Node *) state, EState)); + + portal->queryDesc = queryDesc; + portal->state = state; + portal->attinfo = attinfo; + portal->cleanup = cleanup; } /* * PortalGetQueryDesc -- - * Returns query attached to portal. + * Returns query attached to portal. * * Exceptions: - * BadState if called when disabled. - * BadArg if portal is invalid. + * BadState if called when disabled. + * BadArg if portal is invalid. */ -QueryDesc * +QueryDesc * PortalGetQueryDesc(Portal portal) { - AssertState(PortalManagerEnabled); - AssertArg(PortalIsValid(portal)); - - return (portal->queryDesc); + AssertState(PortalManagerEnabled); + AssertArg(PortalIsValid(portal)); + + return (portal->queryDesc); } /* * PortalGetState -- - * Returns state attached to portal. + * Returns state attached to portal. * * Exceptions: - * BadState if called when disabled. - * BadArg if portal is invalid. + * BadState if called when disabled. + * BadArg if portal is invalid. */ -EState * +EState * PortalGetState(Portal portal) { - AssertState(PortalManagerEnabled); - AssertArg(PortalIsValid(portal)); - - return (portal->state); + AssertState(PortalManagerEnabled); + AssertArg(PortalIsValid(portal)); + + return (portal->state); } /* * CreatePortal -- - * Returns a new portal given a name. + * Returns a new portal given a name. * * Note: - * This is expected to be of very limited usability. See instead, + * This is expected to be of very limited usability. See instead, * BlankPortalAssignName. * * Exceptions: - * BadState if called when disabled. - * BadArg if portal name is invalid. - * "WARN" if portal name is in use. + * BadState if called when disabled. + * BadArg if portal name is invalid. + * "WARN" if portal name is in use. */ Portal -CreatePortal(char *name) /* XXX PortalName */ -{ - Portal portal; - uint16 length; - - AssertState(PortalManagerEnabled); - AssertArg(PointerIsValid(name)); /* XXX PortalName */ - - portal = GetPortalByName(name); - if (PortalIsValid(portal)) { - elog(NOTICE, "CreatePortal: portal %s already exists", name); +CreatePortal(char *name) /* XXX PortalName */ +{ + Portal portal; + uint16 length; + + AssertState(PortalManagerEnabled); + AssertArg(PointerIsValid(name)); /* XXX PortalName */ + + portal = GetPortalByName(name); + if (PortalIsValid(portal)) + { + elog(NOTICE, "CreatePortal: portal %s already exists", name); + return (portal); + } + + /* make new portal structure */ + portal = (Portal) + MemoryContextAlloc((MemoryContext) PortalMemory, sizeof *portal); + + /* initialize portal variable context */ + NodeSetTag((Node *) & portal->variable, T_PortalVariableMemory); + AllocSetInit(&portal->variable.setData, DynamicAllocMode, (Size) 0); + portal->variable.method = &PortalVariableContextMethodsData; + + /* initialize portal heap context */ + NodeSetTag((Node *) & portal->heap, T_PortalHeapMemory); + portal->heap.block = NULL; + FixedStackInit(&portal->heap.stackData, + offsetof(HeapMemoryBlockData, itemData)); + portal->heap.method = &PortalHeapContextMethodsData; + + /* initialize portal name */ + length = 1 + strlen(name); + portal->name = (char *) + MemoryContextAlloc((MemoryContext) & portal->variable, length); + strncpy(portal->name, name, length); + + /* initialize portal query */ + portal->queryDesc = NULL; + portal->attinfo = NULL; + portal->state = NULL; + portal->cleanup = NULL; + + /* put portal in table */ + PortalHashTableInsert(portal); + + /* Trap(PointerIsValid(name), Unimplemented); */ return (portal); - } - - /* make new portal structure */ - portal = (Portal) - MemoryContextAlloc((MemoryContext)PortalMemory, sizeof *portal); - - /* initialize portal variable context */ - NodeSetTag((Node*)&portal->variable, T_PortalVariableMemory); - AllocSetInit(&portal->variable.setData, DynamicAllocMode, (Size)0); - portal->variable.method = &PortalVariableContextMethodsData; - - /* initialize portal heap context */ - NodeSetTag((Node*)&portal->heap, T_PortalHeapMemory); - portal->heap.block = NULL; - FixedStackInit(&portal->heap.stackData, - offsetof (HeapMemoryBlockData, itemData)); - portal->heap.method = &PortalHeapContextMethodsData; - - /* initialize portal name */ - length = 1 + strlen(name); - portal->name = (char*) - MemoryContextAlloc((MemoryContext)&portal->variable, length); - strncpy(portal->name, name, length); - - /* initialize portal query */ - portal->queryDesc = NULL; - portal->attinfo = NULL; - portal->state = NULL; - portal->cleanup = NULL; - - /* put portal in table */ - PortalHashTableInsert(portal); - - /* Trap(PointerIsValid(name), Unimplemented); */ - return (portal); } /* * PortalDestroy -- - * Destroys portal. + * Destroys portal. * * Exceptions: - * BadState if called when disabled. - * BadArg if portal is invalid. + * BadState if called when disabled. + * BadArg if portal is invalid. */ void -PortalDestroy(Portal *portalP) -{ - Portal portal = *portalP; - - AssertState(PortalManagerEnabled); - AssertArg(PortalIsValid(portal)); - - /* remove portal from table if not blank portal */ - if (portal != BlankPortal) - PortalHashTableDelete(portal); - - /* reset portal */ - if (PointerIsValid(portal->cleanup)) - (*portal->cleanup)(portal); - - PortalResetHeapMemory(portal); - MemoryContextFree((MemoryContext)&portal->variable, - (Pointer)portal->name); - AllocSetReset(&portal->variable.setData); /* XXX log */ - - if (portal != BlankPortal) - MemoryContextFree((MemoryContext)PortalMemory, (Pointer)portal); +PortalDestroy(Portal * portalP) +{ + Portal portal = *portalP; + + AssertState(PortalManagerEnabled); + AssertArg(PortalIsValid(portal)); + + /* remove portal from table if not blank portal */ + if (portal != BlankPortal) + PortalHashTableDelete(portal); + + /* reset portal */ + if (PointerIsValid(portal->cleanup)) + (*portal->cleanup) (portal); + + PortalResetHeapMemory(portal); + MemoryContextFree((MemoryContext) & portal->variable, + (Pointer) portal->name); + AllocSetReset(&portal->variable.setData); /* XXX log */ + + if (portal != BlankPortal) + MemoryContextFree((MemoryContext) PortalMemory, (Pointer) portal); } /* ---------------- - * PortalResetHeapMemory -- - * Resets portal's heap memory context. + * PortalResetHeapMemory -- + * Resets portal's heap memory context. * * Someday, Reset, Start, and End can be optimized by keeping a global * portal module stack of free HeapMemoryBlock's. This will make Start * and End be fast. * * Exceptions: - * BadState if called when disabled. - * BadState if called when not in PortalHeapMemory context. - * BadArg if mode is invalid. + * BadState if called when disabled. + * BadState if called when not in PortalHeapMemory context. + * BadArg if mode is invalid. * ---------------- */ static void PortalResetHeapMemory(Portal portal) { - PortalHeapMemory context; - MemoryContext currentContext; - - context = PortalGetHeapMemory(portal); - - if (PointerIsValid(context->block)) { - /* save present context */ - currentContext = MemoryContextSwitchTo((MemoryContext)context); - - do { - EndPortalAllocMode(); - } while (PointerIsValid(context->block)); - - /* restore context */ - MemoryContextSwitchTo(currentContext); - } + PortalHeapMemory context; + MemoryContext currentContext; + + context = PortalGetHeapMemory(portal); + + if (PointerIsValid(context->block)) + { + /* save present context */ + currentContext = MemoryContextSwitchTo((MemoryContext) context); + + do + { + EndPortalAllocMode(); + } while (PointerIsValid(context->block)); + + /* restore context */ + MemoryContextSwitchTo(currentContext); + } } /* * StartPortalAllocMode -- - * Starts a new block of portal heap allocation using mode and limit; - * the current block is disabled until EndPortalAllocMode is called. + * Starts a new block of portal heap allocation using mode and limit; + * the current block is disabled until EndPortalAllocMode is called. * * Note: - * Note blocks may be stacked and restored arbitarily. - * The semantics of mode and limit are described in aset.h. + * Note blocks may be stacked and restored arbitarily. + * The semantics of mode and limit are described in aset.h. * * Exceptions: - * BadState if called when disabled. - * BadState if called when not in PortalHeapMemory context. - * BadArg if mode is invalid. + * BadState if called when disabled. + * BadState if called when not in PortalHeapMemory context. + * BadArg if mode is invalid. */ void StartPortalAllocMode(AllocMode mode, Size limit) { - PortalHeapMemory context; - - AssertState(PortalManagerEnabled); - AssertState(IsA(CurrentMemoryContext,PortalHeapMemory)); - /* AssertArg(AllocModeIsValid); */ - - context = (PortalHeapMemory)CurrentMemoryContext; - - /* stack current mode */ - if (PointerIsValid(context->block)) - FixedStackPush(&context->stackData, context->block); - - /* allocate and initialize new block */ - context->block = - MemoryContextAlloc( - (MemoryContext)PortalHeapMemoryGetVariableMemory(context), - sizeof (HeapMemoryBlockData) ); - - /* XXX careful, context->block has never been stacked => bad state */ - - AllocSetInit(&HEAPMEMBLOCK(context)->setData, mode, limit); + PortalHeapMemory context; + + AssertState(PortalManagerEnabled); + AssertState(IsA(CurrentMemoryContext, PortalHeapMemory)); + /* AssertArg(AllocModeIsValid); */ + + context = (PortalHeapMemory) CurrentMemoryContext; + + /* stack current mode */ + if (PointerIsValid(context->block)) + FixedStackPush(&context->stackData, context->block); + + /* allocate and initialize new block */ + context->block = + MemoryContextAlloc( + (MemoryContext) PortalHeapMemoryGetVariableMemory(context), + sizeof(HeapMemoryBlockData)); + + /* XXX careful, context->block has never been stacked => bad state */ + + AllocSetInit(&HEAPMEMBLOCK(context)->setData, mode, limit); } /* * EndPortalAllocMode -- - * Ends current block of portal heap allocation; previous block is - * reenabled. + * Ends current block of portal heap allocation; previous block is + * reenabled. * * Note: - * Note blocks may be stacked and restored arbitarily. + * Note blocks may be stacked and restored arbitarily. * * Exceptions: - * BadState if called when disabled. - * BadState if called when not in PortalHeapMemory context. + * BadState if called when disabled. + * BadState if called when not in PortalHeapMemory context. */ void EndPortalAllocMode() { - PortalHeapMemory context; - - AssertState(PortalManagerEnabled); - AssertState(IsA(CurrentMemoryContext,PortalHeapMemory)); - - context = (PortalHeapMemory)CurrentMemoryContext; - AssertState(PointerIsValid(context->block)); /* XXX Trap(...) */ - - /* free current mode */ - AllocSetReset(&HEAPMEMBLOCK(context)->setData); - MemoryContextFree((MemoryContext)PortalHeapMemoryGetVariableMemory(context), - context->block); - - /* restore previous mode */ - context->block = FixedStackPop(&context->stackData); + PortalHeapMemory context; + + AssertState(PortalManagerEnabled); + AssertState(IsA(CurrentMemoryContext, PortalHeapMemory)); + + context = (PortalHeapMemory) CurrentMemoryContext; + AssertState(PointerIsValid(context->block)); /* XXX Trap(...) */ + + /* free current mode */ + AllocSetReset(&HEAPMEMBLOCK(context)->setData); + MemoryContextFree((MemoryContext) PortalHeapMemoryGetVariableMemory(context), + context->block); + + /* restore previous mode */ + context->block = FixedStackPop(&context->stackData); } /* * PortalGetVariableMemory -- - * Returns variable memory context for a given portal. + * Returns variable memory context for a given portal. * * Exceptions: - * BadState if called when disabled. - * BadArg if portal is invalid. + * BadState if called when disabled. + * BadArg if portal is invalid. */ PortalVariableMemory PortalGetVariableMemory(Portal portal) { - return (&portal->variable); + return (&portal->variable); } /* * PortalGetHeapMemory -- - * Returns heap memory context for a given portal. + * Returns heap memory context for a given portal. * * Exceptions: - * BadState if called when disabled. - * BadArg if portal is invalid. + * BadState if called when disabled. + * BadArg if portal is invalid. */ PortalHeapMemory PortalGetHeapMemory(Portal portal) { - return (&portal->heap); + return (&portal->heap); } /* * PortalVariableMemoryGetPortal -- - * Returns portal containing given variable memory context. + * Returns portal containing given variable memory context. * * Exceptions: - * BadState if called when disabled. - * BadArg if context is invalid. + * BadState if called when disabled. + * BadArg if context is invalid. */ -static Portal +static Portal PortalVariableMemoryGetPortal(PortalVariableMemory context) { - return ((Portal)((char *)context - offsetof (PortalD, variable))); + return ((Portal) ((char *) context - offsetof(PortalD, variable))); } /* * PortalHeapMemoryGetPortal -- - * Returns portal containing given heap memory context. + * Returns portal containing given heap memory context. * * Exceptions: - * BadState if called when disabled. - * BadArg if context is invalid. + * BadState if called when disabled. + * BadArg if context is invalid. */ -static Portal +static Portal PortalHeapMemoryGetPortal(PortalHeapMemory context) { - return ((Portal)((char *)context - offsetof (PortalD, heap))); + return ((Portal) ((char *) context - offsetof(PortalD, heap))); } /* * PortalVariableMemoryGetHeapMemory -- - * Returns heap memory context associated with given variable memory. + * Returns heap memory context associated with given variable memory. * * Exceptions: - * BadState if called when disabled. - * BadArg if context is invalid. + * BadState if called when disabled. + * BadArg if context is invalid. */ #ifdef NOT_USED PortalHeapMemory PortalVariableMemoryGetHeapMemory(PortalVariableMemory context) { - return ((PortalHeapMemory)((char *)context - - offsetof (PortalD, variable) - + offsetof (PortalD, heap))); + return ((PortalHeapMemory) ((char *) context + - offsetof(PortalD, variable) + + offsetof(PortalD, heap))); } + #endif /* * PortalHeapMemoryGetVariableMemory -- - * Returns variable memory context associated with given heap memory. + * Returns variable memory context associated with given heap memory. * * Exceptions: - * BadState if called when disabled. - * BadArg if context is invalid. + * BadState if called when disabled. + * BadArg if context is invalid. */ -static PortalVariableMemory +static PortalVariableMemory PortalHeapMemoryGetVariableMemory(PortalHeapMemory context) { - return ((PortalVariableMemory)((char *)context - - offsetof (PortalD, heap) - + offsetof (PortalD, variable))); + return ((PortalVariableMemory) ((char *) context + - offsetof(PortalD, heap) + + offsetof(PortalD, variable))); } - |