blob: cae9dba8b3afd852b1888d0dcafb2223ae683a59 [file] [log] [blame] [edit]
// Copyright 2025 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main
import (
"os"
"runtime"
"syscall"
"unsafe"
)
func init() {
register("WindowsUpdateGOMAXPROCS", WindowsUpdateGOMAXPROCS)
register("WindowsDontUpdateGOMAXPROCS", WindowsDontUpdateGOMAXPROCS)
}
// Set CPU affinity mask to only two CPUs.
//
// Skips the test if CPUs 0 and 1 are not available.
func setAffinity2() {
kernel32 := syscall.MustLoadDLL("kernel32.dll")
_GetProcessAffinityMask := kernel32.MustFindProc("GetProcessAffinityMask")
_SetProcessAffinityMask := kernel32.MustFindProc("SetProcessAffinityMask")
h, err := syscall.GetCurrentProcess()
if err != nil {
panic(err)
}
var mask, sysmask uintptr
ret, _, err := _GetProcessAffinityMask.Call(uintptr(h), uintptr(unsafe.Pointer(&mask)), uintptr(unsafe.Pointer(&sysmask)))
if ret == 0 {
panic(err)
}
// We're going to restrict to CPUs 0 and 1. Make sure those are already available.
if mask & 0b11 != 0b11 {
println("SKIP: CPUs 0 and 1 not available")
os.Exit(0)
}
mask = 0b11
ret, _, err = _SetProcessAffinityMask.Call(uintptr(h), mask)
if ret == 0 {
panic(err)
}
}
func WindowsUpdateGOMAXPROCS() {
ncpu := runtime.NumCPU()
setAffinity2()
waitForMaxProcsChange(ncpu, 2)
println("OK")
}
func WindowsDontUpdateGOMAXPROCS() {
procs := runtime.GOMAXPROCS(0)
setAffinity2()
mustNotChangeMaxProcs(procs)
println("OK")
}