memory regions seem to work now
This commit is contained in:
parent
36a26875ef
commit
b6360c5d5f
1 changed files with 32 additions and 18 deletions
|
|
@ -217,12 +217,15 @@ template computeRemaining(r): untyped =
|
||||||
|
|
||||||
proc setObstackPtr*(r: var MemRegion; sp: StackPtr) =
|
proc setObstackPtr*(r: var MemRegion; sp: StackPtr) =
|
||||||
# free everything after 'sp':
|
# free everything after 'sp':
|
||||||
if sp.current != nil:
|
if sp.current.next != nil:
|
||||||
deallocAll(r, sp.current.next)
|
deallocAll(r, sp.current.next)
|
||||||
sp.current.next = nil
|
sp.current.next = nil
|
||||||
else:
|
# better leak this memory than be sorry:
|
||||||
deallocAll(r, r.head)
|
for i in 0..high(r.freeLists): r.freeLists[i] = nil
|
||||||
r.head = nil
|
r.holes = nil
|
||||||
|
#else:
|
||||||
|
# deallocAll(r, r.head)
|
||||||
|
# r.head = nil
|
||||||
r.bump = sp.bump
|
r.bump = sp.bump
|
||||||
r.tail = sp.current
|
r.tail = sp.current
|
||||||
r.remaining = sp.remaining
|
r.remaining = sp.remaining
|
||||||
|
|
@ -233,6 +236,17 @@ proc deallocAll*() = tlRegion.deallocAll()
|
||||||
|
|
||||||
proc deallocOsPages(r: var MemRegion) = r.deallocAll()
|
proc deallocOsPages(r: var MemRegion) = r.deallocAll()
|
||||||
|
|
||||||
|
template withScratchRegion*(body: untyped) =
|
||||||
|
var scratch: MemRegion
|
||||||
|
let oldRegion = tlRegion
|
||||||
|
tlRegion = scratch
|
||||||
|
try:
|
||||||
|
body
|
||||||
|
finally:
|
||||||
|
tlRegion = oldRegion
|
||||||
|
deallocAll(scratch)
|
||||||
|
|
||||||
|
when false:
|
||||||
proc joinRegion*(dest: var MemRegion; src: MemRegion) =
|
proc joinRegion*(dest: var MemRegion; src: MemRegion) =
|
||||||
# merging is not hard.
|
# merging is not hard.
|
||||||
if dest.head.isNil:
|
if dest.head.isNil:
|
||||||
|
|
@ -290,7 +304,7 @@ proc newStr(typ: PNimType, len: int; init: bool): pointer {.compilerRtl.} =
|
||||||
let size = roundup(addInt(len, GenericSeqSize), MemAlign)
|
let size = roundup(addInt(len, GenericSeqSize), MemAlign)
|
||||||
result = rawNewSeq(tlRegion, typ, size)
|
result = rawNewSeq(tlRegion, typ, size)
|
||||||
if init: zeroMem(result, size)
|
if init: zeroMem(result, size)
|
||||||
cast[PGenericSeq](result).len = len
|
cast[PGenericSeq](result).len = 0
|
||||||
cast[PGenericSeq](result).reserved = len
|
cast[PGenericSeq](result).reserved = len
|
||||||
|
|
||||||
proc newObjRC1(typ: PNimType, size: int): pointer {.compilerRtl.} =
|
proc newObjRC1(typ: PNimType, size: int): pointer {.compilerRtl.} =
|
||||||
|
|
@ -307,9 +321,9 @@ proc growObj(regionUnused: var MemRegion; old: pointer, newsize: int): pointer =
|
||||||
roundup(newsize, MemAlign))
|
roundup(newsize, MemAlign))
|
||||||
let elemSize = if typ.kind == tyString: 1 else: typ.base.size
|
let elemSize = if typ.kind == tyString: 1 else: typ.base.size
|
||||||
let oldsize = cast[PGenericSeq](old).len*elemSize + GenericSeqSize
|
let oldsize = cast[PGenericSeq](old).len*elemSize + GenericSeqSize
|
||||||
copyMem(result, old, oldsize)
|
|
||||||
zeroMem(result +! oldsize, newsize-oldsize)
|
zeroMem(result +! oldsize, newsize-oldsize)
|
||||||
#dealloc(sh.region[], old, roundup(oldsize, MemAlign))
|
copyMem(result, old, oldsize)
|
||||||
|
dealloc(sh.region[], old, roundup(oldsize, MemAlign))
|
||||||
|
|
||||||
proc growObj(old: pointer, newsize: int): pointer {.rtl.} =
|
proc growObj(old: pointer, newsize: int): pointer {.rtl.} =
|
||||||
result = growObj(tlRegion, old, newsize)
|
result = growObj(tlRegion, old, newsize)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue