]> Cypherpunks repositories - gostls13.git/commitdiff
time: Sleep through interruptions
authorChristopher Wedgwood <cw@f00f.org>
Thu, 4 Feb 2010 21:09:02 +0000 (13:09 -0800)
committerRuss Cox <rsc@golang.org>
Thu, 4 Feb 2010 21:09:02 +0000 (13:09 -0800)
R=rsc
CC=golang-dev
https://golang.org/cl/202043

src/pkg/time/sleep.go
src/pkg/time/sleep_test.go [new file with mode: 0644]

index fe0ddce4a9b4cce5eced1b998f3bee2eaef8dec5..5de5374cea7f43cf29bd3eb13a4292fe0885e196 100644 (file)
@@ -11,5 +11,16 @@ import (
 
 // Sleep pauses the current goroutine for at least ns nanoseconds. Higher resolution
 // sleeping may be provided by syscall.Nanosleep on some operating systems.
-// Sleep returns os.EINTR if interrupted.
-func Sleep(ns int64) os.Error { return os.NewSyscallError("sleep", syscall.Sleep(ns)) }
+func Sleep(ns int64) os.Error {
+       // TODO(cw): use monotonic-time once it's available
+       t := Nanoseconds()
+       end := t + ns
+       for t < end {
+               errno := syscall.Sleep(end - t)
+               if errno != 0 && errno != syscall.EINTR {
+                       return os.NewSyscallError("sleep", errno)
+               }
+               t = Nanoseconds()
+       }
+       return nil
+}
diff --git a/src/pkg/time/sleep_test.go b/src/pkg/time/sleep_test.go
new file mode 100644 (file)
index 0000000..7ec6c49
--- /dev/null
@@ -0,0 +1,26 @@
+// 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_test
+
+import (
+       "os"
+       "syscall"
+       "testing"
+       . "time"
+)
+
+func TestSleep(t *testing.T) {
+       const delay = int64(100e6)
+       go func() {
+               Sleep(delay / 2)
+               syscall.Kill(os.Getpid(), syscall.SIGCHLD)
+       }()
+       start := Nanoseconds()
+       Sleep(delay)
+       duration := Nanoseconds() - start
+       if duration < delay {
+               t.Fatalf("Sleep(%d) slept for only %d ns", delay, duration)
+       }
+}