new implementations for --gc:orc (#14121)

* cycle collector: new implementation
* cycle collector: make self-adaptive based on its previous effectiveness
* cycle collector: added Lins's jump stack to improve traversal from 3*N to 2*N
* cycle collector: make tests green
* API extensions and bugfixes
* code cleanup and use --gc:orc for tasyncawait
This commit is contained in:
Andreas Rumpf
2020-04-27 11:57:26 +02:00
committed by GitHub
parent eaedd0cb94
commit dedb04fa9e
13 changed files with 428 additions and 21 deletions

View File

@@ -1,6 +1,6 @@
discard """
outputsub: "result: 5000"
cmd: "nim c --gc:arc $file"
cmd: "nim c --gc:orc $file"
"""
import asyncdispatch, asyncnet, nativesockets, net, strutils, os
@@ -71,4 +71,5 @@ main()
assert msgCount == swarmSize * messagesToSend
echo "result: ", msgCount
GC_fullCollect()
echo "memory: ", formatSize(getOccupiedMem() - mem)

View File

@@ -27,4 +27,5 @@ proc main(rootName: string) =
let mem = getOccupiedMem()
main("yeah")
GC_fullCollect()
echo "leak: ", getOccupiedMem() - mem > 0

View File

@@ -51,4 +51,5 @@ proc main =
discard serve(PAsyncHttpServer(value: "asdas"))
main()
GC_fullCollect()
echo "MEMORY ", getOccupiedMem() - mem

View File

@@ -50,4 +50,5 @@ proc main =
let mem = getOccupiedMem()
main()
GC_fullCollect()
echo "MEM ", getOccupiedMem() - mem

View File

@@ -15,4 +15,6 @@ proc main(x: int) =
let mem = getOccupiedMem()
main(90)
GC_fullCollect()
echo "MEM ", getOccupiedMem() - mem

View File

@@ -61,4 +61,5 @@ proc main =
let mem = getOccupiedMem()
main()
GC_fullCollect()
echo getOccupiedMem() - mem

View File

@@ -394,7 +394,7 @@ proc run(self: var LoopTesterApp) =
echo "Constructing CFG..."
var n = 2
when not defined(gcOrc):
when true: # not defined(gcOrc):
# currently cycle detection is so slow that we disable this part
for parlooptrees in 1..10:
discard self.cfg.createNode(n + 1)
@@ -437,4 +437,5 @@ proc main =
let mem = getOccupiedMem()
main()
when defined(gcOrc):
GC_fullCollect()
doAssert getOccupiedMem() == mem