mirror of https://github.com/golang/go.git
sync: in TryLock try to acquire mutex even if state is not 0
For #45435 Change-Id: I728accd9a53c1826243f52aa04dc2a0a1dfdaadf Reviewed-on: https://go-review.googlesource.com/c/go/+/363672 Trust: Ian Lance Taylor <iant@golang.org> Run-TryBot: Ian Lance Taylor <iant@golang.org> Reviewed-by: Dmitry Vyukov <dvyukov@google.com>
This commit is contained in:
parent
865689571d
commit
fdd67930a0
|
|
@ -87,13 +87,22 @@ func (m *Mutex) Lock() {
|
|||
// and use of TryLock is often a sign of a deeper problem
|
||||
// in a particular use of mutexes.
|
||||
func (m *Mutex) TryLock() bool {
|
||||
if atomic.CompareAndSwapInt32(&m.state, 0, mutexLocked) {
|
||||
if race.Enabled {
|
||||
race.Acquire(unsafe.Pointer(m))
|
||||
}
|
||||
return true
|
||||
old := m.state
|
||||
if old&(mutexLocked|mutexStarving) != 0 {
|
||||
return false
|
||||
}
|
||||
return false
|
||||
|
||||
// There may be a goroutine waiting for the mutex, but we are
|
||||
// running now and can try to grab the mutex before that
|
||||
// goroutine wakes up.
|
||||
if !atomic.CompareAndSwapInt32(&m.state, old, old|mutexLocked) {
|
||||
return false
|
||||
}
|
||||
|
||||
if race.Enabled {
|
||||
race.Acquire(unsafe.Pointer(m))
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (m *Mutex) lockSlow() {
|
||||
|
|
|
|||
Loading…
Reference in New Issue