]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: check transition condition before triggering periodic GC
authorAustin Clements <austin@google.com>
Thu, 23 Feb 2017 16:04:37 +0000 (11:04 -0500)
committerAustin Clements <austin@google.com>
Fri, 31 Mar 2017 01:15:03 +0000 (01:15 +0000)
Currently sysmon triggers periodic GC if GC is not currently running
and it's been long enough since the last GC. This misses some
important conditions; for example, whether GC is enabled at all by
GOGC. As a result, if GOGC is off, once we pass the timeout for
periodic GC, sysmon will attempt to trigger a GC every 10ms. This GC
will be a no-op because gcStart will check all of the appropriate
conditions and do nothing, but it still goes through the motions of
waking the forcegc goroutine and printing a gctrace line.

Fix this by making sysmon call gcShouldStart to check *all* of the
appropriate transition conditions before attempting to trigger a
periodic GC.

Fixes #19247.

Change-Id: Icee5521ce175e8419f934723849853d53773af31
Reviewed-on: https://go-review.googlesource.com/37515
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rick Hudson <rlh@golang.org>
src/runtime/proc.go

index 8dede3fb2370c1f3a8aa02ee49192ea7d7c56e74..ae19120a3108ac8b67721415d4a75397badd5088 100644 (file)
@@ -3791,7 +3791,7 @@ func sysmon() {
                }
                // check if we need to force a GC
                lastgc := int64(atomic.Load64(&memstats.last_gc_nanotime))
-               if gcphase == _GCoff && lastgc != 0 && now-lastgc > forcegcperiod && atomic.Load(&forcegc.idle) != 0 {
+               if gcShouldStart(true) && lastgc != 0 && now-lastgc > forcegcperiod && atomic.Load(&forcegc.idle) != 0 {
                        lock(&forcegc.lock)
                        forcegc.idle = 0
                        forcegc.g.schedlink = 0