mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-02 19:22:40 +00:00
ORC: make rootsThreshold thread local [backport]
This commit is contained in:
@@ -350,7 +350,7 @@ const
|
||||
when defined(nimStressOrc):
|
||||
const rootsThreshold = 10 # broken with -d:nimStressOrc: 10 and for havlak iterations 1..8
|
||||
else:
|
||||
var rootsThreshold = defaultThreshold
|
||||
var rootsThreshold {.threadvar.}: int
|
||||
|
||||
proc partialCollect(lowMark: int) =
|
||||
when false:
|
||||
@@ -392,13 +392,13 @@ proc collectCycles() =
|
||||
# of the cycle collector's effectiveness:
|
||||
# we're effective when we collected 50% or more of the nodes
|
||||
# we touched. If we're effective, we can reset the threshold:
|
||||
if j.keepThreshold and rootsThreshold <= defaultThreshold:
|
||||
if j.keepThreshold and rootsThreshold <= 0:
|
||||
discard
|
||||
elif j.freed * 2 >= j.touched:
|
||||
when not defined(nimFixedOrc):
|
||||
rootsThreshold = max(rootsThreshold div 3 * 2, 16)
|
||||
else:
|
||||
rootsThreshold = defaultThreshold
|
||||
rootsThreshold = 0
|
||||
#cfprintf(cstderr, "[collectCycles] freed %ld, touched %ld new threshold %ld\n", j.freed, j.touched, rootsThreshold)
|
||||
elif rootsThreshold < high(int) div 4:
|
||||
rootsThreshold = rootsThreshold * 3 div 2
|
||||
@@ -411,7 +411,7 @@ proc registerCycle(s: Cell; desc: PNimTypeV2) =
|
||||
if roots.d == nil: init(roots)
|
||||
add(roots, s, desc)
|
||||
|
||||
if roots.len >= rootsThreshold:
|
||||
if roots.len >= rootsThreshold+defaultThreshold:
|
||||
collectCycles()
|
||||
when logOrc:
|
||||
writeCell("[added root]", s, desc)
|
||||
@@ -427,7 +427,7 @@ proc GC_enableOrc*() =
|
||||
## Enables the cycle collector subsystem of `--gc:orc`. This is a `--gc:orc`
|
||||
## specific API. Check with `when defined(gcOrc)` for its existence.
|
||||
when not defined(nimStressOrc):
|
||||
rootsThreshold = defaultThreshold
|
||||
rootsThreshold = 0
|
||||
|
||||
proc GC_disableOrc*() =
|
||||
## Disables the cycle collector subsystem of `--gc:orc`. This is a `--gc:orc`
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
discard """
|
||||
outputsub: "(allocCount: 4302, deallocCount: 4300)"
|
||||
outputsub: "(allocCount: 4050, deallocCount: 4048)"
|
||||
cmd: "nim c --gc:orc -d:nimAllocStats $file"
|
||||
"""
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
discard """
|
||||
nimoutFull: true
|
||||
cmd: '''nim c -r --warnings:off --hints:off --gc:arc --expandArc:newTarget --expandArc:delete --expandArc:p1 --expandArc:tt --hint:Performance:off --assertions:off --expandArc:extractConfig --expandArc:mergeShadowScope --expandArc:check $file'''
|
||||
cmd: '''nim c -r --warnings:off --hints:off --mm:arc --expandArc:newTarget --expandArc:delete --expandArc:p1 --expandArc:tt --hint:Performance:off --assertions:off --expandArc:extractConfig --expandArc:mergeShadowScope --expandArc:check $file'''
|
||||
nimout: '''
|
||||
--expandArc: newTarget
|
||||
|
||||
|
||||
Reference in New Issue
Block a user