Add levelmu, a package implementing priority mutex with levels

This commit is contained in:
Matt Joiner 2014-08-25 05:22:34 +10:00
parent 8f065e473f
commit caa1d65bc8
1 changed files with 39 additions and 0 deletions

39
util/levelmu/levelmu.go Normal file
View File

@ -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
}