mirror of
https://github.com/taigrr/wtf
synced 2025-01-18 04:03:14 -08:00
57 lines
1.1 KiB
Go
57 lines
1.1 KiB
Go
package linux
|
|
|
|
import (
|
|
"io/ioutil"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
type Interrupt struct {
|
|
Name string
|
|
Counts []uint64
|
|
Description string
|
|
}
|
|
|
|
type Interrupts struct {
|
|
Interrupts []Interrupt
|
|
}
|
|
|
|
func ReadInterrupts(path string) (*Interrupts, error) {
|
|
b, err := ioutil.ReadFile(path)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
content := string(b)
|
|
lines := strings.Split(content, "\n")
|
|
cpus := lines[0]
|
|
lines = append(lines[:0], lines[1:]...)
|
|
numCpus := len(strings.Fields(cpus))
|
|
interrupts := make([]Interrupt, 0)
|
|
for _, line := range lines {
|
|
fields := strings.Fields(line)
|
|
if len(fields) == 0 {
|
|
continue
|
|
}
|
|
counts := make([]uint64, 0)
|
|
i := 0
|
|
for ; i < numCpus; i++ {
|
|
if len(fields) <= i+1 {
|
|
break
|
|
}
|
|
count, err := strconv.ParseInt(fields[i+1], 10, 64)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
counts = append(counts, uint64(count))
|
|
}
|
|
name := strings.TrimSuffix(fields[0], ":")
|
|
description := strings.Join(fields[i+1:], " ")
|
|
interrupts = append(interrupts, Interrupt{
|
|
Name: name,
|
|
Counts: counts,
|
|
Description: description,
|
|
})
|
|
}
|
|
return &Interrupts{Interrupts: interrupts}, nil
|
|
}
|