58 lines
793 B
Go
58 lines
793 B
Go
package main
|
|
|
|
import (
|
|
"time"
|
|
)
|
|
|
|
type Timer struct {
|
|
pending AtomicBool
|
|
timer *time.Timer
|
|
}
|
|
|
|
/* Starts the timer if not already pending
|
|
*/
|
|
func (t *Timer) Start(dur time.Duration) bool {
|
|
if !t.pending.Swap(true) {
|
|
t.timer.Reset(dur)
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
/* Stops the timer
|
|
*/
|
|
func (t *Timer) Stop() {
|
|
if t.pending.Swap(true) {
|
|
t.timer.Stop()
|
|
select {
|
|
case <-t.timer.C:
|
|
default:
|
|
}
|
|
}
|
|
t.pending.Set(false)
|
|
}
|
|
|
|
func (t *Timer) Pending() bool {
|
|
return t.pending.Get()
|
|
}
|
|
|
|
func (t *Timer) Reset(dur time.Duration) {
|
|
t.pending.Set(false)
|
|
t.Start(dur)
|
|
}
|
|
|
|
func (t *Timer) Wait() <-chan time.Time {
|
|
return t.timer.C
|
|
}
|
|
|
|
func NewTimer() (t Timer) {
|
|
t.pending.Set(false)
|
|
t.timer = time.NewTimer(0)
|
|
t.timer.Stop()
|
|
select {
|
|
case <-t.timer.C:
|
|
default:
|
|
}
|
|
return
|
|
}
|