123456789101112131415161718192021222324252627 |
- // Copyright (C) 2025 The Syncthing Authors.
- //
- // This Source Code Form is subject to the terms of the Mozilla Public
- // License, v. 2.0. If a copy of the MPL was not distributed with this file,
- // You can obtain one at https://mozilla.org/MPL/2.0/.
- package timeutil
- import (
- "sync/atomic"
- "time"
- )
- var prevNanos atomic.Int64
- // StrictlyMonotonicNanos returns the current time in Unix nanoseconds.
- // Guaranteed to strictly increase for each call, regardless of the
- // underlying OS timer resolution or clock jumps.
- func StrictlyMonotonicNanos() int64 {
- for {
- old := prevNanos.Load()
- now := max(time.Now().UnixNano(), old+1)
- if prevNanos.CompareAndSwap(old, now) {
- return now
- }
- }
- }
|