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

90 lines
2.5 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"
"sort"
)
// TopologyNode is an abstract construct representing a collection of
// processors and various levels of memory cache that those processors share.
// In a NUMA architecture, there are multiple NUMA nodes, abstracted here as
// multiple TopologyNode structs. In an SMP architecture, a single TopologyNode
// will be available in the TopologyInfo struct and this single struct can be
// used to describe the levels of memory caching available to the single
// physical processor package's physical processor cores
type TopologyNode struct {
// TODO(jaypipes): Deprecated in 0.2, remove in 1.0
Id int `json:"-"`
ID int `json:"id"`
Cores []*ProcessorCore `json:"cores"`
Caches []*MemoryCache `json:"caches"`
}
func (n *TopologyNode) String() string {
return fmt.Sprintf(
"node #%d (%d cores)",
n.ID,
len(n.Cores),
)
}
// TopologyInfo describes the system topology for the host hardware
type TopologyInfo struct {
Architecture Architecture `json:"architecture"`
Nodes []*TopologyNode `json:"nodes"`
}
// Topology returns a TopologyInfo struct that describes the system topology of
// the host hardware
func Topology(opts ...*WithOption) (*TopologyInfo, error) {
mergeOpts := mergeOptions(opts...)
ctx := &context{
chroot: *mergeOpts.Chroot,
}
info := &TopologyInfo{}
if err := ctx.topologyFillInfo(info); err != nil {
return nil, err
}
for _, node := range info.Nodes {
sort.Sort(SortByMemoryCacheLevelTypeFirstProcessor(node.Caches))
}
return info, nil
}
func (i *TopologyInfo) String() string {
archStr := "SMP"
if i.Architecture == ARCHITECTURE_NUMA {
archStr = "NUMA"
}
res := fmt.Sprintf(
"topology %s (%d nodes)",
archStr,
len(i.Nodes),
)
return res
}
// simple private struct used to encapsulate topology information in a
// top-level "topology" YAML/JSON map/object key
type topologyPrinter struct {
Info *TopologyInfo `json:"topology"`
}
// YAMLString returns a string with the topology information formatted as YAML
// under a top-level "topology:" key
func (i *TopologyInfo) YAMLString() string {
return safeYAML(topologyPrinter{i})
}
// JSONString returns a string with the topology information formatted as JSON
// under a top-level "topology:" key
func (i *TopologyInfo) JSONString(indent bool) string {
return safeJSON(topologyPrinter{i}, indent)
}