If the context expires before acquireThread(ctx) succeeds, then the goroutine can block like:
net.lookupProtocol.func1()
src/net/lookup_windows.go:58 +0x105
created by net.lookupProtocol in goroutine 2834
src/net/lookup_windows.go:56 +0xda
We saw this in our UTs with a leak detector, confirmed by inspection of the source code.
Change-Id: I9b927f0345a2fa7336b23d95c506a8a0976e28d0
GitHub-Last-Rev:
27af7477a99bdbee0c32697837f1ff261ee70d83
GitHub-Pull-Request: golang/go#73364
Reviewed-on: https://go-review.googlesource.com/c/go/+/664956
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-by: Zxilly Chou <zhouxinyu1001@gmail.com>
Reviewed-by: David Chase <drchase@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
proto int
err error
}
- ch := make(chan result) // unbuffered
+ ch := make(chan result, 1) // buffer so that next goroutine never blocks
go func() {
if err := acquireThread(ctx); err != nil {
ch <- result{err: mapErr(err)}
runtime.LockOSThread()
defer runtime.UnlockOSThread()
proto, err := getprotobyname(name)
- select {
- case ch <- result{proto: proto, err: err}:
- case <-ctx.Done():
- }
+ ch <- result{proto: proto, err: err}
}()
select {
case r := <-ch: