aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Anthony Knyszek <mknyszek@google.com>2024-02-01 04:47:22 +0000
committerGopher Robot <gobot@golang.org>2024-02-01 22:45:45 +0000
commite34f6a9928942d227513e6bf51a94db87d9ec07d (patch)
treeb71d2ba9ad0dcbf051fb7ece4c94dcb9e404c7ee
parent7b3786bbb16f1bcd9e740f05627bf965f8a5a54d (diff)
downloadgo-e34f6a9928942d227513e6bf51a94db87d9ec07d.tar.gz
go-e34f6a9928942d227513e6bf51a94db87d9ec07d.zip
[release-branch.go1.22] runtime: model wakeableSleep.lock in the race detector
Currently the flight recorder tests are failing in race mode because the race detector doesn't see s.lock, leading to false positives. This has also appeared in the trace tests. Model the lock in the race detector. Fixes #65207. Fixes #65283. Change-Id: I1e9a5c9606536f55fdfc46b5f8443e9c7213c23d Reviewed-on: https://go-review.googlesource.com/c/go/+/560215 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Michael Pratt <mpratt@google.com> (cherry picked from commit 0b12e3d81cdba8a5676d6d61970d3dc5cb1462ac) Reviewed-on: https://go-review.googlesource.com/c/go/+/559956 Auto-Submit: Michael Knyszek <mknyszek@google.com>
-rw-r--r--src/runtime/trace2.go19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/runtime/trace2.go b/src/runtime/trace2.go
index 3639adaa15..d40596f39b 100644
--- a/src/runtime/trace2.go
+++ b/src/runtime/trace2.go
@@ -932,7 +932,13 @@ func newWakeableSleep() *wakeableSleep {
func (s *wakeableSleep) sleep(ns int64) {
resetTimer(s.timer, nanotime()+ns)
lock(&s.lock)
+ if raceenabled {
+ raceacquire(unsafe.Pointer(&s.lock))
+ }
wakeup := s.wakeup
+ if raceenabled {
+ racerelease(unsafe.Pointer(&s.lock))
+ }
unlock(&s.lock)
<-wakeup
stopTimer(s.timer)
@@ -945,6 +951,9 @@ func (s *wakeableSleep) wake() {
// Grab the wakeup channel, which may be nil if we're
// racing with close.
lock(&s.lock)
+ if raceenabled {
+ raceacquire(unsafe.Pointer(&s.lock))
+ }
if s.wakeup != nil {
// Non-blocking send.
//
@@ -956,6 +965,9 @@ func (s *wakeableSleep) wake() {
default:
}
}
+ if raceenabled {
+ racerelease(unsafe.Pointer(&s.lock))
+ }
unlock(&s.lock)
}
@@ -969,11 +981,18 @@ func (s *wakeableSleep) wake() {
func (s *wakeableSleep) close() {
// Set wakeup to nil so that a late timer ends up being a no-op.
lock(&s.lock)
+ if raceenabled {
+ raceacquire(unsafe.Pointer(&s.lock))
+ }
wakeup := s.wakeup
s.wakeup = nil
// Close the channel.
close(wakeup)
+
+ if raceenabled {
+ racerelease(unsafe.Pointer(&s.lock))
+ }
unlock(&s.lock)
return
}