mirror of
https://github.com/AlexxIT/go2rtc.git
synced 2025-10-06 00:37:00 +08:00
53 lines
671 B
Go
53 lines
671 B
Go
package core
|
|
|
|
import (
|
|
"time"
|
|
)
|
|
|
|
type Worker struct {
|
|
timer *time.Timer
|
|
done chan struct{}
|
|
}
|
|
|
|
// NewWorker run f after d
|
|
func NewWorker(d time.Duration, f func() time.Duration) *Worker {
|
|
timer := time.NewTimer(d)
|
|
done := make(chan struct{})
|
|
|
|
go func() {
|
|
for {
|
|
select {
|
|
case <-timer.C:
|
|
if d = f(); d > 0 {
|
|
timer.Reset(d)
|
|
continue
|
|
}
|
|
case <-done:
|
|
timer.Stop()
|
|
}
|
|
break
|
|
}
|
|
}()
|
|
|
|
return &Worker{timer: timer, done: done}
|
|
}
|
|
|
|
// Do - instant timer run
|
|
func (w *Worker) Do() {
|
|
if w == nil {
|
|
return
|
|
}
|
|
w.timer.Reset(0)
|
|
}
|
|
|
|
func (w *Worker) Stop() {
|
|
if w == nil {
|
|
return
|
|
}
|
|
|
|
select {
|
|
case w.done <- struct{}{}:
|
|
default:
|
|
}
|
|
}
|