From ba3149612f62c011765876d7a437095fa50e0771 Mon Sep 17 00:00:00 2001 From: Allen Li Date: Thu, 11 Jul 2019 00:57:57 +0000 Subject: [PATCH] time: clarify when draining a Timer's channel is needed Updates #27169 Change-Id: I22a6194c06529ba70b1ec648e3188c191224e321 GitHub-Last-Rev: 457b2a61a8ee4a745371c87756e5b6f38058af28 GitHub-Pull-Request: golang/go#32996 Reviewed-on: https://go-review.googlesource.com/c/go/+/185245 Reviewed-by: Rob Pike --- src/time/sleep.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/time/sleep.go b/src/time/sleep.go index 10edf6fe0e..2cc908da55 100644 --- a/src/time/sleep.go +++ b/src/time/sleep.go @@ -54,8 +54,8 @@ type Timer struct { // Stop does not close the channel, to prevent a read from the channel succeeding // incorrectly. // -// To prevent a timer created with NewTimer from firing after a call to Stop, -// check the return value and drain the channel. +// To ensure the channel is empty after a call to Stop, check the +// return value and drain the channel. // For example, assuming the program has not received from t.C already: // // if !t.Stop() { @@ -97,10 +97,9 @@ func NewTimer(d Duration) *Timer { // It returns true if the timer had been active, false if the timer had // expired or been stopped. // -// Resetting a timer must take care not to race with the send into t.C -// that happens when the current timer expires. +// Reset should be invoked only on stopped or expired timers with drained channels. // If a program has already received a value from t.C, the timer is known -// to have expired, and t.Reset can be used directly. +// to have expired and the channel drained, so t.Reset can be used directly. // If a program has not yet received a value from t.C, however, // the timer must be stopped and—if Stop reports that the timer expired // before being stopped—the channel explicitly drained: -- 2.48.1