mirror of
https://github.com/golang/go.git
synced 2024-09-22 02:48:50 +00:00
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>
This commit is contained in:
parent
287f791845
commit
0b12e3d81c
@ -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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user