package poller import ( "context" "sync" "time" ) type Runtime struct { poller *GatewayPackagePoller interval time.Duration cancel context.CancelFunc wg sync.WaitGroup } func NewRuntime(poller *GatewayPackagePoller, interval time.Duration) *Runtime { if interval <= 0 { interval = time.Second } return &Runtime{poller: poller, interval: interval} } func (r *Runtime) Start(parent context.Context) bool { if r == nil || r.poller == nil || r.cancel != nil { return false } ctx, cancel := context.WithCancel(parent) r.cancel = cancel r.wg.Add(1) go func() { defer r.wg.Done() ticker := time.NewTicker(r.interval) defer ticker.Stop() for { _, _ = r.poller.PollOnce(ctx) select { case <-ctx.Done(): return case <-ticker.C: } } }() return true } func (r *Runtime) Stop() { if r == nil || r.cancel == nil { return } r.cancel() r.wg.Wait() r.cancel = nil }