Merge branch 'master' into td-remove-cycle

pull/689/head
shirou 6 years ago committed by GitHub
commit 7c2ac48f84
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -11,6 +11,7 @@ import (
"runtime" "runtime"
"strconv" "strconv"
"strings" "strings"
"syscall"
"github.com/shirou/gopsutil/internal/common" "github.com/shirou/gopsutil/internal/common"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
@ -29,6 +30,9 @@ var (
// sys/sysctl.h // sys/sysctl.h
const ( const (
CTLKern = 1 // "high kernel": proc, limits CTLKern = 1 // "high kernel": proc, limits
CTLHw = 6 // CTL_HW
SMT = 24 // HW_SMT
NCpuOnline = 25 // HW_NCPUONLINE
KernCptime = 40 // KERN_CPTIME KernCptime = 40 // KERN_CPTIME
KernCptime2 = 71 // KERN_CPTIME2 KernCptime2 = 71 // KERN_CPTIME2
) )
@ -68,6 +72,22 @@ func init() {
}() }()
} }
func smt() (bool, error) {
mib := []int32{CTLHw, SMT}
buf, _, err := common.CallSyscall(mib)
if err != nil {
return false, err
}
var ret bool
br := bytes.NewReader(buf)
if err := binary.Read(br, binary.LittleEndian, &ret); err != nil {
return false, err
}
return ret, nil
}
func Times(percpu bool) ([]TimesStat, error) { func Times(percpu bool) ([]TimesStat, error) {
return TimesWithContext(context.Background(), percpu) return TimesWithContext(context.Background(), percpu)
} }
@ -82,13 +102,27 @@ func TimesWithContext(ctx context.Context, percpu bool) ([]TimesStat, error) {
ncpu = 1 ncpu = 1
} }
smt, err := smt()
if err == syscall.EOPNOTSUPP {
// if hw.smt is not applicable for this platform (e.g. i386),
// pretend it's enabled
smt = true
} else if err != nil {
return nil, err
}
for i := 0; i < ncpu; i++ { for i := 0; i < ncpu; i++ {
var cpuTimes = make([]int64, CPUStates) j := i
if !smt {
j *= 2
}
var cpuTimes = make([]int32, CPUStates)
var mib []int32 var mib []int32
if percpu { if percpu {
mib = []int32{CTLKern, KernCptime} mib = []int32{CTLKern, KernCptime2, int32(j)}
} else { } else {
mib = []int32{CTLKern, KernCptime2, int32(i)} mib = []int32{CTLKern, KernCptime}
} }
buf, _, err := common.CallSyscall(mib) buf, _, err := common.CallSyscall(mib)
if err != nil { if err != nil {
@ -107,10 +141,10 @@ func TimesWithContext(ctx context.Context, percpu bool) ([]TimesStat, error) {
Idle: float64(cpuTimes[CPIdle]) / ClocksPerSec, Idle: float64(cpuTimes[CPIdle]) / ClocksPerSec,
Irq: float64(cpuTimes[CPIntr]) / ClocksPerSec, Irq: float64(cpuTimes[CPIntr]) / ClocksPerSec,
} }
if !percpu { if percpu {
c.CPU = "cpu-total" c.CPU = fmt.Sprintf("cpu%d", j)
} else { } else {
c.CPU = fmt.Sprintf("cpu%d", i) c.CPU = "cpu-total"
} }
ret = append(ret, c) ret = append(ret, c)
} }
@ -135,10 +169,19 @@ func InfoWithContext(ctx context.Context) ([]InfoStat, error) {
} }
c.Mhz = float64(u32) c.Mhz = float64(u32)
if u32, err = unix.SysctlUint32("hw.ncpuonline"); err != nil { mib := []int32{CTLHw, NCpuOnline}
buf, _, err := common.CallSyscall(mib)
if err != nil {
return nil, err
}
var ncpu int32
br := bytes.NewReader(buf)
err = binary.Read(br, binary.LittleEndian, &ncpu)
if err != nil {
return nil, err return nil, err
} }
c.Cores = int32(u32) c.Cores = ncpu
if c.ModelName, err = unix.Sysctl("hw.model"); err != nil { if c.ModelName, err = unix.Sysctl("hw.model"); err != nil {
return nil, err return nil, err

@ -342,7 +342,7 @@ func PlatformInformationWithContext(ctx context.Context) (platform string, famil
family = "fedora" family = "fedora"
case "oracle", "centos", "redhat", "scientific", "enterpriseenterprise", "amazon", "xenserver", "cloudlinux", "ibm_powerkvm": case "oracle", "centos", "redhat", "scientific", "enterpriseenterprise", "amazon", "xenserver", "cloudlinux", "ibm_powerkvm":
family = "rhel" family = "rhel"
case "suse", "opensuse": case "suse", "opensuse", "sles":
family = "suse" family = "suse"
case "gentoo": case "gentoo":
family = "gentoo" family = "gentoo"
@ -457,6 +457,7 @@ func SensorsTemperaturesWithContext(ctx context.Context) ([]TemperatureStat, err
return temperatures, err return temperatures, err
} }
} }
var warns Warnings
// example directory // example directory
// device/ temp1_crit_alarm temp2_crit_alarm temp3_crit_alarm temp4_crit_alarm temp5_crit_alarm temp6_crit_alarm temp7_crit_alarm // device/ temp1_crit_alarm temp2_crit_alarm temp3_crit_alarm temp4_crit_alarm temp5_crit_alarm temp6_crit_alarm temp7_crit_alarm
@ -482,16 +483,19 @@ func SensorsTemperaturesWithContext(ctx context.Context) ([]TemperatureStat, err
// Get the name of the temperature you are reading // Get the name of the temperature you are reading
name, err := ioutil.ReadFile(filepath.Join(filepath.Dir(file), "name")) name, err := ioutil.ReadFile(filepath.Join(filepath.Dir(file), "name"))
if err != nil { if err != nil {
return temperatures, err warns.Add(err)
continue
} }
// Get the temperature reading // Get the temperature reading
current, err := ioutil.ReadFile(file) current, err := ioutil.ReadFile(file)
if err != nil { if err != nil {
return temperatures, err warns.Add(err)
continue
} }
temperature, err := strconv.ParseFloat(strings.TrimSpace(string(current)), 64) temperature, err := strconv.ParseFloat(strings.TrimSpace(string(current)), 64)
if err != nil { if err != nil {
warns.Add(err)
continue continue
} }
@ -501,5 +505,5 @@ func SensorsTemperaturesWithContext(ctx context.Context) ([]TemperatureStat, err
Temperature: temperature / 1000.0, Temperature: temperature / 1000.0,
}) })
} }
return temperatures, nil return temperatures, warns.Reference()
} }

@ -0,0 +1,25 @@
package host
import (
"fmt"
)
type Warnings struct {
List []error
}
func (w *Warnings) Add(err error) {
w.List = append(w.List, err)
}
func (w *Warnings) Reference() error {
if len(w.List) > 0 {
return w
} else {
return nil
}
}
func (w *Warnings) Error() string {
return fmt.Sprintf("Number of warnings: %v", len(w.List))
}
Loading…
Cancel
Save