| package platform |
| |
| import ( |
| "context" |
| "runtime" |
| "sync" |
| |
| "github.com/containerd/log" |
| ) |
| |
| var ( |
| arch string |
| onceArch sync.Once |
| ) |
| |
| // Architecture returns the runtime architecture of the process. |
| // |
| // Unlike [runtime.GOARCH] (which refers to the compiler platform), |
| // Architecture refers to the running platform. |
| // |
| // For example, Architecture reports "x86_64" as architecture, even |
| // when running a "linux/386" compiled binary on "linux/amd64" hardware. |
| func Architecture() string { |
| onceArch.Do(func() { |
| var err error |
| arch, err = runtimeArchitecture() |
| if err != nil { |
| log.G(context.TODO()).WithError(err).Error("Could not read system architecture info") |
| } |
| }) |
| return arch |
| } |
| |
| // PossibleCPU returns the set of possible CPUs on the host (which is equal or |
| // larger to the number of CPUs currently online). The returned set may be a |
| // single CPU number ({0}), or a continuous range of CPU numbers ({0,1,2,3}), or |
| // a non-continuous range of CPU numbers ({0,1,2,3,12,13,14,15}). |
| func PossibleCPU() []int { |
| if ncpu := possibleCPUs(); ncpu != nil { |
| return ncpu |
| } |
| |
| // Fallback in case possibleCPUs() fails. |
| var cpus []int |
| ncpu := runtime.NumCPU() |
| for i := 0; i <= ncpu; i++ { |
| cpus = append(cpus, i) |
| } |
| |
| return cpus |
| } |