Untitled
unknown
golang
2 years ago
792 B
10
Indexable
package main
import (
"container/list"
"sync"
)
type FIFOLock struct {
mutex *sync.Mutex
list *list.List
}
func NewFIFOLock() *FIFOLock {
return &FIFOLock{mutex: &sync.Mutex{}, list: list.New()}
}
func (l *FIFOLock) Lock() {
l.mutex.Lock()
defer l.mutex.Unlock()
newLock := &sync.Mutex{}
element := l.list.PushBack(newLock)
newLock.Lock()
if previous := element.Prev(); previous != nil {
prevLock := previous.Value.(*sync.Mutex)
prevLock.Lock()
prevLock.Unlock()
}
}
func (l *FIFOLock) Lock() {
l.mutex.Lock()
defer l.mutex.Unlock()
first := l.list.Front()
firstLock := first.Value.(*sync.Mutex)
l.list.Remove(first)
firstLock.Unlock()
}
Editor is loading...