Skip to content

Commit

Permalink
GC: avoid pathological behaviour; fixes #10040 [backport] (#10052)
Browse files Browse the repository at this point in the history
  • Loading branch information
Araq authored Dec 20, 2018
1 parent 6cbe1d4 commit cd65e53
Showing 1 changed file with 9 additions and 9 deletions.
18 changes: 9 additions & 9 deletions lib/system/gc.nim
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@
const
CycleIncrease = 2 # is a multiplicative increase
InitialCycleThreshold = 4*1024*1024 # X MB because cycle checking is slow
ZctThreshold = 500 # we collect garbage if the ZCT's size
# reaches this threshold
# this seems to be a good value
InitialZctThreshold = 500 # we collect garbage if the ZCT's size
# reaches this threshold
# this seems to be a good value
withRealTime = defined(useRealtimeGC)

when withRealTime and not declared(getTicks):
Expand Down Expand Up @@ -78,6 +78,7 @@ type
when nimCoroutines:
activeStack: ptr GcStack # current executing coroutine stack.
cycleThreshold: int
zctThreshold: int
when useCellIds:
idGenerator: int
zct: CellSeq # the zero count table
Expand Down Expand Up @@ -253,6 +254,7 @@ proc initGC() =
when traceGC:
for i in low(CellState)..high(CellState): init(states[i])
gch.cycleThreshold = InitialCycleThreshold
gch.zctThreshold = InitialZctThreshold
gch.stat.stackScans = 0
gch.stat.cycleCollections = 0
gch.stat.maxThreshold = 0
Expand Down Expand Up @@ -771,18 +773,15 @@ proc collectCTBody(gch: var GcHeap) =
c_fprintf(stdout, "[GC] missed deadline: %ld\n", duration)

proc collectCT(gch: var GcHeap) =
# stackMarkCosts prevents some pathological behaviour: Stack marking
# becomes more expensive with large stacks and large stacks mean that
# cells with RC=0 are more likely to be kept alive by the stack.
let stackMarkCosts = max(stackSize() div (16*sizeof(int)), ZctThreshold)
if (gch.zct.len >= stackMarkCosts or (cycleGC and
if (gch.zct.len >= gch.zctThreshold or (cycleGC and
getOccupiedMem(gch.region)>=gch.cycleThreshold) or alwaysGC) and
gch.recGcLock == 0:
when false:
prepareForInteriorPointerChecking(gch.region)
cellsetReset(gch.marked)
markForDebug(gch)
collectCTBody(gch)
gch.zctThreshold = max(InitialZctThreshold, gch.zct.len * CycleIncrease)

when withRealTime:
proc toNano(x: int): Nanos {.inline.} =
Expand All @@ -793,10 +792,11 @@ when withRealTime:

proc GC_step(gch: var GcHeap, us: int, strongAdvice: bool) =
gch.maxPause = us.toNano
if (gch.zct.len >= ZctThreshold or (cycleGC and
if (gch.zct.len >= gch.zctThreshold or (cycleGC and
getOccupiedMem(gch.region)>=gch.cycleThreshold) or alwaysGC) or
strongAdvice:
collectCTBody(gch)
gch.zctThreshold = max(InitialZctThreshold, gch.zct.len * CycleIncrease)

proc GC_step*(us: int, strongAdvice = false, stackSize = -1) {.noinline.} =
if stackSize >= 0:
Expand Down

0 comments on commit cd65e53

Please sign in to comment.