diff options
Diffstat (limited to 'src/pkg/time/tick.go')
-rw-r--r-- | src/pkg/time/tick.go | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/pkg/time/tick.go b/src/pkg/time/tick.go new file mode 100644 index 000000000..53e2234f8 --- /dev/null +++ b/src/pkg/time/tick.go @@ -0,0 +1,62 @@ +// 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 ( + "syscall"; + "time"; + "unsafe"; +) + +// TODO(rsc): This implementation of time.Tick is a +// simple placeholder. Eventually, there will need to be +// a single central time server no matter how many tickers +// are active. There also needs to be a way to cancel a ticker. +// +// Also, if timeouts become part of the select statement, +// perhaps the Ticker is just: +// +// func Ticker(ns int64, c chan int64) { +// for { +// select { timeout ns: } +// nsec, err := time.Nanoseconds(); +// c <- nsec; +// } + +func ticker(ns int64, c chan int64) { + var tv syscall.Timeval; + now := time.Nanoseconds(); + when := now; + for { + when += ns; // next alarm + + // if c <- now took too long, skip ahead + if when < now { + // one big step + when += (now-when)/ns * ns; + } + for when <= now { + // little steps until when > now + when += ns + } + + time.Sleep(when - now); + now = time.Nanoseconds(); + c <- now; + } +} + +// Tick creates a synchronous 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. +func Tick(ns int64) chan int64 { + if ns <= 0 { + return nil + } + c := make(chan int64); + go ticker(ns, c); + return c; +} + |