errgroup: drop support for Go versions before 1.20
Change-Id: I7de5dfae21c4ffe31d6c16e3df0fed3e2269cb16 Reviewed-on: https://go-review.googlesource.com/c/sync/+/654421 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Ian Lance Taylor <iant@google.com> Auto-Submit: Ian Lance Taylor <iant@google.com> Commit-Queue: Ian Lance Taylor <iant@google.com> Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org>
This commit is contained in:
parent
960bf1fb13
commit
b637f27e40
5 changed files with 40 additions and 82 deletions
|
|
@ -46,7 +46,7 @@ func (g *Group) done() {
|
||||||
// returns a non-nil error or the first time Wait returns, whichever occurs
|
// returns a non-nil error or the first time Wait returns, whichever occurs
|
||||||
// first.
|
// first.
|
||||||
func WithContext(ctx context.Context) (*Group, context.Context) {
|
func WithContext(ctx context.Context) (*Group, context.Context) {
|
||||||
ctx, cancel := withCancelCause(ctx)
|
ctx, cancel := context.WithCancelCause(ctx)
|
||||||
return &Group{cancel: cancel}, ctx
|
return &Group{cancel: cancel}, ctx
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -250,6 +250,45 @@ func TestGoLimit(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestCancelCause(t *testing.T) {
|
||||||
|
errDoom := errors.New("group_test: doomed")
|
||||||
|
|
||||||
|
cases := []struct {
|
||||||
|
errs []error
|
||||||
|
want error
|
||||||
|
}{
|
||||||
|
{want: nil},
|
||||||
|
{errs: []error{nil}, want: nil},
|
||||||
|
{errs: []error{errDoom}, want: errDoom},
|
||||||
|
{errs: []error{errDoom, nil}, want: errDoom},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range cases {
|
||||||
|
g, ctx := errgroup.WithContext(context.Background())
|
||||||
|
|
||||||
|
for _, err := range tc.errs {
|
||||||
|
err := err
|
||||||
|
g.TryGo(func() error { return err })
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := g.Wait(); err != tc.want {
|
||||||
|
t.Errorf("after %T.TryGo(func() error { return err }) for err in %v\n"+
|
||||||
|
"g.Wait() = %v; want %v",
|
||||||
|
g, tc.errs, err, tc.want)
|
||||||
|
}
|
||||||
|
|
||||||
|
if tc.want == nil {
|
||||||
|
tc.want = context.Canceled
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := context.Cause(ctx); err != tc.want {
|
||||||
|
t.Errorf("after %T.TryGo(func() error { return err }) for err in %v\n"+
|
||||||
|
"context.Cause(ctx) = %v; tc.want %v",
|
||||||
|
g, tc.errs, err, tc.want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func BenchmarkGo(b *testing.B) {
|
func BenchmarkGo(b *testing.B) {
|
||||||
fn := func() {}
|
fn := func() {}
|
||||||
g := &errgroup.Group{}
|
g := &errgroup.Group{}
|
||||||
|
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
||||||
// Copyright 2023 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
//go:build go1.20
|
|
||||||
|
|
||||||
package errgroup
|
|
||||||
|
|
||||||
import "context"
|
|
||||||
|
|
||||||
func withCancelCause(parent context.Context) (context.Context, func(error)) {
|
|
||||||
return context.WithCancelCause(parent)
|
|
||||||
}
|
|
||||||
|
|
@ -1,54 +0,0 @@
|
||||||
// Copyright 2023 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
//go:build go1.20
|
|
||||||
|
|
||||||
package errgroup_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"errors"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"golang.org/x/sync/errgroup"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestCancelCause(t *testing.T) {
|
|
||||||
errDoom := errors.New("group_test: doomed")
|
|
||||||
|
|
||||||
cases := []struct {
|
|
||||||
errs []error
|
|
||||||
want error
|
|
||||||
}{
|
|
||||||
{want: nil},
|
|
||||||
{errs: []error{nil}, want: nil},
|
|
||||||
{errs: []error{errDoom}, want: errDoom},
|
|
||||||
{errs: []error{errDoom, nil}, want: errDoom},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, tc := range cases {
|
|
||||||
g, ctx := errgroup.WithContext(context.Background())
|
|
||||||
|
|
||||||
for _, err := range tc.errs {
|
|
||||||
err := err
|
|
||||||
g.TryGo(func() error { return err })
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := g.Wait(); err != tc.want {
|
|
||||||
t.Errorf("after %T.TryGo(func() error { return err }) for err in %v\n"+
|
|
||||||
"g.Wait() = %v; want %v",
|
|
||||||
g, tc.errs, err, tc.want)
|
|
||||||
}
|
|
||||||
|
|
||||||
if tc.want == nil {
|
|
||||||
tc.want = context.Canceled
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := context.Cause(ctx); err != tc.want {
|
|
||||||
t.Errorf("after %T.TryGo(func() error { return err }) for err in %v\n"+
|
|
||||||
"context.Cause(ctx) = %v; tc.want %v",
|
|
||||||
g, tc.errs, err, tc.want)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,14 +0,0 @@
|
||||||
// Copyright 2023 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
//go:build !go1.20
|
|
||||||
|
|
||||||
package errgroup
|
|
||||||
|
|
||||||
import "context"
|
|
||||||
|
|
||||||
func withCancelCause(parent context.Context) (context.Context, func(error)) {
|
|
||||||
ctx, cancel := context.WithCancel(parent)
|
|
||||||
return ctx, func(error) { cancel() }
|
|
||||||
}
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue