From: Austin Clements Date: Mon, 19 Oct 2015 17:35:25 +0000 (-0400) Subject: runtime: consolidate "out of GC work" checks X-Git-Tag: go1.6beta1~667 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=4cca1cc05eae81b933d2aa703b71780a150d715a;p=gostls13.git runtime: consolidate "out of GC work" checks We already have gcMarkWorkAvailable, but the check for GC mark work is open-coded in several places. Generalize gcMarkWorkAvailable slightly and replace these open-coded checks with calls to gcMarkWorkAvailable. In addition to cleaning up the code, this puts us in a better position to make this check slightly more complicated. Change-Id: I1b29883300ecd82a1bf6be193e9b4ee96582a860 Reviewed-on: https://go-review.googlesource.com/16058 Reviewed-by: Rick Hudson Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot --- diff --git a/src/runtime/mgc.go b/src/runtime/mgc.go index 8bba526853..de054dd340 100644 --- a/src/runtime/mgc.go +++ b/src/runtime/mgc.go @@ -613,7 +613,7 @@ func (c *gcControllerState) findRunnableGCWorker(_p_ *p) *g { // else for a while, so kick everything out of its run // queue. } else { - if _p_.gcw.wbuf == 0 && work.full == 0 { + if !gcMarkWorkAvailable(_p_) { // No work to be done right now. This can // happen at the end of the mark phase when // there are still assists tapering off. Don't @@ -1383,7 +1383,7 @@ func gcBgMarkWorker(p *p) { "work.nwait=", incnwait, "work.nproc=", work.nproc) throw("work.nwait > work.nproc") } - done = incnwait == work.nproc && work.full == 0 + done = incnwait == work.nproc && !gcMarkWorkAvailable(nil) } // If this worker reached a background mark completion @@ -1414,9 +1414,10 @@ func gcBgMarkWorker(p *p) { } // gcMarkWorkAvailable returns true if executing a mark worker -// on p is potentially useful. +// on p is potentially useful. p may be nil, in which case it only +// checks the global sources of work. func gcMarkWorkAvailable(p *p) bool { - if !p.gcw.empty() { + if p != nil && !p.gcw.empty() { return true } if atomicload64(&work.full) != 0 { diff --git a/src/runtime/mgcmark.go b/src/runtime/mgcmark.go index 4ec428d914..04267dbdb0 100644 --- a/src/runtime/mgcmark.go +++ b/src/runtime/mgcmark.go @@ -386,7 +386,7 @@ retry: throw("work.nwait > work.nproc") } - if incnwait == work.nproc && work.full == 0 { + if incnwait == work.nproc && !gcMarkWorkAvailable(nil) { // This has reached a background completion // point. if gcBlackenPromptly {