repair_time.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package repair_time
  2. import (
  3. "fmt"
  4. "strconv"
  5. "sync"
  6. )
  7. /*
  8. Потокобезопасное время ожидания до восстановлении ремки
  9. */
  10. // RepairTime -- потокобезопасное время до восстановления ремки
  11. type RepairTime struct {
  12. val int
  13. valOld int // Старое время до ремки
  14. block sync.RWMutex
  15. }
  16. // NewRepairTime -- возвращает новый *RepairTime
  17. func NewRepairTime() *RepairTime {
  18. return &RepairTime{}
  19. }
  20. // Получ -- возвращает хранимое значение времени
  21. func (сам *RepairTime) Получ() int {
  22. сам.block.RLock()
  23. defer сам.block.RUnlock()
  24. return сам.val
  25. }
  26. // Старое -- возвращает хранимое старое значение времени
  27. func (сам *RepairTime) Старое() int {
  28. сам.block.RLock()
  29. defer сам.block.RUnlock()
  30. return сам.valOld
  31. }
  32. // Уст -- устанавливает хранимое время восстановления ремки
  33. func (сам *RepairTime) Уст(val string) error {
  34. сам.block.Lock()
  35. defer сам.block.Unlock()
  36. iVal, err := strconv.Atoi(val)
  37. if err != nil {
  38. return fmt.Errorf("RepairTime.Set(): val(%v) не число, err=%w", val, err)
  39. }
  40. if iVal < 0 {
  41. return fmt.Errorf("RepairTime.Set(): val(%v) < 0", iVal)
  42. }
  43. сам.valOld = сам.val
  44. сам.val = iVal
  45. return nil
  46. }
  47. // Dec -- уменьшает на секунду время восстановления
  48. func (сам *RepairTime) Dec() {
  49. сам.block.Lock()
  50. defer сам.block.Unlock()
  51. if сам.val > 0 {
  52. сам.valOld = сам.val
  53. сам.val--
  54. }
  55. }
  56. // IsReady -- возвращает признак готовности восстановления
  57. func (сам *RepairTime) IsReady() bool {
  58. сам.block.RLock()
  59. defer сам.block.RUnlock()
  60. return сам.val == 0
  61. }
  62. // IsChange -- возвращает признак изменения здоровья после присвоения
  63. func (сам *RepairTime) IsChange() bool {
  64. сам.block.RLock()
  65. defer сам.block.RUnlock()
  66. return сам.val == сам.valOld
  67. }