Philipp Schrader | a9a7939 | 2023-03-25 13:28:31 -0700 | [diff] [blame] | 1 | package background_task |
Philipp Schrader | c49eaf7 | 2023-02-26 16:56:52 -0800 | [diff] [blame] | 2 | |
| 3 | import ( |
| 4 | "time" |
| 5 | ) |
| 6 | |
Philipp Schrader | 3f0e36f | 2023-03-25 13:49:41 -0700 | [diff] [blame^] | 7 | // A helper to run a function in the background at a specified interval. |
| 8 | // Can be used for a lot of different things. |
| 9 | type backgroundTask struct { |
Philipp Schrader | c49eaf7 | 2023-02-26 16:56:52 -0800 | [diff] [blame] | 10 | doneChan chan<- bool |
| 11 | checkStopped chan<- bool |
Philipp Schrader | 3f0e36f | 2023-03-25 13:49:41 -0700 | [diff] [blame^] | 12 | interval time.Duration |
Philipp Schrader | c49eaf7 | 2023-02-26 16:56:52 -0800 | [diff] [blame] | 13 | } |
| 14 | |
Philipp Schrader | 3f0e36f | 2023-03-25 13:49:41 -0700 | [diff] [blame^] | 15 | func New(interval time.Duration) backgroundTask { |
| 16 | return backgroundTask{ |
| 17 | doneChan: make(chan bool, 1), |
| 18 | checkStopped: make(chan bool, 1), |
| 19 | interval: interval, |
| 20 | } |
| 21 | } |
Philipp Schrader | c49eaf7 | 2023-02-26 16:56:52 -0800 | [diff] [blame] | 22 | |
Philipp Schrader | 3f0e36f | 2023-03-25 13:49:41 -0700 | [diff] [blame^] | 23 | func (task *backgroundTask) Start(taskFunc func()) { |
Philipp Schrader | c49eaf7 | 2023-02-26 16:56:52 -0800 | [diff] [blame] | 24 | go func() { |
Philipp Schrader | 3f0e36f | 2023-03-25 13:49:41 -0700 | [diff] [blame^] | 25 | // Setting start time to a time prior so the function gets |
| 26 | // called instantly when Start() called |
| 27 | startTime := time.Now().Add(-task.interval - time.Minute) |
Philipp Schrader | c49eaf7 | 2023-02-26 16:56:52 -0800 | [diff] [blame] | 28 | for { |
| 29 | curTime := time.Now() |
| 30 | diff := curTime.Sub(startTime) |
| 31 | |
Philipp Schrader | 3f0e36f | 2023-03-25 13:49:41 -0700 | [diff] [blame^] | 32 | if diff > task.interval { |
| 33 | taskFunc() |
Philipp Schrader | c49eaf7 | 2023-02-26 16:56:52 -0800 | [diff] [blame] | 34 | startTime = curTime |
| 35 | } |
| 36 | |
Philipp Schrader | 3f0e36f | 2023-03-25 13:49:41 -0700 | [diff] [blame^] | 37 | if len(task.doneChan) != 0 { |
Philipp Schrader | c49eaf7 | 2023-02-26 16:56:52 -0800 | [diff] [blame] | 38 | break |
| 39 | } |
| 40 | |
| 41 | time.Sleep(time.Second) |
| 42 | } |
| 43 | |
Philipp Schrader | 3f0e36f | 2023-03-25 13:49:41 -0700 | [diff] [blame^] | 44 | task.checkStopped <- true |
Philipp Schrader | c49eaf7 | 2023-02-26 16:56:52 -0800 | [diff] [blame] | 45 | }() |
| 46 | } |
| 47 | |
Philipp Schrader | 3f0e36f | 2023-03-25 13:49:41 -0700 | [diff] [blame^] | 48 | func (task *backgroundTask) Stop() { |
| 49 | task.doneChan <- true |
Philipp Schrader | c49eaf7 | 2023-02-26 16:56:52 -0800 | [diff] [blame] | 50 | |
| 51 | for { |
Philipp Schrader | 3f0e36f | 2023-03-25 13:49:41 -0700 | [diff] [blame^] | 52 | if len(task.checkStopped) != 0 { |
| 53 | close(task.doneChan) |
| 54 | close(task.checkStopped) |
Philipp Schrader | c49eaf7 | 2023-02-26 16:56:52 -0800 | [diff] [blame] | 55 | break |
| 56 | } |
| 57 | } |
| 58 | } |