فهرست منبع

Merge pull request #39374 from tklauser/unix-numcpu

Use functions from x/sys/unix to get number of CPUs on Linux
Sebastiaan van Stijn 6 سال پیش
والد
کامیت
baa0040fb4
3فایلهای تغییر یافته به همراه15 افزوده شده و 24 حذف شده
  1. 5 14
      pkg/sysinfo/numcpu_linux.go
  2. 10 0
      pkg/sysinfo/numcpu_windows.go
  3. 0 10
      pkg/sysinfo/sysinfo.go

+ 5 - 14
pkg/sysinfo/numcpu_linux.go

@@ -2,7 +2,6 @@ package sysinfo // import "github.com/docker/docker/pkg/sysinfo"
 
 import (
 	"runtime"
-	"unsafe"
 
 	"golang.org/x/sys/unix"
 )
@@ -14,23 +13,15 @@ import (
 // Returns 0 on errors. Use |runtime.NumCPU| in that case.
 func numCPU() int {
 	// Gets the affinity mask for a process: The very one invoking this function.
-	pid, _, _ := unix.RawSyscall(unix.SYS_GETPID, 0, 0, 0)
+	pid := unix.Getpid()
 
-	var mask [1024 / 64]uintptr
-	_, _, err := unix.RawSyscall(unix.SYS_SCHED_GETAFFINITY, pid, uintptr(len(mask)*8), uintptr(unsafe.Pointer(&mask[0])))
-	if err != 0 {
+	var mask unix.CPUSet
+	err := unix.SchedGetaffinity(pid, &mask)
+	if err != nil {
 		return 0
 	}
 
-	// For every available thread a bit is set in the mask.
-	ncpu := 0
-	for _, e := range mask {
-		if e == 0 {
-			continue
-		}
-		ncpu += int(popcnt(uint64(e)))
-	}
-	return ncpu
+	return mask.Count()
 }
 
 // NumCPU returns the number of CPUs which are currently online

+ 10 - 0
pkg/sysinfo/numcpu_windows.go

@@ -13,6 +13,16 @@ var (
 	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

+ 0 - 10
pkg/sysinfo/sysinfo.go

@@ -146,13 +146,3 @@ func isCpusetListAvailable(provided, available string) (bool, error) {
 	}
 	return true, nil
 }
-
-// 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)
-}