aboutsummaryrefslogtreecommitdiff
path: root/src/sync
diff options
context:
space:
mode:
Diffstat (limited to 'src/sync')
-rw-r--r--src/sync/map.go3
-rw-r--r--src/sync/map_test.go14
2 files changed, 16 insertions, 1 deletions
diff --git a/src/sync/map.go b/src/sync/map.go
index e8ccf58b56..00b2446153 100644
--- a/src/sync/map.go
+++ b/src/sync/map.go
@@ -461,7 +461,8 @@ func (m *Map) Range(f func(key, value any) bool) {
read = m.loadReadOnly()
if read.amended {
read = readOnly{m: m.dirty}
- m.read.Store(&read)
+ copyRead := read
+ m.read.Store(&copyRead)
m.dirty = nil
m.misses = 0
}
diff --git a/src/sync/map_test.go b/src/sync/map_test.go
index 1eb3fc68a5..20872f3b72 100644
--- a/src/sync/map_test.go
+++ b/src/sync/map_test.go
@@ -5,6 +5,7 @@
package sync_test
import (
+ "internal/testenv"
"math/rand"
"reflect"
"runtime"
@@ -280,3 +281,16 @@ func TestCompareAndSwap_NonExistingKey(t *testing.T) {
t.Fatalf("CompareAndSwap on an non-existing key succeeded")
}
}
+
+func TestMapRangeNoAllocations(t *testing.T) { // Issue 62404
+ testenv.SkipIfOptimizationOff(t)
+ var m sync.Map
+ allocs := testing.AllocsPerRun(10, func() {
+ m.Range(func(key, value any) bool {
+ return true
+ })
+ })
+ if allocs > 0 {
+ t.Errorf("AllocsPerRun of m.Range = %v; want 0", allocs)
+ }
+}