]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: scanvalid race Fixes #9727
authorRick Hudson <rlh@golang.org>
Thu, 29 Jan 2015 15:37:32 +0000 (10:37 -0500)
committerRick Hudson <rlh@golang.org>
Thu, 29 Jan 2015 19:00:32 +0000 (19:00 +0000)
Set gcscanvalid=false after you have cased to _Grunning.
If you do it before the cas and the atomicstatus races to a scan state,
the scan will set gcscanvalid=true and we will be _Grunning
with gcscanvalid==true which is not a good thing.

Change-Id: Ie53ea744a5600392b47da91159d985fe6fe75961
Reviewed-on: https://go-review.googlesource.com/3510
Reviewed-by: Austin Clements <austin@google.com>
src/runtime/proc1.go

index 8efb5467be04ac6f82101bd93b83d05cb3d6c221..82fc41d5b319c610722bc2b891a6cca451b5103f 100644 (file)
@@ -387,10 +387,6 @@ func casgstatus(gp *g, oldval, newval uint32) {
                })
        }
 
-       if newval == _Grunning {
-               gp.gcscanvalid = false
-       }
-
        // loop if gp->atomicstatus is in a scan state giving
        // GC time to finish and change the state to oldval.
        for !cas(&gp.atomicstatus, oldval, newval) {
@@ -407,6 +403,9 @@ func casgstatus(gp *g, oldval, newval uint32) {
                //      })
                // }
        }
+       if newval == _Grunning {
+               gp.gcscanvalid = false
+       }
 }
 
 // casgstatus(gp, oldstatus, Gcopystack), assuming oldstatus is Gwaiting or Grunnable.