|
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- package distlock
-
- import "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/distlock/types"
-
- type Reentrant struct {
- svc *Service
- reqs []types.LockRequest
- locked []*Mutex
- }
-
- func (r *Reentrant) Lock(req types.LockRequest, opt ...AcquireOptionFn) error {
- var willLock []types.Lock
-
- loop:
- for _, lock := range req.Locks {
- for _, req := range r.reqs {
- for _, locked := range req.Locks {
- if locked.Equals(lock) {
- continue loop
- }
- }
- }
-
- willLock = append(willLock, lock)
- }
-
- if len(willLock) == 0 {
- return nil
- }
-
- newReq := types.LockRequest{
- Reason: req.Reason,
- Locks: willLock,
- }
-
- m, err := r.svc.Acquire(newReq, opt...)
- if err != nil {
- return err
- }
-
- r.reqs = append(r.reqs, newReq)
- r.locked = append(r.locked, m)
-
- return nil
- }
-
- func (r *Reentrant) Unlock() {
- for i := len(r.reqs) - 1; i >= 0; i-- {
- r.locked[i].Unlock()
- }
- r.locked = nil
- r.reqs = nil
- }
|