gc_regions: cleanup & fixes for deallocation (#11920)
* gc_regions: withRegion nows return the modified MemRegion * gc_regions: make withScratchRegion dealloc correctly * tests/gc: add tregionleak test This test checks if memory within regions are freed properly.
This commit is contained in:
parent
6feb3900b1
commit
e9df8ebcfd
2 changed files with 27 additions and 5 deletions
|
|
@ -87,13 +87,13 @@ var
|
||||||
tlRegion {.threadVar.}: MemRegion
|
tlRegion {.threadVar.}: MemRegion
|
||||||
# tempStrRegion {.threadVar.}: MemRegion # not yet used
|
# tempStrRegion {.threadVar.}: MemRegion # not yet used
|
||||||
|
|
||||||
template withRegion*(r: MemRegion; body: untyped) =
|
template withRegion*(r: var MemRegion; body: untyped) =
|
||||||
let oldRegion = tlRegion
|
let oldRegion = tlRegion
|
||||||
tlRegion = r
|
tlRegion = r
|
||||||
try:
|
try:
|
||||||
body
|
body
|
||||||
finally:
|
finally:
|
||||||
#r = tlRegion
|
r = tlRegion
|
||||||
tlRegion = oldRegion
|
tlRegion = oldRegion
|
||||||
|
|
||||||
template inc(p: pointer, s: int) =
|
template inc(p: pointer, s: int) =
|
||||||
|
|
@ -262,14 +262,13 @@ when false:
|
||||||
setObstackPtr(obs)
|
setObstackPtr(obs)
|
||||||
|
|
||||||
template withScratchRegion*(body: untyped) =
|
template withScratchRegion*(body: untyped) =
|
||||||
var scratch: MemRegion
|
|
||||||
let oldRegion = tlRegion
|
let oldRegion = tlRegion
|
||||||
tlRegion = scratch
|
tlRegion = MemRegion()
|
||||||
try:
|
try:
|
||||||
body
|
body
|
||||||
finally:
|
finally:
|
||||||
|
deallocAll()
|
||||||
tlRegion = oldRegion
|
tlRegion = oldRegion
|
||||||
deallocAll(scratch)
|
|
||||||
|
|
||||||
when false:
|
when false:
|
||||||
proc joinRegion*(dest: var MemRegion; src: MemRegion) =
|
proc joinRegion*(dest: var MemRegion; src: MemRegion) =
|
||||||
|
|
|
||||||
23
tests/gc/tregionleak.nim
Normal file
23
tests/gc/tregionleak.nim
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
discard """
|
||||||
|
cmd: '''nim c --gc:regions $file'''
|
||||||
|
output: '''
|
||||||
|
finalized
|
||||||
|
finalized
|
||||||
|
'''
|
||||||
|
"""
|
||||||
|
|
||||||
|
proc finish(o: RootRef) =
|
||||||
|
echo "finalized"
|
||||||
|
|
||||||
|
withScratchRegion:
|
||||||
|
var test: RootRef
|
||||||
|
new(test, finish)
|
||||||
|
|
||||||
|
var
|
||||||
|
mr: MemRegion
|
||||||
|
test: RootRef
|
||||||
|
|
||||||
|
withRegion(mr):
|
||||||
|
new(test, finish)
|
||||||
|
|
||||||
|
deallocAll(mr)
|
||||||
Loading…
Add table
Add a link
Reference in a new issue