73 lines
1.7 KiB
Go
73 lines
1.7 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 (
|
|
"io/ioutil"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
func (ctx *context) topologyFillInfo(info *TopologyInfo) error {
|
|
info.Nodes = ctx.topologyNodes()
|
|
if len(info.Nodes) == 1 {
|
|
info.Architecture = ARCHITECTURE_SMP
|
|
} else {
|
|
info.Architecture = ARCHITECTURE_NUMA
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// TopologyNodes has been deprecated in 0.2. Please use the TopologyInfo.Nodes
|
|
// attribute.
|
|
// TODO(jaypipes): Remove in 1.0.
|
|
func TopologyNodes() ([]*TopologyNode, error) {
|
|
msg := `
|
|
The TopologyNodes() function has been DEPRECATED and will be removed in the 1.0
|
|
release of ghw. Please use the TopologyInfo.Nodes attribute.
|
|
`
|
|
warn(msg)
|
|
ctx := contextFromEnv()
|
|
return ctx.topologyNodes(), nil
|
|
}
|
|
|
|
func (ctx *context) topologyNodes() []*TopologyNode {
|
|
nodes := make([]*TopologyNode, 0)
|
|
|
|
files, err := ioutil.ReadDir(ctx.pathSysDevicesSystemNode())
|
|
if err != nil {
|
|
warn("failed to determine nodes: %s\n", err)
|
|
return nodes
|
|
}
|
|
for _, file := range files {
|
|
filename := file.Name()
|
|
if !strings.HasPrefix(filename, "node") {
|
|
continue
|
|
}
|
|
node := &TopologyNode{}
|
|
nodeID, err := strconv.Atoi(filename[4:])
|
|
if err != nil {
|
|
warn("failed to determine node ID: %s\n", err)
|
|
return nodes
|
|
}
|
|
node.ID = nodeID
|
|
cores, err := ctx.coresForNode(nodeID)
|
|
if err != nil {
|
|
warn("failed to determine cores for node: %s\n", err)
|
|
return nodes
|
|
}
|
|
node.Cores = cores
|
|
caches, err := ctx.cachesForNode(nodeID)
|
|
if err != nil {
|
|
warn("failed to determine caches for node: %s\n", err)
|
|
return nodes
|
|
}
|
|
node.Caches = caches
|
|
nodes = append(nodes, node)
|
|
}
|
|
return nodes
|
|
}
|