From e29742b52fd03a2557b17a5e1bea0178510ae3d4 Mon Sep 17 00:00:00 2001 From: WAKAYAMA Shirou Date: Sat, 19 Apr 2014 01:29:34 +0900 Subject: [PATCH] implements CPU info total on Windows. but it may be not correct. --- cpu_windows.go | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/cpu_windows.go b/cpu_windows.go index 909c96f..dbba509 100644 --- a/cpu_windows.go +++ b/cpu_windows.go @@ -3,12 +3,45 @@ package main import ( - "fmt" + "syscall" + "unsafe" ) +var ( + modkernel32 = syscall.NewLazyDLL("kernel32.dll") + procGetSystemTimes = modkernel32.NewProc("GetSystemTimes") +) + +type FILETIME struct { + DwLowDateTime uint32 + DwHighDateTime uint32 +} + func (c CPU) Cpu_times() ([]CPU_Times, error) { ret := make([]CPU_Times, 0) - fmt.Println("Windows") + var lpIdleTime FILETIME + var lpKernelTime FILETIME + var lpUserTime FILETIME + r, _, _ := procGetSystemTimes.Call( + uintptr(unsafe.Pointer(&lpIdleTime)), + uintptr(unsafe.Pointer(&lpKernelTime)), + uintptr(unsafe.Pointer(&lpUserTime))) + if r == 0 { + return ret, syscall.GetLastError() + } + + LO_T := float64(0.0000001) + HI_T := (LO_T * 4294967296.0) + idle := ((HI_T * float64(lpIdleTime.DwHighDateTime)) + (LO_T * float64(lpIdleTime.DwLowDateTime))) + user := ((HI_T * float64(lpUserTime.DwHighDateTime)) + (LO_T * float64(lpUserTime.DwLowDateTime))) + kernel := ((HI_T * float64(lpKernelTime.DwHighDateTime)) + (LO_T * float64(lpKernelTime.DwLowDateTime))) + system := (kernel - idle) + + ret = append(ret, CPU_Times{ + Idle: uint64(idle), + User: uint64(user), + System: uint64(system), + }) return ret, nil }