2012-03-27 23:13:14 +00:00
|
|
|
// 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
|
2014-09-21 17:33:12 +00:00
|
|
|
ForceUSPacificForTesting()
|
2012-03-27 23:13:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
var Interrupt = interrupt
|
|
|
|
var DaysIn = daysIn
|
2014-09-21 17:33:12 +00:00
|
|
|
|
2015-08-28 15:33:40 +00:00
|
|
|
func empty(arg interface{}, seq uintptr) {}
|
2014-09-21 17:33:12 +00:00
|
|
|
|
|
|
|
// 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.
|
2015-08-28 15:33:40 +00:00
|
|
|
func CheckRuntimeTimerOverflow() {
|
2014-09-21 17:33:12 +00:00
|
|
|
// We manually create a runtimeTimer to bypass the overflow
|
|
|
|
// detection logic in NewTimer: we're testing the underlying
|
|
|
|
// runtime.addtimer function.
|
|
|
|
r := &runtimeTimer{
|
2015-08-28 15:33:40 +00:00
|
|
|
when: runtimeNano() + (1<<63 - 1),
|
2014-09-21 17:33:12 +00:00
|
|
|
f: empty,
|
|
|
|
arg: nil,
|
|
|
|
}
|
|
|
|
startTimer(r)
|
|
|
|
|
2015-08-28 15:33:40 +00:00
|
|
|
// Start a goroutine that should send on t.C right away.
|
2014-09-21 17:33:12 +00:00
|
|
|
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)
|
|
|
|
}()
|
|
|
|
|
2015-08-28 15:33:40 +00:00
|
|
|
// 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
|
2014-09-21 17:33:12 +00:00
|
|
|
}
|