mirror of
https://github.com/golang/go
synced 2024-10-14 03:43:28 +00:00
runtime: scanvalid race Fixes #9727
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>
This commit is contained in:
parent
428afae027
commit
27aed3ce68
|
@ -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.
|
||||
|
|
Loading…
Reference in a new issue