OSDN Git Service

libgo: Update to weekly.2011-12-02.
[pf3gnuchains/gcc-fork.git] / libgo / go / time / tick.go
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 synchronous 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, in nanoseconds, 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 func (t *Ticker) Stop() {
43         stopTimer(&t.r)
44 }
45
46 // Tick is a convenience wrapper for NewTicker providing access to the ticking
47 // channel only.  Useful for clients that have no need to shut down the ticker.
48 func Tick(d Duration) <-chan Time {
49         if d <= 0 {
50                 return nil
51         }
52         return NewTicker(d).C
53 }