fixes #23725; Size computations work better when they are correct (#23758)

[backport]
This commit is contained in:
Andreas Rumpf
2024-06-26 05:09:05 +02:00
committed by GitHub
parent 948fc29bb2
commit 8096fa45bd

View File

@@ -789,13 +789,13 @@ when defined(gcDestructors):
# Well, not for the entire list, but for `max` elements of the list because
# we split the list in order to achieve bounded response times.
var it = c.freeList
var x = 0
var total = 0
while it != nil:
inc x, size
inc total, size
let chunk = cast[PSmallChunk](pageAddr(it))
inc(chunk.free, x)
inc(chunk.free, size)
it = it.next
dec(a.occ, x)
dec(a.occ, total)
proc freeDeferredObjects(a: var MemRegion; root: PBigChunk) =
var it = root
@@ -904,7 +904,7 @@ proc rawAlloc(a: var MemRegion, requestedSize: int): pointer =
trackSize(c.size)
sysAssert(isAccessible(a, result), "rawAlloc 14")
sysAssert(allocInv(a), "rawAlloc: end")
when logAlloc: cprintf("var pointer_%p = alloc(%ld)\n", result, requestedSize)
when logAlloc: cprintf("var pointer_%p = alloc(%ld) # %p\n", result, requestedSize, addr a)
proc rawAlloc0(a: var MemRegion, requestedSize: int): pointer =
result = rawAlloc(a, requestedSize)
@@ -953,6 +953,8 @@ proc rawDealloc(a: var MemRegion, p: pointer) =
c.size = SmallChunkSize
freeBigChunk(a, cast[PBigChunk](c))
else:
when logAlloc: cprintf("dealloc(pointer_%p) # SMALL FROM %p CALLER %p\n", p, c.owner, addr(a))
when defined(gcDestructors):
addToSharedFreeList(c, f, s div MemAlign)
sysAssert(((cast[int](p) and PageMask) - smallChunkOverhead()) %%
@@ -960,6 +962,7 @@ proc rawDealloc(a: var MemRegion, p: pointer) =
else:
# set to 0xff to check for usage after free bugs:
when overwriteFree: nimSetMem(p, -1'i32, c.size -% bigChunkOverhead())
when logAlloc: cprintf("dealloc(pointer_%p) # BIG %p\n", p, c.owner)
when defined(gcDestructors):
if c.owner == addr(a):
deallocBigChunk(a, cast[PBigChunk](c))
@@ -967,8 +970,9 @@ proc rawDealloc(a: var MemRegion, p: pointer) =
addToSharedFreeListBigChunks(c.owner[], cast[PBigChunk](c))
else:
deallocBigChunk(a, cast[PBigChunk](c))
sysAssert(allocInv(a), "rawDealloc: end")
when logAlloc: cprintf("dealloc(pointer_%p)\n", p)
#when logAlloc: cprintf("dealloc(pointer_%p)\n", p)
when not defined(gcDestructors):
proc isAllocatedPtr(a: MemRegion, p: pointer): bool =