diff options
Diffstat (limited to 'util/fasttime.go')
-rw-r--r-- | util/fasttime.go | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/util/fasttime.go b/util/fasttime.go index a18924cb..f1a81333 100644 --- a/util/fasttime.go +++ b/util/fasttime.go @@ -1,5 +1,41 @@ package util +import ( + "sync/atomic" + "time" +) + // FastTime provides current unix time using specified resolution with reduced number of syscalls. type FastTime struct { + last int64 + ticker *time.Ticker +} + +// NewFastTime returns new time provider with given resolution. +func NewFastTime(resolution time.Duration) *FastTime { + ft := &FastTime{ + last: time.Now().UnixNano(), + ticker: time.NewTicker(resolution), + } + + go ft.run() + + return ft +} + +// Stop ticking. +func (ft *FastTime) Stop() { + ft.ticker.Stop() +} + +// UnixNano returns current timestamps. Value might be delayed after current time by specified resolution. +func (ft *FastTime) UnixNano() int64 { + return atomic.LoadInt64(&ft.last) +} + +// consume time values over given resolution. +func (ft *FastTime) run() { + for range ft.ticker.C { + atomic.StoreInt64(&ft.last, time.Now().UnixNano()) + } } |