From: Austin Clements Date: Thu, 12 Feb 2015 20:05:55 +0000 (-0500) Subject: runtime: replace scanblock(0, 0, nil, nil) with drainworkbuf X-Git-Tag: go1.5beta1~2019 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=cf964e1653489d99b68a0668d293b6b521e5ab62;p=gostls13.git runtime: replace scanblock(0, 0, nil, nil) with drainworkbuf scanblock(0, 0, nil, nil) was just a confusing way of saying wbuf = getpartialorempty() drainworkbuf(wbuf, true) Make drainworkbuf accept a nil workbuf and perform the getpartialorempty itself and replace all uses of scanblock(0, 0, nil, nil) with direct calls to drainworkbuf(nil, true). Change-Id: I7002a2f8f3eaf6aa85bbf17ccc81d7288acfef1c Reviewed-on: https://go-review.googlesource.com/4781 Reviewed-by: Russ Cox Reviewed-by: Rick Hudson --- diff --git a/src/runtime/mgc.go b/src/runtime/mgc.go index afca568e0b..3f361c1b4d 100644 --- a/src/runtime/mgc.go +++ b/src/runtime/mgc.go @@ -461,6 +461,9 @@ func scanblock(b0, n0 uintptr, ptrmask *uint8, wbuf *workbuf) *workbuf { // If drainallwbufs is true find all other available workbufs and repeat the process. //go:nowritebarrier func drainworkbuf(wbuf *workbuf, drainallwbufs bool) { + if wbuf == nil { + wbuf = getpartialorempty(472) + } checknocurrentwbuf() if gcphase != _GCmark && gcphase != _GCmarktermination { throw("scanblock phase incorrect") @@ -1149,10 +1152,7 @@ func gchelper() { // parallel mark for over GC roots parfordo(work.markfor) if gcphase != _GCscan { - wbuf := scanblock(0, 0, nil, nil) // blocks in getfull - if wbuf != nil { - throw("gchelper did not extinguish wbuf") - } + drainworkbuf(nil, true) // blocks in getfull } if trace.enabled { @@ -1414,13 +1414,9 @@ func gcscan_m() { // This is the concurrent mark phase. //go:nowritebarrier func gcmark_m() { - // If one is available grab this M's workbuffer. - wbuf := scanblock(0, 0, nil, nil) - if wbuf != nil { - throw("gcmark_m did not extinguish wbuf") - } + drainworkbuf(nil, true) // TODO add another harvestwbuf and reset work.nwait=0, work.ndone=0, and work.nproc=1 - // and repeat the above scanblock. + // and repeat the above drainworkbuf. } // For now this must be bracketed with a stoptheworld and a starttheworld to ensure @@ -1505,10 +1501,7 @@ func gc(start_time int64, eagersweep bool) { harvestwbufs() // move local workbufs onto global queues where the GC can find them gchelperstart() parfordo(work.markfor) - wbuf := scanblock(0, 0, nil, nil) - if wbuf != nil { - throw("gc does not extinguish wbuf") - } + drainworkbuf(nil, true) if work.full != 0 { throw("work.full != 0")