Thanks!  That makes sense.  Does it make sense to update the docs to
show the "select-with-default" mode of draining the channel instead?

On Wed, Jan 25, 2017 at 10:20 AM, Ian Lance Taylor <i...@golang.org> wrote:
> On Wed, Jan 25, 2017 at 9:34 AM, 'Tim Hockin' via golang-nuts
> <golang-nuts@googlegroups.com> wrote:
>> I'm not convinced that the docs quite cover the case I am looking, so
>> I am posting here.
>>
>> https://golang.org/pkg/time/#Timer.Reset says "This should not be done
>> concurrent to other receives from the Timer's channel" but it's not
>> clear what the repercussions are.
>>
>> In our case, I have a function to be run periodically, on a timer, but
>> it can be run manually too.  When run manually, I want to push the
>> timer out (restart the period).
>>
>> I have a goroutine doing:
>>
>> ```
>>         for {
>>                 select {
>>                 case <-stop:
>>                         pr.stop()
>>                         return
>>                 case <-timer.C:
>>                         run()
>>                 }
>>         }
>> ```
>>
>> deep inside run(), we have:
>>
>> ```
>> timer.Stop()
>> timer.Reset(period)
>> ```
>>
>> I understand that I could lose the race and deliver on timer.C _just
>> before_ this runs, and that is fine.  What I am seeking to know is
>> whether this is considered "safe"?  The receive is running
>> concurrently to the Reset().  Will this cause problems inside Timer,
>> beyond the potential "extra" delivery?  Do I need to break the loop
>> and stop receiving on it while the Reset() happens?
>
> The sentence "This should not be done concurrent to other receives
> from the Timer's channel." is intended to apply to the description of
> how to use t.Stop safely.  It's there because if you use the code
> fragment described there and there is a concurrent receive, you don't
> know which channel receive will succeed.  In other words, the channel
> receive in the code fragment might hang.
>
> It is safe to use Reset as you describe, as long as you understand
> that the timer may expire, and send a value to the channel, as you
> call Stop and Reset.  If you don't care about that--if an extra value
> sent to the channel doesn't matter--then your code is fine.
>
> Ian

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to