]> Cypherpunks.ru repositories - gostls13.git/commitdiff
[release-branch.go1.22] runtime: model wakeableSleep.lock in the race detector
authorMichael Anthony Knyszek <mknyszek@google.com>
Thu, 1 Feb 2024 04:47:22 +0000 (04:47 +0000)
committerGopher Robot <gobot@golang.org>
Thu, 1 Feb 2024 22:45:45 +0000 (22:45 +0000)
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>

src/runtime/trace2.go

index 3639adaa1571dab8066435f462376b6a5c0ca7c0..d40596f39be985e7c726f57252872852fd2cd02c 100644 (file)
@@ -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
 }