mirror of
				https://github.com/ClusterCockpit/cc-metric-collector.git
				synced 2025-11-04 10:45:06 +01:00 
			
		
		
		
	move maybe-usable-by-other-cc-components to pkg. Fix all files to use the new paths (#88)
This commit is contained in:
		
							
								
								
									
										64
									
								
								pkg/multiChanTicker/multiChanTicker.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								pkg/multiChanTicker/multiChanTicker.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,64 @@
 | 
			
		||||
package multiChanTicker
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	cclog "github.com/ClusterCockpit/cc-metric-collector/pkg/ccLogger"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type multiChanTicker struct {
 | 
			
		||||
	ticker   *time.Ticker
 | 
			
		||||
	channels []chan time.Time
 | 
			
		||||
	done     chan bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type MultiChanTicker interface {
 | 
			
		||||
	Init(duration time.Duration)
 | 
			
		||||
	AddChannel(chan time.Time)
 | 
			
		||||
	Close()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (t *multiChanTicker) Init(duration time.Duration) {
 | 
			
		||||
	t.ticker = time.NewTicker(duration)
 | 
			
		||||
	t.done = make(chan bool)
 | 
			
		||||
	go func() {
 | 
			
		||||
		done := func() {
 | 
			
		||||
			close(t.done)
 | 
			
		||||
			cclog.ComponentDebug("MultiChanTicker", "DONE")
 | 
			
		||||
		}
 | 
			
		||||
		for {
 | 
			
		||||
			select {
 | 
			
		||||
			case <-t.done:
 | 
			
		||||
				done()
 | 
			
		||||
				return
 | 
			
		||||
			case ts := <-t.ticker.C:
 | 
			
		||||
				cclog.ComponentDebug("MultiChanTicker", "Tick", ts)
 | 
			
		||||
				for _, c := range t.channels {
 | 
			
		||||
					select {
 | 
			
		||||
					case <-t.done:
 | 
			
		||||
						done()
 | 
			
		||||
						return
 | 
			
		||||
					case c <- ts:
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (t *multiChanTicker) AddChannel(channel chan time.Time) {
 | 
			
		||||
	t.channels = append(t.channels, channel)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (t *multiChanTicker) Close() {
 | 
			
		||||
	cclog.ComponentDebug("MultiChanTicker", "CLOSE")
 | 
			
		||||
	t.done <- true
 | 
			
		||||
	// wait for close of channel t.done
 | 
			
		||||
	<-t.done
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewTicker(duration time.Duration) MultiChanTicker {
 | 
			
		||||
	t := &multiChanTicker{}
 | 
			
		||||
	t.Init(duration)
 | 
			
		||||
	return t
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user