]> Cypherpunks repositories - gostls13.git/commitdiff
go/token: add test for concurrent use of FileSet.Pos
authorDave Cheney <dave@cheney.net>
Wed, 19 Dec 2012 00:38:00 +0000 (16:38 -0800)
committerRobert Griesemer <gri@golang.org>
Wed, 19 Dec 2012 00:38:00 +0000 (16:38 -0800)
Update #4354.

Add a test to expose the race in the FileSet position cache.

R=dvyukov, gri
CC=fullung, golang-dev
https://golang.org/cl/6940078

src/pkg/go/token/position_test.go

index 160107df407df8b7a2ab7f9b3ef189f6cd7766c4..3e7d552b7541c2b25d1bca1d92cc15101c39e514 100644 (file)
@@ -6,6 +6,8 @@ package token
 
 import (
        "fmt"
+       "math/rand"
+       "sync"
        "testing"
 )
 
@@ -179,3 +181,26 @@ func TestFiles(t *testing.T) {
                }
        }
 }
+
+// issue 4345. Test concurrent use of FileSet.Pos does not trigger a
+// race in the FileSet position cache.
+func TestFileSetRace(t *testing.T) {
+       fset := NewFileSet()
+       for i := 0; i < 100; i++ {
+               fset.AddFile(fmt.Sprintf("file-%d", i), fset.Base(), 1031)
+       }
+       max := int32(fset.Base())
+       var stop sync.WaitGroup
+       r := rand.New(rand.NewSource(7))
+       for i := 0; i < 2; i++ {
+               r := rand.New(rand.NewSource(r.Int63()))
+               stop.Add(1)
+               go func() {
+                       for i := 0; i < 1000; i++ {
+                               fset.Position(Pos(r.Int31n(max)))
+                       }
+                       stop.Done()
+               }()
+       }
+       stop.Wait()
+}