]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: consolidate gcworkdone/gcscanvalid clearing loops
authorAustin Clements <austin@google.com>
Wed, 25 Feb 2015 03:20:38 +0000 (22:20 -0500)
committerAustin Clements <austin@google.com>
Wed, 25 Feb 2015 15:46:41 +0000 (15:46 +0000)
Previously, we had three loops in the garbage collector that all
cleared the per-G GC flags.  Consolidate these into one function.
This one function is designed to work in a concurrent setting.  As a
result, it's slightly more expensive than the loops it replaces during
STW phases, but these happen at most twice per GC.

Change-Id: Id1ec0074fd58865eb0112b8a0547b267802d0df1
Reviewed-on: https://go-review.googlesource.com/5881
Reviewed-by: Russ Cox <rsc@golang.org>
Reviewed-by: Rick Hudson <rlh@golang.org>
src/runtime/mgc.go
src/runtime/mgcmark.go

index 88d44b2b7572fe329a8b82b7ec54210c7ee3c677..e87d80618ab77318a4e5882469ab376a8524dda2 100644 (file)
@@ -339,13 +339,9 @@ func gc(mode int) {
                })
        } else {
                // For non-concurrent GC (mode != gcBackgroundMode)
-               // The g stacks have not been scanned so set gcscanvalid
+               // The g stacks have not been scanned so clear g state
                // such that mark termination scans all stacks.
-               // No races here since we are in a STW phase.
-               for _, gp := range allgs {
-                       gp.gcworkdone = false  // set to true in gcphasework
-                       gp.gcscanvalid = false // stack has not been scanned
-               }
+               gcResetGState()
        }
 
        startTime := nanotime()
@@ -384,11 +380,7 @@ func gc(mode int) {
                        // The g stacks have been scanned so
                        // they have gcscanvalid==true and gcworkdone==true.
                        // Reset these so that all stacks will be rescanned.
-                       // No races here since we are in a STW phase.
-                       for _, gp := range allgs {
-                               gp.gcworkdone = false  // set to true in gcphasework
-                               gp.gcscanvalid = false // stack has not been scanned
-                       }
+                       gcResetGState()
                        finishsweep_m()
                        gcMark(startTime)
                        gcSweep(mode)
@@ -606,6 +598,22 @@ func gcCopySpans() {
        unlock(&mheap_.lock)
 }
 
+// gcResetGState resets the GC state of all G's and returns the length
+// of allgs.
+func gcResetGState() int {
+       // This may be called during a concurrent phase, so make sure
+       // allgs doesn't change.
+       lock(&allglock)
+       local_allglen := allglen
+       for i := uintptr(0); i < local_allglen; i++ {
+               gp := allgs[i]
+               gp.gcworkdone = false  // set to true in gcphasework
+               gp.gcscanvalid = false // stack has not been scanned
+       }
+       unlock(&allglock)
+       return int(local_allglen)
+}
+
 // Hooks for other packages
 
 var poolcleanup func()
index 1d6c1e8e22fadfba7413ce8d8559766aa504c6dc..50e125dc2703b131d497bfb60a0eb42be144f072 100644 (file)
@@ -27,14 +27,7 @@ func gcscan_m() {
        // At the bottom we will want to return this p back to the scheduler.
 
        // Prepare flag indicating that the scan has not been completed.
-       lock(&allglock)
-       local_allglen := allglen
-       for i := uintptr(0); i < local_allglen; i++ {
-               gp := allgs[i]
-               gp.gcworkdone = false  // set to true in gcphasework
-               gp.gcscanvalid = false // stack has not been scanned
-       }
-       unlock(&allglock)
+       local_allglen := gcResetGState()
 
        work.nwait = 0
        work.ndone = 0
@@ -45,7 +38,7 @@ func gcscan_m() {
 
        lock(&allglock)
        // Check that gc work is done.
-       for i := uintptr(0); i < local_allglen; i++ {
+       for i := 0; i < local_allglen; i++ {
                gp := allgs[i]
                if !gp.gcworkdone {
                        throw("scan missed a g")