/*
* 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
/* 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 */
context->keeper = block;
}
- context->isReset = true;
-
return (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);
/* Reset block size allocation sequence, too */
set->nextBlockSize = set->initBlockSize;
-
- set->isReset = true;
}
/*
set->blocks = block;
}
- set->isReset = false;
-
AllocAllocInfo(set, chunk);
return AllocChunkGetPointer(chunk);
}
randomize_mem((char *) AllocChunkGetPointer(chunk), size);
#endif
- /* isReset must be false already */
- Assert(!set->isReset);
-
AllocAllocInfo(set, chunk);
return AllocChunkGetPointer(chunk);
}
randomize_mem((char *) AllocChunkGetPointer(chunk), size);
#endif
- set->isReset = false;
-
AllocAllocInfo(set, chunk);
return AllocChunkGetPointer(chunk);
}
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
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;
}
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;
+ }
}
/*
node->parent = NULL; /* for the moment */
node->firstchild = NULL;
node->nextchild = NULL;
+ node->isReset = true;
node->name = ((char *) node) + size;
strcpy(node->name, name);
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;
}
/*
MemSetAligned(ret, 0, size);
+ context->isReset = false;
return ret;
}
MemSetLoop(ret, 0, size);
+ context->isReset = false;
return ret;
}
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);
}