diff --git a/internal/safe/map.go b/internal/safe/map.go index 61e12dce..461a9db5 100644 --- a/internal/safe/map.go +++ b/internal/safe/map.go @@ -262,6 +262,14 @@ func (m *Map[Key, Val]) ValuesErr(fn func(vals []Val) error) error { return err } +func (m *Map[Key, Val]) Clear() { + m.lock.Lock() + defer m.lock.Unlock() + + m.data = make(map[Key]Val) + m.order = nil +} + func (m *Map[Key, Val]) MapErr(fn func(map[Key]Val) error) error { m.lock.RLock() defer m.lock.RUnlock() diff --git a/internal/user/user.go b/internal/user/user.go index 03b7378b..eaa4796f 100644 --- a/internal/user/user.go +++ b/internal/user/user.go @@ -238,24 +238,22 @@ func (user *User) SetAddressMode(ctx context.Context, mode vault.AddressMode) er } }) - updateCh := make(map[string]*queue.QueuedChannel[imap.Update]) + user.updateCh.Clear() switch mode { case vault.CombinedMode: primaryUpdateCh := queue.NewQueuedChannel[imap.Update](0, 0) user.apiAddrs.IterKeys(func(addrID string) { - updateCh[addrID] = primaryUpdateCh + user.updateCh.Set(addrID, primaryUpdateCh) }) case vault.SplitMode: user.apiAddrs.IterKeys(func(addrID string) { - updateCh[addrID] = queue.NewQueuedChannel[imap.Update](0, 0) + user.updateCh.Set(addrID, queue.NewQueuedChannel[imap.Update](0, 0)) }) } - user.updateCh = safe.NewMapFrom(updateCh, nil) - if err := user.vault.SetAddressMode(mode); err != nil { return fmt.Errorf("failed to set address mode: %w", err) }