diff options
Diffstat (limited to 'internal/notify/service.go')
| -rw-r--r-- | internal/notify/service.go | 16 |
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) { |
