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:
alaviss 2020-08-17 18:20:48 +00:00 • committed by GitHub
commit e9df8ebcfd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 5 deletions

View file

@ -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
View 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)