1// +build darwin freebsd openbsd 2 3package host 4 5import ( 6 "context" 7 "sync/atomic" 8 9 "golang.org/x/sys/unix" 10) 11 12// cachedBootTime must be accessed via atomic.Load/StoreUint64 13var cachedBootTime uint64 14 15func BootTimeWithContext(ctx context.Context) (uint64, error) { 16 t := atomic.LoadUint64(&cachedBootTime) 17 if t != 0 { 18 return t, nil 19 } 20 tv, err := unix.SysctlTimeval("kern.boottime") 21 if err != nil { 22 return 0, err 23 } 24 25 atomic.StoreUint64(&cachedBootTime, uint64(tv.Sec)) 26 27 return uint64(tv.Sec), nil 28} 29 30func UptimeWithContext(ctx context.Context) (uint64, error) { 31 boot, err := BootTimeWithContext(ctx) 32 if err != nil { 33 return 0, err 34 } 35 return timeSince(boot), nil 36} 37