fix allocator corruption for large sizes (#7338)
* fix allocator corruption for large sizes * allow large chunks to coalesce and added test case * use correct constants in MaxBigChunkSize
This commit is contained in:
parent
d20729e840
commit
e39f2a9283
5 changed files with 92 additions and 41 deletions
|
|
@ -8,7 +8,7 @@ x.dealloc()
|
|||
|
||||
x = createU(int, 3)
|
||||
assert x != nil
|
||||
x.free()
|
||||
x.dealloc()
|
||||
|
||||
x = create(int, 4)
|
||||
assert cast[ptr array[4, int]](x)[0] == 0
|
||||
|
|
@ -18,7 +18,7 @@ assert cast[ptr array[4, int]](x)[3] == 0
|
|||
|
||||
x = x.resize(4)
|
||||
assert x != nil
|
||||
x.free()
|
||||
x.dealloc()
|
||||
|
||||
x = cast[ptr int](allocShared(100))
|
||||
assert x != nil
|
||||
|
|
@ -26,7 +26,7 @@ deallocShared(x)
|
|||
|
||||
x = createSharedU(int, 3)
|
||||
assert x != nil
|
||||
x.freeShared()
|
||||
x.deallocShared()
|
||||
|
||||
x = createShared(int, 3)
|
||||
assert x != nil
|
||||
|
|
@ -37,7 +37,7 @@ assert cast[ptr array[3, int]](x)[2] == 0
|
|||
assert x != nil
|
||||
x = cast[ptr int](x.resizeShared(2))
|
||||
assert x != nil
|
||||
x.freeShared()
|
||||
x.deallocShared()
|
||||
|
||||
x = create(int, 10)
|
||||
assert x != nil
|
||||
|
|
@ -49,4 +49,9 @@ x = createShared(int, 1)
|
|||
assert x != nil
|
||||
x = x.resizeShared(1)
|
||||
assert x != nil
|
||||
x.freeShared()
|
||||
x.deallocShared()
|
||||
|
||||
x = cast[ptr int](alloc0(125 shl 23))
|
||||
dealloc(x)
|
||||
x = cast[ptr int](alloc0(126 shl 23))
|
||||
dealloc(x)
|
||||
37
tests/system/talloc2.nim
Normal file
37
tests/system/talloc2.nim
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
const
|
||||
nmax = 2*1024*1024*1024
|
||||
|
||||
proc test(n: int) =
|
||||
var a = alloc0(9999)
|
||||
var t = cast[ptr UncheckedArray[int8]](alloc(n))
|
||||
var b = alloc0(9999)
|
||||
t[0] = 1
|
||||
t[1] = 2
|
||||
t[n-2] = 3
|
||||
t[n-1] = 4
|
||||
dealloc(a)
|
||||
dealloc(t)
|
||||
dealloc(b)
|
||||
|
||||
# allocator adds 48 bytes to BigChunk
|
||||
# BigChunk allocator edges at 2^n * (1 - s) for s = [1..32]/64
|
||||
proc test2(n: int) =
|
||||
let d = n div 256 # cover edges and more
|
||||
for i in countdown(128,1):
|
||||
for j in [-4096, -64, -49, -48, -47, -32, 0, 4096]:
|
||||
let b = n + j - i*d
|
||||
if b>0 and b<=nmax:
|
||||
test(b)
|
||||
#echo b, ": ", getTotalMem(), " ", getOccupiedMem(), " ", getFreeMem()
|
||||
|
||||
proc test3 =
|
||||
var n = 1
|
||||
while n <= nmax:
|
||||
test2(n)
|
||||
n *= 2
|
||||
n = nmax
|
||||
while n >= 1:
|
||||
test2(n)
|
||||
n = n div 2
|
||||
|
||||
test3()
|
||||
Loading…
Add table
Add a link
Reference in a new issue