|  | // 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 | 
|  |  | 
|  | import "runtime" | 
|  |  | 
|  | func init() { | 
|  | // force US/Pacific for time zone tests | 
|  | ForceUSPacificForTesting() | 
|  | } | 
|  |  | 
|  | func initTestingZone() { | 
|  | z, err := loadLocation("America/Los_Angeles", zoneSources[len(zoneSources)-1:]) | 
|  | if runtime.Compiler == "gccgo" && err != nil { | 
|  | z, err = loadLocation("America/Los_Angeles", zoneSources) | 
|  | } | 
|  | if err != nil { | 
|  | panic("cannot load America/Los_Angeles for testing: " + err.Error()) | 
|  | } | 
|  | z.name = "Local" | 
|  | localLoc = *z | 
|  | } | 
|  |  | 
|  | var OrigZoneSources = zoneSources | 
|  |  | 
|  | func forceZipFileForTesting(zipOnly bool) { | 
|  | zoneSources = make([]string, len(OrigZoneSources)) | 
|  | copy(zoneSources, OrigZoneSources) | 
|  | if zipOnly { | 
|  | zoneSources = zoneSources[len(zoneSources)-1:] | 
|  | } | 
|  | } | 
|  |  | 
|  | 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 | 
|  | } |