host_bsd.go 677 B

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