diff options
| author | Ondřej Surý <ondrej@sury.org> | 2011-04-26 09:55:32 +0200 |
|---|---|---|
| committer | Ondřej Surý <ondrej@sury.org> | 2011-04-26 09:55:32 +0200 |
| commit | 7b15ed9ef455b6b66c6b376898a88aef5d6a9970 (patch) | |
| tree | 3ef530baa80cdf29436ba981f5783be6b4d2202b /src/pkg/time | |
| parent | 50104cc32a498f7517a51c8dc93106c51c7a54b4 (diff) | |
| download | golang-7b15ed9ef455b6b66c6b376898a88aef5d6a9970.tar.gz | |
Imported Upstream version 2011.04.13upstream/2011.04.13
Diffstat (limited to 'src/pkg/time')
| -rw-r--r-- | src/pkg/time/sleep.go | 5 | ||||
| -rw-r--r-- | src/pkg/time/sleep_test.go | 23 | ||||
| -rw-r--r-- | src/pkg/time/sys.go | 14 | ||||
| -rw-r--r-- | src/pkg/time/time.go | 2 | ||||
| -rw-r--r-- | src/pkg/time/time_test.go | 12 |
5 files changed, 46 insertions, 10 deletions
diff --git a/src/pkg/time/sleep.go b/src/pkg/time/sleep.go index 7b3f01f01..3bc253c94 100644 --- a/src/pkg/time/sleep.go +++ b/src/pkg/time/sleep.go @@ -5,9 +5,8 @@ package time import ( - "syscall" - "sync" "container/heap" + "sync" ) // The Timer type represents a single event. @@ -126,7 +125,7 @@ func sleeper(sleeperId int64) { dt = maxSleepTime } timerMutex.Unlock() - syscall.Sleep(dt) + sysSleep(dt) timerMutex.Lock() if currentSleeper != sleeperId { // Another sleeper has been started, making this one redundant. diff --git a/src/pkg/time/sleep_test.go b/src/pkg/time/sleep_test.go index 8bf599c3e..25e79f9fb 100644 --- a/src/pkg/time/sleep_test.go +++ b/src/pkg/time/sleep_test.go @@ -5,6 +5,7 @@ package time_test import ( + "fmt" "os" "syscall" "testing" @@ -132,6 +133,21 @@ func TestAfterStop(t *testing.T) { } } +func TestAfterQueuing(t *testing.T) { + // This test flakes out on some systems, + // so we'll try it a few times before declaring it a failure. + const attempts = 3 + err := os.NewError("!=nil") + for i := 0; i < attempts && err != nil; i++ { + if err = testAfterQueuing(t); err != nil { + t.Logf("attempt %v failed: %v", i, err) + } + } + if err != nil { + t.Fatal(err) + } +} + var slots = []int{5, 3, 6, 6, 6, 1, 1, 2, 7, 9, 4, 8, 0} type afterResult struct { @@ -143,7 +159,7 @@ func await(slot int, result chan<- afterResult, ac <-chan int64) { result <- afterResult{slot, <-ac} } -func TestAfterQueuing(t *testing.T) { +func testAfterQueuing(t *testing.T) os.Error { const ( Delta = 100 * 1e6 ) @@ -160,13 +176,14 @@ func TestAfterQueuing(t *testing.T) { for _, slot := range slots { r := <-result if r.slot != slot { - t.Fatalf("after queue got slot %d, expected %d", r.slot, slot) + return fmt.Errorf("after queue got slot %d, expected %d", r.slot, slot) } ns := r.t - t0 target := int64(slot * Delta) slop := int64(Delta) / 4 if ns < target-slop || ns > target+slop { - t.Fatalf("after queue slot %d arrived at %g, expected [%g,%g]", slot, float64(ns), float64(target-slop), float64(target+slop)) + return fmt.Errorf("after queue slot %d arrived at %g, expected [%g,%g]", slot, float64(ns), float64(target-slop), float64(target+slop)) } } + return nil } diff --git a/src/pkg/time/sys.go b/src/pkg/time/sys.go index 8a2e6fadc..63f4cbf3d 100644 --- a/src/pkg/time/sys.go +++ b/src/pkg/time/sys.go @@ -44,11 +44,19 @@ func sleep(t, ns int64) (int64, os.Error) { // TODO(cw): use monotonic-time once it's available end := t + ns for t < end { - errno := syscall.Sleep(end - t) - if errno != 0 && errno != syscall.EINTR { - return 0, os.NewSyscallError("sleep", errno) + err := sysSleep(end - t) + if err != nil { + return 0, err } t = Nanoseconds() } return t, nil } + +func sysSleep(t int64) os.Error { + errno := syscall.Sleep(t) + if errno != 0 && errno != syscall.EINTR { + return os.NewSyscallError("sleep", errno) + } + return nil +} diff --git a/src/pkg/time/time.go b/src/pkg/time/time.go index 432b3523a..40338f775 100644 --- a/src/pkg/time/time.go +++ b/src/pkg/time/time.go @@ -23,7 +23,7 @@ type Time struct { Month, Day int // Jan-2 is 1, 2 Hour, Minute, Second int // 15:04:05 is 15, 4, 5. Weekday int // Sunday, Monday, ... - ZoneOffset int // seconds east of UTC, e.g. -7*60 for -0700 + ZoneOffset int // seconds east of UTC, e.g. -7*60*60 for -0700 Zone string // e.g., "MST" } diff --git a/src/pkg/time/time_test.go b/src/pkg/time/time_test.go index c86bca1b4..1d83291c0 100644 --- a/src/pkg/time/time_test.go +++ b/src/pkg/time/time_test.go @@ -19,6 +19,18 @@ func init() { os.Setenv("TZ", "America/Los_Angeles") } +// We should be in PST/PDT, but if the time zone files are missing we +// won't be. The purpose of this test is to at least explain why some of +// the subsequent tests fail. +func TestZoneData(t *testing.T) { + lt := LocalTime() + // PST is 8 hours west, PDT is 7 hours west. We could use the name but it's not unique. + if off := lt.ZoneOffset; off != -8*60*60 && off != -7*60*60 { + t.Errorf("Unable to find US Pacific time zone data for testing; time zone is %q offset %d", lt.Zone, off) + t.Error("Likely problem: the time zone files have not been installed.") + } +} + type TimeTest struct { seconds int64 golden Time |
