aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/time.go
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2019-12-02 12:07:22 -0800
committerIan Lance Taylor <iant@golang.org>2019-12-02 22:42:22 +0000
commit94f4686a77d1d708f240eac388fb5c5b83e2c15f (patch)
tree3aa8fda7bd9c252db61259ce181ab1cd71a60ebc /src/runtime/time.go
parenta18608a044afed86c789e541db65526b9ccacef9 (diff)
downloadgo-94f4686a77d1d708f240eac388fb5c5b83e2c15f.tar.gz
go-94f4686a77d1d708f240eac388fb5c5b83e2c15f.zip
runtime: use current P's race context in timer code
We were using the race context of the P that held the timer, but since we unlock the P's timers while executing a timer that could lead to a race on the race context itself. Updates #6239 Updates #27707 Fixes #35906 Change-Id: I5f9d5f52d8e28dffb88c3327301071b16ed1a913 Reviewed-on: https://go-review.googlesource.com/c/go/+/209580 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org> Reviewed-by: Michael Knyszek <mknyszek@google.com>
Diffstat (limited to 'src/runtime/time.go')
-rw-r--r--src/runtime/time.go11
1 files changed, 6 insertions, 5 deletions
diff --git a/src/runtime/time.go b/src/runtime/time.go
index a7d14cf877..d64bea814f 100644
--- a/src/runtime/time.go
+++ b/src/runtime/time.go
@@ -805,10 +805,11 @@ func runtimer(pp *p, now int64) int64 {
//go:systemstack
func runOneTimer(pp *p, t *timer, now int64) {
if raceenabled {
- if pp.timerRaceCtx == 0 {
- pp.timerRaceCtx = racegostart(funcPC(runtimer) + sys.PCQuantum)
+ ppcur := getg().m.p.ptr()
+ if ppcur.timerRaceCtx == 0 {
+ ppcur.timerRaceCtx = racegostart(funcPC(runtimer) + sys.PCQuantum)
}
- raceacquirectx(pp.timerRaceCtx, unsafe.Pointer(t))
+ raceacquirectx(ppcur.timerRaceCtx, unsafe.Pointer(t))
}
f := t.f
@@ -836,12 +837,12 @@ func runOneTimer(pp *p, t *timer, now int64) {
}
if raceenabled {
- // Temporarily use the P's racectx for g0.
+ // Temporarily use the current P's racectx for g0.
gp := getg()
if gp.racectx != 0 {
throw("runOneTimer: unexpected racectx")
}
- gp.racectx = pp.timerRaceCtx
+ gp.racectx = gp.m.p.ptr().timerRaceCtx
}
unlock(&pp.timersLock)