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() }