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