...
1
2
3 package host
4
5 import (
6 "context"
7 "sync/atomic"
8
9 "golang.org/x/sys/unix"
10 )
11
12
13 var cachedBootTime uint64
14
15 func 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
30 func 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
View as plain text