]> Cypherpunks repositories - gostls13.git/commitdiff
runtime/race: add tests for maps with big keys/vals
authorDmitriy Vyukov <dvyukov@google.com>
Tue, 5 Aug 2014 14:12:38 +0000 (18:12 +0400)
committerDmitriy Vyukov <dvyukov@google.com>
Tue, 5 Aug 2014 14:12:38 +0000 (18:12 +0400)
With the recent GC changes large objects are handled somewhat differently.

LGTM=khr
R=khr
CC=golang-codereviews
https://golang.org/cl/114600043

src/pkg/runtime/race/testdata/map_test.go

index 0a3a9f12a9a324f77f2bb56c18ecf0351336e265..a8d8148d0e7ff8a90a89ded6f29e32dcbd9bbe45 100644 (file)
@@ -238,3 +238,96 @@ func TestRaceMapAssignMultipleReturn(t *testing.T) {
        _ = x
        <-ch
 }
+
+// BigKey and BigVal must be larger than 256 bytes,
+// so that compiler sets KindGCProg for them.
+type BigKey [1000]*int
+
+type BigVal struct {
+       x int
+       y [1000]*int
+}
+
+func TestRaceMapBigKeyAccess1(t *testing.T) {
+       m := make(map[BigKey]int)
+       var k BigKey
+       ch := make(chan bool, 1)
+       go func() {
+               _ = m[k]
+               ch <- true
+       }()
+       k[30] = new(int)
+       <-ch
+}
+
+func TestRaceMapBigKeyAccess2(t *testing.T) {
+       m := make(map[BigKey]int)
+       var k BigKey
+       ch := make(chan bool, 1)
+       go func() {
+               _, _ = m[k]
+               ch <- true
+       }()
+       k[30] = new(int)
+       <-ch
+}
+
+func TestRaceMapBigKeyInsert(t *testing.T) {
+       m := make(map[BigKey]int)
+       var k BigKey
+       ch := make(chan bool, 1)
+       go func() {
+               m[k] = 1
+               ch <- true
+       }()
+       k[30] = new(int)
+       <-ch
+}
+
+func TestRaceMapBigKeyDelete(t *testing.T) {
+       m := make(map[BigKey]int)
+       var k BigKey
+       ch := make(chan bool, 1)
+       go func() {
+               delete(m, k)
+               ch <- true
+       }()
+       k[30] = new(int)
+       <-ch
+}
+
+func TestRaceMapBigValInsert(t *testing.T) {
+       m := make(map[int]BigVal)
+       var v BigVal
+       ch := make(chan bool, 1)
+       go func() {
+               m[1] = v
+               ch <- true
+       }()
+       v.y[30] = new(int)
+       <-ch
+}
+
+func TestRaceMapBigValAccess1(t *testing.T) {
+       m := make(map[int]BigVal)
+       var v BigVal
+       ch := make(chan bool, 1)
+       go func() {
+               v = m[1]
+               ch <- true
+       }()
+       v.y[30] = new(int)
+       <-ch
+}
+
+func TestRaceMapBigValAccess2(t *testing.T) {
+       m := make(map[int]BigVal)
+       var v BigVal
+       ch := make(chan bool, 1)
+       go func() {
+               v, _ = m[1]
+               ch <- true
+       }()
+       v.y[30] = new(int)
+       <-ch
+}