Add levelmu, a package implementing priority mutex with levels
This commit is contained in:
parent
8f065e473f
commit
caa1d65bc8
|
@ -0,0 +1,39 @@
|
|||
package levelmu
|
||||
|
||||
import (
|
||||
"sync"
|
||||
)
|
||||
|
||||
type LevelMutex struct {
|
||||
mus []sync.Mutex
|
||||
// Protected by the very last mutex.
|
||||
lastLevel int
|
||||
}
|
||||
|
||||
func (lm *LevelMutex) Init(levels int) {
|
||||
if lm.mus != nil {
|
||||
panic("level mutex already initialized")
|
||||
}
|
||||
lm.mus = make([]sync.Mutex, levels)
|
||||
}
|
||||
|
||||
func (lm *LevelMutex) Lock() {
|
||||
lm.LevelLock(0)
|
||||
}
|
||||
|
||||
func (lm *LevelMutex) Unlock() {
|
||||
stopLevel := lm.lastLevel
|
||||
for i := len(lm.mus) - 1; i >= stopLevel; i-- {
|
||||
lm.mus[i].Unlock()
|
||||
}
|
||||
}
|
||||
|
||||
func (lm *LevelMutex) LevelLock(level int) {
|
||||
if level >= len(lm.mus) {
|
||||
panic("lock level exceeds configured level count")
|
||||
}
|
||||
for l := level; l < len(lm.mus); l++ {
|
||||
lm.mus[l].Lock()
|
||||
}
|
||||
lm.lastLevel = level
|
||||
}
|
Loading…
Reference in New Issue