diff options
Diffstat (limited to 'tests/gc/cycleleak.nim')
-rw-r--r-- | tests/gc/cycleleak.nim | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/tests/gc/cycleleak.nim b/tests/gc/cycleleak.nim new file mode 100644 index 000000000..0a0f2c540 --- /dev/null +++ b/tests/gc/cycleleak.nim @@ -0,0 +1,42 @@ +discard """ + outputsub: "no leak: " +""" + +type + Module = object + nodes*: seq[PNode] + + PModule = ref Module + + Node = object + owner*: PModule + data*: array[0..200, char] # some fat to drain memory faster + + PNode = ref Node + +proc newNode(owner: PModule): PNode = + new(result) + result.owner = owner + +proc compileModule: PModule = + new(result) + result.nodes = @[] + for i in 0..100: + result.nodes.add newNode(result) + +var gModuleCache: PModule + +proc loop = + for i in 0..10000: + gModuleCache = compileModule() + gModuleCache = nil + GC_fullCollect() + + if getOccupiedMem() > 300_000: + echo "still a leak! ", getOccupiedMem() + quit(1) + else: + echo "no leak: ", getOccupiedMem() + +loop() + |