You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

reentrant.go 902 B

6 months ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package distlock
  2. import "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/distlock/types"
  3. type Reentrant struct {
  4. svc *Service
  5. reqs []types.LockRequest
  6. locked []*Mutex
  7. }
  8. func (r *Reentrant) Lock(req types.LockRequest, opt ...AcquireOptionFn) error {
  9. var willLock []types.Lock
  10. loop:
  11. for _, lock := range req.Locks {
  12. for _, req := range r.reqs {
  13. for _, locked := range req.Locks {
  14. if locked.Equals(lock) {
  15. continue loop
  16. }
  17. }
  18. }
  19. willLock = append(willLock, lock)
  20. }
  21. if len(willLock) == 0 {
  22. return nil
  23. }
  24. newReq := types.LockRequest{
  25. Reason: req.Reason,
  26. Locks: willLock,
  27. }
  28. m, err := r.svc.Acquire(newReq, opt...)
  29. if err != nil {
  30. return err
  31. }
  32. r.reqs = append(r.reqs, newReq)
  33. r.locked = append(r.locked, m)
  34. return nil
  35. }
  36. func (r *Reentrant) Unlock() {
  37. for i := len(r.reqs) - 1; i >= 0; i-- {
  38. r.locked[i].Unlock()
  39. }
  40. r.locked = nil
  41. r.reqs = nil
  42. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。