func Ticker(ns int64, c *chan int64) {
var tv syscall.Timeval;
+ now := time.Nanoseconds();
+ when := now;
for {
- syscall.nstotimeval(ns, &tv);
+ 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
+ }
+
+ syscall.nstotimeval(when - now, &tv);
syscall.Syscall6(syscall.SYS_SELECT, 0, 0, 0, 0, syscall.TimevalPtr(&tv), 0);
- nsec, err := time.Nanoseconds();
- c <- nsec;
+ now = time.Nanoseconds();
+ c <- now;
}
}
export func Tick(ns int64) *chan int64 {
+ if ns <= 0 {
+ return nil
+ }
c := new(chan int64);
go Ticker(ns, c);
return c;
)
// Seconds since January 1, 1970 00:00:00 GMT
-export func Seconds() (sec int64, err *os.Error) {
- var nsec int64;
- sec, nsec, err = os.Time();
- return sec, err
+export func Seconds() int64 {
+ sec, nsec, err := os.Time();
+ if err != nil {
+ panic("time: os.Time: ", err.String());
+ }
+ return sec
}
// Nanoseconds since January 1, 1970 00:00:00 GMT
-export func Nanoseconds() (nsec int64, err *os.Error) {
- var sec int64;
- sec, nsec, err = os.Time();
- return sec*1e9 + nsec, err
+export func Nanoseconds() int64 {
+ sec, nsec, err := os.Time();
+ if err != nil {
+ panic("time: os.Time: ", err.String());
+ }
+ return sec*1e9 + nsec
}
export const (
}
export func UTC() (t *Time, err *os.Error) {
- var sec int64;
- sec, err = Seconds();
- if err != nil {
- return nil, err
- }
- return SecondsToUTC(sec), nil
+ return SecondsToUTC(Seconds()), nil
}
// TODO: Should this return an error?
}
export func LocalTime() (t *Time, err *os.Error) {
- var sec int64;
- sec, err = Seconds();
- if err != nil {
- return nil, err
- }
- return SecondsToLocalTime(sec), nil
+ return SecondsToLocalTime(Seconds()), nil
}
// Compute number of seconds since January 1, 1970.