From: qydysky Date: Sat, 13 May 2023 12:44:10 +0000 (+0800) Subject: Add X-Git-Tag: v0.26.3 X-Git-Url: http://127.0.0.1:8081/?a=commitdiff_plain;h=a03acd9939d34091c164f480a35a52198effc31d;p=part%2F.git Add --- diff --git a/sync/RWMutex.go b/sync/RWMutex.go index 587221e..48bda30 100644 --- a/sync/RWMutex.go +++ b/sync/RWMutex.go @@ -22,15 +22,15 @@ func (m *RWMutex) RLock(to ...time.Duration) (unrlock func()) { if len(to) > 0 { c := time.Now() for m.rlc.Load() < ulock { - runtime.Gosched() if time.Since(c) > to[0] { - panic(fmt.Sprintf("timeout to wait rlock, rlc:%d", m.rlc.Load())) + panic(fmt.Sprintf("timeout to wait lock, rlc:%d", m.rlc.Load())) } + runtime.Gosched() } } else { for m.rlc.Load() < ulock { - runtime.Gosched() time.Sleep(time.Millisecond) + runtime.Gosched() } } m.rlc.Add(1) @@ -45,39 +45,34 @@ func (m *RWMutex) RLock(to ...time.Duration) (unrlock func()) { func (m *RWMutex) Lock(to ...time.Duration) (unlock func()) { lockid := m.cul.Add(1) - if len(to) > 0 { c := time.Now() - if !m.rlc.CompareAndSwap(ulock, lock) { - for m.rlc.Load() > ulock { - runtime.Gosched() - if time.Since(c) > to[0] { - panic(fmt.Sprintf("timeout to wait rlock, rlc:%d", m.rlc.Load())) - } - } - for lockid-1 != m.oll.Load() { - runtime.Gosched() - if time.Since(c) > to[0] { - panic(fmt.Sprintf("timeout to wait lock, rlc:%d", m.rlc.Load())) - } + for m.rlc.Load() > ulock { + if time.Since(c) > to[0] { + panic(fmt.Sprintf("timeout to wait rlock, rlc:%d", m.rlc.Load())) } - if !m.rlc.CompareAndSwap(ulock, lock) { - panic("csa error, bug") + runtime.Gosched() + } + for lockid-1 != m.oll.Load() { + if time.Since(c) > to[0] { + panic(fmt.Sprintf("timeout to wait lock, rlc:%d", m.rlc.Load())) } + runtime.Gosched() + } + if !m.rlc.CompareAndSwap(ulock, lock) { + panic("csa error, bug") } } else { + for m.rlc.Load() > ulock { + time.Sleep(time.Millisecond) + runtime.Gosched() + } + for lockid-1 != m.oll.Load() { + time.Sleep(time.Millisecond) + runtime.Gosched() + } if !m.rlc.CompareAndSwap(ulock, lock) { - for m.rlc.Load() > ulock { - runtime.Gosched() - time.Sleep(time.Millisecond) - } - for lockid-1 != m.oll.Load() { - runtime.Gosched() - time.Sleep(time.Millisecond) - } - if !m.rlc.CompareAndSwap(ulock, lock) { - panic("") - } + panic("csa error, bug") } } var callC atomic.Bool