Compare commits

..

1 Commits

Author SHA1 Message Date
Dan Ballard 0b9266ba83 make writes to shared global hashmap threadsafe 2018-11-21 13:42:58 -08:00
1 changed files with 17 additions and 54 deletions

View File

@ -9,7 +9,7 @@ import (
"runtime"
"strconv"
"strings"
"time"
"sync"
)
// SysInfo will record cpu and memory data
@ -20,15 +20,13 @@ type SysInfo struct {
// Stat will store CPU time struct
type Stat struct {
utime float64
stime float64
cutime float64
cstime float64
start float64
rss float64
uptime float64
kernelmodetime float64
usermodetime float64
utime float64
stime float64
cutime float64
cstime float64
start float64
rss float64
uptime float64
}
type fn func(int) (*SysInfo, error)
@ -36,6 +34,7 @@ type fn func(int) (*SysInfo, error)
var fnMap map[string]fn
var platform string
var history map[int]Stat
var historyLock sync.Mutex
var eol string
func wrapper(statType string) func(pid int) (*SysInfo, error) {
@ -45,10 +44,10 @@ func wrapper(statType string) func(pid int) (*SysInfo, error) {
}
func init() {
platform = runtime.GOOS
// if eol = "\n"; strings.Index(platform, "win") == 0 {
// platform = "win"
// eol = "\r\n"
// }
if eol = "\n"; strings.Index(platform, "win") == 0 {
platform = "win"
eol = "\r\n"
}
history = make(map[int]Stat)
fnMap = make(map[string]fn)
fnMap["darwin"] = wrapper("ps")
@ -58,7 +57,6 @@ func init() {
fnMap["linux"] = wrapper("proc")
fnMap["netbsd"] = wrapper("proc")
fnMap["win"] = wrapper("win")
fnMap["windows"] = wrapper("windows")
}
func formatStdOut(stdout []byte, userfulIndex int) []string {
infoArr := strings.Split(string(stdout), eol)[userfulIndex]
@ -143,53 +141,18 @@ func stat(pid int, statType string) (*SysInfo, error) {
seconds = 1
}
historyLock.Lock()
history[pid] = *stat
historyLock.Unlock()
sysInfo.CPU = (total / seconds) * 100
sysInfo.Memory = stat.rss * pageSize
} else if statType == "windows" {
uptime := float64(time.Now().Unix())
args := "wmic PROCESS " + strconv.Itoa(pid) + " get workingsetsize,usermodetime,kernelmodetime"
cmdArgs := strings.Fields(args)
output, _ := exec.Command(cmdArgs[0], cmdArgs[1:len(cmdArgs)]...).Output()
outputStr := string(output)
strArr := strings.Fields(outputStr)[3:]
kernelmodetime := parseFloat(strArr[0])
usermodetime := parseFloat(strArr[1])
workingsetsize := parseFloat(strArr[2])
_kernelmodetime := 0.0
_usermodetime := 0.0
_uptime := 0.0
if _history.kernelmodetime != 0 {
_kernelmodetime = _history.kernelmodetime
}
if _history.usermodetime != 0 {
_usermodetime = _history.usermodetime
}
if _history.uptime != 0 {
_uptime = _history.uptime
}
total := kernelmodetime - _kernelmodetime + usermodetime - _usermodetime
total = total / 10000000
// seconds :=
stat := &Stat{
kernelmodetime: kernelmodetime,
usermodetime: usermodetime,
uptime: uptime,
}
history[pid] = *stat
}
return sysInfo, nil
}
// GetStat will return current system CPU and memory data
func GetStat(pid int) (*SysInfo, error) {
sysInfo, err := fnMap[platform](12320)
sysInfo, err := fnMap[platform](pid)
return sysInfo, err
}