diff --git a/load/load_darwin.go b/load/load_darwin.go index cd7b74d..a205f2f 100644 --- a/load/load_darwin.go +++ b/load/load_darwin.go @@ -5,10 +5,10 @@ package load import ( "context" "os/exec" - "strconv" "strings" + "unsafe" - "github.com/shirou/gopsutil/internal/common" + "golang.org/x/sys/unix" ) func Avg() (*AvgStat, error) { @@ -16,28 +16,23 @@ func Avg() (*AvgStat, error) { } func AvgWithContext(ctx context.Context) (*AvgStat, error) { - values, err := common.DoSysctrlWithContext(ctx, "vm.loadavg") - if err != nil { - return nil, err - } - - load1, err := strconv.ParseFloat(values[0], 64) - if err != nil { - return nil, err + // This SysctlRaw method borrowed from + // https://github.com/prometheus/node_exporter/blob/master/collector/loadavg_freebsd.go + // this implementation is common with BSDs + type loadavg struct { + load [3]uint32 + scale int } - load5, err := strconv.ParseFloat(values[1], 64) + b, err := unix.SysctlRaw("vm.loadavg") if err != nil { return nil, err } - load15, err := strconv.ParseFloat(values[2], 64) - if err != nil { - return nil, err - } - + load := *(*loadavg)(unsafe.Pointer((&b[0]))) + scale := float64(load.scale) ret := &AvgStat{ - Load1: float64(load1), - Load5: float64(load5), - Load15: float64(load15), + Load1: float64(load.load[0]) / scale, + Load5: float64(load.load[1]) / scale, + Load15: float64(load.load[2]) / scale, } return ret, nil