diff options
author | Ruslan Mustakov <ruslan.mustakov@xored.com> | 2016-05-11 20:00:22 +0600 |
---|---|---|
committer | Ruslan Mustakov <ruslan.mustakov@xored.com> | 2016-05-11 20:02:12 +0600 |
commit | 0dc35b7841375e4a00bcdbc546b38137ca7483f8 (patch) | |
tree | bd40643e6b3d73cb443cb77dfc0262f2f4c42a0b /lib | |
parent | f288eb7543d99651eee58ad9a961c78a737aa0c2 (diff) | |
download | Nim-0dc35b7841375e4a00bcdbc546b38137ca7483f8.tar.gz |
Replaced ignoreStackAndRegisters with stackSize in GC_step
Diffstat (limited to 'lib')
-rw-r--r-- | lib/system/gc.nim | 38 | ||||
-rw-r--r-- | lib/system/gc2.nim | 38 |
2 files changed, 48 insertions, 28 deletions
diff --git a/lib/system/gc.nim b/lib/system/gc.nim index 85bdf04fe..5c2170a17 100644 --- a/lib/system/gc.nim +++ b/lib/system/gc.nim @@ -905,19 +905,19 @@ proc unmarkStackAndRegisters(gch: var GcHeap) = #sysAssert c.typ != nil, "unmarkStackAndRegisters 2" gch.decStack.len = 0 -proc collectCTBody(gch: var GcHeap, ignoreStackAndRegisters = false) = +proc collectCTBody(gch: var GcHeap) = when withRealTime: let t0 = getticks() sysAssert(allocInv(gch.region), "collectCT: begin") + + when not defined(nimCoroutines): + gch.stat.maxStackSize = max(gch.stat.maxStackSize, stackSize()) sysAssert(gch.decStack.len == 0, "collectCT") prepareForInteriorPointerChecking(gch.region) - if not ignoreStackAndRegisters: - when not defined(nimCoroutines): - gch.stat.maxStackSize = max(gch.stat.maxStackSize, stackSize()) - markStackAndRegisters(gch) - markThreadStacks(gch) - gch.stat.maxStackCells = max(gch.stat.maxStackCells, gch.decStack.len) - inc(gch.stat.stackScans) + markStackAndRegisters(gch) + markThreadStacks(gch) + gch.stat.maxStackCells = max(gch.stat.maxStackCells, gch.decStack.len) + inc(gch.stat.stackScans) if collectZCT(gch): when cycleGC: if getOccupiedMem(gch.region) >= gch.cycleThreshold or alwaysCycleGC: @@ -927,8 +927,7 @@ proc collectCTBody(gch: var GcHeap, ignoreStackAndRegisters = false) = gch.cycleThreshold = max(InitialCycleThreshold, getOccupiedMem() * CycleIncrease) gch.stat.maxThreshold = max(gch.stat.maxThreshold, gch.cycleThreshold) - if not ignoreStackAndRegisters: - unmarkStackAndRegisters(gch) + unmarkStackAndRegisters(gch) sysAssert(allocInv(gch.region), "collectCT: end") when withRealTime: @@ -972,17 +971,28 @@ when withRealTime: proc GC_setMaxPause*(MaxPauseInUs: int) = gch.maxPause = MaxPauseInUs.toNano - proc GC_step(gch: var GcHeap, us: int, strongAdvice: bool, ignoreStackAndRegisters: bool) = + proc GC_step(gch: var GcHeap, us: int, strongAdvice: bool) = acquire(gch) gch.maxPause = us.toNano if (gch.zct.len >= ZctThreshold or (cycleGC and getOccupiedMem(gch.region)>=gch.cycleThreshold) or alwaysGC) or strongAdvice: - collectCTBody(gch, ignoreStackAndRegisters) + collectCTBody(gch) release(gch) - proc GC_step*(us: int, strongAdvice, ignoreStackAndRegisters = false) = - GC_step(gch, us, strongAdvice, ignoreStackAndRegisters) + proc GC_step*(us: int, strongAdvice = false, stackSize = -1) {.noinline.} = + var stackTop {.volatile.}: pointer + let prevStackBottom = gch.stackBottom + if stackSize >= 0: + stackTop = addr(stackTop) + when stackIncreases: + gch.stackBottom = cast[pointer]( + cast[ByteAddress](stackTop) - sizeof(pointer) * 6 - stackSize) + else: + gch.stackBottom = cast[pointer]( + cast[ByteAddress](stackTop) + sizeof(pointer) * 6 + stackSize) + GC_step(gch, us, strongAdvice) + gch.stackBottom = prevStackBottom when not defined(useNimRtl): proc GC_disable() = diff --git a/lib/system/gc2.nim b/lib/system/gc2.nim index f2d1397b4..7d54c07be 100644 --- a/lib/system/gc2.nim +++ b/lib/system/gc2.nim @@ -894,18 +894,18 @@ proc unmarkStackAndRegisters(gch: var GcHeap) = decRef(d[i]) gch.decStack.len = 0 -proc collectCTBody(gch: var GcHeap, ignoreStackAndRegisters = false) = +proc collectCTBody(gch: var GcHeap) = when withRealTime: let t0 = getticks() sysAssert(allocInv(gch.region), "collectCT: begin") + + when not defined(nimCoroutines): + gch.stat.maxStackSize = max(gch.stat.maxStackSize, stackSize()) sysAssert(gch.decStack.len == 0, "collectCT") prepareForInteriorPointerChecking(gch.region) - if not ignoreStackAndRegisters: - when not defined(nimCoroutines): - gch.stat.maxStackSize = max(gch.stat.maxStackSize, stackSize()) - markStackAndRegisters(gch) - gch.stat.maxStackCells = max(gch.stat.maxStackCells, gch.decStack.len) - inc(gch.stat.stackScans) + markStackAndRegisters(gch) + gch.stat.maxStackCells = max(gch.stat.maxStackCells, gch.decStack.len) + inc(gch.stat.stackScans) if collectZCT(gch): when cycleGC: if getOccupiedMem(gch.region) >= gch.cycleThreshold or alwaysCycleGC: @@ -914,8 +914,7 @@ proc collectCTBody(gch: var GcHeap, ignoreStackAndRegisters = false) = gch.cycleThreshold = max(InitialCycleThreshold, getOccupiedMem() * CycleIncrease) gch.stat.maxThreshold = max(gch.stat.maxThreshold, gch.cycleThreshold) - if not ignoreStackAndRegisters: - unmarkStackAndRegisters(gch) + unmarkStackAndRegisters(gch) sysAssert(allocInv(gch.region), "collectCT: end") when withRealTime: @@ -950,15 +949,26 @@ when withRealTime: proc GC_setMaxPause*(MaxPauseInUs: int) = gch.maxPause = MaxPauseInUs.toNano - proc GC_step(gch: var GcHeap, us: int, strongAdvice, ignoreStackAndRegisters: bool) = + proc GC_step(gch: var GcHeap, us: int, strongAdvice: bool) = gch.maxPause = us.toNano if (gch.zct.len >= ZctThreshold or (cycleGC and getOccupiedMem(gch.region)>=gch.cycleThreshold) or alwaysGC) or strongAdvice: - collectCTBody(gch, ignoreStackAndRegisters) - - proc GC_step*(us: int, strongAdvice, ignoreStackAndRegisters = false) = - GC_step(gch, us, strongAdvice, ignoreStackAndRegisters) + collectCTBody(gch) + + proc GC_step*(us: int, strongAdvice = false, stackSize = -1) {.noinline.} = + var stackTop {.volatile.}: pointer + let prevStackBottom = gch.stackBottom + if stackSize >= 0: + stackTop = addr(stackTop) + when stackIncreases: + gch.stackBottom = cast[pointer]( + cast[ByteAddress](stackTop) - sizeof(pointer) * 6 - stackSize) + else: + gch.stackBottom = cast[pointer]( + cast[ByteAddress](stackTop) + sizeof(pointer) * 6 + stackSize) + GC_step(gch, us, strongAdvice) + gch.stackBottom = prevStackBottom when not defined(useNimRtl): proc GC_disable() = |