make memory regions robust; disable free lists for now
This commit is contained in:
parent
1c478db375
commit
88bc2d8df4
1 changed files with 32 additions and 28 deletions
|
|
@ -70,8 +70,9 @@ type
|
||||||
bump: pointer
|
bump: pointer
|
||||||
head, tail: Chunk
|
head, tail: Chunk
|
||||||
nextChunkSize, totalSize: int
|
nextChunkSize, totalSize: int
|
||||||
freeLists: array[MaxSmallObject div MemAlign, FreeEntry]
|
when false:
|
||||||
holes: SizedFreeEntry
|
freeLists: array[MaxSmallObject div MemAlign, FreeEntry]
|
||||||
|
holes: SizedFreeEntry
|
||||||
when hasThreadSupport:
|
when hasThreadSupport:
|
||||||
lock: SysLock
|
lock: SysLock
|
||||||
|
|
||||||
|
|
@ -145,21 +146,22 @@ proc allocSlowPath(r: var MemRegion; size: int) =
|
||||||
r.remaining = s - sizeof(BaseChunk)
|
r.remaining = s - sizeof(BaseChunk)
|
||||||
|
|
||||||
proc allocFast(r: var MemRegion; size: int): pointer =
|
proc allocFast(r: var MemRegion; size: int): pointer =
|
||||||
if size <= MaxSmallObject:
|
when false:
|
||||||
var it = r.freeLists[size div MemAlign]
|
if size <= MaxSmallObject:
|
||||||
if it != nil:
|
var it = r.freeLists[size div MemAlign]
|
||||||
r.freeLists[size div MemAlign] = it.next
|
if it != nil:
|
||||||
return pointer(it)
|
r.freeLists[size div MemAlign] = it.next
|
||||||
else:
|
|
||||||
var it = r.holes
|
|
||||||
var prev: SizedFreeEntry = nil
|
|
||||||
while it != nil:
|
|
||||||
if it.size >= size:
|
|
||||||
if prev != nil: prev.next = it.next
|
|
||||||
else: r.holes = it.next
|
|
||||||
return pointer(it)
|
return pointer(it)
|
||||||
prev = it
|
else:
|
||||||
it = it.next
|
var it = r.holes
|
||||||
|
var prev: SizedFreeEntry = nil
|
||||||
|
while it != nil:
|
||||||
|
if it.size >= size:
|
||||||
|
if prev != nil: prev.next = it.next
|
||||||
|
else: r.holes = it.next
|
||||||
|
return pointer(it)
|
||||||
|
prev = it
|
||||||
|
it = it.next
|
||||||
if size > r.remaining:
|
if size > r.remaining:
|
||||||
allocSlowPath(r, size)
|
allocSlowPath(r, size)
|
||||||
sysAssert(size <= r.remaining, "size <= r.remaining")
|
sysAssert(size <= r.remaining, "size <= r.remaining")
|
||||||
|
|
@ -184,15 +186,16 @@ proc dealloc(r: var MemRegion; p: pointer; size: int) =
|
||||||
# it is benefitial to not use the free lists here:
|
# it is benefitial to not use the free lists here:
|
||||||
if r.bump -! size == p:
|
if r.bump -! size == p:
|
||||||
dec r.bump, size
|
dec r.bump, size
|
||||||
elif size <= MaxSmallObject:
|
when false:
|
||||||
let it = cast[FreeEntry](p)
|
if size <= MaxSmallObject:
|
||||||
it.next = r.freeLists[size div MemAlign]
|
let it = cast[FreeEntry](p)
|
||||||
r.freeLists[size div MemAlign] = it
|
it.next = r.freeLists[size div MemAlign]
|
||||||
else:
|
r.freeLists[size div MemAlign] = it
|
||||||
let it = cast[SizedFreeEntry](p)
|
else:
|
||||||
it.size = size
|
let it = cast[SizedFreeEntry](p)
|
||||||
it.next = r.holes
|
it.size = size
|
||||||
r.holes = it
|
it.next = r.holes
|
||||||
|
r.holes = it
|
||||||
|
|
||||||
proc deallocAll(r: var MemRegion; head: Chunk) =
|
proc deallocAll(r: var MemRegion; head: Chunk) =
|
||||||
var it = head
|
var it = head
|
||||||
|
|
@ -220,9 +223,10 @@ proc setObstackPtr*(r: var MemRegion; sp: StackPtr) =
|
||||||
if sp.current.next != nil:
|
if sp.current.next != nil:
|
||||||
deallocAll(r, sp.current.next)
|
deallocAll(r, sp.current.next)
|
||||||
sp.current.next = nil
|
sp.current.next = nil
|
||||||
# better leak this memory than be sorry:
|
when false:
|
||||||
for i in 0..high(r.freeLists): r.freeLists[i] = nil
|
# better leak this memory than be sorry:
|
||||||
r.holes = nil
|
for i in 0..high(r.freeLists): r.freeLists[i] = nil
|
||||||
|
r.holes = nil
|
||||||
#else:
|
#else:
|
||||||
# deallocAll(r, r.head)
|
# deallocAll(r, r.head)
|
||||||
# r.head = nil
|
# r.head = nil
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue