@@ -458,6 +458,9 @@ AllocSetContextCreateInternal(MemoryContext parent,
458458 parent ,
459459 name );
460460
461+ ((MemoryContext ) set )-> mem_allocated =
462+ set -> keeper -> endptr - ((char * ) set );
463+
461464 return (MemoryContext ) set ;
462465 }
463466 }
@@ -546,6 +549,8 @@ AllocSetContextCreateInternal(MemoryContext parent,
546549 parent ,
547550 name );
548551
552+ ((MemoryContext ) set )-> mem_allocated = firstBlockSize ;
553+
549554 return (MemoryContext ) set ;
550555}
551556
@@ -566,6 +571,7 @@ AllocSetReset(MemoryContext context)
566571{
567572 AllocSet set = (AllocSet ) context ;
568573 AllocBlock block ;
574+ Size keepersize = set -> keeper -> endptr - ((char * ) set );
569575
570576 AssertArg (AllocSetIsValid (set ));
571577
@@ -604,6 +610,8 @@ AllocSetReset(MemoryContext context)
604610 else
605611 {
606612 /* Normal case, release the block */
613+ context -> mem_allocated -= block -> endptr - ((char * ) block );
614+
607615#ifdef CLOBBER_FREED_MEMORY
608616 wipe_mem (block , block -> freeptr - ((char * ) block ));
609617#endif
@@ -612,6 +620,8 @@ AllocSetReset(MemoryContext context)
612620 block = next ;
613621 }
614622
623+ Assert (context -> mem_allocated == keepersize );
624+
615625 /* Reset block size allocation sequence, too */
616626 set -> nextBlockSize = set -> initBlockSize ;
617627}
@@ -628,6 +638,7 @@ AllocSetDelete(MemoryContext context)
628638{
629639 AllocSet set = (AllocSet ) context ;
630640 AllocBlock block = set -> blocks ;
641+ Size keepersize = set -> keeper -> endptr - ((char * ) set );
631642
632643 AssertArg (AllocSetIsValid (set ));
633644
@@ -683,6 +694,9 @@ AllocSetDelete(MemoryContext context)
683694 {
684695 AllocBlock next = block -> next ;
685696
697+ if (block != set -> keeper )
698+ context -> mem_allocated -= block -> endptr - ((char * ) block );
699+
686700#ifdef CLOBBER_FREED_MEMORY
687701 wipe_mem (block , block -> freeptr - ((char * ) block ));
688702#endif
@@ -693,6 +707,8 @@ AllocSetDelete(MemoryContext context)
693707 block = next ;
694708 }
695709
710+ Assert (context -> mem_allocated == keepersize );
711+
696712 /* Finally, free the context header, including the keeper block */
697713 free (set );
698714}
@@ -733,6 +749,9 @@ AllocSetAlloc(MemoryContext context, Size size)
733749 block = (AllocBlock ) malloc (blksize );
734750 if (block == NULL )
735751 return NULL ;
752+
753+ context -> mem_allocated += blksize ;
754+
736755 block -> aset = set ;
737756 block -> freeptr = block -> endptr = ((char * ) block ) + blksize ;
738757
@@ -928,6 +947,8 @@ AllocSetAlloc(MemoryContext context, Size size)
928947 if (block == NULL )
929948 return NULL ;
930949
950+ context -> mem_allocated += blksize ;
951+
931952 block -> aset = set ;
932953 block -> freeptr = ((char * ) block ) + ALLOC_BLOCKHDRSZ ;
933954 block -> endptr = ((char * ) block ) + blksize ;
@@ -1028,6 +1049,9 @@ AllocSetFree(MemoryContext context, void *pointer)
10281049 set -> blocks = block -> next ;
10291050 if (block -> next )
10301051 block -> next -> prev = block -> prev ;
1052+
1053+ context -> mem_allocated -= block -> endptr - ((char * ) block );
1054+
10311055#ifdef CLOBBER_FREED_MEMORY
10321056 wipe_mem (block , block -> freeptr - ((char * ) block ));
10331057#endif
@@ -1144,6 +1168,7 @@ AllocSetRealloc(MemoryContext context, void *pointer, Size size)
11441168 AllocBlock block = (AllocBlock ) (((char * ) chunk ) - ALLOC_BLOCKHDRSZ );
11451169 Size chksize ;
11461170 Size blksize ;
1171+ Size oldblksize ;
11471172
11481173 /*
11491174 * Try to verify that we have a sane block pointer: it should
@@ -1159,13 +1184,18 @@ AllocSetRealloc(MemoryContext context, void *pointer, Size size)
11591184 /* Do the realloc */
11601185 chksize = MAXALIGN (size );
11611186 blksize = chksize + ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ ;
1187+ oldblksize = block -> endptr - ((char * )block );
1188+
11621189 block = (AllocBlock ) realloc (block , blksize );
11631190 if (block == NULL )
11641191 {
11651192 /* Disallow external access to private part of chunk header. */
11661193 VALGRIND_MAKE_MEM_NOACCESS (chunk , ALLOCCHUNK_PRIVATE_LEN );
11671194 return NULL ;
11681195 }
1196+
1197+ context -> mem_allocated += blksize - oldblksize ;
1198+
11691199 block -> freeptr = block -> endptr = ((char * ) block ) + blksize ;
11701200
11711201 /* Update pointers since block has likely been moved */
@@ -1383,6 +1413,7 @@ AllocSetCheck(MemoryContext context)
13831413 const char * name = set -> header .name ;
13841414 AllocBlock prevblock ;
13851415 AllocBlock block ;
1416+ int64 total_allocated = 0 ;
13861417
13871418 for (prevblock = NULL , block = set -> blocks ;
13881419 block != NULL ;
@@ -1393,6 +1424,11 @@ AllocSetCheck(MemoryContext context)
13931424 long blk_data = 0 ;
13941425 long nchunks = 0 ;
13951426
1427+ if (set -> keeper == block )
1428+ total_allocated += block -> endptr - ((char * ) set );
1429+ else
1430+ total_allocated += block -> endptr - ((char * ) block );
1431+
13961432 /*
13971433 * Empty block - empty can be keeper-block only
13981434 */
@@ -1479,6 +1515,8 @@ AllocSetCheck(MemoryContext context)
14791515 elog (WARNING , "problem in alloc set %s: found inconsistent memory block %p" ,
14801516 name , block );
14811517 }
1518+
1519+ Assert (total_allocated == context -> mem_allocated );
14821520}
14831521
14841522#endif /* MEMORY_CONTEXT_CHECKING */
0 commit comments