| // Copyright 2009 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package time |
| |
| import "errors" |
| |
| // A Ticker holds a synchronous channel that delivers `ticks' of a clock |
| // at intervals. |
| type Ticker struct { |
| C <-chan int64 // The channel on which the ticks are delivered. |
| r runtimeTimer |
| } |
| |
| // NewTicker returns a new Ticker containing a channel that will |
| // send the time, in nanoseconds, every ns nanoseconds. It adjusts the |
| // intervals to make up for pauses in delivery of the ticks. The value of |
| // ns must be greater than zero; if not, NewTicker will panic. |
| func NewTicker(ns int64) *Ticker { |
| if ns <= 0 { |
| panic(errors.New("non-positive interval for NewTicker")) |
| } |
| // Give the channel a 1-element time buffer. |
| // If the client falls behind while reading, we drop ticks |
| // on the floor until the client catches up. |
| c := make(chan int64, 1) |
| t := &Ticker{ |
| C: c, |
| r: runtimeTimer{ |
| when: Nanoseconds() + ns, |
| period: ns, |
| f: sendTime, |
| arg: c, |
| }, |
| } |
| startTimer(&t.r) |
| return t |
| } |
| |
| // Stop turns off a ticker. After Stop, no more ticks will be sent. |
| func (t *Ticker) Stop() { |
| stopTimer(&t.r) |
| } |
| |
| // Tick is a convenience wrapper for NewTicker providing access to the ticking |
| // channel only. Useful for clients that have no need to shut down the ticker. |
| func Tick(ns int64) <-chan int64 { |
| if ns <= 0 { |
| return nil |
| } |
| return NewTicker(ns).C |
| } |