summaryrefslogtreecommitdiff
path: root/vendor/codeberg.org/gruf/go-mutexes/map.go
diff options
context:
space:
mode:
authorLibravatar kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com>2022-11-08 09:35:01 +0000
committerLibravatar GitHub <noreply@github.com>2022-11-08 10:35:01 +0100
commit7c0bbd3f6a3ed9a8e5b879a00dbd4dad88e375c3 (patch)
tree0409dfee4ff5685f66cbd61d8504b119b1db093c /vendor/codeberg.org/gruf/go-mutexes/map.go
parent[docs] refer to the latest release version (#992) (diff)
downloadgotosocial-7c0bbd3f6a3ed9a8e5b879a00dbd4dad88e375c3.tar.xz
[chore] update gruf libraries (#996)
* update go-store to v2.0.6: closer callbacks are now only ever called at most once Signed-off-by: kim <grufwub@gmail.com> * bump go-store => v2.0.7, go-mutexes => v1.1.4 Signed-off-by: kim <grufwub@gmail.com> Signed-off-by: kim <grufwub@gmail.com>
Diffstat (limited to 'vendor/codeberg.org/gruf/go-mutexes/map.go')
-rw-r--r--vendor/codeberg.org/gruf/go-mutexes/map.go57
1 files changed, 17 insertions, 40 deletions
diff --git a/vendor/codeberg.org/gruf/go-mutexes/map.go b/vendor/codeberg.org/gruf/go-mutexes/map.go
index d0387d3e7..a3c171c7a 100644
--- a/vendor/codeberg.org/gruf/go-mutexes/map.go
+++ b/vendor/codeberg.org/gruf/go-mutexes/map.go
@@ -89,8 +89,8 @@ func acquireState(state uint8, lt uint8) (uint8, bool) {
// awaiting a permissible state (.e.g no key write locks allowed when the
// map is read locked).
type MutexMap struct {
- qpool pool
- queue []*sync.Mutex
+ queue *sync.WaitGroup
+ qucnt int32
mumap map[string]*rwmutex
mpool pool
@@ -118,17 +118,8 @@ func NewMap(max, wake int32) MutexMap {
}
return MutexMap{
- qpool: pool{
- alloc: func() interface{} {
- return &sync.Mutex{}
- },
- },
+ queue: &sync.WaitGroup{},
mumap: make(map[string]*rwmutex, max),
- mpool: pool{
- alloc: func() interface{} {
- return &rwmutex{}
- },
- },
maxmu: max,
wake: wake,
}
@@ -170,36 +161,26 @@ func (mm *MutexMap) SET(max, wake int32) (int32, int32) {
// spinLock will wait (using a mutex to sleep thread) until conditional returns true.
func (mm *MutexMap) spinLock(cond func() bool) {
- var mu *sync.Mutex
-
for {
// Acquire map lock
mm.mapmu.Lock()
if cond() {
- // Release mu if needed
- if mu != nil {
- mm.qpool.Release(mu)
- }
return
}
- // Alloc mu if needed
- if mu == nil {
- v := mm.qpool.Acquire()
- mu = v.(*sync.Mutex)
- }
+ // Current queue ptr
+ queue := mm.queue
// Queue ourselves
- mm.queue = append(mm.queue, mu)
- mu.Lock()
+ queue.Add(1)
+ mm.qucnt++
// Unlock map
mm.mapmu.Unlock()
// Wait on notify
- mu.Lock()
- mu.Unlock()
+ mm.queue.Wait()
}
}
@@ -236,9 +217,8 @@ func (mm *MutexMap) lock(key string, lt uint8) func() {
if !ok {
// No mutex found for key
- // Alloc from pool
- v := mm.mpool.Acquire()
- mu = v.(*rwmutex)
+ // Alloc mu from pool
+ mu = mm.mpool.Acquire()
mm.mumap[key] = mu
// Set our key
@@ -301,13 +281,12 @@ func (mm *MutexMap) cleanup() {
go func() {
if wakemod == 0 {
- // Notify queued routines
- for _, mu := range mm.queue {
- mu.Unlock()
- }
+ // Release queued goroutines
+ mm.queue.Add(-int(mm.qucnt))
- // Reset queue
- mm.queue = mm.queue[:0]
+ // Allocate new queue and reset
+ mm.queue = &sync.WaitGroup{}
+ mm.qucnt = 0
}
if mm.count == 0 {
@@ -323,7 +302,6 @@ func (mm *MutexMap) cleanup() {
mm.evict = mm.evict[:0]
mm.state = stateUnlockd
mm.mpool.GC()
- mm.qpool.GC()
}
// Unlock map
@@ -412,9 +390,8 @@ func (st *LockState) lock(key string, lt uint8) func() {
if !ok {
// No mutex found for key
- // Alloc from pool
- v := st.mmap.mpool.Acquire()
- mu = v.(*rwmutex)
+ // Alloc mu from pool
+ mu = st.mmap.mpool.Acquire()
st.mmap.mumap[key] = mu
// Set our key