github.com/vieux/docker@v0.6.3-0.20161004191708-e097c2a938c7/pkg/sysinfo/numcpu_windows.go (about)

     1  // +build windows
     2  
     3  package sysinfo
     4  
     5  import (
     6  	"runtime"
     7  	"syscall"
     8  	"unsafe"
     9  )
    10  
    11  var (
    12  	kernel32               = syscall.NewLazyDLL("kernel32.dll")
    13  	getCurrentProcess      = kernel32.NewProc("GetCurrentProcess")
    14  	getProcessAffinityMask = kernel32.NewProc("GetProcessAffinityMask")
    15  )
    16  
    17  func numCPU() int {
    18  	// Gets the affinity mask for a process
    19  	var mask, sysmask uintptr
    20  	currentProcess, _, _ := getCurrentProcess.Call()
    21  	ret, _, _ := getProcessAffinityMask.Call(currentProcess, uintptr(unsafe.Pointer(&mask)), uintptr(unsafe.Pointer(&sysmask)))
    22  	if ret == 0 {
    23  		return 0
    24  	}
    25  	// For every available thread a bit is set in the mask.
    26  	ncpu := int(popcnt(uint64(mask)))
    27  	return ncpu
    28  }
    29  
    30  // NumCPU returns the number of CPUs which are currently online
    31  func NumCPU() int {
    32  	if ncpu := numCPU(); ncpu > 0 {
    33  		return ncpu
    34  	}
    35  	return runtime.NumCPU()
    36  }