mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: move selectdone into g
Writing to selectdone on the stack of another goroutine meant a pretty subtle dance between the select code and the stack copying code. Instead move the selectdone variable into the g struct. Change-Id: Id246aaf18077c625adef7ca2d62794afef1bdd1b Reviewed-on: https://go-review.googlesource.com/53390 Reviewed-by: Austin Clements <austin@google.com> Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
89d74f5416
commit
32b94f13cf
5 changed files with 27 additions and 78 deletions
|
|
@ -272,11 +272,14 @@ type sudog struct {
|
|||
// channel this sudog is blocking on. shrinkstack depends on
|
||||
// this for sudogs involved in channel ops.
|
||||
|
||||
g *g
|
||||
selectdone *uint32 // CAS to 1 to win select race (may point to stack)
|
||||
next *sudog
|
||||
prev *sudog
|
||||
elem unsafe.Pointer // data element (may point to stack)
|
||||
g *g
|
||||
|
||||
// isSelect indicates g is participating in a select, so
|
||||
// g.selectDone must be CAS'd to win the wake-up race.
|
||||
isSelect bool
|
||||
next *sudog
|
||||
prev *sudog
|
||||
elem unsafe.Pointer // data element (may point to stack)
|
||||
|
||||
// The following fields are never accessed concurrently.
|
||||
// For channels, waitlink is only accessed by g.
|
||||
|
|
@ -367,6 +370,7 @@ type g struct {
|
|||
cgoCtxt []uintptr // cgo traceback context
|
||||
labels unsafe.Pointer // profiler labels
|
||||
timer *timer // cached timer for time.Sleep
|
||||
selectDone uint32 // are we participating in a select and did someone win the race?
|
||||
|
||||
// Per-G GC state
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue