Files
scrutiny/vendor/github.com/jaypipes/ghw/cpu.go
T
2020-08-21 06:31:48 +00:00

172 lines
4.9 KiB
Go

//
// Use and distribution licensed under the Apache license version 2.
//
// See the COPYING file in the root project directory for full text.
//
package ghw
import (
"fmt"
)
// ProcessorCore describes a physical host processor core. A processor core is
// a separate processing unit within some types of central processing units
// (CPU).
type ProcessorCore struct {
// TODO(jaypipes): Deprecated in 0.2, remove in 1.0
Id int `json:"-"`
// ID is the `uint32` identifier that the host gave this core. Note that
// this does *not* necessarily equate to a zero-based index of the core
// within a physical package. For example, the core IDs for an Intel Core
// i7 are 0, 1, 2, 8, 9, and 10
ID int `json:"id"`
// Index is the zero-based index of the core on the physical processor
// package
Index int `json:"index"`
// NumThreads is the number of hardware threads associated with the core
NumThreads uint32 `json:"total_threads"`
// LogicalProcessors is a slice of ints representing the logical processor
// IDs assigned to any processing unit for the core
LogicalProcessors []int `json:"logical_processors"`
}
// String returns a short string indicating important information about the
// processor core
func (c *ProcessorCore) String() string {
return fmt.Sprintf(
"processor core #%d (%d threads), logical processors %v",
c.Index,
c.NumThreads,
c.LogicalProcessors,
)
}
// Processor describes a physical host central processing unit (CPU).
type Processor struct {
// TODO(jaypipes): Deprecated in 0.2, remove in 1.0
Id int `json:"-"`
// ID is the physical processor `uint32` ID according to the system
ID int `json:"id"`
// NumCores is the number of physical cores in the processor package
NumCores uint32 `json:"total_cores"`
// NumThreads is the number of hardware threads in the processor package
NumThreads uint32 `json:"total_threads"`
// Vendor is a string containing the vendor name
Vendor string `json:"vendor"`
// Model` is a string containing the vendor's model name
Model string `json:"model"`
// Capabilities is a slice of strings indicating the features the processor
// has enabled
Capabilities []string `json:"capabilities"`
// Cores is a slice of ProcessorCore` struct pointers that are packed onto
// this physical processor
Cores []*ProcessorCore `json:"cores"`
}
// HasCapability returns true if the Processor has the supplied cpuid
// capability, false otherwise. Example of cpuid capabilities would be 'vmx' or
// 'sse4_2'. To see a list of potential cpuid capabilitiies, see the section on
// CPUID feature bits in the following article:
//
// https://en.wikipedia.org/wiki/CPUID
func (p *Processor) HasCapability(find string) bool {
for _, c := range p.Capabilities {
if c == find {
return true
}
}
return false
}
// String returns a short string describing the Processor
func (p *Processor) String() string {
ncs := "cores"
if p.NumCores == 1 {
ncs = "core"
}
nts := "threads"
if p.NumThreads == 1 {
nts = "thread"
}
return fmt.Sprintf(
"physical package #%d (%d %s, %d hardware %s)",
p.ID,
p.NumCores,
ncs,
p.NumThreads,
nts,
)
}
// CPUInfo describes all central processing unit (CPU) functionality on a host.
// Returned by the `ghw.CPU()` function.
type CPUInfo struct {
// TotalCores is the total number of physical cores the host system
// contains
TotalCores uint32 `json:"total_cores"`
// TotalThreads is the total number of hardware threads the host system
// contains
TotalThreads uint32 `json:"total_threads"`
// Processors is a slice of Processor struct pointers, one for each
// physical processor package contained in the host
Processors []*Processor `json:"processors"`
}
// CPU returns a CPUInfo struct that contains information about the CPUs on the
// host system
func CPU(opts ...*WithOption) (*CPUInfo, error) {
mergeOpts := mergeOptions(opts...)
ctx := &context{
chroot: *mergeOpts.Chroot,
}
info := &CPUInfo{}
if err := ctx.cpuFillInfo(info); err != nil {
return nil, err
}
return info, nil
}
// String returns a short string indicating a summary of CPU information
func (i *CPUInfo) String() string {
nps := "packages"
if len(i.Processors) == 1 {
nps = "package"
}
ncs := "cores"
if i.TotalCores == 1 {
ncs = "core"
}
nts := "threads"
if i.TotalThreads == 1 {
nts = "thread"
}
return fmt.Sprintf(
"cpu (%d physical %s, %d %s, %d hardware %s)",
len(i.Processors),
nps,
i.TotalCores,
ncs,
i.TotalThreads,
nts,
)
}
// simple private struct used to encapsulate cpu information in a top-level
// "cpu" YAML/JSON map/object key
type cpuPrinter struct {
Info *CPUInfo `json:"cpu"`
}
// YAMLString returns a string with the cpu information formatted as YAML
// under a top-level "cpu:" key
func (i *CPUInfo) YAMLString() string {
return safeYAML(cpuPrinter{i})
}
// JSONString returns a string with the cpu information formatted as JSON
// under a top-level "cpu:" key
func (i *CPUInfo) JSONString(indent bool) string {
return safeJSON(cpuPrinter{i}, indent)
}