1// Copyright 2016 The go-ethereum Authors 2// This file is part of the go-ethereum library. 3// 4// The go-ethereum library is free software: you can redistribute it and/or modify 5// it under the terms of the GNU Lesser General Public License as published by 6// the Free Software Foundation, either version 3 of the License, or 7// (at your option) any later version. 8// 9// The go-ethereum library is distributed in the hope that it will be useful, 10// but WITHOUT ANY WARRANTY; without even the implied warranty of 11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12// GNU Lesser General Public License for more details. 13// 14// You should have received a copy of the GNU Lesser General Public License 15// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. 16 17// Package mclock is a wrapper for a monotonic clock source 18package mclock 19 20import ( 21 "time" 22 23 "github.com/aristanetworks/goarista/monotime" 24) 25 26// AbsTime represents absolute monotonic time. 27type AbsTime time.Duration 28 29// Now returns the current absolute monotonic time. 30func Now() AbsTime { 31 return AbsTime(monotime.Now()) 32} 33 34// Add returns t + d. 35func (t AbsTime) Add(d time.Duration) AbsTime { 36 return t + AbsTime(d) 37} 38 39// Clock interface makes it possible to replace the monotonic system clock with 40// a simulated clock. 41type Clock interface { 42 Now() AbsTime 43 Sleep(time.Duration) 44 After(time.Duration) <-chan time.Time 45} 46 47// System implements Clock using the system clock. 48type System struct{} 49 50// Now implements Clock. 51func (System) Now() AbsTime { 52 return AbsTime(monotime.Now()) 53} 54 55// Sleep implements Clock. 56func (System) Sleep(d time.Duration) { 57 time.Sleep(d) 58} 59 60// After implements Clock. 61func (System) After(d time.Duration) <-chan time.Time { 62 return time.After(d) 63} 64