mirror of
https://github.com/AlexxIT/go2rtc.git
synced 2026-04-22 23:57:20 +08:00
0b80fa53cf
- implement getSystemInfo to gather CPU and memory usage - add platform-specific implementations for memory and CPU usage - enhance OpenAPI documentation to include system resource metrics
78 lines
1.6 KiB
Go
78 lines
1.6 KiB
Go
//go:build windows
|
|
|
|
package api
|
|
|
|
import (
|
|
"syscall"
|
|
"unsafe"
|
|
)
|
|
|
|
var (
|
|
kernel32 = syscall.NewLazyDLL("kernel32.dll")
|
|
globalMemoryStatusEx = kernel32.NewProc("GlobalMemoryStatusEx")
|
|
getSystemTimes = kernel32.NewProc("GetSystemTimes")
|
|
)
|
|
|
|
// MEMORYSTATUSEX structure
|
|
type memoryStatusEx struct {
|
|
dwLength uint32
|
|
dwMemoryLoad uint32
|
|
ullTotalPhys uint64
|
|
ullAvailPhys uint64
|
|
ullTotalPageFile uint64
|
|
ullAvailPageFile uint64
|
|
ullTotalVirtual uint64
|
|
ullAvailVirtual uint64
|
|
ullAvailExtendedVirtual uint64
|
|
}
|
|
|
|
func getMemoryInfo() (total, used uint64) {
|
|
var ms memoryStatusEx
|
|
ms.dwLength = uint32(unsafe.Sizeof(ms))
|
|
|
|
ret, _, _ := globalMemoryStatusEx.Call(uintptr(unsafe.Pointer(&ms)))
|
|
if ret == 0 {
|
|
return 0, 0
|
|
}
|
|
|
|
return ms.ullTotalPhys, ms.ullTotalPhys - ms.ullAvailPhys
|
|
}
|
|
|
|
type filetime struct {
|
|
dwLowDateTime uint32
|
|
dwHighDateTime uint32
|
|
}
|
|
|
|
func (ft filetime) ticks() uint64 {
|
|
return uint64(ft.dwHighDateTime)<<32 | uint64(ft.dwLowDateTime)
|
|
}
|
|
|
|
var prevIdleWin, prevTotalWin uint64
|
|
|
|
func getCPUUsage() float64 {
|
|
var idleTime, kernelTime, userTime filetime
|
|
|
|
ret, _, _ := getSystemTimes.Call(
|
|
uintptr(unsafe.Pointer(&idleTime)),
|
|
uintptr(unsafe.Pointer(&kernelTime)),
|
|
uintptr(unsafe.Pointer(&userTime)),
|
|
)
|
|
if ret == 0 {
|
|
return 0
|
|
}
|
|
|
|
idle := idleTime.ticks()
|
|
total := kernelTime.ticks() + userTime.ticks() // kernel includes idle
|
|
|
|
deltaTotal := total - prevTotalWin
|
|
deltaIdle := idle - prevIdleWin
|
|
prevIdleWin = idle
|
|
prevTotalWin = total
|
|
|
|
if deltaTotal == 0 {
|
|
return 0
|
|
}
|
|
|
|
return float64(deltaTotal-deltaIdle) / float64(deltaTotal) * 100
|
|
}
|