]> Cypherpunks repositories - gostls13.git/commitdiff
add time.Tick()
authorRuss Cox <rsc@golang.org>
Thu, 4 Dec 2008 00:40:00 +0000 (16:40 -0800)
committerRuss Cox <rsc@golang.org>
Thu, 4 Dec 2008 00:40:00 +0000 (16:40 -0800)
R=r
DELTA=130  (115 added, 1 deleted, 14 changed)
OCL=20376
CL=20385

src/lib/syscall/time_amd64_darwin.go
src/lib/syscall/time_amd64_linux.go
src/lib/time/Makefile
src/lib/time/tick.go [new file with mode: 0644]
src/lib/time/tick_test.go [new file with mode: 0644]

index 011933b4f3807ac042147ca04d432e5cc6b69bcc..7be6d6607dc7e36a33afca3ecb1198e33cb75782 100644 (file)
@@ -16,3 +16,9 @@ export func gettimeofday() (sec, nsec, errno int64) {
        }
        return r1, r2*1000, 0
 }
+
+export func nstotimeval(ns int64, tv *Timeval) {
+       ns += 999;      // round up
+       tv.sec = int64(ns/1000000000);
+       tv.usec = uint32(ns%1000000000 / 1000);
+}
index 43b050119e9ad3a49cb08d88c9810594cda3e07b..f9b5f014d96590f4d26745216cc9fd5bcb007b73 100644 (file)
@@ -14,3 +14,9 @@ export func gettimeofday() (sec, nsec, errno int64) {
        }
        return int64(tv.sec), int64(tv.usec*1000), 0
 }
+
+export func nstotimeval(ns int64, tv *Timeval) {
+       ns += 999;      // round up
+       tv.sec = int64(ns/1000000000);
+       tv.usec = uint64(ns%1000000000 / 1000);
+}
index d397be1f36b946cae53d9055bb42939d6ec47f20..9f42265a869674f8238a5c82165f57ffb637224f 100644 (file)
@@ -2,34 +2,70 @@
 # Use of this source code is governed by a BSD-style
 # license that can be found in the LICENSE file.
 
+# DO NOT EDIT.  Automatically generated by gobuild.
+# gobuild -m >Makefile
 O=6
 GC=$(O)g
+CC=$(O)c -w
+AS=$(O)a
+AR=$(O)ar
 
-PKG=$(GOROOT)/pkg/time.a
+default: packages
+
+clean:
+       rm -f *.$O *.a $O.out
+
+test: packages
+       gotest
+
+coverage: packages
+       gotest
+       6cov -g `pwd` | grep -v '_test\.go:'
+
+%.$O: %.go
+       $(GC) $*.go
+
+%.$O: %.c
+       $(CC) $*.c
+
+%.$O: %.s
+       $(AS) $*.s
 
 O1=\
-       zoneinfo.$O
+       zoneinfo.$O\
+
 O2=\
        time.$O\
 
-install: nuke $(PKG)
+O3=\
+       tick.$O\
+
+time.a: a1 a2 a3
 
-$(PKG): a1 a2
+a1:    $(O1)
+       $(AR) grc time.a zoneinfo.$O
+       rm -f $(O1)
 
-a1:    $(O1)
-       $(O)ar grc $(PKG) $(O1)
+a2:    $(O2)
+       $(AR) grc time.a time.$O
+       rm -f $(O2)
 
-a2:    $(O2)
-       $(O)ar grc $(PKG) $(O2)
+a3:    $(O3)
+       $(AR) grc time.a tick.$O
+       rm -f $(O3)
 
-$(O1): nuke
+newpkg: clean
+       $(AR) grc time.a
+
+$(O1): newpkg
 $(O2): a1
+$(O3): a2
 
-nuke:
-       rm -f *.$(O) *.a $(PKG)
+nuke: clean
+       rm -f $(GOROOT)/pkg/time.a
 
-clean:
-       rm -f *.$(O) *.a
+packages: time.a
+
+install: packages
+       cp time.a $(GOROOT)/pkg/time.a
 
-%.$O:  %.go
-       $(GC) $<
diff --git a/src/lib/time/tick.go b/src/lib/time/tick.go
new file mode 100644 (file)
index 0000000..efd5ceb
--- /dev/null
@@ -0,0 +1,42 @@
+// 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"
+)
+
+// 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;
+       for {
+               syscall.nstotimeval(ns, &tv);
+               syscall.Syscall6(syscall.SYS_SELECT, 0, 0, 0, 0, syscall.TimevalPtr(&tv), 0);
+               nsec, err := time.Nanoseconds();
+               c <- nsec;
+       }
+}
+
+export func Tick(ns int64) *chan int64 {
+       c := new(chan int64);
+       go Ticker(ns, c);
+       return c;
+}
+
diff --git a/src/lib/time/tick_test.go b/src/lib/time/tick_test.go
new file mode 100644 (file)
index 0000000..9530f62
--- /dev/null
@@ -0,0 +1,29 @@
+// 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 (
+       "testing";
+       "time";
+)
+
+export func TestTick(t *testing.T) {
+       const (
+               Delta uint64 = 10*1e6;
+               Count uint64 = 10;
+       );
+       c := Tick(Delta);
+       t0, err := Nanoseconds();
+       for i := 0; i < Count; i++ {
+               <-c;
+       }
+       t1, err1 := Nanoseconds();
+       ns := t1 - t0;
+       target := int64(Delta*Count);
+       slop := target*2/10;
+       if ns < target - slop || ns > target + slop {
+               t.Fatalf("%d ticks of %d ns took %d ns, expected %d", Count, Delta, ns, target);
+       }
+}