diff --git a/src/cmd/go/internal/par/work.go b/src/cmd/go/internal/par/work.go index 6543f1a35c..a568c86f60 100644 --- a/src/cmd/go/internal/par/work.go +++ b/src/cmd/go/internal/par/work.go @@ -55,7 +55,6 @@ func (w *Work) Do(n int, f func(item interface{})) { if n < 1 { panic("par.Work.Do: n < 1") } - n = 1 if w.running >= 1 { panic("par.Work.Do: already called Do") } diff --git a/src/cmd/go/internal/par/work_test.go b/src/cmd/go/internal/par/work_test.go index 71c0395d3b..53a715ea81 100644 --- a/src/cmd/go/internal/par/work_test.go +++ b/src/cmd/go/internal/par/work_test.go @@ -7,6 +7,7 @@ package par import ( "sync/atomic" "testing" + "time" ) func TestWork(t *testing.T) { @@ -30,6 +31,30 @@ func TestWork(t *testing.T) { } } +func TestWorkParallel(t *testing.T) { + var w Work + + for tries := 0; tries < 10; tries++ { + const N = 100 + for i := 0; i < N; i++ { + w.Add(i) + } + start := time.Now() + var n int32 + w.Do(N, func(x interface{}) { + time.Sleep(1 * time.Millisecond) + atomic.AddInt32(&n, +1) + }) + if n != N { + t.Fatalf("par.Work.Do did not do all the work") + } + if time.Since(start) < N/2*time.Millisecond { + return + } + } + t.Fatalf("par.Work.Do does not seem to be parallel") +} + func TestCache(t *testing.T) { var cache Cache