From 6ec0f72a72dd2dc2ee613dc6b436e2991ba6b8af Mon Sep 17 00:00:00 2001 From: Hideo Hattori Date: Mon, 15 Jun 2015 16:35:52 +0900 Subject: [PATCH] implement CPUTimes (and CPUPercent) on darwin. use ps command. --- process/process_darwin.go | 48 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/process/process_darwin.go b/process/process_darwin.go index cd661c1..3fd66b0 100644 --- a/process/process_darwin.go +++ b/process/process_darwin.go @@ -25,6 +25,10 @@ const ( KernProcPathname = 12 // path to executable ) +const ( + ClockTicks = 100 // C.sysconf(C._SC_CLK_TCK) +) + type _Ctype_struct___0 struct { Pad uint64 } @@ -178,8 +182,50 @@ func (p *Process) Threads() (map[string]string, error) { ret := make(map[string]string, 0) return ret, common.NotImplementedError } + +func convertCpuTimes(s string) (ret float64, err error) { + var t int + var _tmp string + if strings.Contains(s, ":") { + _t := strings.Split(s, ":") + hour, err := strconv.Atoi(_t[0]) + if err != nil { + return ret, err + } + t += hour * 60 * 100 + _tmp = _t[1] + } else { + _tmp = s + } + + _t := strings.Split(_tmp, ".") + if err != nil { + return ret, err + } + h, err := strconv.Atoi(_t[0]) + t += h * 100 + h, err = strconv.Atoi(_t[1]) + t += h + return float64(t) / ClockTicks, nil +} func (p *Process) CPUTimes() (*cpu.CPUTimesStat, error) { - return nil, common.NotImplementedError + r, err := callPs("utime,stime", p.Pid) + + utime, err := convertCpuTimes(r[0][0]) + if err != nil { + return nil, err + } + stime, err := convertCpuTimes(r[0][1]) + if err != nil { + return nil, err + } + + ret := &cpu.CPUTimesStat{ + CPU: "cpu", + User: utime, + System: stime, + } + return ret, nil } func (p *Process) CPUAffinity() ([]int32, error) { return nil, common.NotImplementedError -- GitLab