@ -458,6 +458,9 @@ AllocSetContextCreateInternal(MemoryContext parent,
parent ,
name ) ;
( ( MemoryContext ) set ) - > mem_allocated =
set - > keeper - > endptr - ( ( char * ) set ) ;
return ( MemoryContext ) set ;
}
}
@ -546,6 +549,8 @@ AllocSetContextCreateInternal(MemoryContext parent,
parent ,
name ) ;
( ( MemoryContext ) set ) - > mem_allocated = firstBlockSize ;
return ( MemoryContext ) set ;
}
@ -566,6 +571,7 @@ AllocSetReset(MemoryContext context)
{
AllocSet set = ( AllocSet ) context ;
AllocBlock block ;
Size keepersize = set - > keeper - > endptr - ( ( char * ) set ) ;
AssertArg ( AllocSetIsValid ( set ) ) ;
@ -604,6 +610,8 @@ AllocSetReset(MemoryContext context)
else
{
/* Normal case, release the block */
context - > mem_allocated - = block - > endptr - ( ( char * ) block ) ;
# ifdef CLOBBER_FREED_MEMORY
wipe_mem ( block , block - > freeptr - ( ( char * ) block ) ) ;
# endif
@ -612,6 +620,8 @@ AllocSetReset(MemoryContext context)
block = next ;
}
Assert ( context - > mem_allocated = = keepersize ) ;
/* Reset block size allocation sequence, too */
set - > nextBlockSize = set - > initBlockSize ;
}
@ -628,6 +638,7 @@ AllocSetDelete(MemoryContext context)
{
AllocSet set = ( AllocSet ) context ;
AllocBlock block = set - > blocks ;
Size keepersize = set - > keeper - > endptr - ( ( char * ) set ) ;
AssertArg ( AllocSetIsValid ( set ) ) ;
@ -683,6 +694,9 @@ AllocSetDelete(MemoryContext context)
{
AllocBlock next = block - > next ;
if ( block ! = set - > keeper )
context - > mem_allocated - = block - > endptr - ( ( char * ) block ) ;
# ifdef CLOBBER_FREED_MEMORY
wipe_mem ( block , block - > freeptr - ( ( char * ) block ) ) ;
# endif
@ -693,6 +707,8 @@ AllocSetDelete(MemoryContext context)
block = next ;
}
Assert ( context - > mem_allocated = = keepersize ) ;
/* Finally, free the context header, including the keeper block */
free ( set ) ;
}
@ -733,6 +749,9 @@ AllocSetAlloc(MemoryContext context, Size size)
block = ( AllocBlock ) malloc ( blksize ) ;
if ( block = = NULL )
return NULL ;
context - > mem_allocated + = blksize ;
block - > aset = set ;
block - > freeptr = block - > endptr = ( ( char * ) block ) + blksize ;
@ -928,6 +947,8 @@ AllocSetAlloc(MemoryContext context, Size size)
if ( block = = NULL )
return NULL ;
context - > mem_allocated + = blksize ;
block - > aset = set ;
block - > freeptr = ( ( char * ) block ) + ALLOC_BLOCKHDRSZ ;
block - > endptr = ( ( char * ) block ) + blksize ;
@ -1028,6 +1049,9 @@ AllocSetFree(MemoryContext context, void *pointer)
set - > blocks = block - > next ;
if ( block - > next )
block - > next - > prev = block - > prev ;
context - > mem_allocated - = block - > endptr - ( ( char * ) block ) ;
# ifdef CLOBBER_FREED_MEMORY
wipe_mem ( block , block - > freeptr - ( ( char * ) block ) ) ;
# endif
@ -1144,6 +1168,7 @@ AllocSetRealloc(MemoryContext context, void *pointer, Size size)
AllocBlock block = ( AllocBlock ) ( ( ( char * ) chunk ) - ALLOC_BLOCKHDRSZ ) ;
Size chksize ;
Size blksize ;
Size oldblksize ;
/*
* Try to verify that we have a sane block pointer : it should
@ -1159,6 +1184,8 @@ AllocSetRealloc(MemoryContext context, void *pointer, Size size)
/* Do the realloc */
chksize = MAXALIGN ( size ) ;
blksize = chksize + ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ ;
oldblksize = block - > endptr - ( ( char * ) block ) ;
block = ( AllocBlock ) realloc ( block , blksize ) ;
if ( block = = NULL )
{
@ -1166,6 +1193,9 @@ AllocSetRealloc(MemoryContext context, void *pointer, Size size)
VALGRIND_MAKE_MEM_NOACCESS ( chunk , ALLOCCHUNK_PRIVATE_LEN ) ;
return NULL ;
}
context - > mem_allocated + = blksize - oldblksize ;
block - > freeptr = block - > endptr = ( ( char * ) block ) + blksize ;
/* Update pointers since block has likely been moved */
@ -1383,6 +1413,7 @@ AllocSetCheck(MemoryContext context)
const char * name = set - > header . name ;
AllocBlock prevblock ;
AllocBlock block ;
int64 total_allocated = 0 ;
for ( prevblock = NULL , block = set - > blocks ;
block ! = NULL ;
@ -1393,6 +1424,11 @@ AllocSetCheck(MemoryContext context)
long blk_data = 0 ;
long nchunks = 0 ;
if ( set - > keeper = = block )
total_allocated + = block - > endptr - ( ( char * ) set ) ;
else
total_allocated + = block - > endptr - ( ( char * ) block ) ;
/*
* Empty block - empty can be keeper - block only
*/
@ -1479,6 +1515,8 @@ AllocSetCheck(MemoryContext context)
elog ( WARNING , " problem in alloc set %s: found inconsistent memory block %p " ,
name , block ) ;
}
Assert ( total_allocated = = context - > mem_allocated ) ;
}
# endif /* MEMORY_CONTEXT_CHECKING */