From 5f8353c741433c351a7123cd74c2e6a9c3d2c6a7 Mon Sep 17 00:00:00 2001 From: Lomanic Date: Sat, 29 Dec 2018 14:44:01 +0100 Subject: [PATCH] [cpu][openbsd] Fix #621, define CPU states according to OpenBSD version --- cpu/cpu_openbsd.go | 42 ++++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/cpu/cpu_openbsd.go b/cpu/cpu_openbsd.go index 82b920f..7a3c2a6 100644 --- a/cpu/cpu_openbsd.go +++ b/cpu/cpu_openbsd.go @@ -16,7 +16,7 @@ import ( ) // sys/sched.h -const ( +var ( CPUser = 0 CPNice = 1 CPSys = 2 @@ -35,18 +35,36 @@ const ( var ClocksPerSec = float64(128) func init() { - getconf, err := exec.LookPath("/usr/bin/getconf") - if err != nil { - return - } - out, err := invoke.Command(getconf, "CLK_TCK") - // ignore errors - if err == nil { - i, err := strconv.ParseFloat(strings.TrimSpace(string(out)), 64) + func() { + getconf, err := exec.LookPath("/usr/bin/getconf") + if err != nil { + return + } + out, err := invoke.Command(getconf, "CLK_TCK") + // ignore errors if err == nil { - ClocksPerSec = float64(i) + i, err := strconv.ParseFloat(strings.TrimSpace(string(out)), 64) + if err == nil { + ClocksPerSec = float64(i) + } } - } + }() + func() { + v, err := unix.Sysctl("kern.osrelease") // can't reuse host.PlatformInformation because of circular import + if err != nil { + return + } + v = strings.ToLower(v) + version, err := strconv.ParseFloat(v, 64) + if err != nil { + return + } + if version >= 6.4 { + CPIntr = 4 + CPIdle = 5 + CPUStates = 6 + } + }() } func Times(percpu bool) ([]TimesStat, error) { @@ -64,7 +82,7 @@ func TimesWithContext(ctx context.Context, percpu bool) ([]TimesStat, error) { } for i := 0; i < ncpu; i++ { - var cpuTimes [CPUStates]int64 + var cpuTimes = make([]int64, CPUStates) var mib []int32 if percpu { mib = []int32{CTLKern, KernCptime}