github.com/cozy/cozy-stack@v0.0.0-20240603063001-31110fa4cae1/pkg/lock/simple_mem.go (about) 1 package lock 2 3 import ( 4 "sync" 5 6 "github.com/cozy/cozy-stack/pkg/prefixer" 7 ) 8 9 type InMemoryLockGetter struct { 10 locks *sync.Map 11 } 12 13 func NewInMemory() *InMemoryLockGetter { 14 return &InMemoryLockGetter{locks: new(sync.Map)} 15 } 16 17 func (i *InMemoryLockGetter) ReadWrite(_ prefixer.Prefixer, name string) ErrorRWLocker { 18 lock, _ := i.locks.LoadOrStore(name, &memLock{}) 19 20 return lock.(*memLock) 21 } 22 23 // LongOperation returns a lock suitable for long operations. It will refresh 24 // the lock in redis to avoid its automatic expiration. 25 func (i *InMemoryLockGetter) LongOperation(db prefixer.Prefixer, name string) ErrorLocker { 26 return &longOperation{ 27 lock: i.ReadWrite(db, name).(*memLock), 28 timeout: LockTimeout, 29 } 30 } 31 32 type memLock struct { 33 sync.RWMutex 34 } 35 36 func (ml *memLock) Lock() error { ml.RWMutex.Lock(); return nil } 37 func (ml *memLock) RLock() error { ml.RWMutex.RLock(); return nil } 38 func (ml *memLock) Extend() {} 39 func (ml *memLock) Unlock() { ml.RWMutex.Unlock() } 40 func (ml *memLock) RUnlock() { ml.RWMutex.RUnlock() }