1
0
mirror of https://github.com/golang/go synced 2024-10-05 22:31:22 -06:00
go/src/lib/time/tick.go

60 lines
1.2 KiB
Go
Raw Normal View History

// 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;
}
}
2009-01-20 15:40:40 -07:00
func Tick(ns int64) chan int64 {
if ns <= 0 {
return nil
}
2009-01-06 16:19:02 -07:00
c := make(chan int64);
go ticker(ns, c);
return c;
}