package health_repair_time import ( "fmt" "strconv" "sync" ) /* Потокобезопасное время ожидания до восстановлении ремки */ // RepairTime -- потокобезопасное время до восстановления ремки type RepairTime struct { val int valOld int // Старое время до ремки block sync.RWMutex } // NewRepairTime -- возвращает новый *RepairTime func NewRepairTime() *RepairTime { return &RepairTime{} } // Get -- возвращает хранимое значение времени func (сам *RepairTime) Get() int { сам.block.RLock() defer сам.block.RUnlock() return сам.val } // GetOld -- возвращает хранимое старое значение времени func (сам *RepairTime) GetOld() int { сам.block.RLock() defer сам.block.RUnlock() return сам.valOld } // Set -- устанавливает хранимое время восстановления ремки func (сам *RepairTime) Set(val string) error { сам.block.Lock() defer сам.block.Unlock() iVal, err := strconv.Atoi(val) if err != nil { return fmt.Errorf("RepairTime.Set(): val(%v) не число, err=%w", val, err) } if iVal < 0 { return fmt.Errorf("RepairTime.Set(): val(%v) < 0", iVal) } сам.valOld = сам.val сам.val = iVal return nil } // Dec -- уменьшает на секунду время восстановления func (сам *RepairTime) Dec() { сам.block.Lock() defer сам.block.Unlock() if сам.val > 0 { сам.valOld = сам.val сам.val-- } } // IsReady -- возвращает признак готовности восстановления func (сам *RepairTime) IsReady() bool { сам.block.RLock() defer сам.block.RUnlock() return сам.val == 0 } // IsChange -- возвращает признак изменения здоровья после присвоения func (сам *RepairTime) IsChange() bool { сам.block.RLock() defer сам.block.RUnlock() return сам.val == сам.valOld }