98 lines
1.9 KiB
Go
98 lines
1.9 KiB
Go
//go:build windows
|
|
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"math"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
const (
|
|
PriorityClassIdle = 0x00000040
|
|
PriorityClassNormal = 0x00000020
|
|
PriorityClassHigh = 0x00000080
|
|
PriorityClassAboveNormal = 0x00008000
|
|
PriorityClassRealtime = 0x00000100
|
|
PriorityClassBelowNormal = 0x00004000
|
|
)
|
|
|
|
func parseMemSize(s string) (uint64, error) {
|
|
s = strings.TrimSpace(s)
|
|
if s == "" {
|
|
return 0, fmt.Errorf("empty value")
|
|
}
|
|
multiplier := uint64(1)
|
|
switch s[len(s)-1] {
|
|
case 'k', 'K':
|
|
multiplier = 1024
|
|
s = s[:len(s)-1]
|
|
case 'm', 'M':
|
|
multiplier = 1024 * 1024
|
|
s = s[:len(s)-1]
|
|
case 'g', 'G':
|
|
multiplier = 1024 * 1024 * 1024
|
|
s = s[:len(s)-1]
|
|
}
|
|
n, err := strconv.ParseUint(s, 10, 64)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
if n > math.MaxUint64/multiplier {
|
|
return 0, fmt.Errorf("value overflows uint64")
|
|
}
|
|
return n * multiplier, nil
|
|
}
|
|
|
|
func formatMemSize(b uint64) string {
|
|
if b >= 1024*1024*1024 {
|
|
return fmt.Sprintf("%.1fGB", float64(b)/(1024*1024*1024))
|
|
}
|
|
if b >= 1024*1024 {
|
|
return fmt.Sprintf("%dMB", b/1024/1024)
|
|
}
|
|
return fmt.Sprintf("%dKB", b/1024)
|
|
}
|
|
|
|
func isAboveNormal(c uint32) bool {
|
|
return c == PriorityClassAboveNormal ||
|
|
c == PriorityClassHigh ||
|
|
c == PriorityClassRealtime
|
|
}
|
|
|
|
func desiredPriority(rss, mem uint64, current uint32, gameMode, isGame bool) uint32 {
|
|
if gameMode {
|
|
if isGame {
|
|
return PriorityClassHigh
|
|
}
|
|
return PriorityClassIdle
|
|
}
|
|
if rss >= mem {
|
|
return PriorityClassHigh
|
|
}
|
|
if isAboveNormal(current) {
|
|
return PriorityClassNormal
|
|
}
|
|
return 0
|
|
}
|
|
|
|
func prioName(c uint32) string {
|
|
switch c {
|
|
case PriorityClassIdle:
|
|
return "IDLE"
|
|
case PriorityClassBelowNormal:
|
|
return "BELOW_NORMAL"
|
|
case PriorityClassNormal:
|
|
return "NORMAL"
|
|
case PriorityClassAboveNormal:
|
|
return "ABOVE_NORMAL"
|
|
case PriorityClassHigh:
|
|
return "HIGH"
|
|
case PriorityClassRealtime:
|
|
return "REALTIME"
|
|
default:
|
|
return fmt.Sprintf("0x%X", c)
|
|
}
|
|
}
|