github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/src/pkg/time/tick.go (about) 1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package time 6 7 import "errors" 8 9 // A Ticker holds a channel that delivers `ticks' of a clock 10 // at intervals. 11 type Ticker struct { 12 C <-chan Time // The channel on which the ticks are delivered. 13 r runtimeTimer 14 } 15 16 // NewTicker returns a new Ticker containing a channel that will send the 17 // time with a period specified by the duration argument. 18 // It adjusts the intervals or drops ticks to make up for slow receivers. 19 // The duration d must be greater than zero; if not, NewTicker will panic. 20 func NewTicker(d Duration) *Ticker { 21 if d <= 0 { 22 panic(errors.New("non-positive interval for NewTicker")) 23 } 24 // Give the channel a 1-element time buffer. 25 // If the client falls behind while reading, we drop ticks 26 // on the floor until the client catches up. 27 c := make(chan Time, 1) 28 t := &Ticker{ 29 C: c, 30 r: runtimeTimer{ 31 when: nano() + int64(d), 32 period: int64(d), 33 f: sendTime, 34 arg: c, 35 }, 36 } 37 startTimer(&t.r) 38 return t 39 } 40 41 // Stop turns off a ticker. After Stop, no more ticks will be sent. 42 // Stop does not close the channel, to prevent a read from the channel succeeding 43 // incorrectly. 44 func (t *Ticker) Stop() { 45 stopTimer(&t.r) 46 } 47 48 // Tick is a convenience wrapper for NewTicker providing access to the ticking 49 // channel only. Useful for clients that have no need to shut down the ticker. 50 func Tick(d Duration) <-chan Time { 51 if d <= 0 { 52 return nil 53 } 54 return NewTicker(d).C 55 }