|  | // 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 | 
|  | } |