mirror of
				https://github.com/k3s-io/kubernetes.git
				synced 2025-10-31 13:50:01 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			67 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package clock
 | |
| 
 | |
| import "time"
 | |
| 
 | |
| type Timer struct {
 | |
| 	C <-chan time.Time
 | |
| 
 | |
| 	timer     *time.Timer
 | |
| 	fakeTimer *fakeTimer
 | |
| }
 | |
| 
 | |
| func (t *Timer) Reset(d time.Duration) bool {
 | |
| 	if t.timer != nil {
 | |
| 		return t.timer.Reset(d)
 | |
| 	}
 | |
| 	return t.fakeTimer.Reset(d)
 | |
| }
 | |
| 
 | |
| func (t *Timer) Stop() bool {
 | |
| 	if t.timer != nil {
 | |
| 		return t.timer.Stop()
 | |
| 	}
 | |
| 	return t.fakeTimer.Stop()
 | |
| }
 | |
| 
 | |
| type fakeTimer struct {
 | |
| 	// c is the same chan as C in the Timer that contains this fakeTimer
 | |
| 	c chan<- time.Time
 | |
| 	// clk is kept so we can maintain just one lock and to add and attempt to
 | |
| 	// send the times made by this timer during Resets and Stops
 | |
| 	clk *fake
 | |
| 	// active is true until the fakeTimer's send is attempted or it has been
 | |
| 	// stopped
 | |
| 	active bool
 | |
| 	// sends is where we store all the sends made by this timer so we can
 | |
| 	// deactivate the old ones when Reset or Stop is called.
 | |
| 	sends []*send
 | |
| }
 | |
| 
 | |
| func (ft *fakeTimer) Reset(d time.Duration) bool {
 | |
| 	ft.clk.Lock()
 | |
| 	defer ft.clk.Unlock()
 | |
| 	target := ft.clk.t.Add(d)
 | |
| 	active := ft.active
 | |
| 	ft.active = true
 | |
| 	for _, s := range ft.sends {
 | |
| 		s.active = false
 | |
| 	}
 | |
| 	s := ft.clk.addSend(target, ft)
 | |
| 	ft.sends = []*send{s}
 | |
| 	ft.clk.sendTimes()
 | |
| 	return active
 | |
| }
 | |
| 
 | |
| func (ft *fakeTimer) Stop() bool {
 | |
| 	ft.clk.Lock()
 | |
| 	defer ft.clk.Unlock()
 | |
| 	active := ft.active
 | |
| 	ft.active = false
 | |
| 	for _, s := range ft.sends {
 | |
| 		s.active = false
 | |
| 	}
 | |
| 	ft.sends = nil
 | |
| 	ft.clk.sendTimes()
 | |
| 	return active
 | |
| }
 |