package fs import ( "math" "strconv" "github.com/opencontainers/runc/libcontainer/cgroups" "github.com/opencontainers/runc/libcontainer/cgroups/fscommon" "github.com/opencontainers/runc/libcontainer/configs" ) type PidsGroup struct{} func (s *PidsGroup) Name() string { return "pids" } func (s *PidsGroup) Apply(path string, _ *configs.Resources, pid int) error { return apply(path, pid) } func (s *PidsGroup) Set(path string, r *configs.Resources) error { if r.PidsLimit != 0 { // "max" is the fallback value. limit := "max" if r.PidsLimit > 0 { limit = strconv.FormatInt(r.PidsLimit, 10) } if err := cgroups.WriteFile(path, "pids.max", limit); err != nil { return err } } return nil } func (s *PidsGroup) GetStats(path string, stats *cgroups.Stats) error { if !cgroups.PathExists(path) { return nil } current, err := fscommon.GetCgroupParamUint(path, "pids.current") if err != nil { return err } max, err := fscommon.GetCgroupParamUint(path, "pids.max") if err != nil { return err } // If no limit is set, read from pids.max returns "max", which is // converted to MaxUint64 by GetCgroupParamUint. Historically, we // represent "no limit" for pids as 0, thus this conversion. if max == math.MaxUint64 { max = 0 } stats.PidsStats.Current = current stats.PidsStats.Limit = max return nil }