]> Cypherpunks repositories - gostls13.git/commit
context: use fewer goroutines in WithCancel/WithTimeout
authorRuss Cox <rsc@golang.org>
Thu, 19 Sep 2019 19:33:02 +0000 (15:33 -0400)
committerRuss Cox <rsc@golang.org>
Thu, 26 Sep 2019 16:25:30 +0000 (16:25 +0000)
commit0ad368675bae1e3228c9146e092cd00cfb29ac27
tree01e602b04dfba375108841feed248a3c25456bda
parentae024d9daf9b98dfdc5d4449964645cd3d303ac1
context: use fewer goroutines in WithCancel/WithTimeout

If the parent context passed to WithCancel or WithTimeout
is a known context implementation (one created by this package),
we attach the child to the parent by editing data structures directly;
otherwise, for unknown parent implementations, we make a
goroutine that watches for the parent to finish and propagates
the cancellation.

A common problem with this scheme, before this CL, is that
users who write custom context implementations to manage
their value sets cause WithCancel/WithTimeout to start
goroutines that would have not been started before.

This CL changes the way we map a parent context back to the
underlying data structure. Instead of walking up through
known context implementations to reach the *cancelCtx,
we look up parent.Value(&cancelCtxKey) to return the
innermost *cancelCtx, which we use if it matches parent.Done().

This way, a custom context implementation wrapping a
*cancelCtx but not changing Done-ness (and not refusing
to return wrapped keys) will not require a goroutine anymore
in WithCancel/WithTimeout.

For #28728.

Change-Id: Idba2f435c81b19fe38d0dbf308458ca87c7381e9
Reviewed-on: https://go-review.googlesource.com/c/go/+/196521
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/context/context.go
src/context/context_test.go
src/context/x_test.go
src/go/build/deps_test.go