From 0b12e3d81cdba8a5676d6d61970d3dc5cb1462ac Mon Sep 17 00:00:00 2001 From: Michael Anthony Knyszek Date: Thu, 1 Feb 2024 04:47:22 +0000 Subject: [PATCH] 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 Reviewed-by: Michael Pratt --- src/runtime/trace2.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/runtime/trace2.go b/src/runtime/trace2.go index 3639adaa1571da..d40596f39be985 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 }