func GetStats(c *cgroups.Cgroup) (*cgroups.Stats, error) { stats := cgroups.NewStats() d, err := getCgroupData(c, 0) if err != nil { return nil, fmt.Errorf("getting CgroupData %s", err) } for sysname, sys := range subsystems { path, err := d.path(sysname) if err != nil { // Don't fail if a cgroup hierarchy was not found, just skip this subsystem if cgroups.IsNotFound(err) { continue } return nil, err } if err := sys.GetStats(path, stats); err != nil { return nil, err } } return stats, nil }
func (s *PerfEventGroup) Set(d *data) error { // we just want to join this group even though we don't set anything if _, err := d.join("perf_event"); err != nil && !cgroups.IsNotFound(err) { return err } return nil }
func (s *FreezerGroup) Set(d *data) error { switch d.c.Freezer { case cgroups.Frozen, cgroups.Thawed: dir, err := d.path("freezer") if err != nil { return err } if err := writeFile(dir, "freezer.state", string(d.c.Freezer)); err != nil { return err } for { state, err := readFile(dir, "freezer.state") if err != nil { return err } if strings.TrimSpace(state) == string(d.c.Freezer) { break } time.Sleep(1 * time.Millisecond) } default: if _, err := d.join("freezer"); err != nil && !cgroups.IsNotFound(err) { return err } } return nil }
func (raw *data) Paths() (map[string]string, error) { paths := make(map[string]string) for sysname := range subsystems { path, err := raw.path(sysname) if err != nil { // Don't fail if a cgroup hierarchy was not found, just skip this subsystem if cgroups.IsNotFound(err) { continue } return nil, err } paths[sysname] = path } return paths, nil }
/* * This would be nicer to get from the systemd API when accounting * is enabled, but sadly there is no way to do that yet. * The lack of this functionality in the API & the approach taken * is guided by * http://www.freedesktop.org/wiki/Software/systemd/ControlGroupInterface/#readingaccountinginformation. */ func GetStats(c *cgroups.Cgroup) (*cgroups.Stats, error) { stats := cgroups.NewStats() for sysname, sys := range subsystems { subsystemPath, err := getSubsystemPath(c, sysname) if err != nil { // Don't fail if a cgroup hierarchy was not found, just skip this subsystem if cgroups.IsNotFound(err) { continue } return nil, err } if err := sys.GetStats(subsystemPath, stats); err != nil { return nil, err } } return stats, nil }