aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/runtime2.go
diff options
context:
space:
mode:
authorAustin Clements <austin@google.com>2016-02-18 09:34:43 -0500
committerAustin Clements <austin@google.com>2016-03-16 20:13:15 +0000
commitdb72b41bcd67ecb80890d586effbabd8d110952c (patch)
treed351d5b1adbbf61ef0161d472f27b027713f1716 /src/runtime/runtime2.go
parent3c2a21ff13c53b93db50cfb37b186d6200e2ceec (diff)
downloadgo-db72b41bcd67ecb80890d586effbabd8d110952c.tar.xz
runtime: protect sudog.elem with hchan.lock
Currently sudog.elem is never accessed concurrently, so in several cases we drop the channel lock just before reading/writing the sent/received value from/to sudog.elem. However, concurrent stack shrinking is going to have to adjust sudog.elem to point to the new stack, which means it needs a way to synchronize with accesses to sudog.elem. Hence, add sudog.elem to the fields protected by hchan.lock and scoot the unlocks down past the uses of sudog.elem. While we're here, better document the channel synchronization rules. For #12967. Change-Id: I3ad0ca71f0a74b0716c261aef21b2f7f13f74917 Reviewed-on: https://go-review.googlesource.com/20040 Reviewed-by: Keith Randall <khr@golang.org> Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/runtime/runtime2.go')
-rw-r--r--src/runtime/runtime2.go17
1 files changed, 12 insertions, 5 deletions
diff --git a/src/runtime/runtime2.go b/src/runtime/runtime2.go
index 5d7f4354ef..eda258a992 100644
--- a/src/runtime/runtime2.go
+++ b/src/runtime/runtime2.go
@@ -214,11 +214,18 @@ type gobuf struct {
// Changes here must also be made in src/cmd/compile/internal/gc/select.go's
// selecttype.
type sudog struct {
- 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)
+ // The following fields are protected by the hchan.lock of the
+ // channel this sudog is blocking on.
+
+ 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)
+
+ // The following fields are never accessed concurrently.
+ // waitlink is only accessed by g.
+
releasetime int64
ticket uint32
waitlink *sudog // g.waiting list