mutex.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. // package mutex -- безопасный мьютекс
  2. package mutex
  3. import (
  4. "log"
  5. "sync"
  6. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
  7. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
  8. )
  9. type Mutex struct {
  10. block sync.Mutex
  11. val sync.Mutex
  12. isLock defs.Bool
  13. }
  14. // NewMutex -- возвращает новый безопасный мьютекс
  15. func NewMutex() core_spec.IMutex {
  16. sf := &Mutex{}
  17. return sf
  18. }
  19. // Unlock -- освободить мьютекс
  20. func (sf *Mutex) Unlock() {
  21. sf.block.Lock()
  22. defer sf.block.Unlock()
  23. if !sf.isLock {
  24. log.Println("ERROR Mutex.Unlock(): mutex already free")
  25. return
  26. }
  27. sf.val.Unlock()
  28. sf.isLock = false
  29. }
  30. // Lock -- попытка захватить мьютекс
  31. func (sf *Mutex) Lock() {
  32. sf.block.Lock()
  33. defer sf.block.Unlock()
  34. sf.val.Lock()
  35. sf.isLock = true
  36. }
  37. // IsLock -- возвращает признак захвата мьютекса
  38. func (sf *Mutex) IsLock() defs.Bool {
  39. sf.block.Lock()
  40. defer sf.block.Unlock()
  41. return sf.isLock
  42. }
  43. // IsFree -- возвращает признак свободного мьютекса
  44. func (sf *Mutex) IsFree() defs.Bool {
  45. sf.block.Lock()
  46. defer sf.block.Unlock()
  47. return !sf.isLock
  48. }