@@ -132,6 +132,7 @@ typedef struct AllocSetContext
132
132
Size maxBlockSize ; /* maximum block size */
133
133
Size nextBlockSize ; /* next block size to allocate */
134
134
Size allocChunkLimit ; /* effective chunk size limit */
135
+ Size memAllocated ; /* track memory allocated for this context */
135
136
AllocBlock keeper ; /* keep this block over resets */
136
137
/* freelist this context could be put in, or -1 if not a candidate: */
137
138
int freeListIndex ; /* index in context_freelists[], or -1 */
@@ -272,6 +273,7 @@ static void *AllocSetRealloc(MemoryContext context, void *pointer, Size size);
272
273
static void AllocSetReset (MemoryContext context );
273
274
static void AllocSetDelete (MemoryContext context );
274
275
static Size AllocSetGetChunkSpace (MemoryContext context , void * pointer );
276
+ static Size AllocSetMemAllocated (MemoryContext context );
275
277
static bool AllocSetIsEmpty (MemoryContext context );
276
278
static void AllocSetStats (MemoryContext context ,
277
279
MemoryStatsPrintFunc printfunc , void * passthru ,
@@ -291,6 +293,7 @@ static const MemoryContextMethods AllocSetMethods = {
291
293
AllocSetReset ,
292
294
AllocSetDelete ,
293
295
AllocSetGetChunkSpace ,
296
+ AllocSetMemAllocated ,
294
297
AllocSetIsEmpty ,
295
298
AllocSetStats
296
299
#ifdef MEMORY_CONTEXT_CHECKING
@@ -464,8 +467,7 @@ AllocSetContextCreateInternal(MemoryContext parent,
464
467
parent ,
465
468
name );
466
469
467
- ((MemoryContext ) set )-> mem_allocated =
468
- set -> keeper -> endptr - ((char * ) set );
470
+ set -> memAllocated = set -> keeper -> endptr - ((char * ) set );
469
471
470
472
return (MemoryContext ) set ;
471
473
}
@@ -555,7 +557,7 @@ AllocSetContextCreateInternal(MemoryContext parent,
555
557
parent ,
556
558
name );
557
559
558
- (( MemoryContext ) set ) -> mem_allocated = firstBlockSize ;
560
+ set -> memAllocated = firstBlockSize ;
559
561
560
562
return (MemoryContext ) set ;
561
563
}
@@ -617,7 +619,7 @@ AllocSetReset(MemoryContext context)
617
619
else
618
620
{
619
621
/* Normal case, release the block */
620
- context -> mem_allocated -= block -> endptr - ((char * ) block );
622
+ set -> memAllocated -= block -> endptr - ((char * ) block );
621
623
622
624
#ifdef CLOBBER_FREED_MEMORY
623
625
wipe_mem (block , block -> freeptr - ((char * ) block ));
@@ -627,7 +629,7 @@ AllocSetReset(MemoryContext context)
627
629
block = next ;
628
630
}
629
631
630
- Assert (context -> mem_allocated == keepersize );
632
+ Assert (set -> memAllocated == keepersize );
631
633
632
634
/* Reset block size allocation sequence, too */
633
635
set -> nextBlockSize = set -> initBlockSize ;
@@ -703,7 +705,7 @@ AllocSetDelete(MemoryContext context)
703
705
AllocBlock next = block -> next ;
704
706
705
707
if (block != set -> keeper )
706
- context -> mem_allocated -= block -> endptr - ((char * ) block );
708
+ set -> memAllocated -= block -> endptr - ((char * ) block );
707
709
708
710
#ifdef CLOBBER_FREED_MEMORY
709
711
wipe_mem (block , block -> freeptr - ((char * ) block ));
@@ -715,7 +717,7 @@ AllocSetDelete(MemoryContext context)
715
717
block = next ;
716
718
}
717
719
718
- Assert (context -> mem_allocated == keepersize );
720
+ Assert (set -> memAllocated == keepersize );
719
721
720
722
/* Finally, free the context header, including the keeper block */
721
723
free (set );
@@ -758,7 +760,7 @@ AllocSetAlloc(MemoryContext context, Size size)
758
760
if (block == NULL )
759
761
return NULL ;
760
762
761
- context -> mem_allocated += blksize ;
763
+ set -> memAllocated += blksize ;
762
764
763
765
block -> aset = set ;
764
766
block -> freeptr = block -> endptr = ((char * ) block ) + blksize ;
@@ -955,7 +957,7 @@ AllocSetAlloc(MemoryContext context, Size size)
955
957
if (block == NULL )
956
958
return NULL ;
957
959
958
- context -> mem_allocated += blksize ;
960
+ set -> memAllocated += blksize ;
959
961
960
962
block -> aset = set ;
961
963
block -> freeptr = ((char * ) block ) + ALLOC_BLOCKHDRSZ ;
@@ -1058,7 +1060,7 @@ AllocSetFree(MemoryContext context, void *pointer)
1058
1060
if (block -> next )
1059
1061
block -> next -> prev = block -> prev ;
1060
1062
1061
- context -> mem_allocated -= block -> endptr - ((char * ) block );
1063
+ set -> memAllocated -= block -> endptr - ((char * ) block );
1062
1064
1063
1065
#ifdef CLOBBER_FREED_MEMORY
1064
1066
wipe_mem (block , block -> freeptr - ((char * ) block ));
@@ -1161,8 +1163,8 @@ AllocSetRealloc(MemoryContext context, void *pointer, Size size)
1161
1163
}
1162
1164
1163
1165
/* updated separately, not to underflow when (oldblksize > blksize) */
1164
- context -> mem_allocated -= oldblksize ;
1165
- context -> mem_allocated += blksize ;
1166
+ set -> memAllocated -= oldblksize ;
1167
+ set -> memAllocated += blksize ;
1166
1168
1167
1169
block -> freeptr = block -> endptr = ((char * ) block ) + blksize ;
1168
1170
@@ -1337,6 +1339,24 @@ AllocSetGetChunkSpace(MemoryContext context, void *pointer)
1337
1339
return result ;
1338
1340
}
1339
1341
1342
+ /*
1343
+ * All memory currently allocated for this context (including fragmentation
1344
+ * and freed chunks).
1345
+ *
1346
+ * Allocation sizes double (up to maxBlockSize), so the current block may
1347
+ * represent half of the total space allocated to the context. Subtract away
1348
+ * the free space at the tail of the current block, which may never have been
1349
+ * touched.
1350
+ */
1351
+ static Size
1352
+ AllocSetMemAllocated (MemoryContext context )
1353
+ {
1354
+ AllocSet set = (AllocSet ) context ;
1355
+ AllocBlock currentBlock = set -> blocks ;
1356
+ Size tailSpace = currentBlock -> endptr - currentBlock -> freeptr ;
1357
+ return set -> memAllocated - tailSpace ;
1358
+ }
1359
+
1340
1360
/*
1341
1361
* AllocSetIsEmpty
1342
1362
* Is an allocset empty of any allocated space?
@@ -1538,7 +1558,7 @@ AllocSetCheck(MemoryContext context)
1538
1558
name , block );
1539
1559
}
1540
1560
1541
- Assert (total_allocated == context -> mem_allocated );
1561
+ Assert (total_allocated == set -> memAllocated );
1542
1562
}
1543
1563
1544
1564
#endif /* MEMORY_CONTEXT_CHECKING */
0 commit comments