mirror of
				https://github.com/ClusterCockpit/cc-metric-collector.git
				synced 2025-10-31 17:05:07 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			61 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package multiChanTicker
 | |
| 
 | |
| import (
 | |
| 	cclog "github.com/ClusterCockpit/cc-metric-collector/internal/ccLogger"
 | |
| 	"time"
 | |
| )
 | |
| 
 | |
| 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() {
 | |
| 			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() {
 | |
| 	t.done <- true
 | |
| 	cclog.ComponentDebug("MultiChanTicker", "CLOSE")
 | |
| }
 | |
| 
 | |
| func NewTicker(duration time.Duration) MultiChanTicker {
 | |
| 	t := &multiChanTicker{}
 | |
| 	t.Init(duration)
 | |
| 	return t
 | |
| }
 |