mirror of
https://github.com/shirou/gopsutil.git
synced 2025-04-26 13:48:59 +08:00

All BSDs use the same implementation to get BootTime{,WithContext} and Uptime{,WithContext} based on the kern.boottime sysctl. Move this implementation to a separate host/host_bsd.go file shared by darwin, freebsd and openbsd. Also use SysctlTimeval to get the boot time directly as a type Timeval instead of manually extracting it using package unsafe. It will also allow for easier reuse to support package host on e.g. Dragonfly BSD or NetBSD. This requires updating the golang.org/x/sys/unix dependency to the latest revision. Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
50 lines
930 B
Go
50 lines
930 B
Go
// +build darwin freebsd openbsd
|
|
|
|
package host
|
|
|
|
import (
|
|
"context"
|
|
"sync/atomic"
|
|
"time"
|
|
|
|
"golang.org/x/sys/unix"
|
|
)
|
|
|
|
// cachedBootTime must be accessed via atomic.Load/StoreUint64
|
|
var cachedBootTime uint64
|
|
|
|
func BootTime() (uint64, error) {
|
|
return BootTimeWithContext(context.Background())
|
|
}
|
|
|
|
func BootTimeWithContext(ctx context.Context) (uint64, error) {
|
|
t := atomic.LoadUint64(&cachedBootTime)
|
|
if t != 0 {
|
|
return t, nil
|
|
}
|
|
tv, err := unix.SysctlTimeval("kern.boottime")
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
atomic.StoreUint64(&cachedBootTime, uint64(tv.Sec))
|
|
|
|
return uint64(tv.Sec), nil
|
|
}
|
|
|
|
func uptime(boot uint64) uint64 {
|
|
return uint64(time.Now().Unix()) - boot
|
|
}
|
|
|
|
func Uptime() (uint64, error) {
|
|
return UptimeWithContext(context.Background())
|
|
}
|
|
|
|
func UptimeWithContext(ctx context.Context) (uint64, error) {
|
|
boot, err := BootTimeWithContext(ctx)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return uptime(boot), nil
|
|
}
|