37 lines
1.2 KiB
Go
37 lines
1.2 KiB
Go
// Copyright (C) 2016 Arista Networks, Inc.
|
|
// Use of this source code is governed by the Apache License 2.0
|
|
// that can be found in the COPYING file.
|
|
|
|
// Package monotime provides functions to access monotonic clock source.
|
|
package monotime
|
|
|
|
import (
|
|
"time"
|
|
_ "unsafe" // required to use //go:linkname
|
|
)
|
|
|
|
//go:noescape
|
|
//go:linkname nanotime runtime.nanotime
|
|
func nanotime() int64
|
|
|
|
// Now returns the current time in nanoseconds from a monotonic clock.
|
|
//
|
|
// The time returned is based on some arbitrary platform-specific point in the
|
|
// past. The time returned is guaranteed to increase monotonically without
|
|
// notable jumps, unlike time.Now() from the Go standard library, which may
|
|
// jump forward or backward significantly due to system time changes or leap
|
|
// seconds.
|
|
//
|
|
// It's implemented using runtime.nanotime(), which uses CLOCK_MONOTONIC on
|
|
// Linux. Note that unlike CLOCK_MONOTONIC_RAW, CLOCK_MONOTONIC is affected
|
|
// by time changes. However, time changes never cause clock jumps; instead,
|
|
// clock frequency is adjusted slowly.
|
|
func Now() time.Duration {
|
|
return time.Duration(nanotime())
|
|
}
|
|
|
|
// Since returns the time elapsed since t, obtained previously using Now.
|
|
func Since(t time.Duration) time.Duration {
|
|
return Now() - t
|
|
}
|