summaryrefslogtreecommitdiff
path: root/src/pkg/time/tick.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/pkg/time/tick.go')
-rw-r--r--src/pkg/time/tick.go62
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;
+}
+