github.com/whatap/golib@v0.0.22/util/panicutil/SelfInfoWin.go (about)

     1  //+build windows
     2  
     3  package panicutil
     4  
     5  import (
     6  	"fmt"
     7  	"syscall"
     8  	"time"
     9  )
    10  
    11  var prevTime, prevUsage uint64
    12  
    13  //GetSelfCPUUsage GetSelfCPUUsage
    14  func GetSelfCPUUsage() (float32, error) {
    15  	handle, err := syscall.GetCurrentProcess()
    16  	if err != nil {
    17  		return 0, err
    18  	}
    19  	// fmt.Println("GetSelfCPUUsage ", prevTime, prevUsage)
    20  	var ctime, etime, ktime, utime syscall.Filetime
    21  	err = syscall.GetProcessTimes(handle, &ctime, &etime, &ktime, &utime)
    22  	if err != nil {
    23  		return 0, err
    24  	}
    25  
    26  	curTime := uint64(time.Now().UnixNano())
    27  	curUsage := uint64(ktime.Nanoseconds()) + uint64(utime.Nanoseconds()) // Always overflows
    28  
    29  	var cpuUsagePercent float32
    30  	if prevTime > 0 && prevUsage > 0 {
    31  		timeDiff := curTime - prevTime
    32  		usageDiff := curUsage - prevUsage
    33  		cpuUsagePercent = float32(100 * float64(usageDiff) / float64(timeDiff))
    34  		err = nil
    35  	} else {
    36  		err = fmt.Errorf("requires to run GetSelfCPUUsage twice at least")
    37  	}
    38  
    39  	prevTime = curTime
    40  	prevUsage = curUsage
    41  
    42  	return cpuUsagePercent, err
    43  }