aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/mmgr/mcxt.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/mmgr/mcxt.c')
-rw-r--r--src/backend/utils/mmgr/mcxt.c517
1 files changed, 267 insertions, 250 deletions
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