mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			60 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
// 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
 | 
						|
}
 |