From 9d8ef8d73b53840886e4a772c72f2b7d396cb37c Mon Sep 17 00:00:00 2001 From: David Symonds Date: Fri, 18 Mar 2016 08:54:57 +1100 Subject: [PATCH] context: Uniformly pass cancelCtx by pointer. cancelCtx has an embedded sync.Mutex. This change causes an extra allocation when creating a new timerCtx via WithDeadline, but that seems minor when compared with better locking discipline. If it turns out to be a problem, the whole cancelCtx struct can be flattened into timerCtx. Addresses part of golang/go#14839. Change-Id: Ie86ed1b63592b521aefde747d5fafcd49ac18178 Reviewed-on: https://go-review.googlesource.com/20840 Reviewed-by: Brad Fitzpatrick --- context/context.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/context/context.go b/context/context.go index 77b64d0c..19235cf2 100644 --- a/context/context.go +++ b/context/context.go @@ -210,13 +210,13 @@ type CancelFunc func() // call cancel as soon as the operations running in this Context complete. func WithCancel(parent Context) (ctx Context, cancel CancelFunc) { c := newCancelCtx(parent) - propagateCancel(parent, &c) - return &c, func() { c.cancel(true, Canceled) } + propagateCancel(parent, c) + return c, func() { c.cancel(true, Canceled) } } // newCancelCtx returns an initialized cancelCtx. -func newCancelCtx(parent Context) cancelCtx { - return cancelCtx{ +func newCancelCtx(parent Context) *cancelCtx { + return &cancelCtx{ Context: parent, done: make(chan struct{}), } @@ -259,7 +259,7 @@ func parentCancelCtx(parent Context) (*cancelCtx, bool) { case *cancelCtx: return c, true case *timerCtx: - return &c.cancelCtx, true + return c.cancelCtx, true case *valueCtx: parent = c.Context default: @@ -377,7 +377,7 @@ func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc) { // implement Done and Err. It implements cancel by stopping its timer then // delegating to cancelCtx.cancel. type timerCtx struct { - cancelCtx + *cancelCtx timer *time.Timer // Under cancelCtx.mu. deadline time.Time