]> Cypherpunks.ru repositories - gostls13.git/commitdiff
sync: in TryLock try to acquire mutex even if state is not 0
authorIan Lance Taylor <iant@golang.org>
Sat, 13 Nov 2021 22:36:35 +0000 (14:36 -0800)
committerIan Lance Taylor <iant@golang.org>
Tue, 16 Nov 2021 05:58:03 +0000 (05:58 +0000)
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>
src/sync/mutex.go

index 9dd04d947017f15d8a3663353e71c9322000a700..18b2cedba72f80ce2770929f25409c021526c994 100644 (file)
@@ -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
+       }
+
+       // 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 false
+       return true
 }
 
 func (m *Mutex) lockSlow() {