summary refs log tree commit diff stats
path: root/tests/gc/tlists.nim
diff options
context:
space:
mode:
Diffstat (limited to 'tests/gc/tlists.nim')
-rw-r--r--tests/gc/tlists.nim35
1 files changed, 35 insertions, 0 deletions
diff --git a/tests/gc/tlists.nim b/tests/gc/tlists.nim
new file mode 100644
index 000000000..959cc5f7c
--- /dev/null
+++ b/tests/gc/tlists.nim
@@ -0,0 +1,35 @@
+discard """
+    output: '''Success'''
+"""
+
+# bug #3793
+
+import os
+import math
+import lists
+import strutils
+
+proc mkleak() =
+    # allocate 1 MB via linked lists
+    let numberOfLists = 100
+    for i in countUp(1, numberOfLists):
+        var leakList = initDoublyLinkedList[string]()
+        let numberOfLeaks = 5000
+        for j in countUp(1, numberOfLeaks):
+            leakList.append(newString(200))
+
+proc mkManyLeaks() =
+    for i in 0..0:
+        when false: echo getOccupiedMem()
+        mkleak()
+        when false: echo getOccupiedMem()
+        # Force a full collection. This should free all of the
+        # lists and bring the memory usage down to a few MB's.
+        GC_fullCollect()
+        when false: echo getOccupiedMem()
+        if getOccupiedMem() > 8 * 200 * 5000 * 2:
+          echo GC_getStatistics()
+          quit "leaking"
+    echo "Success"
+
+mkManyLeaks()