diff options
Diffstat (limited to 'src/time/internal_test.go')
-rw-r--r-- | src/time/internal_test.go | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/time/internal_test.go b/src/time/internal_test.go new file mode 100644 index 000000000..edd523bc8 --- /dev/null +++ b/src/time/internal_test.go @@ -0,0 +1,59 @@ +// Copyright 2011 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 + +func init() { + // force US/Pacific for time zone tests + ForceUSPacificForTesting() +} + +var Interrupt = interrupt +var DaysIn = daysIn + +func empty(arg interface{}, seq uintptr) {} + +// Test that a runtimeTimer with a duration so large it overflows +// does not cause other timers to hang. +// +// This test has to be in internal_test.go since it fiddles with +// unexported data structures. +func CheckRuntimeTimerOverflow() { + // We manually create a runtimeTimer to bypass the overflow + // detection logic in NewTimer: we're testing the underlying + // runtime.addtimer function. + r := &runtimeTimer{ + when: runtimeNano() + (1<<63 - 1), + f: empty, + arg: nil, + } + startTimer(r) + + // Start a goroutine that should send on t.C right away. + t := NewTimer(1) + + defer func() { + // Subsequent tests won't work correctly if we don't stop the + // overflow timer and kick the timer proc back into service. + // + // The timer proc is now sleeping and can only be awoken by + // adding a timer to the *beginning* of the heap. We can't + // wake it up by calling NewTimer since other tests may have + // left timers running that should have expired before ours. + // Instead we zero the overflow timer duration and start it + // once more. + stopTimer(r) + t.Stop() + r.when = 0 + startTimer(r) + }() + + // If the test fails, we will hang here until the timeout in the testing package + // fires, which is 10 minutes. It would be nice to catch the problem sooner, + // but there is no reliable way to guarantee that timerproc schedules without + // doing something involving timerproc itself. Previous failed attempts have + // tried calling runtime.Gosched and runtime.GC, but neither is reliable. + // So we fall back to hope: We hope we don't hang here. + <-t.C +} |