freezer.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. // +build linux
  2. package fs
  3. import (
  4. "fmt"
  5. "strings"
  6. "time"
  7. "github.com/opencontainers/runc/libcontainer/cgroups"
  8. "github.com/opencontainers/runc/libcontainer/configs"
  9. )
  10. type FreezerGroup struct {
  11. }
  12. func (s *FreezerGroup) Name() string {
  13. return "freezer"
  14. }
  15. func (s *FreezerGroup) Apply(d *cgroupData) error {
  16. _, err := d.join("freezer")
  17. if err != nil && !cgroups.IsNotFound(err) {
  18. return err
  19. }
  20. return nil
  21. }
  22. func (s *FreezerGroup) Set(path string, cgroup *configs.Cgroup) error {
  23. switch cgroup.Resources.Freezer {
  24. case configs.Frozen, configs.Thawed:
  25. for {
  26. // In case this loop does not exit because it doesn't get the expected
  27. // state, let's write again this state, hoping it's going to be properly
  28. // set this time. Otherwise, this loop could run infinitely, waiting for
  29. // a state change that would never happen.
  30. if err := writeFile(path, "freezer.state", string(cgroup.Resources.Freezer)); err != nil {
  31. return err
  32. }
  33. state, err := readFile(path, "freezer.state")
  34. if err != nil {
  35. return err
  36. }
  37. if strings.TrimSpace(state) == string(cgroup.Resources.Freezer) {
  38. break
  39. }
  40. time.Sleep(1 * time.Millisecond)
  41. }
  42. case configs.Undefined:
  43. return nil
  44. default:
  45. return fmt.Errorf("Invalid argument '%s' to freezer.state", string(cgroup.Resources.Freezer))
  46. }
  47. return nil
  48. }
  49. func (s *FreezerGroup) Remove(d *cgroupData) error {
  50. return removePath(d.path("freezer"))
  51. }
  52. func (s *FreezerGroup) GetStats(path string, stats *cgroups.Stats) error {
  53. return nil
  54. }