aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/utils/mmgr/aset.c25
-rw-r--r--src/backend/utils/mmgr/mcxt.c18
-rw-r--r--src/include/nodes/memnodes.h1
3 files changed, 19 insertions, 25 deletions
diff --git a/src/backend/utils/mmgr/aset.c b/src/backend/utils/mmgr/aset.c
index 140b0c74d97..9e321283e59 100644
--- a/src/backend/utils/mmgr/aset.c
+++ b/src/backend/utils/mmgr/aset.c
@@ -128,7 +128,7 @@ typedef void *AllocPointer;
/*
* AllocSetContext is our standard implementation of MemoryContext.
*
- * Note: isReset means there is nothing for AllocSetReset to do. This is
+ * Note: header.isReset means there is nothing for AllocSetReset to do. This is
* different from the aset being physically empty (empty blocks list) because
* we may still have a keeper block. It's also different from the set being
* logically empty, because we don't attempt to detect pfree'ing the last
@@ -140,7 +140,6 @@ typedef struct AllocSetContext
/* Info about storage allocated in this context: */
AllocBlock blocks; /* head of list of blocks in this set */
AllocChunk freelist[ALLOCSET_NUM_FREELISTS]; /* free chunk lists */
- bool isReset; /* T = no space alloced since last reset */
/* Allocation parameters for this context: */
Size initBlockSize; /* initial block size */
Size maxBlockSize; /* maximum block size */
@@ -427,8 +426,6 @@ AllocSetContextCreate(MemoryContext parent,
context->keeper = block;
}
- context->isReset = true;
-
return (MemoryContext) context;
}
@@ -472,10 +469,6 @@ AllocSetReset(MemoryContext context)
AssertArg(AllocSetIsValid(set));
- /* Nothing to do if no pallocs since startup or last reset */
- if (set->isReset)
- return;
-
#ifdef MEMORY_CONTEXT_CHECKING
/* Check for corruption and leaks before freeing */
AllocSetCheck(context);
@@ -519,8 +512,6 @@ AllocSetReset(MemoryContext context)
/* Reset block size allocation sequence, too */
set->nextBlockSize = set->initBlockSize;
-
- set->isReset = true;
}
/*
@@ -629,8 +620,6 @@ AllocSetAlloc(MemoryContext context, Size size)
set->blocks = block;
}
- set->isReset = false;
-
AllocAllocInfo(set, chunk);
return AllocChunkGetPointer(chunk);
}
@@ -662,9 +651,6 @@ AllocSetAlloc(MemoryContext context, Size size)
randomize_mem((char *) AllocChunkGetPointer(chunk), size);
#endif
- /* isReset must be false already */
- Assert(!set->isReset);
-
AllocAllocInfo(set, chunk);
return AllocChunkGetPointer(chunk);
}
@@ -822,8 +808,6 @@ AllocSetAlloc(MemoryContext context, Size size)
randomize_mem((char *) AllocChunkGetPointer(chunk), size);
#endif
- set->isReset = false;
-
AllocAllocInfo(set, chunk);
return AllocChunkGetPointer(chunk);
}
@@ -922,9 +906,6 @@ AllocSetRealloc(MemoryContext context, void *pointer, Size size)
set->header.name, chunk);
#endif
- /* isReset must be false already */
- Assert(!set->isReset);
-
/*
* Chunk sizes are aligned to power of 2 in AllocSetAlloc(). Maybe the
* allocated area already is >= the new size. (In particular, we always
@@ -1059,15 +1040,13 @@ AllocSetGetChunkSpace(MemoryContext context, void *pointer)
static bool
AllocSetIsEmpty(MemoryContext context)
{
- AllocSet set = (AllocSet) context;
-
/*
* For now, we say "empty" only if the context is new or just reset. We
* could examine the freelists to determine if all space has been freed,
* but it's not really worth the trouble for present uses of this
* functionality.
*/
- if (set->isReset)
+ if (context->isReset)
return true;
return false;
}
diff --git a/src/backend/utils/mmgr/mcxt.c b/src/backend/utils/mmgr/mcxt.c
index 8783edf0263..980cce518cf 100644
--- a/src/backend/utils/mmgr/mcxt.c
+++ b/src/backend/utils/mmgr/mcxt.c
@@ -127,7 +127,12 @@ MemoryContextReset(MemoryContext context)
if (context->firstchild != NULL)
MemoryContextResetChildren(context);
- (*context->methods->reset) (context);
+ /* Nothing to do if no pallocs since startup or last reset */
+ if (!context->isReset)
+ {
+ (*context->methods->reset) (context);
+ context->isReset = true;
+ }
}
/*
@@ -476,6 +481,7 @@ MemoryContextCreate(NodeTag tag, Size size,
node->parent = NULL; /* for the moment */
node->firstchild = NULL;
node->nextchild = NULL;
+ node->isReset = true;
node->name = ((char *) node) + size;
strcpy(node->name, name);
@@ -504,13 +510,16 @@ MemoryContextCreate(NodeTag tag, Size size,
void *
MemoryContextAlloc(MemoryContext context, Size size)
{
+ void *ret;
AssertArg(MemoryContextIsValid(context));
if (!AllocSizeIsValid(size))
elog(ERROR, "invalid memory alloc request size %lu",
(unsigned long) size);
- return (*context->methods->alloc) (context, size);
+ ret = (*context->methods->alloc) (context, size);
+ context->isReset = false;
+ return ret;
}
/*
@@ -535,6 +544,7 @@ MemoryContextAllocZero(MemoryContext context, Size size)
MemSetAligned(ret, 0, size);
+ context->isReset = false;
return ret;
}
@@ -560,6 +570,7 @@ MemoryContextAllocZeroAligned(MemoryContext context, Size size)
MemSetLoop(ret, 0, size);
+ context->isReset = false;
return ret;
}
@@ -620,6 +631,9 @@ repalloc(void *pointer, Size size)
elog(ERROR, "invalid memory alloc request size %lu",
(unsigned long) size);
+ /* isReset must be false already */
+ Assert(!header->context->isReset);
+
return (*header->context->methods->realloc) (header->context,
pointer, size);
}
diff --git a/src/include/nodes/memnodes.h b/src/include/nodes/memnodes.h
index b62ed8f904a..62a0f9730ed 100644
--- a/src/include/nodes/memnodes.h
+++ b/src/include/nodes/memnodes.h
@@ -59,6 +59,7 @@ typedef struct MemoryContextData
MemoryContext firstchild; /* head of linked list of children */
MemoryContext nextchild; /* next child of same parent */
char *name; /* context name (just for debugging) */
+ bool isReset; /* T = no space alloced since last reset */
} MemoryContextData;
/* utils/palloc.h contains typedef struct MemoryContextData *MemoryContext */