package sysinfo // import "github.com/docker/docker/pkg/sysinfo" import ( "runtime" "unsafe" "golang.org/x/sys/windows" ) var ( kernel32 = windows.NewLazySystemDLL("kernel32.dll") getCurrentProcess = kernel32.NewProc("GetCurrentProcess") getProcessAffinityMask = kernel32.NewProc("GetProcessAffinityMask") ) // Returns bit count of 1, used by NumCPU func popcnt(x uint64) (n byte) { x -= (x >> 1) & 0x5555555555555555 x = (x>>2)&0x3333333333333333 + x&0x3333333333333333 x += x >> 4 x &= 0x0f0f0f0f0f0f0f0f x *= 0x0101010101010101 return byte(x >> 56) } func numCPU() int { // Gets the affinity mask for a process var mask, sysmask uintptr currentProcess, _, _ := getCurrentProcess.Call() ret, _, _ := getProcessAffinityMask.Call(currentProcess, uintptr(unsafe.Pointer(&mask)), uintptr(unsafe.Pointer(&sysmask))) if ret == 0 { return 0 } // For every available thread a bit is set in the mask. ncpu := int(popcnt(uint64(mask))) return ncpu } // NumCPU returns the number of CPUs which are currently online func NumCPU() int { if ncpu := numCPU(); ncpu > 0 { return ncpu } return runtime.NumCPU() }