aboutsummaryrefslogtreecommitdiffstats
path: root/internal/notify/service.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/notify/service.go')
-rw-r--r--internal/notify/service.go16
1 files changed, 14 insertions, 2 deletions
diff --git a/internal/notify/service.go b/internal/notify/service.go
index d775aa6..22d7830 100644
--- a/internal/notify/service.go
+++ b/internal/notify/service.go
@@ -115,9 +115,21 @@ func (s *Service) arm(id uint32, ms int64) {
if ms <= 0 {
return
}
- s.timers[id] = time.AfterFunc(time.Duration(ms)*time.Millisecond, func() {
- s.store.Expire(id)
+ var t *time.Timer
+ t = time.AfterFunc(time.Duration(ms)*time.Millisecond, func() {
+ s.mu.Lock()
+ current := s.timers[id] == t
+ if current {
+ delete(s.timers, id)
+ }
+ s.mu.Unlock()
+ // Only the current timer may expire the id: a timer left over from a
+ // replaced notification must not close its successor.
+ if current {
+ s.store.Expire(id)
+ }
})
+ s.timers[id] = t
}
func (s *Service) stopTimer(id uint32) {