syncs: add map.Clear() method

Updates https://github.com/tailscale/corp/issues/13979

Signed-off-by: Denton Gentry <dgentry@tailscale.com>
pull/8926/head
Denton Gentry 1 year ago committed by Denton Gentry
parent 239ad57446
commit 7e15c78a5a

@ -9,6 +9,7 @@ import (
"sync" "sync"
"sync/atomic" "sync/atomic"
"golang.org/x/exp/maps"
"tailscale.com/util/mak" "tailscale.com/util/mak"
) )
@ -227,6 +228,13 @@ func (m *Map[K, V]) Len() int {
return len(m.m) return len(m.m)
} }
// Clear removes all entries from the map.
func (m *Map[K, V]) Clear() {
m.mu.Lock()
defer m.mu.Unlock()
maps.Clear(m.m)
}
// WaitGroup is identical to [sync.WaitGroup], // WaitGroup is identical to [sync.WaitGroup],
// but provides a Go method to start a goroutine. // but provides a Go method to start a goroutine.
type WaitGroup struct{ sync.WaitGroup } type WaitGroup struct{ sync.WaitGroup }

@ -137,4 +137,22 @@ func TestMap(t *testing.T) {
t.Errorf("exactly one LoadOrStore should load") t.Errorf("exactly one LoadOrStore should load")
} }
}) })
t.Run("Clear", func(t *testing.T) {
var m Map[string, string]
_, _ = m.LoadOrStore("a", "1")
_, _ = m.LoadOrStore("b", "2")
_, _ = m.LoadOrStore("c", "3")
_, _ = m.LoadOrStore("d", "4")
_, _ = m.LoadOrStore("e", "5")
if m.Len() != 5 {
t.Errorf("Len after loading want=5 got=%d", m.Len())
}
m.Clear()
if m.Len() != 0 {
t.Errorf("Len after Clear want=0 got=%d", m.Len())
}
})
} }

Loading…
Cancel
Save