From 4e406a2372b65ce58b2c4d26ada1c8b27c791af8 Mon Sep 17 00:00:00 2001 From: Dave Cheney Date: Tue, 18 Dec 2012 16:38:00 -0800 Subject: [PATCH] go/token: add test for concurrent use of FileSet.Pos 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 | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/pkg/go/token/position_test.go b/src/pkg/go/token/position_test.go index 160107df40..3e7d552b75 100644 --- a/src/pkg/go/token/position_test.go +++ b/src/pkg/go/token/position_test.go @@ -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() +}