summaryrefslogtreecommitdiff
path: root/util/fasttime.go
diff options
context:
space:
mode:
Diffstat (limited to 'util/fasttime.go')
-rw-r--r--util/fasttime.go36
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())
+ }
}